diff options
Diffstat (limited to 'src/mame/drivers/tcl.c')
-rw-r--r-- | src/mame/drivers/tcl.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/mame/drivers/tcl.c b/src/mame/drivers/tcl.c new file mode 100644 index 00000000000..5d4abc49f8b --- /dev/null +++ b/src/mame/drivers/tcl.c @@ -0,0 +1,200 @@ +/* +Taiwan Chess Legend +Uniwang, 1995 + +Preliminary driver by Tomasz Slanina + +PCB Layout +---------- + + +|-----------------------------------------------| +| AY8930 DSW5 TCL.1E | +| DSW4 TCL.3E TCL.3F TCL.3H | +| DSW3 TCL.4E TCL.4F TCL.4H | +| DSW2 6116 | +| DSW1 6116 6116 | +| 6116 | +| 8255 12MHz | +| | +| | +| TCL_PR3.9E | +| | +| 8255 PAL | +| | +| PAL | +| BATTERY LATTICE | +| PAL PLSI 1016 Z80 PAL | +| TCL_PR1.15C PAL | +| SW1 TCL_PR2.16C 6116 TCL.16F | +|-----------------------------------------------| + +Notes: + Z80 Clock: 3.000MHz + VSync: 60Hz + HSync: 15.15kHz + +*/ + +#include "driver.h" +#include "machine/8255ppi.h" +#include "sound/ay8910.h" + + +static VIDEO_START( tcl ) +{ +} +static VIDEO_UPDATE( tcl ) +{ + return 0; +} + +static ADDRESS_MAP_START( tcl_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM /* bfff ? */ +ADDRESS_MAP_END + + +static INPUT_PORTS_START( tcl ) + PORT_START +INPUT_PORTS_END + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,3), + 3, + { 0, RGN_FRAC(1,3), RGN_FRAC(2,3) }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 +}; + +static const gfx_layout charlayout2 = +{ + 8,8, + RGN_FRAC(1,4), + 4, + { 0, RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4)}, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 +}; + + +static GFXDECODE_START( tcl ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 16 ) + GFXDECODE_ENTRY( REGION_GFX2, 0, charlayout2, 0, 16 ) /* wrong */ +GFXDECODE_END + +static ppi8255_interface ppi8255_intf = +{ + 2, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, +}; + +static MACHINE_RESET( tcl ) +{ + ppi8255_init(&ppi8255_intf); +} + + +static MACHINE_DRIVER_START( tcl ) + + /* basic machine hardware */ + MDRV_CPU_ADD(Z80,12000000/4) + MDRV_CPU_PROGRAM_MAP(tcl_map,0) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(tcl) + MDRV_PALETTE_LENGTH(16*16) + + MDRV_VIDEO_START(tcl) + MDRV_VIDEO_UPDATE(tcl) + + MDRV_MACHINE_RESET(tcl) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 12000000/6) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) +MACHINE_DRIVER_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( tcl ) + ROM_REGION( 0x10000*2, REGION_CPU1, 0 ) + ROM_LOAD( "tcl.16f", 0x00000, 0x20000, CRC(8e694a58) SHA1(7a3c20a7c740065b71fe66ec581edce0dd32f145) ) + + ROM_REGION( 0x8000*3, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "tcl.1e", 0x00000, 0x8000, CRC(37edf9b8) SHA1(9225728116d6edfe8476e565a12e1f1e59766d26) ) + ROM_LOAD( "tcl.3e", 0x08000, 0x8000, CRC(396298cf) SHA1(0ee306179a9d3dd84f7e5799527e6825d2979ddb) ) + ROM_LOAD( "tcl.4e", 0x10000, 0x8000, CRC(f880101c) SHA1(8417410a7dcb304a88e98f9199f44a4df1ee3fb7) ) + + ROM_REGION( 0x2000*4, REGION_GFX2, ROMREGION_DISPOSE ) /* ??? */ + ROM_LOAD( "tcl.3f", 0x0000, 0x2000, CRC(c290c1eb) SHA1(00eb5ff46affe01f240081211b7f9a40e9f76bd8) ) + ROM_LOAD( "tcl.4f", 0x2000, 0x2000, CRC(225e0148) SHA1(26d8db263b1957fc6b2204765c8aa1f10f44b591) ) + ROM_LOAD( "tcl.3h", 0x4000, 0x2000, CRC(ee63d380) SHA1(c1d9ca4584bb2ef0fa85e2afb0876040b473a924) ) + ROM_LOAD( "tcl.4h", 0x6000, 0x2000, CRC(6afa36a1) SHA1(a87423f01dbf9b1e69feb049d6ae3fd63321ee1a) ) + + ROM_REGION( 0x100*3, REGION_PROMS, 0 ) + ROM_LOAD( "tcl_pr1.15c", 0x000, 0x100, CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) + ROM_LOAD( "tcl_pr2.16c", 0x100, 0x100, CRC(0489b760) SHA1(78f8632b17a76335183c5c204cdec856988368b0) ) + ROM_LOAD( "tcl_pr3.9e", 0x200, 0x100, CRC(50ec383b) SHA1(ae95b92bd3946b40134bcdc22708d5c6b0f4c23e) ) +ROM_END + +#define ROL(x,n) (BITSWAP8((x),(7+8-n)&7,(6+8-n)&7,(5+8-n)&7,(4+8-n)&7,(3+8-n)&7,(2+8-n)&7,(1+8-n)&7,(0+8-n)&7)) + +#define WRITEDEST( n ) \ + dest[idx]=n; \ + dest[idx+0x10000]=(n)^0xff; \ + idx++; + +static DRIVER_INIT(tcl) +{ + /* only the first part is decrypted (and verified)*/ + + UINT8 *dest = memory_region(REGION_CPU1); + UINT8 *src = malloc_or_die(memory_region_length(REGION_CPU1)); + + int i,idx=0; + memcpy(src, dest, memory_region_length(REGION_CPU1)); + for(i=0;i<64*1024;i+=4) + { + if(i&0x8000) + { + WRITEDEST(ROL(src[idx]^0x44,4)); // abcdefgh -> aFghaBcd + WRITEDEST(ROL(src[idx]^0x44,7)); // abcdefgh -> haBcdeFg + WRITEDEST(ROL(src[idx]^0x44,2)); // abcdefgh -> cdeFghaB + WRITEDEST((src[idx]^0x44)^0xf0); // abcdefgh -> AbCEeFgh + } + else + { + WRITEDEST(ROL(src[idx]^0x11,4)); // abcdefgh -> efgHabcD + WRITEDEST(ROL(src[idx]^0x11,7)); // abcdefgh -> HabcDefg + WRITEDEST(ROL(src[idx]^0x11,2)); // abcdefgh -> cDefgHab + WRITEDEST((src[idx]^0x11)^0xf0); // abcdefgh -> ABCdefgH + } + } + free(src); + + memory_set_decrypted_region(0, 0x0000, 0x7fff, dest+0x10000); +} + +GAME( 1995, tcl, 0, tcl, tcl, tcl, ROT0, "Uniwang", "Taiwan Chess Legend", GAME_NOT_WORKING ) |