mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
(MESS) itt3030: preliminary bankswitching setup using bankdev [R. Belmont]
This commit is contained in:
parent
32689882b2
commit
c772fe08d8
@ -193,6 +193,7 @@ Beeper Circuit, all ICs shown:
|
|||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "machine/wd_fdc.h"
|
#include "machine/wd_fdc.h"
|
||||||
#include "machine/bankdev.h"
|
#include "machine/bankdev.h"
|
||||||
|
#include "machine/ram.h"
|
||||||
#include "formats/itt3030_dsk.h"
|
#include "formats/itt3030_dsk.h"
|
||||||
#include "video/tms9927.h" //Display hardware
|
#include "video/tms9927.h" //Display hardware
|
||||||
#include "sound/beep.h"
|
#include "sound/beep.h"
|
||||||
@ -207,21 +208,29 @@ public:
|
|||||||
itt3030_state(const machine_config &mconfig, device_type type, const char *tag)
|
itt3030_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag)
|
: driver_device(mconfig, type, tag)
|
||||||
, m_maincpu(*this, "maincpu")
|
, m_maincpu(*this, "maincpu")
|
||||||
|
, m_ram(*this, "mainram")
|
||||||
, m_crtc(*this, "crt5027")
|
, m_crtc(*this, "crt5027")
|
||||||
|
, m_48kbank(*this, "lowerbank")
|
||||||
, m_fdc (*this, "fdc")
|
, m_fdc (*this, "fdc")
|
||||||
, m_floppy0(*this, "fdc:0")
|
, m_floppy0(*this, "fdc:0")
|
||||||
, m_floppy1(*this, "fdc:1")
|
, m_floppy1(*this, "fdc:1")
|
||||||
, m_beep(*this, "beeper")
|
, m_beep(*this, "beeper")
|
||||||
|
, m_vram(*this, "vram")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
// devices
|
// devices
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_device<ram_device> m_ram;
|
||||||
required_device<crt5027_device> m_crtc;
|
required_device<crt5027_device> m_crtc;
|
||||||
|
required_device<address_map_bank_device> m_48kbank;
|
||||||
required_device<fd1791_t> m_fdc;
|
required_device<fd1791_t> m_fdc;
|
||||||
required_device<floppy_connector> m_floppy0;
|
required_device<floppy_connector> m_floppy0;
|
||||||
required_device<floppy_connector> m_floppy1;
|
required_device<floppy_connector> m_floppy1;
|
||||||
required_device<beep_device> m_beep;
|
required_device<beep_device> m_beep;
|
||||||
|
|
||||||
|
// shared pointers
|
||||||
|
required_shared_ptr<UINT8> m_vram;
|
||||||
|
|
||||||
// screen updates
|
// screen updates
|
||||||
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
@ -236,11 +245,16 @@ public:
|
|||||||
DECLARE_READ8_MEMBER(vsync_r);
|
DECLARE_READ8_MEMBER(vsync_r);
|
||||||
DECLARE_READ8_MEMBER(unk2_r);
|
DECLARE_READ8_MEMBER(unk2_r);
|
||||||
DECLARE_WRITE8_MEMBER( beep_w );
|
DECLARE_WRITE8_MEMBER( beep_w );
|
||||||
|
DECLARE_WRITE8_MEMBER(bank_w);
|
||||||
|
DECLARE_READ8_MEMBER(bankl_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(bankl_w);
|
||||||
|
DECLARE_READ8_MEMBER(bankh_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(bankh_w);
|
||||||
DECLARE_FLOPPY_FORMATS(itt3030_floppy_formats);
|
DECLARE_FLOPPY_FORMATS(itt3030_floppy_formats);
|
||||||
private:
|
private:
|
||||||
UINT8 m_unk;
|
UINT8 m_unk;
|
||||||
|
UINT8 m_bank;
|
||||||
floppy_image_device *m_floppy;
|
floppy_image_device *m_floppy;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void itt3030_state::video_start()
|
void itt3030_state::video_start()
|
||||||
@ -263,6 +277,45 @@ WRITE8_MEMBER( itt3030_state::beep_w )
|
|||||||
m_beep->set_state(data&0x32);
|
m_beep->set_state(data&0x32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(itt3030_state::bank_w)
|
||||||
|
{
|
||||||
|
int bank;
|
||||||
|
m_bank = data>>4;
|
||||||
|
|
||||||
|
if (data & 1) // bank 8
|
||||||
|
{
|
||||||
|
bank = 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bank = m_bank >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf("bank_w: new value %02x, m_bank %x, bank %x\n", data, m_bank, bank);
|
||||||
|
|
||||||
|
m_48kbank->set_bank(bank);
|
||||||
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER(itt3030_state::bankl_r)
|
||||||
|
{
|
||||||
|
return m_ram->read(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(itt3030_state::bankl_w)
|
||||||
|
{
|
||||||
|
m_ram->write(offset, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER(itt3030_state::bankh_r)
|
||||||
|
{
|
||||||
|
return m_ram->read(((m_bank>>1)*0x10000) + offset + 0xc000);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(itt3030_state::bankh_w)
|
||||||
|
{
|
||||||
|
m_ram->write(((m_bank>>1)*0x10000) + offset + 0xc000, data);
|
||||||
|
}
|
||||||
|
|
||||||
UINT32 itt3030_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
UINT32 itt3030_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||||
@ -271,7 +324,7 @@ UINT32 itt3030_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap
|
|||||||
{
|
{
|
||||||
for(int x = 0; x < 80; x++ )
|
for(int x = 0; x < 80; x++ )
|
||||||
{
|
{
|
||||||
UINT8 code = space.read_byte(0x3000 + x + y*128);
|
UINT8 code = m_vram[0x3000 + x + y*128];
|
||||||
drawgfx_opaque(bitmap, cliprect, machine().gfx[0], code , 0, 0,0, x*8,y*16);
|
drawgfx_opaque(bitmap, cliprect, machine().gfx[0], code , 0, 0,0, x*8,y*16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -279,12 +332,24 @@ UINT32 itt3030_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The lower 48K is switchable among the first 48K of each of 8 64K banks numbered 0-7 or "bank 8" which is the internal ROM and VRAM
|
||||||
|
// The upper 16K is always the top 16K of the selected bank 0-7, which allows bank/bank copies and such
|
||||||
|
// Port F6 bits 7-5 select banks 0-7, bit 4 enables bank 8
|
||||||
|
|
||||||
static ADDRESS_MAP_START( itt3030_map, AS_PROGRAM, 8, itt3030_state )
|
static ADDRESS_MAP_START( itt3030_map, AS_PROGRAM, 8, itt3030_state )
|
||||||
AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION("maincpu", 0)
|
AM_RANGE(0x0000, 0xbfff) AM_DEVICE("lowerbank", address_map_bank_device, amap8)
|
||||||
AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("maincpu", 0)
|
AM_RANGE(0xc000, 0xffff) AM_READWRITE(bankh_r, bankh_w)
|
||||||
AM_RANGE(0x1000, 0xffff) AM_RAM
|
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( lower48_map, AS_PROGRAM, 8, itt3030_state )
|
||||||
|
AM_RANGE(0x00000, 0x7ffff) AM_READWRITE(bankl_r, bankl_w) // pages 0-7
|
||||||
|
// AM_RANGE(0x00000, 0x7ffff) AM_DEVREADWRITE("mainram", ram_device, read, write) // should work in theory, but compiler blows up spectacularly?
|
||||||
|
AM_RANGE(0x80000, 0x807ff) AM_ROM AM_REGION("maincpu", 0) // begin "page 8"
|
||||||
|
AM_RANGE(0x80800, 0x80fff) AM_ROM AM_REGION("maincpu", 0)
|
||||||
|
AM_RANGE(0x81000, 0x810ff) AM_RAM AM_MIRROR(0x100) // only 256 bytes, but ROM also clears 11xx?
|
||||||
|
AM_RANGE(0x83000, 0x83fff) AM_RAM AM_SHARE("vram")
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START( itt3030_io, AS_IO, 8, itt3030_state )
|
static ADDRESS_MAP_START( itt3030_io, AS_IO, 8, itt3030_state )
|
||||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||||
@ -293,7 +358,7 @@ static ADDRESS_MAP_START( itt3030_io, AS_IO, 8, itt3030_state )
|
|||||||
AM_RANGE(0x32, 0x32) AM_WRITE(beep_w)
|
AM_RANGE(0x32, 0x32) AM_WRITE(beep_w)
|
||||||
AM_RANGE(0x35, 0x35) AM_READ(vsync_r)
|
AM_RANGE(0x35, 0x35) AM_READ(vsync_r)
|
||||||
AM_RANGE(0x50, 0x55) AM_DEVREADWRITE("fdc", fd1791_t, read, write)
|
AM_RANGE(0x50, 0x55) AM_DEVREADWRITE("fdc", fd1791_t, read, write)
|
||||||
|
AM_RANGE(0xf6, 0xf6) AM_WRITE(bank_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static INPUT_PORTS_START( itt3030 )
|
static INPUT_PORTS_START( itt3030 )
|
||||||
@ -322,6 +387,8 @@ void itt3030_state::machine_start()
|
|||||||
|
|
||||||
void itt3030_state::machine_reset()
|
void itt3030_state::machine_reset()
|
||||||
{
|
{
|
||||||
|
m_bank = 1;
|
||||||
|
m_48kbank->set_bank(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
FLOPPY_FORMATS_MEMBER( itt3030_state::itt3030_floppy_formats )
|
FLOPPY_FORMATS_MEMBER( itt3030_state::itt3030_floppy_formats )
|
||||||
@ -356,6 +423,11 @@ static MACHINE_CONFIG_START( itt3030, itt3030_state )
|
|||||||
MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*16-1)
|
MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*16-1)
|
||||||
|
|
||||||
/* devices */
|
/* devices */
|
||||||
|
MCFG_DEVICE_ADD("lowerbank", ADDRESS_MAP_BANK, 0)
|
||||||
|
MCFG_DEVICE_PROGRAM_MAP(lower48_map)
|
||||||
|
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
|
||||||
|
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
|
||||||
|
MCFG_ADDRESS_MAP_BANK_STRIDE(0x10000)
|
||||||
MCFG_DEVICE_ADD("crt5027", CRT5027, XTAL_6MHz)
|
MCFG_DEVICE_ADD("crt5027", CRT5027, XTAL_6MHz)
|
||||||
MCFG_DEVICE_CONFIG(crtc_intf)
|
MCFG_DEVICE_CONFIG(crtc_intf)
|
||||||
MCFG_FD1791x_ADD("fdc", XTAL_20MHz / 20)
|
MCFG_FD1791x_ADD("fdc", XTAL_20MHz / 20)
|
||||||
@ -368,6 +440,10 @@ static MACHINE_CONFIG_START( itt3030, itt3030_state )
|
|||||||
MCFG_PALETTE_LENGTH(2)
|
MCFG_PALETTE_LENGTH(2)
|
||||||
MCFG_PALETTE_INIT_OVERRIDE(driver_device, black_and_white)
|
MCFG_PALETTE_INIT_OVERRIDE(driver_device, black_and_white)
|
||||||
|
|
||||||
|
/* internal ram */
|
||||||
|
MCFG_RAM_ADD("mainram")
|
||||||
|
MCFG_RAM_DEFAULT_SIZE("512K")
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO( "mono" )
|
MCFG_SPEAKER_STANDARD_MONO( "mono" )
|
||||||
MCFG_SOUND_ADD( "beeper", BEEP, 0 )
|
MCFG_SOUND_ADD( "beeper", BEEP, 0 )
|
||||||
|
Loading…
Reference in New Issue
Block a user