/* IGS ARM7 (IGS027A) based Mahjong platform Driver by Xing Xing These games use the IGS027A processor. This is an ARM7 with Internal ROM. (Also used on later PGM games) In some cases the first part of the Internal ROM is excute only, and cannot be read out with a trojan. It hasn't been confirmed if these games make use of that feature. To emulate these games the Internal ROM will need dumping There are at least 5 other games on the platform. */ #include "driver.h" #include "cpu/arm7/arm7core.h" /*************************************************************************** Video 0x38001000, 0x380017ff CG_CONTROL,8 byte per object, 0x100 in total 0x38001800, 0x380019ff PALLETE RAM,2 byte per color, 0x100 in total 0x38004000, 0x38005FFF TX Video RAM????????1E00??????512x240?????? 0x38006000, 0x38007FFF BG Video RAM????????1E00??????512x240?????? ***************************************************************************/ static UINT32 *igs_mainram,*igs_cg_videoram,*igs_tx_videoram,*igs_bg_videoram; static UINT32 *igs_pallete32; static tilemap *igs_tx_tilemap,*igs_bg_tilemap; /* CGLayer */ static WRITE32_HANDLER( igs_cg_videoram_w ) { COMBINE_DATA(&igs_cg_videoram[offset]); //if(data!=0) logerror("PC(%08X) CG @%x = %x!\n",activecpu_get_pc(),offset ,igs_cg_videoram[offset]); /* ROM:08020520 DCW 0x3E ddd1 y ROM:08020522 DCW 0x29 ddd2 x ROM:08020524 DCD 0x190BB6 ddd3 n ROM:08020528 DCW 0xC ddd4 Y ROM:0802052A DCW 0xA6 ddd5 X (ddd5+?)??10bit ddd2??9bit (ddd4+?)??11bit ddd1??8bit ddd3??10bit 8060a4a6 2642ed8f A6A46080 8FED4226 XXXX-XXXX XXxx-xxxx xxxY-YYYY YYYY-YYyy yyyy-yynn nnnn-nnnn */ } /* TX Layer */ static WRITE32_HANDLER( igs_tx_videoram_w ) { COMBINE_DATA(&igs_tx_videoram[offset]); tilemap_mark_tile_dirty(igs_tx_tilemap,offset); //if(data!=0) //logerror( "TX VIDEO RAM OFFSET %x ,data %x!\n",offset ,igs_tx_videoram[offset]); } static TILE_GET_INFO( get_tx_tilemap_tile_info ) { //ppppppppNNNNNNNN int tileno,colour; tileno = igs_tx_videoram[tile_index] & 0xffff; colour = (igs_tx_videoram[tile_index]>>0x10) & 0xffff; SET_TILE_INFO(0,tileno,colour,0); } /* BG Layer */ static WRITE32_HANDLER( igs_bg_videoram_w ) { COMBINE_DATA(&igs_bg_videoram[offset]); tilemap_mark_tile_dirty(igs_bg_tilemap,offset); //if(data!=0) logerror("BG VIDEO RAM OFFSET %x ,data %x!\n",offset ,igs_bg_videoram[offset]); } static TILE_GET_INFO( get_bg_tilemap_tile_info ) { //ppppppppNNNNNNNN int tileno,colour; tileno = igs_bg_videoram[tile_index] & 0xffff; colour = (igs_bg_videoram[tile_index]>>0x10) & 0xffff; SET_TILE_INFO(0,tileno,colour,0); } /* Pallete Layer */ static WRITE32_HANDLER( igs_pallete32_w ) { paletteram16=(UINT16 *)igs_pallete32; COMBINE_DATA(&igs_pallete32[offset]); //paletteram16_xGGGGGRRRRRBBBBB_word_w(offset*2,paletteram16[offset*2],0); //paletteram16_xGGGGGRRRRRBBBBB_word_w(offset*2+1,paletteram16[offset*2+1],0); //if(data!=0) //fprintf(stdout,"PALLETE RAM OFFSET %x ,data %x!\n",offset ,igs_pallete32[offset]); } static VIDEO_START(igs_majhong) { igs_tx_tilemap= tilemap_create(get_tx_tilemap_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32); tilemap_set_transparent_pen(igs_tx_tilemap,15); igs_bg_tilemap= tilemap_create(get_bg_tilemap_tile_info,tilemap_scan_rows,0, 8, 8,64,32); //igs_bg_tilemap= tilemap_create(get_bg_tilemap_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32); //tilemap_set_transparent_pen(igs_bg_tilemap,15); logerror("Video START OK!\n"); } static VIDEO_UPDATE(igs_majhong) { //?????????? fillbitmap(bitmap,get_black_pen(machine),&machine->screen[0].visarea); //?????? tilemap_draw(bitmap,cliprect,igs_bg_tilemap,0,0); //CG?????? //?????? tilemap_draw(bitmap,cliprect,igs_tx_tilemap,0,0); //fprintf(stdout,"Video UPDATE OK!\n"); return 0; } /*************************************************************************** Blitter ***************************************************************************/ /*************************************************************************** Memory Maps ***************************************************************************/ static ADDRESS_MAP_START( igs_majhong_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x00003fff) AM_ROM /* Internal ROM */ AM_RANGE(0x08000000, 0x0807ffff) AM_ROM AM_REGION(REGION_USER1, 0)/* Game ROM */ AM_RANGE(0x10000000, 0x100003ff) AM_RAM AM_BASE(&igs_mainram)// main ram for asic? AM_RANGE(0x18000000, 0x18007fff) AM_RAM AM_RANGE(0x38001000, 0x380017ff) AM_READWRITE(MRA32_RAM, igs_cg_videoram_w) AM_BASE(&igs_cg_videoram) //0x200 * 1 CG PALLETE? AM_RANGE(0x38001800, 0x38001fff) AM_READWRITE(MRA32_RAM, igs_pallete32_w) AM_BASE(&igs_pallete32) //0x200 * 1 AM_RANGE(0x38004000, 0x38005FFF) AM_READWRITE(MRA32_RAM, igs_tx_videoram_w) AM_BASE(&igs_tx_videoram) /* Text Layer */ AM_RANGE(0x38006000, 0x38007FFF) AM_READWRITE(MRA32_RAM, igs_bg_videoram_w) AM_BASE(&igs_bg_videoram) /* CG Layer */ AM_RANGE(0x38002010, 0x38002017) AM_RAM //?????????????? AM_RANGE(0x38009000, 0x38009003) AM_RAM //?????????????? AM_RANGE(0x70000200, 0x70000203) AM_RAM //?????????????? AM_RANGE(0x50000000, 0x500003ff) AM_WRITENOP // uploads xor table to external rom here AM_RANGE(0xf0000000, 0xF000000f) AM_WRITENOP // magic registers ADDRESS_MAP_END /*************************************************************************** Common functions ***************************************************************************/ /*************************************************************************** Code Decryption ***************************************************************************/ static const UINT8 sdwx_tab[] = { 0x49,0x47,0x53,0x30,0x30,0x35,0x35,0x52,0x44,0x34,0x30,0x32,0x30,0x36,0x32,0x31, 0x8A,0xBB,0x20,0x67,0x97,0xA5,0x20,0x45,0x6B,0xC0,0xE8,0x0C,0x80,0xFB,0x49,0xAA, 0x1E,0xAC,0x29,0xF2,0xB9,0x9F,0x01,0x4A,0x8D,0x5F,0x95,0x96,0x78,0xC3,0xF6,0x65, 0x17,0xBD,0xB6,0x5B,0x25,0x5F,0x6B,0xDE,0x10,0x2E,0x67,0x05,0xDC,0xAC,0xB6,0xBD, 0x3D,0x20,0x58,0x3D,0xF0,0xA8,0xC0,0xAD,0x5B,0x82,0x8D,0x12,0x65,0x97,0x87,0x7D, 0x97,0x49,0xDD,0x74,0x74,0x7E,0x9D,0xA1,0x15,0xED,0x75,0xB9,0x09,0xA8,0xA8,0xB0, 0x6B,0xEA,0x54,0x1B,0x45,0x23,0xE2,0xE5,0x25,0x42,0xCE,0x36,0xFE,0x42,0x99,0xA0, 0x41,0xF8,0x0B,0x8C,0x3C,0x1B,0xAE,0xE4,0xB2,0x94,0x87,0x02,0xBC,0x08,0x17,0xD9, 0xE0,0xA4,0x93,0x63,0x6F,0x28,0x5F,0x4A,0x24,0x36,0xD1,0xDA,0xFA,0xDD,0x23,0x26, 0x4E,0x61,0xB9,0x7A,0x36,0x4D,0x95,0x01,0x20,0xBC,0x18,0xB7,0xAF,0xE4,0xFB,0x92, 0xD2,0xE3,0x8E,0xEC,0x26,0xCE,0x2F,0x34,0x8F,0xF7,0x0D,0xD6,0x11,0x7F,0x1F,0x68, 0xF4,0x1D,0x5F,0x16,0x19,0x2D,0x4C,0x4F,0x96,0xFC,0x9F,0xB0,0x99,0x53,0x4C,0x32, 0x7B,0x41,0xBC,0x90,0x23,0x2E,0x4A,0xFC,0x9E,0x1D,0xFC,0x02,0xFC,0x41,0x83,0xBC, 0x6D,0xC4,0x75,0x37,0x9D,0xD3,0xC9,0x26,0x4D,0xED,0x93,0xC6,0x32,0x6D,0x02,0x11, 0x12,0x56,0x97,0x26,0x1D,0x5F,0xA7,0xF8,0x89,0x3F,0x14,0x36,0x72,0x3B,0x48,0x7B, 0xF1,0xED,0x72,0xB7,0x7A,0x56,0x05,0xDE,0x7B,0x27,0x6D,0xCF,0x33,0x4C,0x14,0x86, }; static void sdwx_decrypt(void) { int i; UINT16 *src = (UINT16 *) memory_region(REGION_USER1); int rom_size = 0x80000; for(i=0; i> 1) & 0xff] << 8; src[i] = x; } } static void sdwx_gfx_decrypt(void) { int i; unsigned rom_size = 0x80000; UINT8 *src = (UINT8 *) (memory_region(REGION_GFX1)); UINT8 *result_data = malloc_or_die(rom_size); for (i=0; i