/*************************************************************************** Jaleco fcombat ***************************************************************************/ #include "driver.h" int fcombat_sh; int fcombat_sv; #define BACKGROUND_X_START 32 #define BACKGROUND_X_START_FLIP 72 #define VISIBLE_X_MIN (12*8) #define VISIBLE_X_MAX (52*8) #define VISIBLE_Y_MIN (2*8) #define VISIBLE_Y_MAX (30*8) static tilemap *bgmap; static TILE_GET_INFO( get_bg_tile_info ) { int tileno,palno;//32*16 x 32 //palno=(tile_index-(tile_index/32*16)*32*16)/32; tileno = memory_region(REGION_USER1)[tile_index]; palno=0x18;//memory_region(REGION_USER2)[tile_index]>>3; SET_TILE_INFO(2,tileno,palno,0); } UINT8 fcombat_cocktail_flip; static UINT8 char_palette, sprite_palette; static UINT8 char_bank; /*************************************************************************** Convert the color PROMs into a more useable format. The palette PROM is connected to the RGB output this way: bit 7 -- 220 ohm resistor -- BLUE -- 470 ohm resistor -- BLUE -- 220 ohm resistor -- GREEN -- 470 ohm resistor -- GREEN -- 1 kohm resistor -- GREEN -- 220 ohm resistor -- RED -- 470 ohm resistor -- RED bit 0 -- 1 kohm resistor -- RED ***************************************************************************/ PALETTE_INIT( fcombat ) { int i; for (i = 0; i < machine->drv->total_colors; i++) { int bit0, bit1, bit2, r, g, b; /* red component */ bit0 = (*color_prom >> 0) & 0x01; bit1 = (*color_prom >> 1) & 0x01; bit2 = (*color_prom >> 2) & 0x01; r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* green component */ bit0 = (*color_prom >> 3) & 0x01; bit1 = (*color_prom >> 4) & 0x01; bit2 = (*color_prom >> 5) & 0x01; g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* blue component */ bit0 = 0; bit1 = (*color_prom >> 6) & 0x01; bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; palette_set_color(machine,i,MAKE_RGB(r,g,b)); color_prom++; } /* color_prom now points to the beginning of the char lookup table */ /* fg chars */ for (i = 0; i < 256; i++) colortable[i + 0x000] = 16 + (color_prom[(i & 0xc0) | ((i & 3) << 4) | ((i >> 2) & 15)] & 15); color_prom += 256; /* color_prom now points to the beginning of the sprite lookup table */ /* sprites */ for (i = 0; i < 256; i++) colortable[i + 0x100] = 16 + (color_prom[(i & 0xc0) | ((i & 3) << 4) | ((i >> 2) & 15)] & 15); color_prom += 256; /* bg chars (this is not the full story... there are four layers mixed */ /* using another PROM */ for (i = 0; i < 256; i++) //colortable[i + 0x200] = 16 + (color_prom[(i & 0xc0) | ((i & 3) << 4) | ((i >> 2) & 15)] & 15); colortable[i + 0x200] = *color_prom++ & 15; } /************************************* * * Video system startup * *************************************/ VIDEO_START( fcombat ) { bgmap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,32*8*2,32); video_start_generic(machine); } /************************************* * * Video register I/O * *************************************/ WRITE8_HANDLER( fcombat_videoreg_w ) { /* bit 0 = flip screen and joystick input multiplexor */ fcombat_cocktail_flip = data & 1; /* bits 1-2 char lookup table bank */ char_palette = (data & 0x06) >> 1; /* bits 3 char bank */ char_bank = (data & 0x08) >> 3; /* bits 4-5 unused */ /* bits 6-7 sprite lookup table bank */ sprite_palette = 0;//(data & 0xc0) >> 6; //popmessage("%08x",data); } VIDEO_UPDATE( fcombat ) { int sx, sy, offs, i; /* draw background */ tilemap_set_scrolly( bgmap,0, fcombat_sh); tilemap_set_scrollx( bgmap,0, fcombat_sv-24); tilemap_mark_all_tiles_dirty(bgmap); tilemap_draw(bitmap,cliprect,bgmap,0,0); //draw_background(bitmap, cliprect); /* draw sprites */ for (i = 0; i < spriteram_size; i += 4) { int flags = spriteram[i + 0]; int y = spriteram[i + 1] ^ 255; int code = spriteram[i + 2]+((flags&0x20)<<3); int x = spriteram[i + 3] * 2 + 72; int xflip = flags & 0x80; int yflip = flags & 0x40; int doubled =0;// flags & 0x10; int wide = flags & 0x08; int code2 = code; int color = ((flags >> 1) & 0x03) | ((code >> 5) & 0x04) | (code & 0x08) | (sprite_palette * 16); const gfx_element *gfx = machine->gfx[1]; if (fcombat_cocktail_flip) { x = 64*8 - gfx->width - x; y = 32*8 - gfx->height - y; if (wide) y -= gfx->height; xflip = !xflip; yflip = !yflip; } if (wide) { if (yflip) code |= 0x10, code2 &= ~0x10; else code &= ~0x10, code2 |= 0x10; drawgfx(bitmap, gfx, code2, color, xflip, yflip, x, y + gfx->height, cliprect, TRANSPARENCY_PEN, 0); } if(flags&0x10) { drawgfx(bitmap, gfx, code2+16, color, xflip, yflip, x, y + gfx->height, cliprect, TRANSPARENCY_PEN, 0); drawgfx(bitmap, gfx, code2+16*2, color, xflip, yflip, x, y + 2*gfx->height, cliprect, TRANSPARENCY_PEN, 0); drawgfx(bitmap, gfx, code2+16*3, color, xflip, yflip, x, y + 3*gfx->height, cliprect, TRANSPARENCY_PEN, 0); } drawgfx(bitmap, gfx, code, color, xflip, yflip, x, y, cliprect, TRANSPARENCY_PEN, 0); if (doubled) i += 4; } /* draw the visible text layer */ for (sy = VISIBLE_Y_MIN/8; sy < VISIBLE_Y_MAX/8; sy++) for (sx = VISIBLE_X_MIN/8; sx < VISIBLE_X_MAX/8; sx++) { int x = fcombat_cocktail_flip ? (63*8 - 8*sx) : 8*sx; int y = fcombat_cocktail_flip ? (31*8 - 8*sy) : 8*sy; offs = sx + sy * 64; drawgfx(bitmap, machine->gfx[0], videoram[offs] + 256 * char_bank, ((videoram[offs] & 0xf0) >> 4) + char_palette * 16, fcombat_cocktail_flip, fcombat_cocktail_flip, x, y, cliprect, TRANSPARENCY_PEN, 0); } return 0; }