summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/video/pc_t1t.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/video/pc_t1t.c')
-rw-r--r--src/mess/video/pc_t1t.c1033
1 files changed, 0 insertions, 1033 deletions
diff --git a/src/mess/video/pc_t1t.c b/src/mess/video/pc_t1t.c
deleted file mode 100644
index e77c5339bd0..00000000000
--- a/src/mess/video/pc_t1t.c
+++ /dev/null
@@ -1,1033 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
-/***************************************************************************
-
- IBM PC junior
- Tandy 1000 Graphics Adapter (T1T) section
-
- Note that in the IBM PC Junior world, the term 'vga' is not the 'vga' that
- most people think of
-
-***************************************************************************/
-
-#include "emu.h"
-#include "pc_t1t.h"
-#include "machine/pic8259.h"
-#include "machine/ram.h"
-
-enum
-{
- T1000_TEXT_INTEN = 0,
- T1000_TEXT_BLINK,
- T1000_GFX_1BPP,
- T1000_GFX_2BPP,
- T1000_GFX_4BPP,
- T1000_GFX_2BPP_TGA,
- PCJX_TEXT,
- PCJR_GFX_2BPP_HIGH
-};
-
-
-const device_type PCVIDEO_T1000 = &device_creator<pcvideo_t1000_device>;
-const device_type PCVIDEO_PCJR = &device_creator<pcvideo_pcjr_device>;
-
-pc_t1t_device::pc_t1t_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_video_interface(mconfig, *this),
- m_mc6845(*this, T1000_MC6845_NAME),
- m_mode_control(0),
- m_color_select(0),
- m_status(0),
- m_bank(0),
- m_pc_framecnt(0),
- m_displayram(NULL),
- m_chr_gen(NULL),
- m_chr_size(0),
- m_ra_offset(0),
- m_address_data_ff(0),
- m_update_row_type(-1),
- m_display_enable(0),
- m_vsync(0),
- m_palette_base(0),
- m_palette(*this,"palette")
-{
-}
-
-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(NULL)
-{
-}
-
-pcvideo_pcjr_device::pcvideo_pcjr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : pc_t1t_device(mconfig, PCVIDEO_PCJR, "PC Jr Graphics Adapter", tag, owner, clock, "pcjr_graphics_adapter", __FILE__),
- m_jxkanji(NULL)
-{
-}
-
-
-void pcvideo_t1000_device::device_start()
-{
- m_chr_gen = machine().root_device().memregion("gfx1")->base();
- m_bank = 0;
- m_chr_size = 1;
- m_ra_offset = 256;
-}
-
-
-void pcvideo_pcjr_device::device_start()
-{
- 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();
- else
- m_jxkanji = NULL;
-}
-
-
-/***************************************************************************
-
- Static declarations
-
-***************************************************************************/
-
-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)
- MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update )
-
- MCFG_PALETTE_ADD( "palette", 32 )
- MCFG_PALETTE_INIT_OWNER(pc_t1t_device, pcjr)
-
- MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/8)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(8)
- 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))
-MACHINE_CONFIG_END
-
-machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() const
-{
- 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)
- MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update )
-
- MCFG_PALETTE_ADD( "palette", 32 )
- MCFG_PALETTE_INIT_OWNER(pc_t1t_device, pcjr)
-
- MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/16)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(8)
- 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))
-MACHINE_CONFIG_END
-
-machine_config_constructor pcvideo_pcjr_device::device_mconfig_additions() const
-{
- return MACHINE_CONFIG_NAME( pcvideo_pcjr );
-}
-
-
-/***************************************************************************
-
- Methods
-
-***************************************************************************/
-
-/* Initialise the cga palette */
-PALETTE_INIT_MEMBER( pc_t1t_device, pcjr )
-{
- const static unsigned char tga_palette[16][3] =
- {
- { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0xaa }, { 0x00, 0xaa, 0x00 }, { 0x00, 0xaa, 0xaa },
- { 0xaa, 0x00, 0x00 }, { 0xaa, 0x00, 0xaa }, { 0xaa, 0x55, 0x00 }, { 0xaa, 0xaa, 0xaa },
- { 0x55, 0x55, 0x55 }, { 0x55, 0x55, 0xff }, { 0x55, 0xff, 0x55 }, { 0x55, 0xff, 0xff },
- { 0xff, 0x55, 0x55 }, { 0xff, 0x55, 0xff }, { 0xff, 0xff, 0x55 }, { 0xff, 0xff, 0xff }
- };
- int i;
-
- /* colors */
- for(i = 0; i < 16; i++)
- palette.set_pen_color(i, tga_palette[i][0], tga_palette[i][1], tga_palette[i][2]);
-
- /* b/w mode shades */
- for(i = 0; i < 16; i++)
- palette.set_pen_color(16+i, ( i << 4 ) | i, ( i << 4 ) | i, ( i << 4 ) | i );
-}
-
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_text_inten_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- int i;
-
- if ( y == 0 ) logerror("t1000_text_inten_update_row\n");
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = m_displayram[ offset ];
- UINT8 attr = m_displayram[ offset +1 ];
- UINT8 data = m_chr_gen[ chr * m_chr_size + ra * m_ra_offset ];
- UINT16 fg = m_palette_base + ( attr & 0x0F );
- UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
-
- if ( i == cursor_x && ( m_pc_framecnt & 0x08 ) )
- {
- data = 0xFF;
- }
-
- *p = palette[( data & 0x80 ) ? fg : bg]; p++;
- *p = palette[( data & 0x40 ) ? fg : bg]; p++;
- *p = palette[( data & 0x20 ) ? fg : bg]; p++;
- *p = palette[( data & 0x10 ) ? fg : bg]; p++;
- *p = palette[( data & 0x08 ) ? fg : bg]; p++;
- *p = palette[( data & 0x04 ) ? fg : bg]; p++;
- *p = palette[( data & 0x02 ) ? fg : bg]; p++;
- *p = palette[( data & 0x01 ) ? fg : bg]; p++;
- }
-}
-
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_text_blink_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- int i;
-
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = m_displayram[ offset ];
- UINT8 attr = m_displayram[ offset +1 ];
- UINT8 data = m_chr_gen[ chr * m_chr_size + ra * m_ra_offset ];
- UINT16 fg = m_palette_base + ( attr & 0x0F );
- UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
-
- if ( i == cursor_x )
- {
- if ( m_pc_framecnt & 0x08 )
- {
- data = 0xFF;
- }
- }
- else
- {
- if ( ( attr & 0x80 ) && ( m_pc_framecnt & 0x10 ) )
- {
- data = 0x00;
- }
- }
-
- *p = palette[( data & 0x80 ) ? fg : bg]; p++;
- *p = palette[( data & 0x40 ) ? fg : bg]; p++;
- *p = palette[( data & 0x20 ) ? fg : bg]; p++;
- *p = palette[( data & 0x10 ) ? fg : bg]; p++;
- *p = palette[( data & 0x08 ) ? fg : bg]; p++;
- *p = palette[( data & 0x04 ) ? fg : bg]; p++;
- *p = palette[( data & 0x02 ) ? fg : bg]; p++;
- *p = palette[( data & 0x01 ) ? fg : bg]; p++;
- }
-}
-
-MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjx_text_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- int i;
-
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = m_displayram[ offset ];
- UINT8 attr = m_displayram[ offset +1 ];
- UINT16 fg = m_palette_base + ( attr & 0x07 );
- UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
- UINT16 code = chr & 0x1f;
- if((attr & 0x88) == 0x88)
- {
- code = m_displayram[ offset - 2 ] & 0x1f;
- code = (code << 8) + chr;
- }
- else if(attr & 0x80)
- code = (code << 8) + m_displayram[ offset + 2 ];
- else
- code = chr;
-
- UINT8 data;
- if(ra < 16)
- data = m_jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
- else
- data = ((i == cursor_x) && (m_pc_framecnt & 8)) ? 0xff: 0;
-
- *p = palette[( data & 0x80 ) ? fg : bg]; p++;
- *p = palette[( data & 0x40 ) ? fg : bg]; p++;
- *p = palette[( data & 0x20 ) ? fg : bg]; p++;
- *p = palette[( data & 0x10 ) ? fg : bg]; p++;
- *p = palette[( data & 0x08 ) ? fg : bg]; p++;
- *p = palette[( data & 0x04 ) ? fg : bg]; p++;
- *p = palette[( data & 0x02 ) ? fg : bg]; p++;
- *p = palette[( data & 0x01 ) ? fg : bg]; p++;
- }
-}
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_4bpp_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = m_displayram + ( ra << 13 );
- int i;
-
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
- UINT8 data = vid[ offset ];
-
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
-
- data = vid[ offset + 1 ];
-
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
- *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
- }
-}
-
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_2bpp_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = m_displayram + ( ra << 13 );
- int i;
-
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
- UINT8 data = vid[ offset ];
-
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
-
- data = vid[ offset+1 ];
-
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
- }
-}
-
-
-MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjr_gfx_2bpp_high_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = m_displayram + ( ra << 13 );
- int i;
-
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
- UINT8 data0 = vid[ offset ];
- UINT8 data1 = vid[ offset + 1 ];
-
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x80 ) >> 7 ) | ( ( data1 & 0x80 ) >> 6 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x40 ) >> 6 ) | ( ( data1 & 0x40 ) >> 5 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x20 ) >> 5 ) | ( ( data1 & 0x20 ) >> 4 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x10 ) >> 4 ) | ( ( data1 & 0x10 ) >> 3 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x08 ) >> 3 ) | ( ( data1 & 0x08 ) >> 2 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x04 ) >> 2 ) | ( ( data1 & 0x04 ) >> 1 ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x02 ) >> 1 ) | ( ( data1 & 0x02 ) ) ) ]]; p++;
- *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x01 ) ) | ( ( data1 & 0x01 ) << 1 ) ) ]]; p++;
- }
-}
-
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_2bpp_tga_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = m_displayram + ( ra << 13 );
- int i;
-
- if ( y == 0 ) logerror("t1000_gfx_2bpp_tga_update_row\n");
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
- UINT8 data = vid[ offset ];
- UINT16 data2 = ( vid[ offset + 1 ] ) << 1;
-
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x100 ) | ( data & 0x80 ) ) >> 7 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x80 ) | ( data & 0x40 ) ) >> 6 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x40 ) | ( data & 0x20 ) ) >> 5 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x20 ) | ( data & 0x10 ) ) >> 4 ) ]]; p++;
-
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x10 ) | ( data & 0x08 ) ) >> 3 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x08 ) | ( data & 0x04 ) ) >> 2 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x04 ) | ( data & 0x02 ) ) >> 1 ) ]]; p++;
- *p = palette[m_reg.data[ 0x10 + ( ( data2 & 0x02 ) | ( data & 0x01 ) ) ]]; p++;
- }
-}
-
-
-MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_1bpp_update_row )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = m_displayram + ( ra << 13 );
- UINT8 fg = m_palette_base + m_reg.data[0x11];
- UINT8 bg = m_palette_base + m_reg.data[0x10];
- int i;
-
- if ( y == 0 ) logerror("t1000_gfx_1bpp_update_row\n");
- for ( i = 0; i < x_count; i++ )
- {
- UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
- UINT8 data = vid[ offset ];
-
- *p = palette[( data & 0x80 ) ? fg : bg]; p++;
- *p = palette[( data & 0x40 ) ? fg : bg]; p++;
- *p = palette[( data & 0x20 ) ? fg : bg]; p++;
- *p = palette[( data & 0x10 ) ? fg : bg]; p++;
- *p = palette[( data & 0x08 ) ? fg : bg]; p++;
- *p = palette[( data & 0x04 ) ? fg : bg]; p++;
- *p = palette[( data & 0x02 ) ? fg : bg]; p++;
- *p = palette[( data & 0x01 ) ? fg : bg]; p++;
-
- data = vid[ offset + 1 ];
-
- *p = palette[( data & 0x80 ) ? fg : bg]; p++;
- *p = palette[( data & 0x40 ) ? fg : bg]; p++;
- *p = palette[( data & 0x20 ) ? fg : bg]; p++;
- *p = palette[( data & 0x10 ) ? fg : bg]; p++;
- *p = palette[( data & 0x08 ) ? fg : bg]; p++;
- *p = palette[( data & 0x04 ) ? fg : bg]; p++;
- *p = palette[( data & 0x02 ) ? fg : bg]; p++;
- *p = palette[( data & 0x01 ) ? fg : bg]; p++;
- }
-}
-
-MC6845_UPDATE_ROW( pc_t1t_device::crtc_update_row )
-{
- if (m_update_row_type == -1)
- return;
-
- switch (m_update_row_type)
- {
- case T1000_TEXT_INTEN:
- t1000_text_inten_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case T1000_TEXT_BLINK:
- t1000_text_blink_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case T1000_GFX_1BPP:
- t1000_gfx_1bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case T1000_GFX_2BPP:
- t1000_gfx_2bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case T1000_GFX_2BPP_TGA:
- t1000_gfx_2bpp_tga_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case T1000_GFX_4BPP:
- t1000_gfx_4bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- }
-}
-
-
-MC6845_UPDATE_ROW( pcvideo_pcjr_device::crtc_update_row )
-{
- if (m_update_row_type == -1)
- return;
-
- switch (m_update_row_type)
- {
- case PCJX_TEXT:
- pcjx_text_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- case PCJR_GFX_2BPP_HIGH:
- pcjr_gfx_2bpp_high_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- default:
- pc_t1t_device::crtc_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
- break;
- }
-}
-
-
-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 )
- {
- case 0x08: case 0x09:
- m_update_row_type = T1000_TEXT_INTEN;
- break;
- case 0x28: case 0x29:
- m_update_row_type = T1000_TEXT_BLINK;
- break;
- case 0x0A: case 0x0B: case 0x2A: case 0x2B:
- switch( m_bank & 0xc0 )
- {
- case 0x00:
- case 0x40:
- //logerror("t1t_gfx_2bpp - 1\n");
- m_update_row_type = T1000_GFX_2BPP;
- if ( m_color_select )
- {
- m_reg.data[0x10] = 0x00;
- m_reg.data[0x11] = 0x0B;
- m_reg.data[0x12] = 0x0D;
- m_reg.data[0x13] = 0x0F;
- }
- else
- {
- m_reg.data[0x10] = 0x00;
- m_reg.data[0x11] = 0x0A;
- m_reg.data[0x12] = 0x0C;
- m_reg.data[0x13] = 0x0E;
- }
- break;
- case 0x80:
- case 0xc0:
- //logerror("t1t_gfx_4bpp\n");
- m_update_row_type = T1000_GFX_4BPP;
- break;
- }
- break;
- case 0x18: case 0x19: case 0x1A: case 0x1B:
- case 0x38: case 0x39: case 0x3A: case 0x3B:
- switch( m_bank & 0xc0 )
- {
- case 0x00:
- case 0x40:
- //logerror("t1t_gfx_1bpp\n");
- m_update_row_type = T1000_GFX_1BPP;
- break;
- case 0x80:
- case 0xc0:
- //logerror("t1t_gfx_2bpp - 2\n");
- m_update_row_type = T1000_GFX_2BPP_TGA;
- break;
- }
- break;
- default:
- m_update_row_type = -1;
- break;
- }
-}
-
-
-/* mode control 1 ( m_reg.data[0] ) */
-/* bit0 - 0 = low bandwidth, 1 = high bandwidth */
-/* bit1 - 0 = alpha, 1 = graphics */
-/* bit2 - 0 = color, 1 = b/w */
-/* bit3 - 0 = video disable, 1 = video enable */
-/* bit4 - 1 = 16 color graphics */
-/* mode control 2 ( m_reg.data[3] ) */
-/* bit1 - 1 = enable blink */
-/* bit3 - 1 = 2 color graphics */
-
-void pcvideo_pcjr_device::pc_pcjr_mode_switch()
-{
- switch( m_reg.data[0] & 0x1A )
- {
- case 0x08: /* 01x0x */
- if(m_jxkanji)
- {
- m_update_row_type = PCJX_TEXT;
- break;
- }
- if ( m_reg.data[3] & 0x02 )
- {
- m_update_row_type = T1000_TEXT_BLINK;
- }
- else
- {
- m_update_row_type = T1000_TEXT_INTEN;
- }
- break;
- case 0x0A: /* 01x1x */
- /* By default use medium resolution mode */
- m_update_row_type = T1000_GFX_2BPP;
-
- /* Check for high resolution mode */
- if ( ( m_bank & 0xc0 ) == 0xc0 )
- m_update_row_type = PCJR_GFX_2BPP_HIGH;
-
- /* Check for 640x200 b/w 2 shades mode */
- if ( ( m_reg.data[0] & 0x04 ) && ( m_reg.data[3] & 0x08 ) )
- {
- m_update_row_type = T1000_GFX_1BPP;
- }
- break;
- case 0x18: /* 11x0x - invalid?? */
- m_update_row_type = -1;
- break;
- case 0x1A: /* 11x1x */
- m_update_row_type = T1000_GFX_4BPP;
- break;
- default:
- m_update_row_type = -1;
- break;
- }
-
- /* Determine mc6845 input clock */
- if ( m_reg.data[0] & 0x01 )
- {
- m_mc6845->set_clock( XTAL_14_31818MHz/8 );
- }
- else
- {
- m_mc6845->set_clock( XTAL_14_31818MHz/16 );
- }
-
- /* color or b/w? */
- m_palette_base = ( m_reg.data[0] & 0x04 ) ? 16 : 0;
-}
-
-
-/*
- * 3d8 rW T1T mode control register (see #P138)
- */
-void pcvideo_t1000_device::mode_control_w(int data)
-{
- m_mode_control = data;
-
- mode_switch();
-}
-
-int pc_t1t_device::mode_control_r(void)
-{
- int data = m_mode_control;
- return data;
-}
-
-/*
- * 3d9 ?W color select register on color adapter
- */
-void pc_t1t_device::color_select_w(int data)
-{
- if (m_color_select == data)
- return;
- m_color_select = data;
-}
-
-int pc_t1t_device::color_select_r(void)
-{
- int data = m_color_select;
- return data;
-}
-
-/* Bitfields for T1T status register:
- * Bit(s) Description (Table P179)
- * 7-6 not used
- * 5-4 color EGA, color ET4000: diagnose video display feedback, select
- * from color plane enable
- * 4 holds current dot being displayed
- * 3 in vertical retrace
- * 2 (CGA,color EGA) light pen switch is off
- * (MCGA,color ET4000) reserved (0)
- * 1 (CGA,color EGA) positive edge from light pen has set trigger
- * (MCGA,color ET4000) reserved (0)
- * 0 display enabled
- * =0 do not use memory
- * =1 memory access without interfering with display
- * (Genoa SuperEGA) horizontal or vertical retrace
- */
-int pc_t1t_device::status_r(void)
-{
- int data = m_vsync | m_status | m_display_enable;
- /* HACK HACK HACK */
- data |= ( m_display_enable ? 0x10 : 0x00 );
- /* end HACK */
- return data;
-}
-
-/*
- * 3db -W light pen strobe reset (on any value)
- */
-void pc_t1t_device::lightpen_strobe_w(int data)
-{
-// pc_port[0x3db] = data;
-}
-
-
-/*
- * 3da -W (mono EGA/mono VGA) feature control register
- * (see PORT 03DAh-W for details; VGA, see PORT 03CAh-R)
- */
-void pc_t1t_device::vga_index_w(int data)
-{
- m_reg.index = data;
-}
-
-void pcvideo_t1000_device::vga_data_w(int data)
-{
- m_reg.data[m_reg.index] = data;
-
- switch (m_reg.index)
- {
- case 0x00: /* mode control 1 */
- break;
- case 0x01: /* palette mask (bits 3-0) */
- break;
- case 0x02: /* border color (bits 3-0) */
- break;
- case 0x03: /* mode control 2 */
- break;
- case 0x04: /* reset register */
- break;
- /* palette array */
- case 0x10: case 0x11: case 0x12: case 0x13:
- case 0x14: case 0x15: case 0x16: case 0x17:
- case 0x18: case 0x19: case 0x1a: case 0x1b:
- case 0x1c: case 0x1d: case 0x1e: case 0x1f:
- m_reg.data[m_reg.index] = data & 0x0F;
- break;
- }
-}
-
-
-void pcvideo_pcjr_device::pc_pcjr_vga_data_w(int data)
-{
- m_reg.data[m_reg.index] = data;
-
- switch (m_reg.index)
- {
- case 0x00: /* mode control 1 */
- /* bit0 - 0 = low bandwidth, 1 = high bandwidth */
- /* bit1 - 0 = alpha, 1 = graphics */
- /* bit2 - 0 = color, 1 = b/w */
- /* bit3 - 0 = video disable, 1 = video enable */
- /* bit4 - 1 = 16 color graphics */
- pc_pcjr_mode_switch();
- break;
- case 0x01: /* palette mask (bits 3-0) */
- break;
- case 0x02: /* border color (bits 3-0) */
- break;
- case 0x03: /* mode control 2 */
- /* bit1 - 1 = enable blink */
- /* bit3 - 1 = 2 color graphics */
- pc_pcjr_mode_switch();
- break;
- case 0x04: /* reset register */
- break;
- /* palette array */
- case 0x10: case 0x11: case 0x12: case 0x13:
- case 0x14: case 0x15: case 0x16: case 0x17:
- case 0x18: case 0x19: case 0x1a: case 0x1b:
- case 0x1c: case 0x1d: case 0x1e: case 0x1f:
- m_reg.data[m_reg.index] = data & 0x0F;
- break;
- }
-}
-
-
-int pc_t1t_device::vga_data_r(void)
-{
- int data = m_reg.data[m_reg.index];
-
- switch (m_reg.index)
- {
- case 0x00: /* mode control 1 */
- break;
- case 0x01: /* palette mask (bits 3-0) */
- break;
- case 0x02: /* border color (bits 3-0) */
- break;
- case 0x03: /* mode control 2 */
- break;
- case 0x04: /* reset register */
- break;
- /* palette array */
- case 0x10: case 0x11: case 0x12: case 0x13:
- case 0x14: case 0x15: case 0x16: case 0x17:
- case 0x18: case 0x19: case 0x1a: case 0x1b:
- case 0x1c: case 0x1d: case 0x1e: case 0x1f:
- break;
- }
- return data;
-}
-
-/*
- * 3df RW display bank, access bank, mode
- * bit 0-2 Identifies the page of main memory being displayed in units of 16K.
- * 0: 0K, 1: 16K...7: 112K. In 32K modes (bits 6-7 = 2) only 0,2,4 and
- * 6 are valid, as the next page will also be used.
- * 3-5 Identifies the page of main memory that can be read/written at B8000h
- * in units of 16K. 0: 0K, 1: 16K...7: 112K. In 32K modes (bits 6-7 = 2)
- * only 0,2,4 and 6 are valid, as the next page will also be used.
- * 6-7 Display mode. 0: Text, 1: 16K graphics mode (4,5,6,8)
- * 2: 32K graphics mode (9,Ah)
- */
-void pcvideo_t1000_device::bank_w(int data)
-{
- if (m_bank != data)
- {
- 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();
- }
-}
-
-
-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 */
- {
- 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();
- }
-}
-
-void pcvideo_pcjr_device::pc_pcjx_bank_w(int data)
-{
- if (m_bank != data)
- {
- 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();
- }
-}
-
-int pc_t1t_device::bank_r(void)
-{
- return m_bank;
-}
-
-/*************************************************************************
- *
- * T1T
- * Tandy 1000 / PCjr
- *
- *************************************************************************/
-
-WRITE8_MEMBER( pcvideo_t1000_device::write )
-{
- switch( offset )
- {
- case 0: case 2: case 4: case 6:
- m_mc6845->address_w( space, offset, data );
- break;
- case 1: case 3: case 5: case 7:
- m_mc6845->register_w( space, offset, data );
- break;
- case 8:
- mode_control_w(data);
- break;
- case 9:
- color_select_w(data);
- break;
- case 10:
- vga_index_w(data);
- break;
- case 11:
- lightpen_strobe_w(data);
- break;
- case 12:
- break;
- case 13:
- break;
- case 14:
- vga_data_w(data);
- break;
- case 15:
- bank_w(data);
- break;
- }
-}
-
-
-WRITE8_MEMBER( pcvideo_pcjr_device::write )
-{
- switch( offset )
- {
- case 0: case 4:
- m_mc6845->address_w( space, offset, data );
- break;
- case 1: case 5:
- m_mc6845->register_w( space, offset, data );
- break;
- case 10:
- if ( m_address_data_ff & 0x01 )
- {
- pc_pcjr_vga_data_w( data );
- }
- else
- {
- vga_index_w( data );
- }
- m_address_data_ff ^= 0x01;
- break;
- case 11:
- lightpen_strobe_w(data);
- break;
- case 12:
- break;
- case 15:
- if(m_jxkanji)
- pc_pcjx_bank_w(data);
- else
- pc_pcjr_bank_w(data);
- break;
-
- default:
- break;
- }
-}
-
-
-READ8_MEMBER( pc_t1t_device::read )
-{
- int data = 0xff;
-
- switch( offset )
- {
- case 0: case 2: case 4: case 6:
- /* return last written mc6845 address value here? */
- break;
-
- case 1: case 3: case 5: case 7:
- data = m_mc6845->register_r( space, offset );
- break;
-
- case 8:
- data = mode_control_r();
- break;
-
- case 9:
- data = color_select_r();
- break;
-
- case 10:
- m_address_data_ff = 0;
- data = status_r();
- break;
-
- case 11:
- /* -W lightpen strobe reset */
- break;
-
- case 12:
- case 13:
- break;
-
- case 14:
- data = vga_data_r();
- break;
-
- case 15:
- data = bank_r();
- break;
- }
- return data;
-}
-
-
-WRITE_LINE_MEMBER( pc_t1t_device::t1000_de_changed )
-{
- m_display_enable = state ? 1 : 0;
-}
-
-
-WRITE_LINE_MEMBER( pcvideo_t1000_device::t1000_vsync_changed )
-{
- m_vsync = state ? 8 : 0;
- if ( state )
- {
- m_pc_framecnt++;
- }
-}
-
-
-WRITE_LINE_MEMBER( pcvideo_pcjr_device::pcjr_vsync_changed )
-{
- m_vsync = state ? 8 : 0;
- if ( state )
- {
- m_pc_framecnt++;
- }
- machine().device<pic8259_device>("pic8259")->ir5_w(state);
-}