mirror of
https://github.com/holub/mame
synced 2025-04-17 05:53:36 +03:00
205 lines
6.2 KiB
C
205 lines
6.2 KiB
C
// license:GPL-2.0+
|
|
// copyright-holders: Felipe Sanches
|
|
/***************************************************************************
|
|
|
|
Itautec I7000
|
|
|
|
driver by Felipe C. da S. Sanches <juca@members.fsf.org>
|
|
with tech info provided by Alexandre Souza (a.k.a. Tabajara).
|
|
|
|
The portuguese Wikipedia article available at
|
|
http://pt.wikipedia.org/wiki/Itautec_I-7000
|
|
also provides a technical overview of this machine:
|
|
|
|
The I-7000 was the first computer manufactured by Itautec
|
|
(http://www.itautec.com.br/pt-br/produtos). It was originally an 8 bit CP/M
|
|
computer that became an IBM PC-XT clone in later hardware revisions which
|
|
took the "I-7000 PC-XT" name.
|
|
|
|
* Released in 1982
|
|
* Operating System: SIM/M / BASIC
|
|
* CPU: National NSC800 D-4 at 4,00 MHz
|
|
* Memory: 64KB to 128KB
|
|
* keyboards: 80 keys (with a reduced numerical keypad and function keys)
|
|
* display:
|
|
- 40 X 25 text
|
|
- 80 X 25 text
|
|
- 160 X 100 (8 colors)
|
|
- 640 X 200 (monochrome, with an expansion board)
|
|
- 320 X 200 (16 colors, with an expansion board)
|
|
* Expansion slots:
|
|
- 1 frontal cart slot
|
|
- 4 internal expansion slots
|
|
* Ports:
|
|
- 1 composite video output for a color monitor
|
|
- 2 cassete interfaces
|
|
- 1 RS-232C serial port
|
|
- 1 parallel interface
|
|
* Storage:
|
|
- Cassetes recorder
|
|
- Up to 4 external floppy drives: 8" (FD/DD, 1,1MB) or 5" 1/4
|
|
- Up to 1 external 10 MB hard-drive
|
|
|
|
****************************************************************************/
|
|
|
|
#include "emu.h"
|
|
#include "cpu/z80/z80.h" //CPU was actually a NSC800 (Z80 compatible)
|
|
#include "bus/generic/carts.h"
|
|
|
|
class i7000_state : public driver_device
|
|
{
|
|
public:
|
|
i7000_state(const machine_config &mconfig, device_type type, const char *tag)
|
|
: driver_device(mconfig, type, tag),
|
|
m_card(*this, "cardslot"),
|
|
m_videoram(*this, "videoram")
|
|
{ }
|
|
|
|
virtual void video_start();
|
|
|
|
required_device<generic_slot_device> m_card;
|
|
required_shared_ptr<UINT8> m_videoram;
|
|
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
|
UINT8 *m_char_rom;
|
|
|
|
// DECLARE_READ8_MEMBER( i7000_io_r );
|
|
// DECLARE_WRITE8_MEMBER( i7000_io_w );
|
|
|
|
DECLARE_DRIVER_INIT(i7000);
|
|
DECLARE_PALETTE_INIT(i7000);
|
|
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( i7000_card );
|
|
};
|
|
|
|
DRIVER_INIT_MEMBER(i7000_state, i7000)
|
|
{
|
|
}
|
|
|
|
PALETTE_INIT_MEMBER(i7000_state, i7000)
|
|
{
|
|
palette.set_pen_color(0, rgb_t(0x33, 0x33, 0x33));
|
|
palette.set_pen_color(1, rgb_t(0xBB, 0xBB, 0xBB));
|
|
}
|
|
|
|
void i7000_state::video_start()
|
|
{
|
|
// find memory regions
|
|
m_char_rom = memregion("gfx1")->base();
|
|
}
|
|
|
|
UINT32 i7000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
|
{
|
|
offs_t addr = 0;
|
|
|
|
for (int sy = 0; sy < 25; sy++)
|
|
{
|
|
for (int sx = 0; sx < 40; sx++)
|
|
{
|
|
UINT8 data = m_videoram[addr++];
|
|
for (int y = 0; y < 8; y++)
|
|
{
|
|
int color = m_char_rom[data*8 + y];
|
|
for (int x = 0; x < 8; x++)
|
|
{
|
|
bitmap.pix16(sy*8 + y, sx*8 + 7 - x) = (color & 1);
|
|
color >>= 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*FIXME: we still need to figure out the proper memory map
|
|
for the maincpu and where the cartridge slot maps to. */
|
|
static ADDRESS_MAP_START(i7000_mem, AS_PROGRAM, 8, i7000_state)
|
|
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION("maincpu", 0)
|
|
AM_RANGE(0x1000, 0x1fff) AM_RAM
|
|
AM_RANGE(0x2000, 0xffff) AM_RAM AM_SHARE("videoram")
|
|
// AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("cardslot", 0)
|
|
ADDRESS_MAP_END
|
|
|
|
/*
|
|
static ADDRESS_MAP_START( i7000_io , AS_IO, 8, i7000_state)
|
|
ADDRESS_MAP_UNMAP_HIGH
|
|
ADDRESS_MAP_GLOBAL_MASK (0xff)
|
|
AM_RANGE(0x00, 0xff) AM_READWRITE(i7000_io_r, i7000_io_w)
|
|
ADDRESS_MAP_END
|
|
*/
|
|
|
|
DEVICE_IMAGE_LOAD_MEMBER( i7000_state, i7000_card )
|
|
{
|
|
UINT32 size = m_card->common_get_size("rom");
|
|
|
|
m_card->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_BIG);
|
|
m_card->common_load_rom(m_card->get_rom_base(), size, "rom");
|
|
|
|
return IMAGE_INIT_PASS;
|
|
}
|
|
|
|
#if 0
|
|
static const gfx_layout i7000_charlayout =
|
|
{
|
|
8, 8, /* 8 x 8 characters */
|
|
256, /* 256 characters */
|
|
1, /* 1 bits per pixel */
|
|
{ 0 }, /* no bitplanes */
|
|
/* x offsets */
|
|
{ 0, 1, 2, 3, 4, 5, 6, 7 },
|
|
/* y offsets */
|
|
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
|
|
8*8 /* every char takes 8 bytes */
|
|
};
|
|
|
|
static GFXDECODE_START( i7000 )
|
|
GFXDECODE_ENTRY( "gfx1", 0x0000, i7000_charlayout, 0, 8 )
|
|
GFXDECODE_END
|
|
#endif
|
|
|
|
static MACHINE_CONFIG_START( i7000, i7000_state )
|
|
|
|
/* basic machine hardware */
|
|
MCFG_CPU_ADD("maincpu", NSC800, XTAL_4MHz)
|
|
MCFG_CPU_PROGRAM_MAP(i7000_mem)
|
|
// MCFG_CPU_IO_MAP(i7000_io)
|
|
|
|
/* video hardware */
|
|
MCFG_SCREEN_ADD("screen", RASTER)
|
|
MCFG_SCREEN_REFRESH_RATE(60)
|
|
MCFG_SCREEN_SIZE(320, 200) /* 40x25 8x8 chars */
|
|
MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
|
|
|
|
MCFG_SCREEN_UPDATE_DRIVER(i7000_state, screen_update)
|
|
MCFG_SCREEN_PALETTE("palette")
|
|
|
|
MCFG_PALETTE_ADD("palette", 2)
|
|
MCFG_PALETTE_INIT_OWNER(i7000_state, i7000)
|
|
|
|
// MCFG_GFXDECODE_ADD("gfxdecode", "palette", i7000)
|
|
|
|
/* Cartridge slot */
|
|
MCFG_GENERIC_CARTSLOT_ADD("cardslot", generic_romram_plain_slot, "i7000_card")
|
|
MCFG_GENERIC_EXTENSIONS("rom")
|
|
MCFG_GENERIC_LOAD(i7000_state, i7000_card)
|
|
|
|
/* Software lists */
|
|
MCFG_SOFTWARE_LIST_ADD("card_list", "i7000_card")
|
|
MACHINE_CONFIG_END
|
|
|
|
ROM_START( i7000 )
|
|
ROM_REGION( 0x1000, "maincpu", 0 )
|
|
ROM_LOAD( "i7000_boot_v1_4r02_15_10_85_d52d.rom", 0x0000, 0x1000, CRC(622412e5) SHA1(bf187a095600fd46a739c35132a85b5f39b2f867) )
|
|
|
|
ROM_REGION( 0x0800, "gfx1", 0 )
|
|
ROM_LOAD( "i7000_chargen.rom", 0x0000, 0x0800, CRC(7ba75183) SHA1(4af799f4a8bd385e1e4e5ece378df93e1133dc12) )
|
|
|
|
ROM_REGION( 0x1000, "drive", 0 )
|
|
ROM_LOAD( "i7000_drive_ci01.rom", 0x0000, 0x1000, CRC(d8d6e5c1) SHA1(93e7db42fbfaa8243973321c7fc8c51ed80780be) )
|
|
|
|
ROM_REGION( 0x1000, "telex", 0 )
|
|
ROM_LOAD( "i7000_telex_ci09.rom", 0x0000, 0x1000, CRC(c1c8fcc8) SHA1(cbf5fb600e587b998f190a9e3fb398a51d8a5e87) )
|
|
ROM_END
|
|
|
|
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
|
|
COMP( 1982, i7000, 0, 0, i7000, 0, i7000_state, i7000, "Itautec", "I-7000", GAME_NOT_WORKING | GAME_NO_SOUND)
|