int namcos2_calc_used_pens(int gfx_zone,int tile,char *penused){ unsigned char* gfxdata=NULL; int pix_y=0,pix_x=0; int height=0,width=0; int pencount=0; height=Machine->gfx[gfx_zone]->height; width=Machine->gfx[gfx_zone]->width; for(pix_y=0;pix_y<height;pix_y++){ gfxdata=get_gfx_pointer(Machine->gfx[gfx_zone],tile,pix_y); for(pix_x=0;pix_x<width;pix_x++){ penused[(gfxdata[pix_x])>>3]|=1<<(gfxdata[pix_x]&0x07); } } // for(pix_y=0;pix_y<256;pix_y++) if((penused[pix_y>>3])&(1<<(pix_y&0x07))) pencount++; return pencount; }
int namcos1_vh_start( void ) { int i; struct gfx_object default_object; #if NAMCOS1_DIRECT_DRAW /* tilemap used flag select */ if(Machine->scrbitmap->depth==16) /* tilemap system is not supported 16bit yet */ namcos1_tilemap_used = 0; else /* selected by game option switch */ namcos1_tilemap_used = namcos1_tilemap_need; #endif /* set table for sprite color == 0x7f */ for(i=0;i<=15;i++) gfx_drawmode_table[i] = DRAWMODE_SHADOW; /* set static memory points */ namcos1_paletteram = memory_region(REGION_USER2); namcos1_controlram = memory_region(REGION_USER2) + 0x8000; /* allocate videoram */ namcos1_videoram = (unsigned char *)malloc(0x8000); if(!namcos1_videoram) { return 1; } memset(namcos1_videoram,0,0x8000); /* initialize object manager */ memset(&default_object,0,sizeof(struct gfx_object)); default_object.transparency = TRANSPARENCY_PEN; default_object.transparet_color = 15; default_object.gfx = Machine->gfx[2]; objectlist = gfxobj_create(MAX_PLAYFIELDS+MAX_SPRITES,8,&default_object); if(objectlist == 0) { free(namcos1_videoram); return 1; } objects = objectlist->objects; /* setup tilemap parameter to objects */ for(i=0;i<MAX_PLAYFIELDS;i++) { /* set user draw handler */ objects[i].special_handler = ns1_draw_tilemap; objects[i].gfx = 0; objects[i].code = i; objects[i].visible = 0; objects[i].color = i; } /* initialize playfields */ for (i = 0; i < MAX_PLAYFIELDS; i++) { #if NAMCOS1_DIRECT_DRAW if(namcos1_tilemap_used) { #endif if ( i < 4 ) { playfields[i].base = &namcos1_videoram[i<<13]; playfields[i].tilemap = tilemap_create(background_get_info,tilemap_scan_rows,TILEMAP_BITMASK, 8,8,64,i==3 ? 32 : 64); } else { playfields[i].base = &namcos1_videoram[FG_OFFSET+0x10+( ( i - 4 ) * 0x800 )]; playfields[i].tilemap = tilemap_create(foreground_get_info,tilemap_scan_rows,TILEMAP_BITMASK, 8,8,36,28); } #if NAMCOS1_DIRECT_DRAW } else { if ( i < 4 ) { playfields[i].base = &namcos1_videoram[i<<13]; playfields[i].width = 64*8; playfields[i].height = ( i == 3 ) ? 32*8 : 64*8; } else { playfields[i].base = &namcos1_videoram[FG_OFFSET+0x10+( ( i - 4 ) * 0x800 )]; playfields[i].width = 36*8; playfields[i].height = 28*8; } } #endif playfields[i].scroll_x = 0; playfields[i].scroll_y = 0; } namcos1_set_flipscreen(0); /* initialize sprites and display controller */ for(i=0;i<0x7ef;i++) namcos1_spriteram_w(i,0); for(i=0;i<0xf;i++) namcos1_displaycontrol_w(i,0); for(i=0;i<0xff;i++) namcos1_playfield_control_w(i,0); #if NAMCOS1_DIRECT_DRAW if(namcos1_tilemap_used) { #endif /* build tilemap mask data from gfx data of mask */ /* because this driver use ORIENTATION_ROTATE_90 */ /* mask data can't made by ROM image */ { const struct GfxElement *mask = Machine->gfx[0]; int total = mask->total_elements; int width = mask->width; int height = mask->height; int line,x,c; mask_ptr = (unsigned char **)malloc(total * sizeof(unsigned char *)); if(mask_ptr == 0) { free(namcos1_videoram); return 1; } mask_data = (unsigned char *)malloc(total * 8); if(mask_data == 0) { free(namcos1_videoram); free(mask_ptr); return 1; } for(c=0;c<total;c++) { unsigned char *src_mask = &mask_data[c*8]; for(line=0;line<height;line++) { unsigned char *maskbm = get_gfx_pointer(mask,c,line); src_mask[line] = 0; for (x=0;x<width;x++) { src_mask[line] |= maskbm[x]<<(7-x); } } mask_ptr[c] = src_mask; if(mask->pen_usage) { switch(mask->pen_usage[c]) { case 0x01: mask_ptr[c] = TILEMAP_BITMASK_TRANSPARENT; break; /* blank */ case 0x02: mask_ptr[c] = TILEMAP_BITMASK_OPAQUE; break; /* full */ } } } } #if NAMCOS1_DIRECT_DRAW } else /* namcos1_tilemap_used */ { /* build char mask status table */ { const struct GfxElement *mask = Machine->gfx[0]; const struct GfxElement *pens = Machine->gfx[1]; int total = mask->total_elements; int width = mask->width; int height = mask->height; int line,x,c; char_state = (unsigned char *)malloc( total ); if(char_state == 0) { free(namcos1_videoram); return 1; } for(c=0;c<total;c++) { unsigned char ordata = 0; unsigned char anddata = 0xff; for(line=0;line<height;line++) { unsigned char *maskbm = get_gfx_pointer(mask,c,line); for (x=0;x<width;x++) { ordata |= maskbm[x]; anddata &= maskbm[x]; } } if(!ordata) char_state[c]=CHAR_BLANK; else if(anddata) char_state[c]=CHAR_FULL; else { /* search non used pen */ unsigned char penmap[256]; unsigned char trans_pen; memset(penmap,0,256); for(line=0;line<height;line++) { unsigned char *pensbm = get_gfx_pointer(pens,c,line); for (x=0;x<width;x++) penmap[pensbm[x]]=1; } for(trans_pen=2;trans_pen<256;trans_pen++) { if(!penmap[trans_pen]) break; } char_state[c]=trans_pen; /* transparency color */ /* fill transparency color */ for(line=0;line<height;line++) { unsigned char *maskbm = get_gfx_pointer(mask,c,line); unsigned char *pensbm = get_gfx_pointer(pens,c,line); for (x=0;x<width;x++) { if(!maskbm[x]) pensbm[x] = trans_pen; } } } } } } /* namcos1_tilemap_used */ #endif for (i = 0;i < TILECOLORS;i++) { palette_shadow_table[Machine->pens[i+SPRITECOLORS]] = Machine->pens[i+SPRITECOLORS+TILECOLORS]; } return 0; }