diff options
Diffstat (limited to 'src/mame/drivers/icebox.cpp')
-rw-r--r-- | src/mame/drivers/icebox.cpp | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/src/mame/drivers/icebox.cpp b/src/mame/drivers/icebox.cpp deleted file mode 100644 index 373eaa2f22c..00000000000 --- a/src/mame/drivers/icebox.cpp +++ /dev/null @@ -1,372 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Robbbert -/****************************************************************************************************************** - -Nutting Icebox - -2018-08-19 Skeleton driver. It's all guesswork. - -It's a case with many slots for daughter boards, and 2 floppy drives. It's an "in-circuit emulator" -for Bally / Astrocade development. - -The unit has 5 daughter boards: 3 boards were photographed and are: a cpu board (Z80 and XTAL), - a RS232 board (2x 8251, 8 dipswitches connected to a BR1941L, 4.9152 XTAL), - and a board covered with TTL. - -Commands: -- At the main % prompt: --- A = Arcade --- C = Commercial --- D = Debug --- ^C = boot CP/M --- ^T = load data from disk to 0000 --- ^X = new line -- At the debug prompt: (to be done) Q to quit - -Status: -- Machine boots up, you can enter commands. -- For ^C (boot disk), it is able to read track 00 into memory. It then asks for 18x 128 bytes from track 01. - It reads 8 of those blocks, then hangs. - -To Do: -- Find out more what ports F2-FF do. - -The floppy drives are a special type containing a FDC within. The FDC is a FD1771-B01 with a 4MHz XTAL. - - -NOTES FROM AL KOSSOW --------------------- - -This is the Nutting Associates ICE box used for Bally arcade and Astrocade development. - -The games are written in "Terse", a dialect of FORTH with graphics and sound extensions. - -The game graphics and sound hardware were in a separate chassis connected through 50 pin ribbon cables. -There is 64K of ram that can be mapped to the addresses used where the proms in the game would be. - -Development appeared to have started under CP/M, then they migrated to development in the Terse environment. -The sector size also changed from 128 to 1024 bytes. For some reason, the hardware inverts the sector data. -CP/M flipped the bits, Terse does not. - -There is a 122 pin backplane, and five cards. The bus buffers for the floppies and the external hardware -are on the backplane. There is an I/O, memory mapper, dual 32k static ram, and CPU cards. The I/O card has -a three byte FIFO and a buffer for forcing 00 onto the data bus, which appears to be related to handling -breakpoints from looking at the code in ICE.ASM. - -The eprom dump is for booting Terse, and earlier version of the prom is documented in ICE.ASM which may be for CP/M - -The CPU card has 1K of ram, mapped to FC00. They must have moved the sector buffering to main RAM, since a -1K sector obviously wouldn't fit. - -The crystal on the CPU is 9.8304MHz. It may be possible to alter the cpu speed. There is a FAST signal on the bp. - -I/O registers from the ICE.ASM listing - -CRTD E0 terminal uart data -CRTS E1 terminal uart control -LPTD E2 printer uart data -LPTS E3 printer uart control - -DATA E4 1771 regs -SECTOR E5 -TRACK E6 -COMMAND E7 - -CENABE F0 -SELECT F1 bit 0 & 1 (select drive 0-3), bit 2 (enable floppy interrupt) -FIFO F2 3 BYTE FIFO - -EXTL F8 These are probably for the mapping registers -EXTH F9 - -WPROTL FA -WPROTH FB - -BADRH FC BASE ADR? breakpoint -BADRL FD - -BTYPE FE -MISC FF - -the 0 is forced onto the bus when bp signal IRESET/ is asserted. it appears to come from the CPU board (only -the cpu and io board are connected to it) - -the box doesn't do remapping, it just has two 16 bit write-only registers that can unmap and write protect memory -in 16 4k chunks, (extl,exth), (wprotl,wproth) . - -breakpoint (badrh, barl) specifies an adr to nmi on, with a 4 bit reference type in btype (wr, req, iorq, mreq) - -it looks like zeroing btype disables it. - -io port 0xff (misc) is on the I/O board. - -The date on the backplane of the system is 1978. It originally used dynamic RAM boards for memory, there is support -on the 'mapper' board for generating row/col adrs for them, and four ram board selects. It was replaced with a static -RAM in 1982, based on the date of the boards in the system. Two selects go to each 32k board and there is a DIP switch -on the boards to say which of the four selects it responds to. - -The three byte fifo and a register jams a zero onto the data bus (when?), and we have the source for the CP/M version -of the debugger/boot prom to see how interrupt handling occurs. - -When the floppy controller generates a DRQ or INTRQ it also generates a Z80 INT, which uses IM 0 -and forces a NOP (00) onto the bus. This allows firmware and/or disk routines to resume after a HALT. - -I can sort of piece together what Terse implements and what it evolved from. I think it started as the Caltech FORTH -implemented for the PDP-10 and 11 with a lot of words stripped out, and others added. This was submitted to DECUS as -submission 11-232 but much of the early DECUS stuff has been lost, so I've not been able to find a copy to see how the -FORTH kernel was implemented. I do have the Caltech writeup on it though, -http://bitsavers.org/pdf/caltech/ovro/Caltech-OVRO_Forth_Manual_Jun78.pdf - -First, ^T to boot the boot portion of Terse from Blocks 1 through 4. -The Command "5 LOAD" will boot full Terse. -The disk label says: 220 LOAD (which also boots full Terse I think?) -and then: 158 LOAD, which loads the Gorf binary into RAM - -You can also use: -250 0 DIR (for example) -to see the "first line comments" for a range of blocks. There is some stuff related to cross-compiling there I haven't tried yet. - -Note: Blocks in Terse start with 1, not 0. - -The "Fasterse" content on the disk is the Source for the "binary-only" version of Terse in the commercial games. You can see that -is exactly the same as the code in the low memory of Gorf. - -Also, this disk is hand-labelled 7-Feb-81. -The Gorf binary on the disk is the same as the release, except for an embedded date code - it is 18-Feb-81 on the disk. -It is 24-Feb-81 in the commercial release gorf roms. - - -My Forth is extremely rusty and I happen to look at disks with problems. If you try to do 5 LOAD with the FORLANG disk it comes -up with a Read Error? message.. Argh. There could be a fault in the IMD. Not sure. Great that other disks work. - -Disks like 611ROTO have a disk backup system or something, and when you boot it up with ^T it hangs. I've narrowed it down to a -BUSY wait which never exits (at $308a eventually). - -I think it's a quirk of the FD1771 chip thats not emulated accurately causing this. The first track of data is read using the -READ (multiple) in a loop reading 10 consecutive sectors which occurs fine, and when it's finished reading the sectors an INTERRUPT -command is issued to stop the FD1171 feeding data. According to all the datasheets I've looked at, the BUSY flag should get set to -0 immediately once the INTERRUPT command is executed (and the mame code does this), but the code in this case calls a subroutine -which waits until the BUSY flag is ON and then waits until the flag is OFF. This works elsewhere as it's used to wait until the -SEEK command is completed. - - -******************************************************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "imagedev/floppy.h" -#include "machine/i8251.h" -#include "machine/com8116.h" -#include "bus/rs232/rs232.h" -#include "machine/wd_fdc.h" - - -class icebox_state : public driver_device -{ -public: - icebox_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_uart0(*this, "uart0") - , m_uart1(*this, "uart1") - , m_brg(*this, "brg") - , m_fdc(*this, "fdc") - , m_floppy0(*this, "fdc:0") - , m_floppy1(*this, "fdc:1") - { } - - void icebox(machine_config &config); - -private: - DECLARE_WRITE_LINE_MEMBER(drq_w); - DECLARE_WRITE_LINE_MEMBER(intrq_w); - void mem_map(address_map &map); - void io_map(address_map &map); - void machine_reset() override; - void port_f1_w(u8 data); - u8 m_f1; - - required_device<cpu_device> m_maincpu; - required_device<i8251_device> m_uart0; - required_device<i8251_device> m_uart1; - required_device<com8116_device> m_brg; - required_device<fd1771_device> m_fdc; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; -}; - - -void icebox_state::mem_map(address_map &map) -{ - map(0x0000, 0xefff).ram(); - map(0xf000, 0xfbff).rom().region("maincpu", 0); - map(0xfc00, 0xffff).ram(); -} - -void icebox_state::io_map(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - map(0xe0, 0xe1).rw(m_uart0, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0xe2, 0xe3).rw(m_uart1, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0xe4, 0xe7).lrw8( - NAME([this] (offs_t offset) { return m_fdc->read(offset^3); }), - NAME([this] (offs_t offset, u8 data) { m_fdc->write(offset^3, data); })); - map(0xf1, 0xf1).lw8(NAME([this] (u8 data) { port_f1_w(data); })); -} - -/* Input ports */ -static INPUT_PORTS_START( icebox ) - PORT_START("BAUD") - PORT_DIPNAME( 0x0f, 0x0e, "Baud Rate for Terminal") PORT_DIPLOCATION("SW:5,6,7,8") - PORT_DIPSETTING( 0x00, "50") - PORT_DIPSETTING( 0x01, "75") - PORT_DIPSETTING( 0x02, "110") - PORT_DIPSETTING( 0x03, "134.5") - PORT_DIPSETTING( 0x04, "150") - PORT_DIPSETTING( 0x05, "300") - PORT_DIPSETTING( 0x06, "600") - PORT_DIPSETTING( 0x07, "1200") - PORT_DIPSETTING( 0x08, "1800") - PORT_DIPSETTING( 0x09, "2000") - PORT_DIPSETTING( 0x0a, "2400") - PORT_DIPSETTING( 0x0b, "3600") - PORT_DIPSETTING( 0x0c, "4800") - PORT_DIPSETTING( 0x0e, "9600") - PORT_DIPSETTING( 0x0f, "19200") - PORT_DIPNAME( 0xf0, 0x70, "Baud Rate for Printer") PORT_DIPLOCATION("SW:1,2,3,4") - PORT_DIPSETTING( 0x00, "50") - PORT_DIPSETTING( 0x10, "75") - PORT_DIPSETTING( 0x20, "110") - PORT_DIPSETTING( 0x30, "134.5") - PORT_DIPSETTING( 0x40, "150") - PORT_DIPSETTING( 0x50, "300") - PORT_DIPSETTING( 0x60, "600") - PORT_DIPSETTING( 0x70, "1200") - PORT_DIPSETTING( 0x80, "1800") - PORT_DIPSETTING( 0x90, "2000") - PORT_DIPSETTING( 0xa0, "2400") - PORT_DIPSETTING( 0xb0, "3600") - PORT_DIPSETTING( 0xc0, "4800") - PORT_DIPSETTING( 0xe0, "9600") - PORT_DIPSETTING( 0xf0, "19200") -INPUT_PORTS_END - -void icebox_state::machine_reset() -{ - u8 data = ioport("BAUD")->read(); - m_brg->str_w(data & 15); // Terminal - m_brg->stt_w((data >> 4) & 15); // Printer - m_maincpu->set_pc(0xf000); - m_f1 = 0; -} - -void icebox_state::port_f1_w(u8 data) -{ - m_f1 = data; - - floppy_image_device *floppy = nullptr; - - switch (data & 7) - { - case 4: - floppy = m_floppy0->get_device(); - break; - case 5: - floppy = m_floppy1->get_device(); - break; - default: - break; - } - - m_fdc->set_floppy(floppy); - - if (floppy) - { - floppy->mon_w(0); - floppy->ss_w(0); // side 0 ? - } - - m_fdc->dden_w(1); // single density? -} - -// The next byte from floppy is available. Enable CPU so it can get the NOP byte, via IM0. -WRITE_LINE_MEMBER(icebox_state::drq_w) -{ - if (BIT(m_f1, 2)) - m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE, 0x00); // Z80 -} - -// The next byte from floppy is available. Enable CPU so it can get the NOP byte, via IM0. -WRITE_LINE_MEMBER(icebox_state::intrq_w) -{ - if (BIT(m_f1, 2)) - m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE, 0x00); // Z80 -} - -static void floppies(device_slot_interface &device) -{ - device.option_add("flop", FLOPPY_8_SSDD); // Pertec "iCOM FD5200" -} - -static DEVICE_INPUT_DEFAULTS_START( terminal ) // we need to remove bit 7 which is on the last character of each message - DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) - DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) - DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) - DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) - DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN ) - DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) -DEVICE_INPUT_DEFAULTS_END - -void icebox_state::icebox(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 9'830'400 / 4); // unknown divisor - m_maincpu->set_addrmap(AS_PROGRAM, &icebox_state::mem_map); - m_maincpu->set_addrmap(AS_IO, &icebox_state::io_map); - - I8251(config, m_uart0, 0); - m_uart0->txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd)); - m_uart0->dtr_handler().set("rs232a", FUNC(rs232_port_device::write_dtr)); - m_uart0->rts_handler().set("rs232a", FUNC(rs232_port_device::write_rts)); - - rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, "terminal")); - rs232a.rxd_handler().set(m_uart0, FUNC(i8251_device::write_rxd)); - rs232a.dsr_handler().set(m_uart0, FUNC(i8251_device::write_dsr)); - rs232a.cts_handler().set(m_uart0, FUNC(i8251_device::write_cts)); - rs232a.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal)); // must be exactly here - - I8251(config, m_uart1, 0); - m_uart1->txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd)); - m_uart1->dtr_handler().set("rs232b", FUNC(rs232_port_device::write_dtr)); - m_uart1->rts_handler().set("rs232b", FUNC(rs232_port_device::write_rts)); - - rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, nullptr)); - rs232b.rxd_handler().set(m_uart1, FUNC(i8251_device::write_rxd)); - rs232b.dsr_handler().set(m_uart1, FUNC(i8251_device::write_dsr)); - rs232b.cts_handler().set(m_uart1, FUNC(i8251_device::write_cts)); - - COM5016_5(config, m_brg, 4.9152_MHz_XTAL); // BR1941L-05 - m_brg->fr_handler().set(m_uart0, FUNC(i8251_device::write_txc)); - m_brg->fr_handler().append(m_uart0, FUNC(i8251_device::write_rxc)); - m_brg->ft_handler().set(m_uart1, FUNC(i8251_device::write_txc)); - m_brg->ft_handler().append(m_uart1, FUNC(i8251_device::write_rxc)); - - FD1771(config, m_fdc, 4_MHz_XTAL / 2); - m_fdc->drq_wr_callback().set(FUNC(icebox_state::drq_w)); - m_fdc->intrq_wr_callback().set(FUNC(icebox_state::intrq_w)); - FLOPPY_CONNECTOR(config, m_floppy0, floppies, "flop", floppy_image_device::default_floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, m_floppy1, floppies, "flop", floppy_image_device::default_floppy_formats).enable_sound(true); -} - -/* ROM definition */ -ROM_START( icebox ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ice0.bin", 0x0000, 0x0800, CRC(252092c0) SHA1(8b6c53994dbb1aa76fdb6b72961e12071c100809) ) - ROM_LOAD( "ice1.bin", 0x0800, 0x0800, CRC(f4dc4b93) SHA1(cd8c3b2a1ceb4e5efb35af9bcac7ebaab6a8a308) ) -ROM_END - -/* Driver */ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 19??, icebox, 0, 0, icebox, icebox, icebox_state, empty_init, "Nutting Associates", "ICEBOX", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) // Terminal beeps |