diff --git a/.gitattributes b/.gitattributes index e60aebce518..c81092b7ff0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3185,8 +3185,6 @@ src/emu/video/msm6222b.c svneol=native#text/plain src/emu/video/msm6222b.h svneol=native#text/plain src/emu/video/msm6255.c svneol=native#text/plain src/emu/video/msm6255.h svneol=native#text/plain -src/emu/video/pc_cga.c svneol=native#text/plain -src/emu/video/pc_cga.h svneol=native#text/plain src/emu/video/pc_vga.c svneol=native#text/plain src/emu/video/pc_vga.h svneol=native#text/plain src/emu/video/poly.h svneol=native#text/plain diff --git a/src/emu/bus/isa/cga.c b/src/emu/bus/isa/cga.c index c1ef5f763da..c7b3647f4d4 100644 --- a/src/emu/bus/isa/cga.c +++ b/src/emu/bus/isa/cga.c @@ -2212,3 +2212,29 @@ READ8_MEMBER( isa8_ec1841_0002_device::io_read ) } return data; } + +const device_type ISA8_CGA_MC1502 = &device_creator; + +//------------------------------------------------- +// isa8_cga_mc1502_device - constructor +//------------------------------------------------- + +isa8_cga_mc1502_device::isa8_cga_mc1502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + isa8_cga_device( mconfig, ISA8_CGA_MC1502, "MC1502 CGA", tag, owner, clock, "cga_mc1502", __FILE__) +{ + m_vram_size = 0x8000; + m_chr_gen_offset[0] = 0x0000; + m_chr_gen_offset[1] = 0x0800; + +} + +ROM_START( mc1502 ) + ROM_REGION(0x2000,"gfx1", 0) + // taken from mc1502 + ROM_LOAD( "symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) +ROM_END + +const rom_entry *isa8_cga_mc1502_device::device_rom_region() const +{ + return ROM_NAME( mc1502 ); +} diff --git a/src/emu/bus/isa/cga.h b/src/emu/bus/isa/cga.h index db737ac064c..45c012a56a8 100644 --- a/src/emu/bus/isa/cga.h +++ b/src/emu/bus/isa/cga.h @@ -203,5 +203,20 @@ public: // device type definition extern const device_type ISA8_EC1841_0002; +// ======================> isa8_poisk2_device + +class isa8_cga_mc1502_device : + public isa8_cga_device +{ +public: + // construction/destruction + isa8_cga_mc1502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // optional information overrides + virtual const rom_entry *device_rom_region() const; +}; + +// device type definition +extern const device_type ISA8_CGA_MC1502; + #endif /* __ISA_CGA_H__ */ diff --git a/src/emu/bus/isa/isa_cards.c b/src/emu/bus/isa/isa_cards.c index ab1bfe449c6..9ddc3c02ecc 100644 --- a/src/emu/bus/isa/isa_cards.c +++ b/src/emu/bus/isa/isa_cards.c @@ -13,6 +13,8 @@ SLOT_INTERFACE_START( pc_isa8_cards ) SLOT_INTERFACE("mda", ISA8_MDA) SLOT_INTERFACE("cga", ISA8_CGA) SLOT_INTERFACE("cga_ec1841", ISA8_EC1841_0002) + SLOT_INTERFACE("cga_poisk2", ISA8_CGA_POISK2) + SLOT_INTERFACE("cga_mc1502", ISA8_CGA_MC1502) SLOT_INTERFACE("ega", ISA8_EGA) SLOT_INTERFACE("svga_et4k", ISA8_SVGA_ET4K) SLOT_INTERFACE("com", ISA8_COM) diff --git a/src/emu/video/cgapal.c b/src/emu/video/cgapal.c index fbd5a78b07c..1205da6cf09 100644 --- a/src/emu/video/cgapal.c +++ b/src/emu/video/cgapal.c @@ -9,7 +9,6 @@ * */ -#include "video/pc_cga.h" #include "video/cgapal.h" const unsigned char cga_palette[16 * CGA_PALETTE_SETS][3] = diff --git a/src/emu/video/cgapal.h b/src/emu/video/cgapal.h index 261e47f7f79..5bf3da06912 100644 --- a/src/emu/video/cgapal.h +++ b/src/emu/video/cgapal.h @@ -1 +1,3 @@ +#define CGA_PALETTE_SETS 83 /* one for colour, one for mono, + * 81 for colour composite */ extern const unsigned char cga_palette[16 * CGA_PALETTE_SETS][3]; diff --git a/src/emu/video/pc_cga.c b/src/emu/video/pc_cga.c deleted file mode 100644 index ffd9444910a..00000000000 --- a/src/emu/video/pc_cga.c +++ /dev/null @@ -1,1669 +0,0 @@ -/*************************************************************************** - - Color Graphics Adapter (CGA) section - - - Notes on Port 3D8 - (http://www.clipx.net/ng/interrupts_and_ports/ng2d045.php) - - Port 3D8 - Color/VGA Mode control register - - xx1x xxxx Attribute bit 7. 0=blink, 1=Intesity - xxx1 xxxx 640x200 mode - xxxx 1xxx Enable video signal - xxxx x1xx Select B/W mode - xxxx xx1x Select graphics - xxxx xxx1 80x25 text - - - The usage of the above control register for various modes is: - xx10 1100 40x25 alpha B/W - xx10 1000 40x25 alpha color - xx10 1101 80x25 alpha B/W - xx10 1001 80x25 alpha color - xxx0 1110 320x200 graph B/W - xxx0 1010 320x200 graph color - xxx1 1110 640x200 graph B/W - - - PC1512 display notes - - The PC1512 built-in display adaptor is an emulation of IBM's CGA. Unlike a - real CGA, it is not built around a real MC6845 controller, and so attempts - to get custom video modes out of it may not work as expected. Its 640x200 - CGA mode can be set up to be a 16-color mode rather than mono. - - If you program it with BIOS calls, the PC1512 behaves just like a real CGA, - except: - - - The 'greyscale' text modes (0 and 2) behave just like the 'color' - ones (1 and 3). On a color monitor both are in color; on a mono - monitor both are in greyscale. - - Mode 5 (the 'greyscale' graphics mode) displays in color, using - an alternative color palette: Cyan, Red and White. - - The undocumented 160x100x16 "graphics" mode works correctly. - - (source John Elliott http://www.seasip.info/AmstradXT/pc1512disp.html) - - - Cursor signal handling: - - The alpha dots signal is set when a character pixel should be set. This signal is - also set when the cursor should be displayed. The following formula for alpha - dots is derived from the schematics: - ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( ( ( NOT AT7 ) OR CURSOR DLY OR -BLINK OR NOT ENABLE BLINK ) AND ( CHG DOTS ) ) - - -CURSOR BLINK = VSYNC DLY (LS393) (changes every 8 vsyncs) - -BLINK = -CURSOR BLINK (LS393) (changes every 16 vsyncs) - -CURSOR DLY = -CURSOR signal from mc6845 and LS174 - CHG DOTS = character pixel (from character rom) - - For non-blinking modes this formula reduces to: - ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( CHG DOTS ) - - This means the cursor switches on/off state every 8 vsyncs. - - - For blinking modes this formula reduces to: - ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( ( ( NOT AT7 ) OR CURSOR DLY OR -BLINK ) AND ( CHG DOTS ) ) - - So, at the cursor location the attribute blinking is ignored and only regular - cursor blinking takes place (state switches every 8 vsyncs). On non-cursor - locations with the highest attribute bits set the character will switch - on/off every 16 vsyncs. In all other cases the character is displayed as - usual. - -***************************************************************************/ - -#include "emu.h" -#include "video/pc_cga.h" -#include "video/mc6845.h" -#include "video/cgapal.h" -#include "drivlgcy.h" -#include "scrlegcy.h" - -#define VERBOSE_CGA 0 /* CGA (Color Graphics Adapter) */ - -#define CGA_LOG(N,M,A) \ - do { \ - if(VERBOSE_CGA>=N) \ - { \ - if( M ) \ - logerror("%11.6f: %-24s",machine.time().as_double(),(char*)M ); \ - logerror A; \ - } \ - } while (0) - -/*************************************************************************** - - Static declarations - -***************************************************************************/ - -static VIDEO_START( pc_cga ); -static VIDEO_START( pc_cga32k ); -static PALETTE_INIT( pc_cga ); - - -INPUT_PORTS_START( pcvideo_cga ) - PORT_START( "pcvideo_cga_config" ) - PORT_CONFNAME( 0x03, 0x00, "CGA character set") - PORT_CONFSETTING(0x00, DEF_STR( Normal )) - PORT_CONFSETTING(0x01, "Alternative") - PORT_CONFNAME( 0x1C, 0x00, "CGA monitor type") - PORT_CONFSETTING(0x00, "Colour RGB") - PORT_CONFSETTING(0x04, "Mono RGB") - PORT_CONFSETTING(0x08, "Colour composite") - PORT_CONFSETTING(0x0C, "Television") - PORT_CONFSETTING(0x10, "LCD") - PORT_CONFNAME( 0xE0, 0x00, "CGA chipset") - PORT_CONFSETTING(0x00, "IBM") - PORT_CONFSETTING(0x20, "Amstrad PC1512") - PORT_CONFSETTING(0x40, "Amstrad PPC512") - PORT_CONFSETTING(0x60, "ATI") - PORT_CONFSETTING(0x80, "Paradise") -INPUT_PORTS_END - - -INPUT_PORTS_START( pcvideo_pc1512 ) - PORT_START( "pcvideo_cga_config" ) - PORT_CONFNAME( 0x03, 0x03, "CGA character set") - PORT_CONFSETTING(0x00, "Greek") - PORT_CONFSETTING(0x01, "Danish 2") - PORT_CONFSETTING(0x02, "Danish 1") - PORT_CONFSETTING(0x03, "Default") - PORT_CONFNAME( 0x1C, 0x00, "CGA monitor type") - PORT_CONFSETTING(0x00, "Colour RGB") - PORT_CONFSETTING(0x04, "Mono RGB") - PORT_BIT ( 0xE0, 0x20, IPT_UNUSED ) /* Chipset is always PC1512 */ -INPUT_PORTS_END - - -INPUT_PORTS_START( pcvideo_mc1502 ) - PORT_START( "pcvideo_cga_config" ) - PORT_BIT ( 0x03, 0x01, IPT_UNUSED ) /* via poisk2 */ - PORT_CONFNAME( 0x1C, 0x00, "CGA monitor type") - PORT_CONFSETTING(0x00, "Colour RGB") - PORT_CONFSETTING(0x08, "Colour composite") - PORT_BIT ( 0xE0, 0x00, IPT_UNUSED ) /* Chipset is always IBM */ -INPUT_PORTS_END - - -/* Dipswitch for font selection */ -#define CGA_FONT (cga.config_input_port->read()&3) - -/* Dipswitch for monitor selection */ -#define CGA_MONITOR (cga.config_input_port->read()&0x1C) -#define CGA_MONITOR_RGB 0x00 /* Colour RGB */ -#define CGA_MONITOR_MONO 0x04 /* Greyscale RGB */ -#define CGA_MONITOR_COMPOSITE 0x08 /* Colour composite */ -#define CGA_MONITOR_TELEVISION 0x0C /* Television */ -#define CGA_MONITOR_LCD 0x10 /* LCD, eg PPC512 */ - - -/* Dipswitch for chipset selection */ -#define CGA_CHIPSET (cga.config_input_port->read()&0xE0) -#define CGA_CHIPSET_IBM 0x00 /* Original IBM CGA */ -#define CGA_CHIPSET_PC1512 0x20 /* PC1512 CGA subset */ -#define CGA_CHIPSET_PC200 0x40 /* PC200 in CGA mode */ -#define CGA_CHIPSET_ATI 0x60 /* ATI (supports Plantronics) */ -#define CGA_CHIPSET_PARADISE 0x80 /* Paradise (used in PC1640) */ - - -static DECLARE_READ8_HANDLER( pc_cga8_r ); -static DECLARE_WRITE8_HANDLER( pc_cga8_w ); -static MC6845_UPDATE_ROW( cga_update_row ); -static MC6845_END_UPDATE( cga_end_update ); -static VIDEO_START( pc1512 ); -static SCREEN_UPDATE_RGB32( mc6845_pc1512 ); - -static VIDEO_START( cga_poisk2 ); -static SCREEN_UPDATE_RGB32( cga_poisk2 ); -static VIDEO_START( cga_mc1502 ); - -static MC6845_INTERFACE( mc6845_cga_intf ) -{ - false, /* show border area */ - 0,0,0,0, /* visarea adjustment */ - 8, /* numbers of pixels per video memory address */ - NULL, /* begin_update */ - cga_update_row, /* update_row */ - cga_end_update, /* end_update */ - DEVCB_NULL, /* on_de_changed */ - DEVCB_NULL, /* on_cur_changed */ - DEVCB_NULL, /* on_hsync_changed */ - DEVCB_NULL, /* on_vsync_changed */ - NULL -}; - -#define CGA_HCLK (XTAL_14_31818MHz/8) -#define CGA_LCLK (XTAL_14_31818MHz/16) - - -MACHINE_CONFIG_FRAGMENT( pcvideo_cga ) - MCFG_SCREEN_ADD(CGA_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200) - MCFG_SCREEN_UPDATE_STATIC( mc6845_cga ) - - MCFG_PALETTE_ADD("palette", /* CGA_PALETTE_SETS * 16*/ 65536 ) - MCFG_PALETTE_INIT_LEGACY(pc_cga) - - MCFG_MC6845_ADD(CGA_MC6845_NAME, MC6845, CGA_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_cga_intf) - - MCFG_VIDEO_START( pc_cga ) -MACHINE_CONFIG_END - -MACHINE_CONFIG_FRAGMENT( pcvideo_cga32k ) - MCFG_FRAGMENT_ADD( pcvideo_cga ) - MCFG_VIDEO_START( pc_cga32k ) -MACHINE_CONFIG_END - -MACHINE_CONFIG_FRAGMENT( pcvideo_poisk2 ) - MCFG_FRAGMENT_ADD( pcvideo_cga ) - MCFG_VIDEO_START( cga_poisk2 ) - MCFG_SCREEN_MODIFY(CGA_SCREEN_NAME) - MCFG_SCREEN_UPDATE_STATIC( cga_poisk2 ) -MACHINE_CONFIG_END - -MACHINE_CONFIG_FRAGMENT( pcvideo_mc1502 ) - MCFG_SCREEN_ADD(CGA_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL_16MHz,912,0,640,262,0,200) - MCFG_SCREEN_UPDATE_STATIC( cga_poisk2 ) - - MCFG_PALETTE_ADD("palette", /* CGA_PALETTE_SETS * 16*/ 65536 ) - MCFG_PALETTE_INIT_LEGACY(pc_cga) - - MCFG_MC6845_ADD(CGA_MC6845_NAME, MC6845, CGA_SCREEN_NAME, XTAL_16MHz/8, mc6845_cga_intf) - - MCFG_VIDEO_START( cga_mc1502 ) -MACHINE_CONFIG_END - -MACHINE_CONFIG_FRAGMENT( pcvideo_pc1512 ) - MCFG_FRAGMENT_ADD( pcvideo_cga ) - MCFG_VIDEO_START( pc1512 ) - MCFG_SCREEN_MODIFY(CGA_SCREEN_NAME) - MCFG_SCREEN_UPDATE_STATIC( mc6845_pc1512 ) -MACHINE_CONFIG_END - - - -/*************************************************************************** - - Local variables and declarations - -***************************************************************************/ - -static struct -{ - UINT8 mode_control; /* wo 0x3d8 */ - UINT8 color_select; /* wo 0x3d9 */ - UINT8 status; /* ro 0x3da */ - UINT8 plantronics; /* wo 0x3dd, ATI chipset only */ - - UINT8 frame; - - UINT8 *chr_gen; - - ioport_port *config_input_port; - - mc6845_update_row_func update_row; - UINT8 palette_lut_2bpp[4]; - UINT8 p3df; - - size_t videoram_size; - UINT8 *videoram; - UINT8 is_superimpose; - - palette_device *palette; -} cga; - - -/*************************************************************************** - - Methods - -***************************************************************************/ - -/* Initialise the cga palette */ -static PALETTE_INIT( pc_cga ) -{ - int i, r, g, b; - - for ( i = 0; i < CGA_PALETTE_SETS * 16; i++ ) - { - palette.set_pen_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2] ); - } - - i = 0x8000; - for ( r = 0; r < 32; r++ ) - { - for ( g = 0; g < 32; g++ ) - { - for ( b = 0; b < 32; b++ ) - { - palette.set_pen_color(i, r << 3, g << 3, b << 3 ); - i++; - } - } - } -} - - -static int internal_pc_cga_video_start(running_machine &machine) -{ - memset(&cga, 0, sizeof(cga)); - cga.update_row = NULL; - - cga.chr_gen = machine.root_device().memregion( "gfx1" )->base() + 0x1000; - - state_save_register_item(machine, "pccga", NULL, 0, cga.mode_control); - state_save_register_item(machine, "pccga", NULL, 0, cga.color_select); - state_save_register_item(machine, "pccga", NULL, 0, cga.status); - state_save_register_item(machine, "pccga", NULL, 0, cga.plantronics); - - cga.config_input_port = machine.root_device().ioport(":pcvideo_cga_config" ); - - cga.palette = machine.device("palette"); - return 0; -} - - - -static VIDEO_START( pc_cga ) -{ - int buswidth; - address_space &space = machine.firstcpu->space(AS_PROGRAM); - address_space &spaceio = machine.firstcpu->space(AS_IO); - - space.install_readwrite_bank(0xb8000, 0xbbfff, 0, 0x04000, "bank11" ); - buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; - UINT64 mask = 0; - switch(buswidth) - { - case 8: - mask = 0; - break; - - case 16: - mask = 0xffff; - break; - - case 32: - mask = 0xffffffff; - break; - - case 64: - mask = -1; - break; - - default: - fatalerror("CGA: Bus width %d not supported\n", buswidth); - break; - } - spaceio.install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_cga8_r), FUNC(pc_cga8_w), mask ); - internal_pc_cga_video_start(machine); - cga.videoram_size = 0x4000; - cga.videoram = auto_alloc_array(machine, UINT8, 0x4000); - memset(cga.videoram, 0, sizeof(UINT8) * 0x4000); - cga.is_superimpose = 0; - - machine.root_device().membank("bank11")->set_base(cga.videoram); -} - - -static VIDEO_START( pc_cga32k ) -{ - int buswidth; - address_space &space = machine.firstcpu->space(AS_PROGRAM); - address_space &spaceio = machine.firstcpu->space(AS_IO); - - - space.install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); - buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; - UINT64 mask = 0; - switch(buswidth) - { - case 8: - mask = 0; - break; - - case 16: - mask = 0xffff; - break; - - case 32: - mask = 0xffffffff; - break; - - case 64: - mask = -1; - break; - - default: - fatalerror("CGA: Bus width %d not supported\n", buswidth); - break; - } - spaceio.install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_cga8_r), FUNC(pc_cga8_w), mask ); - - internal_pc_cga_video_start(machine); - - cga.videoram_size = 0x8000; - cga.videoram = auto_alloc_array(machine, UINT8, 0x8000); - cga.is_superimpose = 0; - - machine.root_device().membank("bank11")->set_base(cga.videoram); -} - -SCREEN_UPDATE_RGB32( mc6845_cga ) -{ - UINT8 *gfx = screen.machine().root_device().memregion("gfx1")->base(); - mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); - mc6845->screen_update( screen, bitmap, cliprect); - - /* Check for changes in font dipsetting */ - switch ( CGA_FONT & 0x01 ) - { - case 0: - cga.chr_gen = gfx + 0x1800; - break; - case 1: - cga.chr_gen = gfx + 0x1000; - break; - } - return 0; -} - - -static VIDEO_START( cga_mc1502 ) -{ - VIDEO_START_CALL(pc_cga32k); - cga.chr_gen = machine.root_device().memregion("gfx1")->base(); -} - - -static VIDEO_START( cga_poisk2 ) -{ - VIDEO_START_CALL(pc_cga); - cga.chr_gen = machine.root_device().memregion( "gfx1" )->base() + 0x0000; -} - -static SCREEN_UPDATE_RGB32( cga_poisk2 ) -{ - UINT8 *gfx = screen.machine().root_device().memregion("gfx1")->base(); - mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); - mc6845->screen_update( screen, bitmap, cliprect); - - /* Check for changes in font dipsetting */ - switch ( CGA_FONT & 0x01 ) - { - case 0: - cga.chr_gen = gfx + 0x0800; - break; - case 1: - cga.chr_gen = gfx + 0x0000; - break; - } - return 0; -} - -/* for superimposing CGA over a different source video (i.e. tetriskr) */ -VIDEO_START( pc_cga_superimpose ) -{ - VIDEO_START_CALL( pc_cga ); - cga.is_superimpose = 1; -} - -/*************************************************************************** - Draw text mode with 40x25 characters (default) with high intensity bg. - The character cell size is 16x8 -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_text_inten_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = attr & 0x0F; - UINT16 bg = attr >> 4; - - if ( i == cursor_x && ( cga.frame & 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++; - } -} - - -/*************************************************************************** - Draw text mode with 40x25 characters (default) with high intensity bg. - The character cell size is 16x8. Composite monitor, greyscale. -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = 0x10 + ( attr & 0x0F ); - UINT16 bg = 0x10 + ( ( attr >> 4 ) & 0x07 ); - - if ( i == cursor_x && ( cga.frame & 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++; - } -} - -/*************************************************************************** - Draw text mode with 40x25 characters (default) with high intensity bg. - The character cell size is 16x8 -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_inten_alt_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = attr & 0x0F; - - if ( i == cursor_x && ( cga.frame & 0x08 ) ) - { - data = 0xFF; - } - - *p = palette[( data & 0x80 ) ? fg : 0]; p++; - *p = palette[( data & 0x40 ) ? fg : 0]; p++; - *p = palette[( data & 0x20 ) ? fg : 0]; p++; - *p = palette[( data & 0x10 ) ? fg : 0]; p++; - *p = palette[( data & 0x08 ) ? fg : 0]; p++; - *p = palette[( data & 0x04 ) ? fg : 0]; p++; - *p = palette[( data & 0x02 ) ? fg : 0]; p++; - *p = palette[( data & 0x01 ) ? fg : 0]; p++; - } -} - - -/*************************************************************************** - Draw text mode with 40x25 characters (default) and blinking colors. - The character cell size is 16x8 -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_text_blink_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_blink_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = attr & 0x0F; - UINT16 bg = (attr >> 4) & 0x07; - - if ( i == cursor_x ) - { - if ( cga.frame & 0x08 ) - { - data = 0xFF; - } - } - else - { - if ( ( attr & 0x80 ) && ( cga.frame & 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++; - } -} - -static MC6845_UPDATE_ROW( cga_text_blink_update_row_si ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_blink_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = attr & 0x0F; - UINT16 bg = (attr >> 4) & 0x07; - UINT8 xi; - - if ( i == cursor_x ) - { - if ( cga.frame & 0x08 ) - { - data = 0xFF; - } - } - else - { - if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) ) - { - data = 0x00; - } - } - - for(xi=0;xi<8;xi++) - { - UINT8 pen_data, dot; - - dot = (data & (1 << (7-xi))); - pen_data = dot ? fg : bg; - if(pen_data || dot) - *p = palette[pen_data]; - p++; - } - } -} - -/*************************************************************************** - Draw text mode with 40x25 characters (default) and blinking colors. - The character cell size is 16x8 -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_text_blink_alt_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; - UINT8 chr = videoram[ offset ]; - UINT8 attr = videoram[ offset +1 ]; - UINT8 data = cga.chr_gen[ chr * 8 + ra ]; - UINT16 fg = attr & 0x07; - UINT16 bg = 0; - - if ( i == cursor_x ) - { - if ( cga.frame & 0x08 ) - { - data = 0xFF; - } - } - else - { - if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) ) - { - data = 0x00; - bg = ( attr >> 4 ) & 0x07; - } - } - - *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++; - } -} - - -/* The lo-res (320x200) graphics mode on a colour composite monitor */ - -static MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bppl_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); - UINT8 data = videoram[ offset ]; - - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - - data = videoram[ offset + 1 ]; - - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - } -} - - -/* The hi-res graphics mode on a colour composite monitor - * - * The different scaling factors mean that the '160x200' versions of screens - * are the same size as the normal colour ones. - */ - -#if 0 -static const UINT8 yc_lut2[4] = { 0, 182, 71, 255 }; - -static const UINT8 yc_lut[16][8] = -{ - { 0, 0, 0, 0, 0, 0, 0, 0 }, /* black */ - { 0, 0, 0, 0, 1, 1, 1, 1 }, /* blue */ - { 0, 1, 1, 1, 1, 0, 0, 0 }, /* green */ - { 0, 0, 1, 1, 1, 1, 0, 0 }, /* cyan */ - { 1, 1, 0, 0, 0, 0, 1, 1 }, /* red */ - { 1, 0, 0, 0, 0, 1, 1, 1 }, /* magenta */ - { 1, 1, 1, 1, 0, 0, 0, 0 }, /* yellow */ - { 1, 1, 1, 1, 1, 1, 1, 1 }, /* white */ - /* Intensity set */ - { 2, 2, 2, 2, 2, 2, 2, 2 }, /* black */ - { 2, 2, 2, 2, 3, 3, 3, 3 }, /* blue */ - { 2, 3, 3, 3, 3, 2, 2, 2 }, /* green */ - { 2, 2, 3, 3, 3, 3, 2, 2 }, /* cyan */ - { 3, 3, 2, 2, 2, 2, 3, 3 }, /* red */ - { 3, 2, 2, 2, 2, 3, 3, 3 }, /* magenta */ - { 3, 3, 3, 3, 2, 2, 2, 2 }, /* yellow */ - { 3, 3, 3, 3, 3, 3, 3, 3 }, /* white */ -}; -#endif - -static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bpph_update_row",("\n")); - - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); - UINT8 data = videoram[ offset ]; - - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - - data = videoram[ offset + 1 ]; - - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data >> 4]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - *p = palette[data & 0x0F]; p++; - } -} - - -/*************************************************************************** - Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. - Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 - cga fetches 2 byte per mc6845 access. -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_gfx_2bpp_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); - UINT8 data = videoram[ offset ]; - - *p = palette[cga.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ data & 0x03 ]]; p++; - - data = videoram[ offset+1 ]; - - *p = palette[cga.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; - *p = palette[cga.palette_lut_2bpp[ data & 0x03 ]]; p++; - } -} - - - -/*************************************************************************** - Draw graphics mode with 640x200 pixels (default). - The cell size is 1x1 (1 scanline is the real default) - Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 -***************************************************************************/ - -static MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row ) -{ - UINT8 *videoram = cga.videoram; - UINT32 *p = &bitmap.pix32(y); - const rgb_t *palette = cga.palette->palette()->entry_list_raw(); - UINT8 fg = cga.color_select & 0x0F; - int i; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"cga_gfx_1bpp_update_row",("\n")); - for ( i = 0; i < x_count; i++ ) - { - UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( ra & 1 ) << 13 ); - UINT8 data = videoram[ offset ]; - - *p = palette[( data & 0x80 ) ? fg : 0]; p++; - *p = palette[( data & 0x40 ) ? fg : 0]; p++; - *p = palette[( data & 0x20 ) ? fg : 0]; p++; - *p = palette[( data & 0x10 ) ? fg : 0]; p++; - *p = palette[( data & 0x08 ) ? fg : 0]; p++; - *p = palette[( data & 0x04 ) ? fg : 0]; p++; - *p = palette[( data & 0x02 ) ? fg : 0]; p++; - *p = palette[( data & 0x01 ) ? fg : 0]; p++; - - data = videoram[ offset + 1 ]; - - *p = palette[( data & 0x80 ) ? fg : 0]; p++; - *p = palette[( data & 0x40 ) ? fg : 0]; p++; - *p = palette[( data & 0x20 ) ? fg : 0]; p++; - *p = palette[( data & 0x10 ) ? fg : 0]; p++; - *p = palette[( data & 0x08 ) ? fg : 0]; p++; - *p = palette[( data & 0x04 ) ? fg : 0]; p++; - *p = palette[( data & 0x02 ) ? fg : 0]; p++; - *p = palette[( data & 0x01 ) ? fg : 0]; p++; - } -} - - -static MC6845_UPDATE_ROW( cga_update_row ) -{ - if ( cga.update_row ) - { - cga.update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param ); - } -} - -static MC6845_END_UPDATE( cga_end_update ) -{ - cga.frame++; -} - -static void pc_cga_set_palette_luts(void) -{ - /* Setup 2bpp palette lookup table */ - if ( cga.mode_control & 0x10 ) - { - cga.palette_lut_2bpp[0] = 0; - } - else - { - cga.palette_lut_2bpp[0] = cga.color_select & 0x0F; - } - if ( cga.mode_control & 0x04 ) - { - cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 3; - cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 4; - cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 7; - } - else - { - if ( cga.color_select & 0x20 ) - { - cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 3; - cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 5; - cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 7; - } - else - { - cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 2; - cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 4; - cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 6; - } - } - //logerror("2bpp lut set to %d,%d,%d,%d\n", cga.palette_lut_2bpp[0], cga.palette_lut_2bpp[1], cga.palette_lut_2bpp[2], cga.palette_lut_2bpp[3]); -} - -/* - * rW CGA mode control register (see #P138) - * - * x x x 0 1 0 0 0 - 320x200, 40x25 text. Colour on RGB and composite monitors. - * x x x 0 1 0 0 1 - 640x200, 80x25 text. Colour on RGB and composite monitors. - * x x x 0 1 0 1 0 - 320x200 graphics. Colour on RGB and composite monitors. - * x x x 0 1 0 1 1 - unknown/invalid. - * x x x 0 1 1 0 0 - 320x200, 40x25 text. Colour on RGB, greyscale on composite monitors. - * x x x 0 1 1 0 1 - 640x200, 80x25 text. Colour on RGB, greyscale on composite monitors. - * x x x 0 1 1 1 0 - 320x200 graphics. Alternative palette on RGB, greyscale on composite monitors. - * x x x 0 1 1 1 1 - unknown/invalid. - * x x x 1 1 0 0 0 - unknown/invalid. - * x x x 1 1 0 0 1 - unknown/invalid. - * x x x 1 1 0 1 0 - 160x200/640x200 graphics. 640x200 ?? on RGB monitor, 160x200 on composite monitor. - * x x x 1 1 0 1 1 - unknown/invalid. - * x x x 1 1 1 0 0 - unknown/invalid. - * x x x 1 1 1 0 1 - unknown/invalid. - * x x x 1 1 1 1 0 - 640x200 graphics. Colour on black on RGB monitor, monochrome on composite monitor. - * x x x 1 1 1 1 1 - unknown/invalid. - */ -static void pc_cga_mode_control_w(running_machine &machine, int data) -{ - mc6845_device *mc6845 = machine.device(CGA_MC6845_NAME); - - CGA_LOG(1,"CGA_mode_control_w",("$%02x: columns %d, gfx %d, hires %d, blink %d\n", - data, (data&1)?80:40, (data>>1)&1, (data>>4)&1, (data>>5)&1)); - - cga.mode_control = data; - - //logerror("mode set to %02X\n", cga.mode_control & 0x3F ); - switch ( cga.mode_control & 0x3F ) - { - case 0x08: case 0x09: case 0x0C: case 0x0D: - mc6845->set_hpixels_per_column( 8 ); - if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) - { - if ( cga.mode_control & 0x04 ) - { - /* Composite greyscale */ - cga.update_row = cga_text_inten_comp_grey_update_row; - } - else - { - /* Composite colour */ - cga.update_row = cga_text_inten_update_row; - } - } - else - { - /* RGB colour */ - cga.update_row = cga_text_inten_update_row; - } - break; - case 0x0A: case 0x0B: case 0x2A: case 0x2B: - mc6845->set_hpixels_per_column( 8 ); - if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) - { - cga.update_row = cga_gfx_4bppl_update_row; - } - else - { - cga.update_row = cga_gfx_2bpp_update_row; - } - break; - case 0x0E: case 0x0F: case 0x2E: case 0x2F: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_gfx_2bpp_update_row; - break; - case 0x18: case 0x19: case 0x1C: case 0x1D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_inten_alt_update_row; - break; - case 0x1A: case 0x1B: case 0x3A: case 0x3B: - mc6845->set_hpixels_per_column( 16 ); - if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) - { - cga.update_row = cga_gfx_4bpph_update_row; - } - else - { - cga.update_row = cga_gfx_1bpp_update_row; - } - break; - case 0x1E: case 0x1F: case 0x3E: case 0x3F: - mc6845->set_hpixels_per_column( 16 ); - cga.update_row = cga_gfx_1bpp_update_row; - break; - case 0x28: case 0x29: case 0x2C: case 0x2D: - mc6845->set_hpixels_per_column( 8 ); - if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) - { - if ( cga.mode_control & 0x04 ) - { - /* Composite greyscale */ - cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; - } - else - { - /* Composite colour */ - cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; - } - } - else - { - /* RGB colour */ - cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; - } - break; - case 0x38: case 0x39: case 0x3C: case 0x3D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_blink_alt_update_row; - break; - default: - cga.update_row = NULL; - break; - } - - // The lowest bit of the mode register selects, among others, the - // input clock to the 6845. - mc6845->set_clock( ( cga.mode_control & 1 ) ? CGA_HCLK : CGA_LCLK ); - - pc_cga_set_palette_luts(); -} - - - -/* - * ?W reserved for color select register on color adapter - */ -static void pc_cga_color_select_w(running_machine &machine, int data) -{ - CGA_LOG(1,"CGA_color_select_w",("$%02x\n", data)); - cga.color_select = data; - //logerror("color_select_w: %02X\n", data); - pc_cga_set_palette_luts(); -} - - - -/* - * Select Plantronics modes - */ -static void pc_cga_plantronics_w(running_machine &machine, int data) -{ - CGA_LOG(1,"CGA_plantronics_w",("$%02x\n", data)); - - if (CGA_CHIPSET != CGA_CHIPSET_ATI) return; - - data &= 0x70; /* Only bits 6-4 are used */ - if (cga.plantronics == data) return; - cga.plantronics = data; -} - - - -/************************************************************************* - * - * CGA - * color graphics adapter - * - *************************************************************************/ - -static WRITE8_HANDLER ( char_ram_w ) -{ - UINT8 *gfx = space.machine().root_device().memregion("gfx1")->base(); - offset ^= BIT(offset, 12); - logerror("write char ram %04x %02x\n",offset,data); - gfx[offset + 0x0000] = data; - gfx[offset + 0x0800] = data; - gfx[offset + 0x1000] = data; - gfx[offset + 0x1800] = data; -} - -static READ8_HANDLER ( char_ram_r ) -{ - UINT8 *gfx = space.machine().root_device().memregion("gfx1")->base(); - offset ^= BIT(offset, 12); - return gfx[offset]; -} - -static READ8_HANDLER( pc_cga8_r ) -{ - mc6845_device *mc6845 = space.machine().device(CGA_MC6845_NAME); - 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 = mc6845->register_r( space, offset ); - break; - case 10: - // bit 0 is actually display enable (vblank OR hblank enabled) - data = (mc6845->vsync_r() ? 9 : 0) | ( ( data & 0x40 ) >> 4 ) | mc6845->hsync_r(); - break; - case 0x0f: - data = cga.p3df; - break; - } - return data; -} - - - -static WRITE8_HANDLER( pc_cga8_w ) -{ - mc6845_device *mc6845; - - switch(offset) { - case 0: case 2: case 4: case 6: - mc6845 = space.machine().device(CGA_MC6845_NAME); - mc6845->address_w( space, offset, data ); - break; - case 1: case 3: case 5: case 7: - mc6845 = space.machine().device(CGA_MC6845_NAME); - mc6845->register_w( space, offset, data ); - break; - case 8: - pc_cga_mode_control_w(space.machine(), data); - break; - case 9: - pc_cga_color_select_w(space.machine(), data); - break; - case 0x0d: - pc_cga_plantronics_w(space.machine(), data); - break; - case 0x0f: - // Not sure if some all CGA cards have ability to upload char definition - // The original CGA card had a char rom - UINT8 buswidth = space.machine().firstcpu->space_config(AS_PROGRAM)->m_databus_width; - address_space &space_prg = space.machine().firstcpu->space(AS_PROGRAM); - cga.p3df = data; - if (data & 1) { - UINT64 mask = 0; - switch(buswidth) - { - case 8: - mask = 0; - break; - - case 16: - mask = 0xffff; - break; - - case 32: - mask = 0xffffffff; - break; - - case 64: - mask = -1; - break; - - default: - fatalerror("CGA: Bus width %d not supported\n", buswidth); - break; - } - space_prg.install_legacy_readwrite_handler(0xb8000, 0xb9fff, FUNC(char_ram_r),FUNC(char_ram_w), mask ); - } else { - if (cga.videoram_size== 0x4000) { - space_prg.install_readwrite_bank(0xb8000, 0xbbfff, 0, 0x04000, "bank11" ); - } else { - space_prg.install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); - } - } - break; - - } -} - - - -/* Old plantronics rendering code, leaving it uncommented until we have re-implemented it */ - -// -// From choosevideomode: -// -// /* Plantronics high-res */ -// if ((cga.mode_control & 2) && (cga.plantronics & 0x20)) -// proc = cga_pgfx_2bpp; -// /* Plantronics low-res */ -// if ((cga.mode_control & 2) && (cga.plantronics & 0x10)) -// proc = cga_pgfx_4bpp; -// - -//INLINE void pgfx_plot_unit_4bpp(bitmap_ind16 &bitmap, -// int x, int y, int offs) -//{ -// int color, values[2]; -// int i; -// -// if (cga.plantronics & 0x40) -// { -// values[0] = videoram[offs | 0x4000]; -// values[1] = videoram[offs]; -// } -// else -// { -// values[0] = videoram[offs]; -// values[1] = videoram[offs | 0x4000]; -// } -// for (i=3; i>=0; i--) -// { -// color = ((values[0] & 0x3) << 1) | -// ((values[1] & 2) >> 1) | -// ((values[1] & 1) << 3); -// bitmap.pix16(y, x+i) = Machine->pens[color]; -// values[0]>>=2; -// values[1]>>=2; -// } -//} -// -// -// -///*************************************************************************** -// Draw graphics mode with 640x200 pixels (default) with 2 bits/pixel. -// Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 -// Second plane at CGA_base + 0x4000 / 0x6000 -//***************************************************************************/ -// -//static void cga_pgfx_4bpp(bitmap_ind16 &bitmap, struct mscrtc6845 *crtc) -//{ -// int i, sx, sy, sh; -// int offs = mscrtc6845_get_start(crtc)*2; -// int lines = mscrtc6845_get_char_lines(crtc); -// int height = mscrtc6845_get_char_height(crtc); -// int columns = mscrtc6845_get_char_columns(crtc)*2; -// -// for (sy=0; sy=0; i--) -// { -// bmap[0] = bmap[0] << 1; if (values[0] & 0x80) bmap[0] |= 1; -// bmap[0] = bmap[0] << 1; if (values[1] & 0x80) bmap[0] |= 1; -// bmap[1] = bmap[1] << 1; if (values[0] & 0x08) bmap[1] |= 1; -// bmap[1] = bmap[1] << 1; if (values[1] & 0x08) bmap[1] |= 1; -// values[0] = values[0] << 1; -// values[1] = values[1] << 1; -// } -// -// dest = &bitmap.pix16(y, x); -// *(dest++) = palette[(bmap[0] >> 6) & 0x03]; -// *(dest++) = palette[(bmap[0] >> 4) & 0x03]; -// *(dest++) = palette[(bmap[0] >> 2) & 0x03]; -// *(dest++) = palette[(bmap[0] >> 0) & 0x03]; -// *(dest++) = palette[(bmap[1] >> 6) & 0x03]; -// *(dest++) = palette[(bmap[1] >> 4) & 0x03]; -// *(dest++) = palette[(bmap[1] >> 2) & 0x03]; -// *(dest++) = palette[(bmap[1] >> 0) & 0x03]; -//} -// -// -// -///*************************************************************************** -// Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. -// Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 -// cga fetches 2 byte per mscrtc6845 access (not modeled here)! -//***************************************************************************/ -// -//static void cga_pgfx_2bpp(bitmap_ind16 &bitmap, struct mscrtc6845 *crtc) -//{ -// int i, sx, sy, sh; -// int offs = mscrtc6845_get_start(crtc)*2; -// int lines = mscrtc6845_get_char_lines(crtc); -// int height = mscrtc6845_get_char_height(crtc); -// int columns = mscrtc6845_get_char_columns(crtc)*2; -// int colorset = cga.color_select & 0x3F; -// const UINT16 *palette; -// -// /* Most chipsets use bit 2 of the mode control register to -// * access a third palette. But not consistently. */ -// pc_cga_check_palette(); -// switch(CGA_CHIPSET) -// { -// /* The IBM Professional Graphics Controller behaves like -// * the PC1512, btw. */ -// case CGA_CHIPSET_PC1512: -// if ((colorset < 32) && (cga.mode_control & 4)) colorset += 64; -// break; -// -// case CGA_CHIPSET_IBM: -// case CGA_CHIPSET_PC200: -// case CGA_CHIPSET_ATI: -// case CGA_CHIPSET_PARADISE: -// if (cga.mode_control & 4) colorset = (colorset & 0x1F) + 64; -// break; -// } -// -// -// /* The fact that our palette is located in cga_colortable is a vestigial -// * aspect from when we were doing that ugly trick where drawgfx() would -// * handle graphics drawing. Truthfully, we should probably be using -// * palette_set_color_rgb() here and not doing the palette lookup in the loop -// */ -// palette = &cga_colortable[256*2 + 16*2] + colorset * 4; -// -// for (sy=0; sypalette()->entry_list_raw(); - UINT16 offset_base = ra << 13; - int j; - running_machine &machine = device->machine(); - - if ( y == 0 ) CGA_LOG(1,"pc1512_gfx_4bpp_update_row",("\n")); - for ( j = 0; j < x_count; j++ ) - { - UINT16 offset = offset_base | ( ( ma + j ) & 0x1FFF ); - UINT16 i = ( cga.color_select & 8 ) ? videoram[ videoram_offset[3] | offset ] << 3 : 0; - UINT16 r = ( cga.color_select & 4 ) ? videoram[ videoram_offset[2] | offset ] << 2 : 0; - UINT16 g = ( cga.color_select & 2 ) ? videoram[ videoram_offset[1] | offset ] << 1 : 0; - UINT16 b = ( cga.color_select & 1 ) ? videoram[ videoram_offset[0] | offset ] : 0; - - *p = palette[( ( i & 0x400 ) | ( r & 0x200 ) | ( g & 0x100 ) | ( b & 0x80 ) ) >> 7]; p++; - *p = palette[( ( i & 0x200 ) | ( r & 0x100 ) | ( g & 0x080 ) | ( b & 0x40 ) ) >> 6]; p++; - *p = palette[( ( i & 0x100 ) | ( r & 0x080 ) | ( g & 0x040 ) | ( b & 0x20 ) ) >> 5]; p++; - *p = palette[( ( i & 0x080 ) | ( r & 0x040 ) | ( g & 0x020 ) | ( b & 0x10 ) ) >> 4]; p++; - *p = palette[( ( i & 0x040 ) | ( r & 0x020 ) | ( g & 0x010 ) | ( b & 0x08 ) ) >> 3]; p++; - *p = palette[( ( i & 0x020 ) | ( r & 0x010 ) | ( g & 0x008 ) | ( b & 0x04 ) ) >> 2]; p++; - *p = palette[( ( i & 0x010 ) | ( r & 0x008 ) | ( g & 0x004 ) | ( b & 0x02 ) ) >> 1]; p++; - *p = palette[ ( i & 0x008 ) | ( r & 0x004 ) | ( g & 0x002 ) | ( b & 0x01 ) ]; p++; - } -} - - -static WRITE8_HANDLER ( pc1512_w ) -{ - UINT8 *videoram = cga.videoram; - mc6845_device *mc6845 = space.machine().device(CGA_MC6845_NAME); - - switch (offset) - { - case 0: case 2: case 4: case 6: - data &= 0x1F; - mc6845->address_w( space, offset, data ); - pc1512.mc6845_address = data; - break; - - case 1: case 3: case 5: case 7: - if ( ! pc1512.mc6845_locked_register[pc1512.mc6845_address] ) - { - mc6845->register_w( space, offset, data ); - if ( mc6845_writeonce_register[pc1512.mc6845_address] ) - { - pc1512.mc6845_locked_register[pc1512.mc6845_address] = 1; - } - } - break; - - case 0x8: - /* Check if we're changing to graphics mode 2 */ - if ( ( cga.mode_control & 0x12 ) != 0x12 && ( data & 0x12 ) == 0x12 ) - { - pc1512.write = 0x0F; - } - else - { - space.machine().root_device().membank("bank1")->set_base(videoram + videoram_offset[0]); - } - cga.mode_control = data; - switch( cga.mode_control & 0x3F ) - { - case 0x08: case 0x09: case 0x0C: case 0x0D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_inten_update_row; - break; - case 0x0A: case 0x0B: case 0x2A: case 0x2B: - mc6845->set_hpixels_per_column( 8 ); - if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) - { - cga.update_row = cga_gfx_4bppl_update_row; - } - else - { - cga.update_row = cga_gfx_2bpp_update_row; - } - break; - case 0x0E: case 0x0F: case 0x2E: case 0x2F: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_gfx_2bpp_update_row; - break; - case 0x18: case 0x19: case 0x1C: case 0x1D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_inten_alt_update_row; - break; - case 0x1A: case 0x1B: case 0x3A: case 0x3B: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = pc1512_gfx_4bpp_update_row; - break; - case 0x1E: case 0x1F: case 0x3E: case 0x3F: - mc6845->set_hpixels_per_column( 16 ); - cga.update_row = cga_gfx_1bpp_update_row; - break; - case 0x28: case 0x29: case 0x2C: case 0x2D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_blink_update_row; - break; - case 0x38: case 0x39: case 0x3C: case 0x3D: - mc6845->set_hpixels_per_column( 8 ); - cga.update_row = cga_text_blink_alt_update_row; - break; - default: - cga.update_row = NULL; - break; - } - break; - - case 0xd: - pc1512.write = data; - break; - - case 0xe: - pc1512.read = data; - if ( ( cga.mode_control & 0x12 ) == 0x12 ) - { - space.machine().root_device().membank("bank1")->set_base(videoram + videoram_offset[data & 3]); - } - break; - - default: - pc_cga8_w(space, offset,data); - break; - } -} - -static READ8_HANDLER ( pc1512_r ) -{ - UINT8 data; - - switch (offset) - { - case 0xd: - data = pc1512.write; - break; - - case 0xe: - data = pc1512.read; - break; - - default: - data = pc_cga8_r(space, offset); - break; - } - return data; -} - - -static WRITE8_HANDLER ( pc1512_videoram_w ) -{ - UINT8 *videoram = cga.videoram; - if ( ( cga.mode_control & 0x12 ) == 0x12 ) - { - if (pc1512.write & 1) - videoram[offset+videoram_offset[0]] = data; /* blue plane */ - if (pc1512.write & 2) - videoram[offset+videoram_offset[1]] = data; /* green */ - if (pc1512.write & 4) - videoram[offset+videoram_offset[2]] = data; /* red */ - if (pc1512.write & 8) - videoram[offset+videoram_offset[3]] = data; /* intensity (text, 4color) */ - } - else - { - videoram[offset + videoram_offset[0]] = data; - } -} - -static VIDEO_START( pc1512 ) -{ - memset( &pc1512, 0, sizeof ( pc1512 ) ); - pc1512.write = 0xf; - pc1512.read = 0; - - /* PC1512 cut-down 6845 */ - internal_pc_cga_video_start(machine); - cga.videoram_size = 0x10000; - cga.videoram = auto_alloc_array(machine, UINT8, 0x10000 ); - - address_space &space = machine.firstcpu->space( AS_PROGRAM ); - address_space &io_space = machine.firstcpu->space( AS_IO ); - - space.install_read_bank( 0xb8000, 0xbbfff, 0, 0x0C000, "bank1" ); - machine.root_device().membank("bank1")->set_base(cga.videoram + videoram_offset[0]); - space.install_legacy_write_handler( 0xb8000, 0xbbfff, 0, 0x0C000, FUNC(pc1512_videoram_w), 0xffff); - - io_space.install_legacy_readwrite_handler( 0x3d0, 0x3df, FUNC(pc1512_r), FUNC(pc1512_w), 0xffff); - -} - - -static SCREEN_UPDATE_RGB32( mc6845_pc1512 ) -{ - UINT8 *gfx = screen.machine().root_device().memregion("gfx1")->base(); - mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); - mc6845->screen_update(screen, bitmap, cliprect); - - /* Check for changes in font dipsetting */ - switch ( CGA_FONT & 0x03 ) - { - case 0: - cga.chr_gen = gfx + 0x0000; - break; - case 1: - cga.chr_gen = gfx + 0x0800; - break; - case 2: - cga.chr_gen = gfx + 0x1000; - break; - case 3: - cga.chr_gen = gfx + 0x1800; - break; - } - - return 0; -} diff --git a/src/emu/video/pc_cga.h b/src/emu/video/pc_cga.h deleted file mode 100644 index 416e34998a2..00000000000 --- a/src/emu/video/pc_cga.h +++ /dev/null @@ -1,27 +0,0 @@ -#include "emu.h" - -#define CGA_PALETTE_SETS 83 /* one for colour, one for mono, - * 81 for colour composite */ - -#define CGA_SCREEN_NAME "screen" -#define CGA_MC6845_NAME "mc6845_cga" - -MACHINE_CONFIG_EXTERN( pcvideo_cga ); -MACHINE_CONFIG_EXTERN( pcvideo_cga32k ); -MACHINE_CONFIG_EXTERN( pcvideo_mc1502 ); -INPUT_PORTS_EXTERN( pcvideo_cga ); -INPUT_PORTS_EXTERN( pcvideo_mc1502 ); -SCREEN_UPDATE_RGB32( mc6845_cga ); -VIDEO_START( pc_cga_superimpose ); - -/* has a special 640x200 in 16 color mode, 4 banks at 0xb8000 */ -MACHINE_CONFIG_EXTERN( pcvideo_pc1512 ); -INPUT_PORTS_EXTERN( pcvideo_pc1512 ); - - -/* Used in machine/pc.c */ -DECLARE_READ16_HANDLER( pc1512_16le_r ); -DECLARE_WRITE16_HANDLER( pc1512_16le_w ); -DECLARE_WRITE16_HANDLER( pc1512_videoram16le_w ); - -MACHINE_CONFIG_EXTERN( pcvideo_poisk2 ); diff --git a/src/emu/video/video.mak b/src/emu/video/video.mak index 8b2704f5813..cd7854bb8a4 100644 --- a/src/emu/video/video.mak +++ b/src/emu/video/video.mak @@ -369,8 +369,7 @@ endif #------------------------------------------------- ifneq ($(filter PC_CGA,$(VIDEOS)),) -VIDEOOBJS+= $(VIDEOOBJ)/pc_cga.o \ - $(VIDEOOBJ)/cgapal.o +VIDEOOBJS+= $(VIDEOOBJ)/cgapal.o endif #------------------------------------------------- diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 6ae53a564e7..c49f47bfd61 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -304,7 +304,6 @@ VIDEOS += MB_VCU VIDEOS += MC6845 #VIDEOS += MC6847 #VIDEOS += MSM6255 -VIDEOS += PC_CGA VIDEOS += PC_VGA VIDEOS += POLY VIDEOS += PSX diff --git a/src/mess/drivers/pc.c b/src/mess/drivers/pc.c index 850d30e6a75..69995caba51 100644 --- a/src/mess/drivers/pc.c +++ b/src/mess/drivers/pc.c @@ -71,8 +71,8 @@ video HW too. #include "machine/pic8259.h" #include "machine/pit8253.h" -#include "video/pc_vga.h" -#include "video/pc_cga.h" +#include "bus/isa/isa.h" +#include "bus/isa/isa_cards.h" #include "video/pc_aga.h" #include "video/pc_t1t.h" @@ -407,11 +407,6 @@ ADDRESS_MAP_END static INPUT_PORTS_START( pccga ) - PORT_START("IN0") /* IN0 */ - PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED ) - PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_BIT ( 0x07, 0x07, IPT_UNUSED ) - PORT_START("DSW0") /* IN1 */ PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") PORT_DIPSETTING( 0x00, "1" ) @@ -470,16 +465,9 @@ static INPUT_PORTS_START( pccga ) PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) PORT_BIT( 0x02, 0x02, IPT_UNUSED ) /* no turbo switch */ PORT_BIT( 0x01, 0x01, IPT_UNUSED ) - - PORT_INCLUDE( pcvideo_cga ) INPUT_PORTS_END static INPUT_PORTS_START( pcega ) - PORT_START("IN0") /* IN0 */ - PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED ) - PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_BIT ( 0x07, 0x07, IPT_UNUSED ) - PORT_START("DSW0") /* IN1 */ PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") PORT_DIPSETTING( 0x00, "1" ) @@ -538,8 +526,6 @@ static INPUT_PORTS_START( pcega ) PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) PORT_BIT( 0x02, 0x02, IPT_UNUSED ) /* no turbo switch */ PORT_BIT( 0x01, 0x01, IPT_UNUSED ) - - PORT_INCLUDE( pcvideo_cga ) INPUT_PORTS_END @@ -588,8 +574,6 @@ static INPUT_PORTS_START( europc ) PORT_BIT( 0x01, 0x01, IPT_UNUSED ) EUROPC_KEYBOARD - - PORT_INCLUDE( pcvideo_cga ) INPUT_PORTS_END static INPUT_PORTS_START( bondwell ) @@ -660,7 +644,6 @@ static INPUT_PORTS_START( bondwell ) PORT_BIT( 0x01, 0x01, IPT_UNUSED ) // PORT_INCLUDE( at_keyboard ) /* IN4 - IN11 */ - PORT_INCLUDE( pcvideo_cga ) INPUT_PORTS_END static INPUT_PORTS_START( tandy1t ) @@ -740,23 +723,9 @@ SLOT_INTERFACE_END MCFG_CPU_ADD("maincpu", type, clock) \ MCFG_CPU_PROGRAM_MAP(mem##_map) \ MCFG_CPU_IO_MAP(port##_io) \ - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, vblankfunc, "screen", 0, 1) + MCFG_TIMER_DRIVER_ADD_PERIODIC("scantimer", pc_state, vblankfunc, attotime::from_hz(60)) -/* F4 Character Displayer */ -static const gfx_layout pc_16_charlayout = -{ - 8, 16, /* 8 x 16 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, 2048*8, 2049*8, 2050*8, 2051*8, 2052*8, 2053*8, 2054*8, 2055*8 }, - 8*8 /* every char takes 2 x 8 bytes */ -}; - static const gfx_layout pc_8_charlayout = { 8, 8, /* 8 x 8 characters */ @@ -783,11 +752,6 @@ static const gfx_layout kanji_layout = 16*16 /* every char takes 8 bytes */ }; -static GFXDECODE_START( ibm5150 ) - GFXDECODE_ENTRY( "gfx1", 0x0000, pc_16_charlayout, 3, 1 ) - GFXDECODE_ENTRY( "gfx1", 0x1000, pc_8_charlayout, 3, 1 ) -GFXDECODE_END - static const pc_kbdc_interface pc_kbdc_intf = { @@ -796,6 +760,39 @@ static const pc_kbdc_interface pc_kbdc_intf = }; +static const isa8bus_interface pc_isabus_intf = +{ + // interrupts + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir2_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir3_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir4_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir5_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir6_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), + + // dma request + DEVCB_DEVICE_LINE_MEMBER("dma8237", am9517a_device, dreq1_w), + DEVCB_DEVICE_LINE_MEMBER("dma8237", am9517a_device, dreq2_w), + DEVCB_DEVICE_LINE_MEMBER("dma8237", am9517a_device, dreq3_w) +}; + +static const isa8bus_interface asst128_isabus_intf = +{ + // interrupts + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir2_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir3_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir4_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir5_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir6_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), + + // dma request + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + + static MACHINE_CONFIG_START( pccga, pc_state ) /* basic machine hardware */ MCFG_CPU_PC(pc8, pc8, I8088, 4772720, pc_frame_interrupt) /* 4,77 MHz */ @@ -836,9 +833,8 @@ static MACHINE_CONFIG_START( pccga, pc_state ) MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) - MCFG_FRAGMENT_ADD( pcvideo_cga ) - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibm5150) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga", false) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -866,27 +862,27 @@ static MACHINE_CONFIG_START( pccga, pc_state ) MCFG_RAM_DEFAULT_SIZE("640K") MACHINE_CONFIG_END -static const gfx_layout pc10iii_16_charlayout = -{ - 8, 16, /* 8 x 16 characters */ - 2048, /* 2048 characters */ - 1, /* 1 bits per pixel */ - { 0 }, /* no bitplanes */ - /* x offsets */ - { 7, 6, 5, 4, 3, 2, 1, 0 }, - /* y offsets */ - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, - 8*16 /* every char takes 16 bytes */ -}; +// static const gfx_layout pc10iii_16_charlayout = +// { + // 8, 16, /* 8 x 16 characters */ + // 2048, /* 2048 characters */ + // 1, /* 1 bits per pixel */ + // { 0 }, /* no bitplanes */ + // /* x offsets */ + // { 7, 6, 5, 4, 3, 2, 1, 0 }, + // /* y offsets */ + // { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + // 8*16 /* every char takes 16 bytes */ +// }; -// 8-byte chars: 080-0FF, 180-27F, 300-37F, 480-4FF, 580-67F, 700-77F -// 16-byte chars: 000-07F, 100-17F, 280-2FF, 380-47F, 500-57F, 680-6FF, 780-7FF -static GFXDECODE_START( pc10iii ) - GFXDECODE_ENTRY( "gfx1", 0x0000, pc10iii_16_charlayout, 3, 1 ) -GFXDECODE_END +// // 8-byte chars: 080-0FF, 180-27F, 300-37F, 480-4FF, 580-67F, 700-77F +// // 16-byte chars: 000-07F, 100-17F, 280-2FF, 380-47F, 500-57F, 680-6FF, 780-7FF +// static GFXDECODE_START( pc10iii ) + // GFXDECODE_ENTRY( "gfx1", 0x0000, pc10iii_16_charlayout, 3, 1 ) +// GFXDECODE_END static MACHINE_CONFIG_DERIVED( pc10iii, pccga ) - MCFG_GFXDECODE_MODIFY("gfxdecode", pc10iii) + //MCFG_GFXDECODE_MODIFY("gfxdecode", pc10iii) MACHINE_CONFIG_END static const gfx_layout europc_8_charlayout = @@ -1384,9 +1380,9 @@ static MACHINE_CONFIG_START( asst128, pc_state ) MCFG_I8255_ADD( "ppi8255", ibm5160_ppi8255_interface ) /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_mc1502 ) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", asst128_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga_mc1502", false) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibmpcjr) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1472,8 +1468,9 @@ static MACHINE_CONFIG_START( iskr3104, pc_state ) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) /* video hardware */ -// MCFG_FRAGMENT_ADD( pcvideo_ega ) // Put this back after ISA are added to this driver - MCFG_FRAGMENT_ADD( pcvideo_cga ) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "ega", false) + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) @@ -1542,9 +1539,8 @@ static MACHINE_CONFIG_START( poisk2, pc_state ) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_poisk2 ) - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibm5150) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga_poisk2", false) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1613,9 +1609,8 @@ static MACHINE_CONFIG_START( zenith, pc_state ) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_cga ) - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibm5150) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga", false) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1645,7 +1640,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_START( olivetti, pc_state ) /* basic machine hardware */ - MCFG_CPU_PC(pc16, pc16, I8086, 8000000, pc_vga_frame_interrupt) + MCFG_CPU_PC(pc16, pc16, I8086, 8000000, pc_frame_interrupt) MCFG_QUANTUM_TIME(attotime::from_hz(60)) @@ -1684,9 +1679,8 @@ static MACHINE_CONFIG_START( olivetti, pc_state ) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_cga ) - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibm5150) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga", false) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1716,7 +1710,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_START( ibm5550, pc_state ) /* basic machine hardware */ - MCFG_CPU_PC(ibm5550, ibm5550, I8086, 8000000, pc_vga_frame_interrupt) + MCFG_CPU_PC(ibm5550, ibm5550, I8086, 8000000, pc_frame_interrupt) MCFG_QUANTUM_TIME(attotime::from_hz(60)) @@ -1755,9 +1749,8 @@ static MACHINE_CONFIG_START( ibm5550, pc_state ) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_cga ) - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", ibm5150) + MCFG_ISA8_BUS_ADD("isa", ":maincpu", pc_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", pc_isa8_cards, "cga", false) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1856,10 +1849,6 @@ MACHINE_CONFIG_END ROM_START( bw230 ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD("bondwell.bin", 0xfe000, 0x2000, CRC(d435a405) SHA1(a57c705d1144c7b61940b6f5c05d785c272fc9bb)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( zdsupers ) @@ -1868,9 +1857,6 @@ ROM_START( zdsupers ) ROMX_LOAD( "z184m v3.1d.10d", 0xf8000, 0x8000, CRC(44012c3b) SHA1(f2f28979798874386ca8ba3dd3ead24ae7c2aeb4), ROM_BIOS(1)) ROM_SYSTEM_BIOS( 1, "v29e", "v2.9e" ) ROMX_LOAD( "z184m v2.9e.10d", 0xf8000, 0x8000, CRC(de2f200b) SHA1(ad5ce601669a82351e412fc6c1c70c47779a1e55), ROM_BIOS(2)) - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( europc ) @@ -2079,19 +2065,11 @@ ROM_END ROM_START( dgone ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD( "dgone.bin", 0xf8000, 0x08000, CRC(2c38c86e) SHA1(c0f85a000d1d13cd354965689e925d677822549e)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( ssam88s ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD( "samsung_samtron_88s_vers_2.0a.bin", 0xf8000, 0x08000, CRC(d1252a91) SHA1(469d15b6ecd7b70234975dc12c6bda4212a66652)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( asst128 ) @@ -2157,8 +2135,6 @@ ROM_START( poisk2 ) ROM_SYSTEM_BIOS(5, "v23d", "v2.3d") ROMX_LOAD( "opp2_3h.rf4", 0xfc001, 0x2000, CRC(ac7d4f06) SHA1(858d6e084a38814280b3e29fb54971f4f532e484), ROM_SKIP(1) | ROM_BIOS(6)) ROMX_LOAD( "opp2_3l.rf4", 0xfc000, 0x2000, CRC(3c877ea1) SHA1(0753168659653538311c0ad1df851cbbdba426f4), ROM_SKIP(1) | ROM_BIOS(6)) - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) - ROM_LOAD( "p2_ecga.rf4", 0x0000, 0x2000, CRC(d537f665) SHA1(d70f085b9b0cbd53df7c3122fbe7592998ba8fed)) ROM_END ROM_START( mc1702 ) @@ -2166,10 +2142,6 @@ ROM_START( mc1702 ) ROM_LOAD16_BYTE( "2764_2_(573rf4).rom", 0xfc000, 0x2000, CRC(34a0c8fb) SHA1(88dc247f2e417c2848a2fd3e9b52258ad22a2c07)) ROM_LOAD16_BYTE( "2764_3_(573rf4).rom", 0xfc001, 0x2000, CRC(68ab212b) SHA1(f3313f77392877d28ce290ffa3432f0a32fc4619)) ROM_LOAD( "ba1m_(573rf5).rom", 0x0000, 0x0800, CRC(08d938e8) SHA1(957b6c691dbef75c1c735e8e4e81669d056971e4)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END @@ -2177,39 +2149,23 @@ ROM_START( m24 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROMX_LOAD("olivetti_m24_version_1.43_high.bin",0xfc001, 0x2000, CRC(04e697ba) SHA1(1066dcc849e6289b5ac6372c84a590e456d497a6), ROM_SKIP(1)) ROMX_LOAD("olivetti_m24_version_1.43_low.bin", 0xfc000, 0x2000, CRC(ff7e0f10) SHA1(13423011a9bae3f3193e8c199f98a496cab48c0f), ROM_SKIP(1)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( m240 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROMX_LOAD("olivetti_m240_pch5_2.04_high.bin", 0xf8001, 0x4000, CRC(ceb97b59) SHA1(84fabbeab355e0a4c9445910f2b7d1ec98886642), ROM_SKIP(1)) ROMX_LOAD("olivetti_m240_pch6_2.04_low.bin", 0xf8000, 0x4000, CRC(c463aa94) SHA1(a30c763c1ace9f3ff79e7136b252d624108a50ae), ROM_SKIP(1)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( ibm5550 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROM_LOAD( "ipl5550.rom", 0xfc000, 0x4000, CRC(40cf34c9) SHA1(d41f77fdfa787b0e97ed311e1c084b8699a5b197)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) /* original font rom is undumped */ - ROM_LOAD("5788005.u33", 0x00000, 0x2000, BAD_DUMP CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( pc7000 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROMX_LOAD( "mitsubishi-m5l27128k-1.bin", 0xf8000, 0x4000, CRC(9683957f) SHA1(4569eab6d88eb1bba0d553d1358e593c326978aa), ROM_SKIP(1)) ROMX_LOAD( "mitsubishi-m5l27128k-2.bin", 0xf8001, 0x4000, CRC(99b229a4) SHA1(5800c8bafed26873d8cfcc79a05f93a780a31c91), ROM_SKIP(1)) - - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( olivm15 ) @@ -2222,26 +2178,17 @@ ROM_START( pcd ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD16_BYTE( "sni_pcd1.bin", 0xfc001, 0x2000, CRC(e20244dd) SHA1(0ebc5ddb93baacd9106f1917380de58aac64fe73)) ROM_LOAD16_BYTE( "sni_pcd2.bin", 0xfc000, 0x2000, CRC(e03db2ec) SHA1(fcae8b0c9e7543706817b0a53872826633361fda)) - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) /* original font rom is undumped */ - ROM_LOAD("5788005.u33", 0x00000, 0x2000, BAD_DUMP CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( olypeopl ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD16_BYTE( "uo1271c0.bin", 0xfe000, 0x1000, CRC(c9187bce) SHA1(464e1f96046657b49afa4223ede1040650643d58)) ROM_LOAD16_BYTE( "uo1271d0.bin", 0xfe001, 0x1000, CRC(10e6437b) SHA1(0b77bb7a62f0a8240602f4cdcc3d6765e62894f4)) - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) /* original font rom is undumped */ - ROM_LOAD("5788005.u33", 0x00000, 0x2000, BAD_DUMP CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( sx16 ) ROM_REGION(0x100000,"maincpu", 0) ROM_LOAD( "tmm27128ad.bin",0xfc000, 0x4000, CRC(f8543362) SHA1(fef625e260ca89ba02174584bdc12db609f0780e)) - /* IBM 1501981(CGA) and 1501985(MDA) Character rom */ - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( compc1 ) @@ -2280,8 +2227,6 @@ ROM_START( mbc16 ) ROM_REGION(0x2000,"gfx1", 0) //ATI Graphics Solution SR (graphics card, need to make it ISA card) ROM_LOAD( "atigssr.bin", 0x0000, 0x2000, CRC(aca81498) SHA1(0d84c89487ee7a6ac4c9e73fdb30c5fd8aa595f8)) - // override for now with IBM CGA card - ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END ROM_START( ataripc3 ) diff --git a/src/mess/includes/pc.h b/src/mess/includes/pc.h index 4ae294175d4..e6ce29315dc 100644 --- a/src/mess/includes/pc.h +++ b/src/mess/includes/pc.h @@ -99,7 +99,6 @@ public: TIMER_CALLBACK_MEMBER(pcjr_fdc_watchdog); TIMER_CALLBACK_MEMBER(pc_rtc_timer); TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt); - TIMER_DEVICE_CALLBACK_MEMBER(pc_vga_frame_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(pcjr_frame_interrupt); DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed); DECLARE_READ8_MEMBER(pc_dma8237_fdc_dack_r); diff --git a/src/mess/machine/amstr_pc.c b/src/mess/machine/amstr_pc.c index 483285135a0..0cf570190d3 100644 --- a/src/mess/machine/amstr_pc.c +++ b/src/mess/machine/amstr_pc.c @@ -3,7 +3,6 @@ #include "machine/pit8253.h" #include "includes/amstr_pc.h" #include "includes/pc.h" -#include "video/pc_vga.h" /* pc20 (v2) diff --git a/src/mess/machine/pc.c b/src/mess/machine/pc.c index 39b3bcd1283..f6df38574c2 100644 --- a/src/mess/machine/pc.c +++ b/src/mess/machine/pc.c @@ -20,8 +20,6 @@ #include "machine/mc146818.h" #include "machine/pic8259.h" -#include "video/pc_vga.h" -#include "video/pc_cga.h" #include "video/pc_t1t.h" #include "machine/pit8253.h" @@ -1196,17 +1194,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pc_frame_interrupt) pc_keyboard(); } -TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pc_vga_frame_interrupt) -{ - int scanline = param; - - if((scanline % 64) == 0) - { - //vga_timer(); - pc_keyboard(); - } -} - TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pcjr_frame_interrupt) { int scanline = param; diff --git a/src/mess/video/pc_aga.c b/src/mess/video/pc_aga.c index e80b284f51e..cf548f5e93c 100644 --- a/src/mess/video/pc_aga.c +++ b/src/mess/video/pc_aga.c @@ -3,8 +3,6 @@ * video/pc_aga.c * ****************************************************************************/ -#define CGA_PALETTE_SETS 83 /* one for colour, one for mono, * 81 for colour composite */ - #include "emu.h" #include "video/pc_aga.h" #include "includes/amstr_pc.h"