mirror of
https://github.com/holub/mame
synced 2025-04-16 21:44:32 +03:00
AT&T Blit terminal (skeleton) (#7469)
New machines marked as NOT_WORKING ------------------ AT&T Blit
This commit is contained in:
parent
9649617fb0
commit
593e2f5d9c
@ -4355,6 +4355,7 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/bert.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/besta.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/bitgraph.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/blit.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/bpmmicro.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/blw700i.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/br8641.cpp",
|
||||
|
291
src/mame/drivers/blit.cpp
Normal file
291
src/mame/drivers/blit.cpp
Normal file
@ -0,0 +1,291 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Sergey Svishchev
|
||||
/***************************************************************************
|
||||
|
||||
AT&T Blit -- monochrome, raster graphics (800x1024), serial terminal.
|
||||
|
||||
https://code.9front.org/hg/plan9front/file/f4fa0b9d0397/sys/src/games/blit/mmap
|
||||
memory map
|
||||
|
||||
https://pbs.twimg.com/media/C_uxVGgUwAAImk6.jpg:orig
|
||||
board photo
|
||||
|
||||
Onboard hardware (common to all revisions) is
|
||||
- 24K ROM
|
||||
- 256K RAM (includes frame buffer)
|
||||
- 2 serial ports, each driven by 6850 ACIA
|
||||
|
||||
To do:
|
||||
- keyboard
|
||||
- mouse
|
||||
- make 'mux' window system work -- "68ld: load protocol failed"
|
||||
- sound?
|
||||
- what do dip switches do?
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/6850acia.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/ram.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
#define M68K_TAG "maincpu"
|
||||
#define ACIA0_TAG "acia0"
|
||||
#define ACIA1_TAG "acia1"
|
||||
#define RS232_H_TAG "host"
|
||||
#define RS232_K_TAG "keyboard"
|
||||
|
||||
|
||||
//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
|
||||
#define LOG_PIA (1U << 1)
|
||||
#define LOG_DEBUG (1U << 2)
|
||||
|
||||
//#define VERBOSE (LOG_DEBUG)
|
||||
//#define LOG_OUTPUT_FUNC printf
|
||||
#include "logmacro.h"
|
||||
|
||||
#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__)
|
||||
#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
|
||||
|
||||
|
||||
class blit_state : public driver_device
|
||||
{
|
||||
public:
|
||||
blit_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, M68K_TAG)
|
||||
, m_ram(*this, RAM_TAG)
|
||||
, m_acia0(*this, ACIA0_TAG)
|
||||
, m_acia1(*this, ACIA1_TAG)
|
||||
, m_screen(*this, "screen")
|
||||
, m_misccr(*this, "misccr")
|
||||
, m_p_ram(*this, "p_ram")
|
||||
, m_sysrom(*this, M68K_TAG)
|
||||
{ }
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(system_clock_write);
|
||||
|
||||
void start_write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||
void vblank_ack(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void blit(machine_config &config);
|
||||
void blit_mem(address_map &map);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<acia6850_device> m_acia0;
|
||||
required_device<acia6850_device> m_acia1;
|
||||
required_device<screen_device> m_screen;
|
||||
required_shared_ptr<uint16_t> m_misccr;
|
||||
required_shared_ptr<uint16_t> m_p_ram;
|
||||
required_region_ptr<uint16_t> m_sysrom;
|
||||
|
||||
memory_passthrough_handler *m_rom_shadow_tap;
|
||||
int m_videostart = 0;
|
||||
};
|
||||
|
||||
void blit_state::blit_mem(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x000000, 0x03ffff).ram().share("p_ram");
|
||||
map(0x040000, 0x045fff).rom().region(M68K_TAG, 0);
|
||||
// octal 0000, 0002 - 16-bit
|
||||
// map(0x060000, 0x060003).r(FUNC(blit_state::mouse_xy));
|
||||
// octal 0011, 0013 - 8-bit - host
|
||||
map(0x060008, 0x060009).rw(m_acia0, FUNC(acia6850_device::status_r), FUNC(acia6850_device::control_w));
|
||||
map(0x06000a, 0x06000b).rw(m_acia0, FUNC(acia6850_device::data_r), FUNC(acia6850_device::data_w));
|
||||
// octal 0021 - 8-bit
|
||||
// map(0x060010, 0x060011).r(FUNC(blit_state::mouse_buttons)).mask(0x00ff);
|
||||
// octal 0025 - mirror
|
||||
// map(0x060014, 0x060015).r(FUNC(blit_state::mouse_buttons)).mask(0x00ff);
|
||||
// octal 0027 - ???
|
||||
// octal 0030 - 16-bit
|
||||
map(0x060018, 0x060019).w(FUNC(blit_state::start_write));
|
||||
// octal 0040 - 16-bit
|
||||
map(0x060020, 0x060029).ram().share("misccr");
|
||||
// octal 0050 - 16-bit
|
||||
// map(0x060028, 0x060029).w(FUNC(blit_state::init_write));
|
||||
// octal 0060, 0062 - 8-bit - keyboard
|
||||
map(0x060030, 0x060031).rw(m_acia1, FUNC(acia6850_device::status_r), FUNC(acia6850_device::control_w));
|
||||
map(0x060032, 0x060033).rw(m_acia1, FUNC(acia6850_device::data_r), FUNC(acia6850_device::data_w));
|
||||
// octal 0070 - 16-bit
|
||||
map(0x060038, 0x060039).w(FUNC(blit_state::vblank_ack));
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START(blit)
|
||||
INPUT_PORTS_END
|
||||
|
||||
static DEVICE_INPUT_DEFAULTS_START( host_rs232_defaults )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_19200 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_19200 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
|
||||
DEVICE_INPUT_DEFAULTS( "FLOW_CONTROL", 0x01, 0x01 )
|
||||
DEVICE_INPUT_DEFAULTS_END
|
||||
|
||||
static DEVICE_INPUT_DEFAULTS_START( kbd_rs232_defaults )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_19200 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_19200 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE )
|
||||
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
|
||||
DEVICE_INPUT_DEFAULTS( "FLOW_CONTROL", 0x01, 0x01 )
|
||||
DEVICE_INPUT_DEFAULTS_END
|
||||
|
||||
|
||||
void blit_state::start_write(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
{
|
||||
LOG("START <- %04X (addr %06X)\n", data, data << 2);
|
||||
m_videostart = data << 1;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(blit_state::system_clock_write)
|
||||
{
|
||||
m_acia0->write_txc(state);
|
||||
m_acia0->write_rxc(state);
|
||||
//
|
||||
m_acia1->write_txc(state);
|
||||
m_acia1->write_rxc(state);
|
||||
}
|
||||
|
||||
void blit_state::vblank_ack(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
{
|
||||
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
uint32_t blit_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int fg, bg;
|
||||
|
||||
if (BIT(*m_misccr, 0))
|
||||
{
|
||||
fg = 0; bg = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fg = 1; bg = 0;
|
||||
}
|
||||
|
||||
for (int y = 0; y < 1024; y++)
|
||||
{
|
||||
uint16_t *p = &bitmap.pix(y);
|
||||
|
||||
for (int x = 0; x < 800 / 16; x += 1)
|
||||
{
|
||||
uint16_t gfx;
|
||||
|
||||
gfx = m_p_ram[m_videostart + x + y * 50];
|
||||
|
||||
for (int z = 15; z >= 0; z--)
|
||||
{
|
||||
*p++ = BIT(gfx, z) ? fg : bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void blit_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
void blit_state::machine_reset()
|
||||
{
|
||||
address_space &program = m_maincpu->space(AS_PROGRAM);
|
||||
program.install_rom(0x000000, 0x000007, m_sysrom); // do it here for F3
|
||||
m_rom_shadow_tap = program.install_read_tap(0x040000, 0x045fff, "rom_shadow_r",[this](offs_t offset, u16 &data, u16 mem_mask)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
// delete this tap
|
||||
m_rom_shadow_tap->remove();
|
||||
|
||||
// reinstall ram over the rom shadow
|
||||
m_maincpu->space(AS_PROGRAM).install_ram(0x000000, 0x000007, m_p_ram);
|
||||
}
|
||||
|
||||
// return the original data
|
||||
return data;
|
||||
});
|
||||
|
||||
*m_misccr = 0;
|
||||
}
|
||||
|
||||
void blit_state::blit(machine_config &config)
|
||||
{
|
||||
M68000(config, m_maincpu, XTAL(33'000'000) / 4); // maybe XTAL(32'760'000)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &blit_state::blit_mem);
|
||||
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_LCD, rgb_t::white());
|
||||
m_screen->set_refresh_hz(60);
|
||||
m_screen->set_size(800, 1024);
|
||||
m_screen->set_visarea(0, 800-1, 0, 1024-1);
|
||||
m_screen->set_screen_update(FUNC(blit_state::screen_update));
|
||||
m_screen->screen_vblank().set_inputline(M68K_TAG, M68K_IRQ_1);
|
||||
m_screen->set_palette("palette");
|
||||
|
||||
PALETTE(config, "palette", palette_device::MONOCHROME);
|
||||
|
||||
CLOCK(config, "system_clock", 19200 * 16).signal_handler().set(FUNC(blit_state::system_clock_write));
|
||||
|
||||
ACIA6850(config, m_acia0, 0);
|
||||
m_acia0->txd_handler().set(RS232_H_TAG, FUNC(rs232_port_device::write_txd));
|
||||
m_acia0->rts_handler().set(RS232_H_TAG, FUNC(rs232_port_device::write_rts));
|
||||
m_acia0->irq_handler().set_inputline(M68K_TAG, M68K_IRQ_5);
|
||||
|
||||
rs232_port_device &rs232h(RS232_PORT(config, RS232_H_TAG, default_rs232_devices, "null_modem"));
|
||||
rs232h.rxd_handler().set(m_acia0, FUNC(acia6850_device::write_rxd));
|
||||
rs232h.dcd_handler().set(m_acia0, FUNC(acia6850_device::write_dcd));
|
||||
rs232h.cts_handler().set(m_acia0, FUNC(acia6850_device::write_cts));
|
||||
rs232h.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(host_rs232_defaults));
|
||||
|
||||
ACIA6850(config, m_acia1, 0);
|
||||
m_acia1->txd_handler().set(RS232_K_TAG, FUNC(rs232_port_device::write_txd));
|
||||
m_acia1->rts_handler().set(RS232_K_TAG, FUNC(rs232_port_device::write_rts));
|
||||
m_acia1->irq_handler().set_inputline(M68K_TAG, M68K_IRQ_2);
|
||||
|
||||
rs232_port_device &rs232k(RS232_PORT(config, RS232_K_TAG, default_rs232_devices, "keyboard"));
|
||||
rs232k.rxd_handler().set(m_acia1, FUNC(acia6850_device::write_rxd));
|
||||
rs232k.dcd_handler().set(m_acia1, FUNC(acia6850_device::write_dcd));
|
||||
rs232k.cts_handler().set(m_acia1, FUNC(acia6850_device::write_cts));
|
||||
rs232k.set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(kbd_rs232_defaults));
|
||||
|
||||
RAM(config, RAM_TAG).set_default_size("256K");
|
||||
}
|
||||
|
||||
ROM_START( blit )
|
||||
ROM_REGION16_BE(0x6000, M68K_TAG, 0)
|
||||
ROM_DEFAULT_BIOS("blit")
|
||||
|
||||
ROM_SYSTEM_BIOS(0, "blit", "blit ROM")
|
||||
ROMX_LOAD("rom0.bin", 0x0001, 0x1000, CRC(e1cea320) SHA1(ba71ccd794b3bb87af58e2ff3056fc6b6e03a167), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROMX_LOAD("rom1.bin", 0x0000, 0x1000, CRC(b717fa64) SHA1(45fbc6029031cfa6f16c258c131916f56f7d8d38), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROMX_LOAD("rom2.bin", 0x2001, 0x1000, CRC(8a80bf57) SHA1(0b21ef8657a03418f5333772312b163d9a8e4ba0), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROMX_LOAD("rom3.bin", 0x2000, 0x1000, CRC(846b742c) SHA1(7d27970df6e0304f3b026fd350acffa5fd921a96), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROMX_LOAD("rom4.bin", 0x4001, 0x08bf, CRC(2af93f8b) SHA1(1168cb341bfe2a5bc283281f6afe42837adb60f1), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROMX_LOAD("rom5.bin", 0x4000, 0x08bf, CRC(d87f121f) SHA1(6e776ac29554b8a8bb332168c155bcc502c927b5), ROM_BIOS(0)|ROM_SKIP(1))
|
||||
ROM_END
|
||||
|
||||
/* Driver */
|
||||
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
|
||||
COMP( 1981, blit, 0, 0, blit, blit, blit_state, empty_init, "AT&T", "Blit", MACHINE_IS_SKELETON )
|
@ -9309,6 +9309,9 @@ bladestl // GX797 (c) 1987
|
||||
bladestle // GX797 (c) 1987
|
||||
bladestll // GX797 (c) 1987
|
||||
|
||||
@source:blit.cpp
|
||||
blit
|
||||
|
||||
@source:blitz68k.cpp
|
||||
bankrob // (c) 1993 Entertainment Technology Corp.
|
||||
bankroba // (c) 1993 Entertainment Technology Corp.
|
||||
|
@ -121,6 +121,7 @@ binbug.cpp
|
||||
bitel.cpp
|
||||
bitgraph.cpp
|
||||
bk.cpp
|
||||
blit.cpp
|
||||
blw700i.cpp
|
||||
bmjr.cpp
|
||||
bml3.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user