summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/pc_t1t.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/pc_t1t.cpp')
-rw-r--r--src/mame/video/pc_t1t.cpp168
1 files changed, 89 insertions, 79 deletions
diff --git a/src/mame/video/pc_t1t.cpp b/src/mame/video/pc_t1t.cpp
index b5931d4daba..8c7b2fafdfd 100644
--- a/src/mame/video/pc_t1t.cpp
+++ b/src/mame/video/pc_t1t.cpp
@@ -49,13 +49,14 @@ pc_t1t_device::pc_t1t_device(const machine_config &mconfig, device_type type, co
m_display_enable(0),
m_vsync(0),
m_palette_base(0),
- m_palette(*this,"palette")
+ m_palette(*this,"palette"),
+ m_ram(*this, ":" RAM_TAG),
+ m_vram(*this, "vram")
{
}
pcvideo_t1000_device::pcvideo_t1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : pc_t1t_device(mconfig, PCVIDEO_T1000, "Tandy 1000 Graphics Adapter", tag, owner, clock, "tandy_1000_graphics_adapter", __FILE__),
- m_t1_displayram(nullptr)
+ : pc_t1t_device(mconfig, PCVIDEO_T1000, "Tandy 1000 Graphics Adapter", tag, owner, clock, "tandy_1000_graphics_adapter", __FILE__)
{
}
@@ -68,24 +69,35 @@ pcvideo_pcjr_device::pcvideo_pcjr_device(const machine_config &mconfig, const ch
void pcvideo_t1000_device::device_start()
{
+ if(!m_ram->started())
+ throw device_missing_dependencies();
m_chr_gen = machine().root_device().memregion("gfx1")->base();
m_bank = 0;
m_chr_size = 1;
m_ra_offset = 256;
+ m_vram->space(AS_0).install_ram(0, 128*1024 - 1, m_ram->pointer());
}
void pcvideo_pcjr_device::device_start()
{
+ if(!m_ram->started())
+ throw device_missing_dependencies();
m_chr_gen = machine().root_device().memregion("gfx1")->base();
m_bank = 0;
m_mode_control = 0x08;
m_chr_size = 8;
m_ra_offset = 1;
if(!strncmp(machine().system().name, "ibmpcjx", 7))
+ {
m_jxkanji = machine().root_device().memregion("kanji")->base();
+ m_vram->space(AS_0).install_ram(0, 128*1024 - 1, memshare(":vram")->ptr()); // TODO: fix when this is really understood
+ }
else
+ {
m_jxkanji = nullptr;
+ m_vram->space(AS_0).install_ram(0, 128*1024 - 1, m_ram->pointer());
+ }
}
@@ -95,6 +107,11 @@ void pcvideo_pcjr_device::device_start()
***************************************************************************/
+static ADDRESS_MAP_START(vram_map, AS_0, 8, pcvideo_t1000_device)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x20000, 0x3ffff) AM_NOP
+ADDRESS_MAP_END
+
MACHINE_CONFIG_FRAGMENT( pcvideo_t1000 )
MCFG_SCREEN_ADD(T1000_SCREEN_NAME, RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200)
@@ -109,6 +126,13 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_t1000 )
MCFG_MC6845_UPDATE_ROW_CB(pc_t1t_device, crtc_update_row)
MCFG_MC6845_OUT_DE_CB(WRITELINE(pc_t1t_device, t1000_de_changed))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(pcvideo_t1000_device, t1000_vsync_changed))
+
+ MCFG_DEVICE_ADD("vram", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(vram_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(18)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
MACHINE_CONFIG_END
machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() const
@@ -116,7 +140,6 @@ machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() cons
return MACHINE_CONFIG_NAME( pcvideo_t1000 );
}
-
MACHINE_CONFIG_FRAGMENT( pcvideo_pcjr )
MCFG_SCREEN_ADD(T1000_SCREEN_NAME, RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200)
@@ -131,6 +154,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_pcjr )
MCFG_MC6845_UPDATE_ROW_CB(pcvideo_pcjr_device, crtc_update_row)
MCFG_MC6845_OUT_DE_CB(WRITELINE(pc_t1t_device, t1000_de_changed))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(pcvideo_pcjr_device, pcjr_vsync_changed))
+ MCFG_DEVICE_ADD("vram", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(vram_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(18)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
MACHINE_CONFIG_END
machine_config_constructor pcvideo_pcjr_device::device_mconfig_additions() const
@@ -474,22 +503,6 @@ MC6845_UPDATE_ROW( pcvideo_pcjr_device::crtc_update_row )
}
-READ8_MEMBER( pcvideo_t1000_device::videoram_r )
-{
- UINT8 *videoram = m_t1_displayram;
- int data = 0xff;
- if( videoram )
- data = videoram[offset];
- return data;
-}
-
-WRITE8_MEMBER( pcvideo_t1000_device::videoram_w )
-{
- UINT8 *videoram = m_t1_displayram;
- if( videoram )
- videoram[offset] = data;
-}
-
void pcvideo_t1000_device::mode_switch( void )
{
switch( m_mode_control & 0x3B )
@@ -798,78 +811,66 @@ int pc_t1t_device::vga_data_r(void)
*/
void pcvideo_t1000_device::bank_w(int data)
{
- if (m_bank != data)
+ int dram, vram;
+ if ((data&0xc0)==0xc0) /* needed for lemmings */
{
- UINT8 *ram = machine().root_device().memregion("maincpu")->base();
- int dram, vram;
- m_bank = data;
- /* it seems the video ram is mapped to the last 128K of main memory */
-#if 1
- if ((data&0xc0)==0xc0) /* needed for lemmings */
- {
- dram = 0x80000 + ((data & 0x06) << 14);
- vram = 0x80000 + ((data & 0x30) << (14-3));
- }
- else
- {
- dram = 0x80000 + ((data & 0x07) << 14);
- vram = 0x80000 + ((data & 0x38) << (14-3));
- }
-#else
- dram = (data & 0x07) << 14;
- vram = (data & 0x38) << (14-3);
-#endif
- m_t1_displayram = &ram[vram];
- m_displayram = &ram[dram];
- mode_switch();
+ dram = (m_bank & 0x06);// | ((m_bank & 0x1800) >> 8);
+ vram = ((m_bank & 0x30) >> 3);// | ((m_bank & 0x6000) >> 10);
+ }
+ else
+ {
+ dram = (m_bank & 0x07);// | ((m_bank & 0x1800) >> 8);
+ vram = ((m_bank & 0x38) >> 3);// | ((m_bank & 0x6000) >> 10);
}
+ m_displayram = m_ram->pointer() + (dram << 14);
+ if(m_disable)
+ return;
+ m_vram->set_bank(vram);
+ if((m_bank & 0xc0) != (data & 0xc0))
+ mode_switch();
}
void pcvideo_pcjr_device::pc_pcjr_bank_w(int data)
{
- if (m_bank != data)
+ int dram, vram;
+ m_bank = data;
+ /* it seems the video ram is mapped to the last 128K of main memory */
+ if ((data&0xc0)==0xc0) /* needed for lemmings */
{
- int dram, vram;
- m_bank = data;
- /* it seems the video ram is mapped to the last 128K of main memory */
- if ((data&0xc0)==0xc0) /* needed for lemmings */
- {
- dram = ((data & 0x06) << 14);
- vram = ((data & 0x30) << (14-3));
- }
- else
- {
- dram = ((data & 0x07) << 14);
- vram = ((data & 0x38) << (14-3));
- }
- machine().root_device().membank( "bank14" )->set_base( machine().device<ram_device>(RAM_TAG)->pointer() + vram );
- m_displayram = machine().device<ram_device>(RAM_TAG)->pointer() + dram;
- pc_pcjr_mode_switch();
+ dram = (data & 0x06);
+ vram = (data & 0x30) >> 3;
}
+ else
+ {
+ dram = (data & 0x07);
+ vram = (data & 0x38) >> 3;
+ }
+ m_vram->set_bank(vram);
+ m_displayram = m_ram->pointer() + (dram << 14);
+ if((m_bank & 0xc0) != (data & 0xc0))
+ pc_pcjr_mode_switch();
}
void pcvideo_pcjr_device::pc_pcjx_bank_w(int data)
{
- if (m_bank != data)
+ int dram, vram;
+ m_bank = data;
+ if ((data&0xc0)==0xc0) /* needed for lemmings */
{
- int dram, vram;
- m_bank = data;
- /* this probably isn't right, but otherwise the memory test stomps on the vram */
- if ((data&0xc0)==0xc0) /* needed for lemmings */
- {
- dram = 0x80000 + ((data & 0x06) << 14);
- vram = 0x80000 + ((data & 0x30) << (14-3));
- }
- else
- {
- dram = 0x80000 + ((data & 0x07) << 14);
- vram = 0x80000 + ((data & 0x38) << (14-3));
- }
- machine().root_device().membank( "bank14" )->set_base( machine().device<ram_device>(RAM_TAG)->pointer() + vram );
- m_displayram = machine().device<ram_device>(RAM_TAG)->pointer() + dram;
- pc_pcjr_mode_switch();
+ dram = (data & 0x06);
+ vram = (data & 0x30) >> 3;
+ }
+ else
+ {
+ dram = (data & 0x07);
+ vram = (data & 0x38) >> 3;
}
+ m_vram->set_bank(vram);
+ /* this certainly isn't correct but otherwise the memory test stomps on the vram */
+ m_displayram = (UINT8 *)memshare(":vram")->ptr() + (dram << 14);
+ if((m_bank & 0xc0) != (data & 0xc0))
+ pc_pcjr_mode_switch();
}
int pc_t1t_device::bank_r(void)
@@ -909,17 +910,19 @@ WRITE8_MEMBER( pcvideo_t1000_device::write )
case 12:
break;
case 13:
+ m_bank = (data << 8) | (m_bank & 0xff);
+ bank_w(m_bank);
break;
case 14:
vga_data_w(data);
break;
case 15:
+ m_bank = (m_bank & 0xff00) | data;
bank_w(data);
break;
}
}
-
WRITE8_MEMBER( pcvideo_pcjr_device::write )
{
switch( offset )
@@ -1005,7 +1008,6 @@ READ8_MEMBER( pc_t1t_device::read )
return data;
}
-
WRITE_LINE_MEMBER( pc_t1t_device::t1000_de_changed )
{
m_display_enable = state ? 1 : 0;
@@ -1021,6 +1023,14 @@ WRITE_LINE_MEMBER( pcvideo_t1000_device::t1000_vsync_changed )
}
}
+WRITE_LINE_MEMBER( pcvideo_t1000_device::disable_w )
+{
+ if(state)
+ m_vram->set_bank(8);
+ else
+ bank_w(m_bank);
+ m_disable = state ? true : false;
+}
WRITE_LINE_MEMBER( pcvideo_pcjr_device::pcjr_vsync_changed )
{