summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/gamecstl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/gamecstl.cpp')
-rw-r--r--src/mame/drivers/gamecstl.cpp512
1 files changed, 0 insertions, 512 deletions
diff --git a/src/mame/drivers/gamecstl.cpp b/src/mame/drivers/gamecstl.cpp
deleted file mode 100644
index 325a78878b3..00000000000
--- a/src/mame/drivers/gamecstl.cpp
+++ /dev/null
@@ -1,512 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:R. Belmont
-/*
- Cristaltec "Game Cristal" (MAME bootleg)
-
- Skeleton driver by R. Belmont, based on taitowlf.c by Ville Linde
-
- Note:
- - bp 000F16B5 do bx=0x16bb (can't skip this check?)
-
- Specs: P3-866, SiS 630 graphics card, SiS 7018 sound, Windows 98, DirectX 8.1.
-
- Input is via a custom COM1 port JAMMA adaptor.
-
- The custom emulator is a heavily modified version of MAME32. If you extract the
- disk image, it's in C:\GH4\GH4.EXE. It's UPX compressed, so unpack it before doing
- any forensics. The emulator does run on Windows as new as XP Pro SP2 but you can't
- control it due to the lack of the custom input.
-
- Updates 27/11/2007 (Diego Nappino):
- The COM1 port is opened at 19200 bps, No parity, 8 bit data,1 stop bit.
- The protocol is based on a 6 bytes frame with a leading byte valued 0x05 and a trailing one at 0x02
- The four middle bytes are used, in negative logic (0xFF = No button pressed), to implement the inputs.
- Each bit meaning as follows :
-
- Byte 1 Byte 2 Byte 3 Byte 4
- Bit 0 P1-Credit P1-Button C P2-Left UNUSED
- Bit 1 P1-Start P1-Button D P2-Right UNUSED
- Bit 2 P1-Down P1-Button E P2-Button A SERVICE
- Bit 3 P1-Up TEST P2-Button B UNUSED
- Bit 4 P1-Left P2-Credit P2-Button C UNUSED
- Bit 5 P1-Right P2-Start P2-Button D UNUSED
- Bit 6 P1-Button A P2-Down P2-Button E UNUSED
- Bit 7 P1-Button B P2-Up VIDEO-MODE UNUSED
-
- The JAMMA adaptor sends a byte frame each time an input changes. So, in example, if the P1-Button A and P1-Button B are both pressed, it will send :
-
- 0x05 0xFC 0xFF 0xFF 0xFF 0x02
-
- And when the buttons are both released
-
- 0x05 0xFF 0xFF 0xFF 0xFF 0x02
-
- CPUID info:
- Original set:
-
- CPUID Level: EAX: EBX: ECX: EDX:
- 00000000 00000003 756E6547 6C65746E 49656E69
- 00000001 0000068A 00000002 00000000 0387F9FF
- 00000002 03020101 00000000 00000000 0C040882
- 00000003 00000000 00000000 CA976D2E 000082F6
- 80000000 00000000 00000000 CA976D2E 000082F6
- C0000000 00000000 00000000 CA976D2E 000082F6
-
-
- Version 2:
- CPUID Level: EAX: EBX: ECX: EDX:
- 00000000 00000003 756E6547 6C65746E 49656E69
- 00000001 0000068A 00000002 00000000 0387F9FF
- 00000002 03020101 00000000 00000000 0C040882
- 00000003 00000000 00000000 B8BA1941 00038881
- 80000000 00000000 00000000 B8BA1941 00038881
- C0000000 00000000 00000000 B8BA1941 00038881
-
-*/
-
-#include "emu.h"
-#include "cpu/i386/i386.h"
-#include "machine/idectrl.h"
-#include "machine/lpci.h"
-#include "machine/pckeybrd.h"
-#include "machine/pcshare.h"
-#include "emupal.h"
-#include "screen.h"
-
-
-class gamecstl_state : public pcat_base_state
-{
-public:
- gamecstl_state(const machine_config &mconfig, device_type type, const char *tag)
- : pcat_base_state(mconfig, type, tag),
- m_cga_ram(*this, "cga_ram"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette") { }
-
- void gamecstl(machine_config &config);
-
- void init_gamecstl();
-
-private:
- required_shared_ptr<uint32_t> m_cga_ram;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
- std::unique_ptr<uint32_t[]> m_bios_ram;
- uint8_t m_mtxc_config_reg[256];
- uint8_t m_piix4_config_reg[4][256];
-
- DECLARE_WRITE32_MEMBER(pnp_config_w);
- DECLARE_WRITE32_MEMBER(pnp_data_w);
- DECLARE_WRITE32_MEMBER(bios_ram_w);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- uint32_t screen_update_gamecstl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int ch, int att, int x, int y);
- void intel82439tx_init();
- void gamecstl_io(address_map &map);
- void gamecstl_map(address_map &map);
-
- uint8_t mtxc_config_r(int function, int reg);
- void mtxc_config_w(int function, int reg, uint8_t data);
- uint32_t intel82439tx_pci_r(int function, int reg, uint32_t mem_mask);
- void intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask);
- uint8_t piix4_config_r(int function, int reg);
- void piix4_config_w(int function, int reg, uint8_t data);
- uint32_t intel82371ab_pci_r(int function, int reg, uint32_t mem_mask);
- void intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask);
- uint32_t pci_3dfx_r(int function, int reg, uint32_t mem_mask);
- void pci_3dfx_w(int function, int reg, uint32_t data, uint32_t mem_mask);
-};
-
-
-static const rgb_t cga_palette[16] =
-{
- rgb_t( 0x00, 0x00, 0x00 ), rgb_t( 0x00, 0x00, 0xaa ), rgb_t( 0x00, 0xaa, 0x00 ), rgb_t( 0x00, 0xaa, 0xaa ),
- rgb_t( 0xaa, 0x00, 0x00 ), rgb_t( 0xaa, 0x00, 0xaa ), rgb_t( 0xaa, 0x55, 0x00 ), rgb_t( 0xaa, 0xaa, 0xaa ),
- rgb_t( 0x55, 0x55, 0x55 ), rgb_t( 0x55, 0x55, 0xff ), rgb_t( 0x55, 0xff, 0x55 ), rgb_t( 0x55, 0xff, 0xff ),
- rgb_t( 0xff, 0x55, 0x55 ), rgb_t( 0xff, 0x55, 0xff ), rgb_t( 0xff, 0xff, 0x55 ), rgb_t( 0xff, 0xff, 0xff ),
-};
-
-void gamecstl_state::video_start()
-{
- int i;
- for (i=0; i < 16; i++)
- m_palette->set_pen_color(i, cga_palette[i]);
-}
-
-void gamecstl_state::draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int ch, int att, int x, int y)
-{
- int i,j;
- const uint8_t *dp;
- int index = 0;
- dp = gfx->get_data(ch);
-
- for (j=y; j < y+8; j++)
- {
- uint16_t *p = &bitmap.pix16(j);
-
- for (i=x; i < x+8; i++)
- {
- uint8_t pen = dp[index++];
- if (pen)
- p[i] = gfx->colorbase() + (att & 0xf);
- else
- p[i] = gfx->colorbase() + ((att >> 4) & 0x7);
- }
- }
-}
-
-uint32_t gamecstl_state::screen_update_gamecstl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- int i, j;
- gfx_element *gfx = m_gfxdecode->gfx(0);
- uint32_t *cga = m_cga_ram;
- int index = 0;
-
- bitmap.fill(0, cliprect);
-
- for (j=0; j < 25; j++)
- {
- for (i=0; i < 80; i+=2)
- {
- int att0 = (cga[index] >> 8) & 0xff;
- int ch0 = (cga[index] >> 0) & 0xff;
- int att1 = (cga[index] >> 24) & 0xff;
- int ch1 = (cga[index] >> 16) & 0xff;
-
- draw_char(bitmap, cliprect, gfx, ch0, att0, i*8, j*8);
- draw_char(bitmap, cliprect, gfx, ch1, att1, (i*8)+8, j*8);
- index++;
- }
- }
- return 0;
-}
-
-// Intel 82439TX System Controller (MTXC)
-
-uint8_t gamecstl_state::mtxc_config_r(int function, int reg)
-{
- logerror("MTXC: read %d, %02X\n", function, reg);
- return m_mtxc_config_reg[reg];
-}
-
-void gamecstl_state::mtxc_config_w(int function, int reg, uint8_t data)
-{
- logerror("%s:MTXC: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data);
-
- switch(reg)
- {
- case 0x59: // PAM0
- {
- if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff
- {
- membank("bank1")->set_base(m_bios_ram.get());
- }
- else // disable RAM access (reads go to BIOS ROM)
- {
- membank("bank1")->set_base(memregion("bios")->base() + 0x30000);
- }
- break;
- }
- }
-
- m_mtxc_config_reg[reg] = data;
-}
-
-void gamecstl_state::intel82439tx_init()
-{
- m_mtxc_config_reg[0x60] = 0x02;
- m_mtxc_config_reg[0x61] = 0x02;
- m_mtxc_config_reg[0x62] = 0x02;
- m_mtxc_config_reg[0x63] = 0x02;
- m_mtxc_config_reg[0x64] = 0x02;
- m_mtxc_config_reg[0x65] = 0x02;
-}
-
-uint32_t gamecstl_state::intel82439tx_pci_r(int function, int reg, uint32_t mem_mask)
-{
- uint32_t r = 0;
- if (ACCESSING_BITS_24_31)
- {
- r |= mtxc_config_r(function, reg + 3) << 24;
- }
- if (ACCESSING_BITS_16_23)
- {
- r |= mtxc_config_r(function, reg + 2) << 16;
- }
- if (ACCESSING_BITS_8_15)
- {
- r |= mtxc_config_r(function, reg + 1) << 8;
- }
- if (ACCESSING_BITS_0_7)
- {
- r |= mtxc_config_r(function, reg + 0) << 0;
- }
- return r;
-}
-
-void gamecstl_state::intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask)
-{
- if (ACCESSING_BITS_24_31)
- {
- mtxc_config_w(function, reg + 3, (data >> 24) & 0xff);
- }
- if (ACCESSING_BITS_16_23)
- {
- mtxc_config_w(function, reg + 2, (data >> 16) & 0xff);
- }
- if (ACCESSING_BITS_8_15)
- {
- mtxc_config_w(function, reg + 1, (data >> 8) & 0xff);
- }
- if (ACCESSING_BITS_0_7)
- {
- mtxc_config_w(function, reg + 0, (data >> 0) & 0xff);
- }
-}
-
-// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4)
-
-uint8_t gamecstl_state::piix4_config_r(int function, int reg)
-{
- logerror("PIIX4: read %d, %02X\n", function, reg);
- return m_piix4_config_reg[function][reg];
-}
-
-void gamecstl_state::piix4_config_w(int function, int reg, uint8_t data)
-{
- logerror("%s:PIIX4: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data);
- m_piix4_config_reg[function][reg] = data;
-}
-
-uint32_t gamecstl_state::intel82371ab_pci_r(int function, int reg, uint32_t mem_mask)
-{
- uint32_t r = 0;
- if (ACCESSING_BITS_24_31)
- {
- r |= piix4_config_r(function, reg + 3) << 24;
- }
- if (ACCESSING_BITS_16_23)
- {
- r |= piix4_config_r(function, reg + 2) << 16;
- }
- if (ACCESSING_BITS_8_15)
- {
- r |= piix4_config_r(function, reg + 1) << 8;
- }
- if (ACCESSING_BITS_0_7)
- {
- r |= piix4_config_r(function, reg + 0) << 0;
- }
- return r;
-}
-
-void gamecstl_state::intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask)
-{
- if (ACCESSING_BITS_24_31)
- {
- piix4_config_w(function, reg + 3, (data >> 24) & 0xff);
- }
- if (ACCESSING_BITS_16_23)
- {
- piix4_config_w(function, reg + 2, (data >> 16) & 0xff);
- }
- if (ACCESSING_BITS_8_15)
- {
- piix4_config_w(function, reg + 1, (data >> 8) & 0xff);
- }
- if (ACCESSING_BITS_0_7)
- {
- piix4_config_w(function, reg + 0, (data >> 0) & 0xff);
- }
-}
-
-// ISA Plug-n-Play
-WRITE32_MEMBER(gamecstl_state::pnp_config_w)
-{
- if (ACCESSING_BITS_8_15)
- {
-// osd_printf_debug("PNP Config: %02X\n", (data >> 8) & 0xff);
- }
-}
-
-WRITE32_MEMBER(gamecstl_state::pnp_data_w)
-{
- if (ACCESSING_BITS_8_15)
- {
-// osd_printf_debug("PNP Data: %02X\n", (data >> 8) & 0xff);
- }
-}
-
-
-
-WRITE32_MEMBER(gamecstl_state::bios_ram_w)
-{
- if (m_mtxc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled
- {
- COMBINE_DATA(m_bios_ram.get() + offset);
- }
-}
-
-/*****************************************************************************/
-
-void gamecstl_state::gamecstl_map(address_map &map)
-{
- map(0x00000000, 0x0009ffff).ram();
- map(0x000a0000, 0x000affff).ram();
- map(0x000b0000, 0x000b7fff).ram().share("cga_ram");
- map(0x000e0000, 0x000effff).ram();
- map(0x000f0000, 0x000fffff).bankr("bank1");
- map(0x000f0000, 0x000fffff).w(FUNC(gamecstl_state::bios_ram_w));
- map(0x00100000, 0x01ffffff).ram();
- map(0xfffc0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */
-}
-
-void gamecstl_state::gamecstl_io(address_map &map)
-{
- pcat32_io_common(map);
- map(0x00e8, 0x00eb).noprw();
- map(0x00ec, 0x00ef).noprw();
- map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w));
- map(0x0300, 0x03af).noprw();
- map(0x03b0, 0x03df).noprw();
- map(0x0278, 0x027b).w(FUNC(gamecstl_state::pnp_config_w));
- map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w));
- map(0x0a78, 0x0a7b).w(FUNC(gamecstl_state::pnp_data_w));
- map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write));
-}
-
-/*****************************************************************************/
-
-static const gfx_layout CGA_charlayout =
-{
- 8,8, /* 8 x 16 characters */
- 256, /* 256 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes; 1 bit per pixel */
- /* x offsets */
- { 0,1,2,3,4,5,6,7 },
- /* y offsets */
- { 0*8,1*8,2*8,3*8,
- 4*8,5*8,6*8,7*8 },
- 8*8 /* every char takes 8 bytes */
-};
-
-static GFXDECODE_START( gfx_cga )
-/* Support up to four CGA fonts */
- GFXDECODE_ENTRY( "gfx1", 0x0000, CGA_charlayout, 0, 256 ) /* Font 0 */
- GFXDECODE_ENTRY( "gfx1", 0x0800, CGA_charlayout, 0, 256 ) /* Font 1 */
- GFXDECODE_ENTRY( "gfx1", 0x1000, CGA_charlayout, 0, 256 ) /* Font 2 */
- GFXDECODE_ENTRY( "gfx1", 0x1800, CGA_charlayout, 0, 256 ) /* Font 3*/
-GFXDECODE_END
-
-#define AT_KEYB_HELPER(bit, text, key1) \
- PORT_BIT( bit, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME(text) PORT_CODE(key1)
-
-static INPUT_PORTS_START(gamecstl)
- PORT_START("pc_keyboard_0")
- PORT_BIT ( 0x0001, 0x0000, IPT_UNUSED ) /* unused scancode 0 */
- AT_KEYB_HELPER( 0x0002, "Esc", KEYCODE_Q ) /* Esc 01 81 */
-
- PORT_START("pc_keyboard_1")
- AT_KEYB_HELPER( 0x0020, "Y", KEYCODE_Y ) /* Y 15 95 */
- AT_KEYB_HELPER( 0x1000, "Enter", KEYCODE_ENTER ) /* Enter 1C 9C */
-
- PORT_START("pc_keyboard_2")
-
- PORT_START("pc_keyboard_3")
- AT_KEYB_HELPER( 0x0002, "N", KEYCODE_N ) /* N 31 B1 */
- AT_KEYB_HELPER( 0x0800, "F1", KEYCODE_S ) /* F1 3B BB */
-
- PORT_START("pc_keyboard_4")
-
- PORT_START("pc_keyboard_5")
-
- PORT_START("pc_keyboard_6")
- AT_KEYB_HELPER( 0x0040, "(MF2)Cursor Up", KEYCODE_UP ) /* Up 67 e7 */
- AT_KEYB_HELPER( 0x0080, "(MF2)Page Up", KEYCODE_PGUP ) /* Page Up 68 e8 */
- AT_KEYB_HELPER( 0x0100, "(MF2)Cursor Left", KEYCODE_LEFT ) /* Left 69 e9 */
- AT_KEYB_HELPER( 0x0200, "(MF2)Cursor Right", KEYCODE_RIGHT ) /* Right 6a ea */
- AT_KEYB_HELPER( 0x0800, "(MF2)Cursor Down", KEYCODE_DOWN ) /* Down 6c ec */
- AT_KEYB_HELPER( 0x1000, "(MF2)Page Down", KEYCODE_PGDN ) /* Page Down 6d ed */
- AT_KEYB_HELPER( 0x4000, "Del", KEYCODE_A ) /* Delete 6f ef */
-
- PORT_START("pc_keyboard_7")
-INPUT_PORTS_END
-
-void gamecstl_state::machine_start()
-{
-}
-
-void gamecstl_state::machine_reset()
-{
- membank("bank1")->set_base(memregion("bios")->base() + 0x30000);
-}
-
-void gamecstl_state::gamecstl(machine_config &config)
-{
- /* basic machine hardware */
- PENTIUM3(config, m_maincpu, 200000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &gamecstl_state::gamecstl_map);
- m_maincpu->set_addrmap(AS_IO, &gamecstl_state::gamecstl_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
-
- pcat_common(config);
-
- pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0));
- pcibus.set_device(0, FUNC(gamecstl_state::intel82439tx_pci_r), FUNC(gamecstl_state::intel82439tx_pci_w));
- pcibus.set_device(7, FUNC(gamecstl_state::intel82371ab_pci_r), FUNC(gamecstl_state::intel82371ab_pci_w));
-
- ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true));
- ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w));
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
- screen.set_size(640, 480);
- screen.set_visarea(0, 639, 0, 199);
- screen.set_screen_update(FUNC(gamecstl_state::screen_update_gamecstl));
- screen.set_palette(m_palette);
-
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_cga);
- PALETTE(config, m_palette).set_entries(16);
-}
-
-void gamecstl_state::init_gamecstl()
-{
- m_bios_ram = std::make_unique<uint32_t[]>(0x10000/4);
-
- intel82439tx_init();
-}
-
-/*****************************************************************************/
-
-// not the correct BIOS, f205v owes me a dump of it...
-ROM_START(gamecstl)
- ROM_REGION32_LE(0x40000, "bios", 0)
- ROM_LOAD( "bios.bin", 0x000000, 0x040000, BAD_DUMP CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) )
-
- ROM_REGION(0x08100, "gfx1", 0)
- ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd))
-
- DISK_REGION( "ide:0:hdd:image" )
- DISK_IMAGE( "gamecstl", 0, SHA1(b431af3c42c48ba07972d77a3d24e60ee1e4359e) )
-ROM_END
-
-ROM_START(gamecst2)
- ROM_REGION32_LE(0x40000, "bios", 0)
- ROM_LOAD( "bios.bin", 0x000000, 0x040000, BAD_DUMP CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) )
-
- ROM_REGION(0x08100, "gfx1", 0)
- ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd))
-
- DISK_REGION( "ide:0:hdd:image" )
- DISK_IMAGE( "gamecst2", 0, SHA1(14e1b311cb474801c7bdda3164a0c220fb102159) )
-ROM_END
-
-/*****************************************************************************/
-
-GAME(2002, gamecstl, 0, gamecstl, gamecstl, gamecstl_state, init_gamecstl, ROT0, "Cristaltec", "GameCristal", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-GAME(2002, gamecst2, gamecstl, gamecstl, gamecstl, gamecstl_state, init_gamecstl, ROT0, "Cristaltec", "GameCristal (version 2.613)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)