summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video
diff options
context:
space:
mode:
author Michaël Banaan Ananas <happppp@users.noreply.github.com>2011-08-15 20:39:09 +0000
committer Michaël Banaan Ananas <happppp@users.noreply.github.com>2011-08-15 20:39:09 +0000
commit10d02ae6730d466b7c52e4e4610de286521c9fa1 (patch)
tree60fa340e8592e0bdc3049239ed18ce25688596b9 /src/mame/video
parent22473f07f60762318592b520d823ed10eb84fa35 (diff)
moved tecmosys video related stuff from drivers folder to video folder
Diffstat (limited to 'src/mame/video')
-rw-r--r--src/mame/video/tecmosys.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/src/mame/video/tecmosys.c b/src/mame/video/tecmosys.c
new file mode 100644
index 00000000000..92c0239e013
--- /dev/null
+++ b/src/mame/video/tecmosys.c
@@ -0,0 +1,367 @@
+/***************************************************************************
+
+ tecmosys video driver
+
+***************************************************************************/
+
+#include "emu.h"
+#include "includes/tecmosys.h"
+
+
+static TILE_GET_INFO( get_bg0tile_info )
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+
+ SET_TILE_INFO(
+ 1,
+ state->m_bg0tilemap_ram[2*tile_index+1],
+ (state->m_bg0tilemap_ram[2*tile_index]&0x3f),
+ TILE_FLIPYX((state->m_bg0tilemap_ram[2*tile_index]&0xc0)>>6));
+}
+
+static TILE_GET_INFO( get_bg1tile_info )
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+
+ SET_TILE_INFO(
+ 2,
+ state->m_bg1tilemap_ram[2*tile_index+1],
+ (state->m_bg1tilemap_ram[2*tile_index]&0x3f),
+ TILE_FLIPYX((state->m_bg1tilemap_ram[2*tile_index]&0xc0)>>6));
+}
+
+static TILE_GET_INFO( get_bg2tile_info )
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+
+ SET_TILE_INFO(
+ 3,
+ state->m_bg2tilemap_ram[2*tile_index+1],
+ (state->m_bg2tilemap_ram[2*tile_index]&0x3f),
+ TILE_FLIPYX((state->m_bg2tilemap_ram[2*tile_index]&0xc0)>>6));
+}
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+
+ SET_TILE_INFO(
+ 0,
+ state->m_fgtilemap_ram[2*tile_index+1],
+ (state->m_fgtilemap_ram[2*tile_index]&0x3f),
+ TILE_FLIPYX((state->m_fgtilemap_ram[2*tile_index]&0xc0)>>6));
+}
+
+
+WRITE16_HANDLER( bg0_tilemap_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg0tilemap_ram[offset]);
+ tilemap_mark_tile_dirty(state->m_bg0tilemap,offset/2);
+}
+
+WRITE16_HANDLER( bg1_tilemap_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg1tilemap_ram[offset]);
+ tilemap_mark_tile_dirty(state->m_bg1tilemap,offset/2);
+}
+
+WRITE16_HANDLER( bg2_tilemap_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg2tilemap_ram[offset]);
+ tilemap_mark_tile_dirty(state->m_bg2tilemap,offset/2);
+}
+
+WRITE16_HANDLER( fg_tilemap_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_fgtilemap_ram[offset]);
+ tilemap_mark_tile_dirty(state->m_txt_tilemap,offset/2);
+}
+
+
+INLINE void set_color_555(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data)
+{
+ palette_set_color_rgb(machine, color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift));
+}
+
+WRITE16_HANDLER( tilemap_paletteram16_xGGGGGRRRRRBBBBB_word_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_tilemap_paletteram16[offset]);
+ set_color_555(space->machine(), offset+0x4000, 5, 10, 0, state->m_tilemap_paletteram16[offset]);
+}
+
+WRITE16_HANDLER( bg0_tilemap_lineram_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg0tilemap_lineram[offset]);
+ if (data!=0x0000) popmessage("non 0 write to bg0 lineram %04x %04x",offset,data);
+}
+
+WRITE16_HANDLER( bg1_tilemap_lineram_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg1tilemap_lineram[offset]);
+ if (data!=0x0000) popmessage("non 0 write to bg1 lineram %04x %04x",offset,data);
+}
+
+WRITE16_HANDLER( bg2_tilemap_lineram_w )
+{
+ tecmosys_state *state = space->machine().driver_data<tecmosys_state>();
+ COMBINE_DATA(&state->m_bg2tilemap_lineram[offset]);
+ if (data!=0x0000) popmessage("non 0 write to bg2 lineram %04x %04x",offset,data);
+}
+
+
+
+static void tecmosys_render_sprites_to_bitmap(running_machine &machine, bitmap_t *bitmap, UINT16 extrax, UINT16 extray )
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+ UINT8 *gfxsrc = machine.region ( "gfx1" )->base();
+ int i;
+
+ /* render sprites (with priority information) to temp bitmap */
+ bitmap_fill(state->m_sprite_bitmap, NULL, 0x0000);
+ /* there are multiple spritelists in here, to allow for buffering */
+ for (i=(state->m_spritelist*0x4000)/2;i<((state->m_spritelist+1)*0x4000)/2;i+=8)
+ {
+ int xcnt,ycnt;
+ int drawx, drawy;
+ UINT16* dstptr;
+
+ int x, y;
+ int address;
+ int xsize = 16;
+ int ysize = 16;
+ int colour;
+ int flipx, flipy;
+ int priority;
+ int zoomx, zoomy;
+
+ x = state->m_spriteram[i+0]+386;
+ y = (state->m_spriteram[i+1]+1);
+
+ x-= extrax;
+ y-= extray;
+
+ y&=0x1ff;
+ x&=0x3ff;
+
+ if (x&0x200) x-=0x400;
+ if (y&0x100) y-=0x200;
+
+ address = state->m_spriteram[i+5]| ((state->m_spriteram[i+4]&0x000f)<<16);
+
+ address<<=8;
+
+ flipx = (state->m_spriteram[i+4]&0x0040)>>6;
+ flipy = (state->m_spriteram[i+4]&0x0080)>>7; // used by some move effects in tkdensho
+
+ zoomx = (state->m_spriteram[i+2] & 0x0fff)>>0; // zoom?
+ zoomy = (state->m_spriteram[i+3] & 0x0fff)>>0; // zoom?
+
+ if ((!zoomx) || (!zoomy)) continue;
+
+ ysize = ((state->m_spriteram[i+6] & 0x00ff))*16;
+ xsize = (((state->m_spriteram[i+6] & 0xff00)>>8))*16;
+
+ colour = ((state->m_spriteram[i+4] & 0x3f00))>>8;
+
+ priority = ((state->m_spriteram[i+4] & 0x0030))>>4;
+
+ if (state->m_spriteram[i+4] & 0x8000) continue;
+
+ for (ycnt = 0; ycnt < ysize; ycnt++)
+ {
+ int actualycnt = (ycnt * zoomy) >> 8;
+ int actualysize = (ysize * zoomy) >> 8;
+
+ if (flipy) drawy = y + (actualysize-1) - actualycnt;
+ else drawy = y + actualycnt;
+
+ for (xcnt = 0; xcnt < xsize; xcnt++)
+ {
+ int actualxcnt = (xcnt * zoomx) >> 8;
+ int actualxsize = (xsize *zoomx) >> 8;
+
+ if (flipx) drawx = x + (actualxsize-1) - actualxcnt;
+ else drawx = x + actualxcnt;
+
+ if ((drawx>=0 && drawx<320) && (drawy>=0 && drawy<240))
+ {
+ UINT8 data;
+
+ dstptr = BITMAP_ADDR16(state->m_sprite_bitmap, drawy, drawx);
+
+
+ data = (gfxsrc[address]);
+
+
+ if(data) dstptr[0] = (data + (colour*0x100)) | (priority << 14);
+ }
+
+ address++;
+ }
+ }
+ }
+}
+
+static void tecmosys_tilemap_copy_to_compose(tecmosys_state *state, UINT16 pri)
+{
+ int y,x;
+ UINT16 *srcptr;
+ UINT16 *dstptr;
+ for (y=0;y<240;y++)
+ {
+ srcptr = BITMAP_ADDR16(state->m_tmp_tilemap_renderbitmap, y, 0);
+ dstptr = BITMAP_ADDR16(state->m_tmp_tilemap_composebitmap, y, 0);
+ for (x=0;x<320;x++)
+ {
+ if ((srcptr[x]&0xf)!=0x0)
+ dstptr[x] = (srcptr[x]&0x7ff) | pri;
+ }
+ }
+}
+
+static void tecmosys_do_final_mix(running_machine &machine, bitmap_t* bitmap)
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+ const pen_t *paldata = machine.pens;
+ int y,x;
+ UINT16 *srcptr;
+ UINT16 *srcptr2;
+ UINT32 *dstptr;
+
+ for (y=0;y<240;y++)
+ {
+ srcptr = BITMAP_ADDR16(state->m_tmp_tilemap_composebitmap, y, 0);
+ srcptr2 = BITMAP_ADDR16(state->m_sprite_bitmap, y, 0);
+
+ dstptr = BITMAP_ADDR32(bitmap, y, 0);
+ for (x=0;x<320;x++)
+ {
+ UINT16 pri, pri2;
+ UINT16 penvalue;
+ UINT16 penvalue2;
+ UINT32 colour;
+ UINT32 colour2;
+
+ pri = srcptr[x] & 0xc000;
+ pri2 = srcptr2[x] & 0xc000;
+
+ penvalue = state->m_tilemap_paletteram16[srcptr[x]&0x7ff];
+ colour = paldata[(srcptr[x]&0x7ff) | 0x4000];
+
+ if (srcptr2[x]&0x3fff)
+ {
+ penvalue2 = machine.generic.paletteram.u16[srcptr2[x]&0x3fff];
+ colour2 = paldata[srcptr2[x]&0x3fff];
+ }
+ else
+ {
+ penvalue2 = state->m_tilemap_paletteram16[srcptr[x]&0x7ff];
+ colour2 = paldata[(srcptr[x]&0x7ff) | 0x4000];
+ }
+
+ if ((penvalue & 0x8000) && (penvalue2 & 0x8000)) // blend
+ {
+ int r,g,b;
+ int r2,g2,b2;
+ b = (colour & 0x000000ff) >> 0;
+ g = (colour & 0x0000ff00) >> 8;
+ r = (colour & 0x00ff0000) >> 16;
+
+ b2 = (colour2 & 0x000000ff) >> 0;
+ g2 = (colour2 & 0x0000ff00) >> 8;
+ r2 = (colour2 & 0x00ff0000) >> 16;
+
+ r = (r + r2) >> 1;
+ g = (g + g2) >> 1;
+ b = (b + b2) >> 1;
+
+ dstptr[x] = b | (g<<8) | (r<<16);
+ }
+ else if (pri2 >= pri)
+ {
+ dstptr[x] = colour2;
+ }
+ else
+ {
+ dstptr[x] = colour;
+ }
+ }
+ }
+}
+
+
+SCREEN_UPDATE(tecmosys)
+{
+ tecmosys_state *state = screen->machine().driver_data<tecmosys_state>();
+
+ bitmap_fill(bitmap,cliprect,screen->machine().pens[0x4000]);
+
+
+ tilemap_set_scrolly( state->m_bg0tilemap, 0, state->m_c80000regs[1]+16);
+ tilemap_set_scrollx( state->m_bg0tilemap, 0, state->m_c80000regs[0]+104);
+
+ tilemap_set_scrolly( state->m_bg1tilemap, 0, state->m_a80000regs[1]+17);
+ tilemap_set_scrollx( state->m_bg1tilemap, 0, state->m_a80000regs[0]+106);
+
+ tilemap_set_scrolly( state->m_bg2tilemap, 0, state->m_b00000regs[1]+17);
+ tilemap_set_scrollx( state->m_bg2tilemap, 0, state->m_b00000regs[0]+106);
+
+ bitmap_fill(state->m_tmp_tilemap_composebitmap,cliprect,0);
+
+ bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0);
+ tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg0tilemap,0,0);
+ tecmosys_tilemap_copy_to_compose(state, 0x0000);
+
+ bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0);
+ tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg1tilemap,0,0);
+ tecmosys_tilemap_copy_to_compose(state, 0x4000);
+
+ bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0);
+ tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg2tilemap,0,0);
+ tecmosys_tilemap_copy_to_compose(state, 0x8000);
+
+ bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0);
+ tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_txt_tilemap,0,0);
+ tecmosys_tilemap_copy_to_compose(state, 0xc000);
+
+
+ tecmosys_do_final_mix(screen->machine(), bitmap);
+
+ // prepare sprites for NEXT frame - causes 1 frame palette errors, but prevents sprite lag in tkdensho, which is correct?
+ tecmosys_render_sprites_to_bitmap(screen->machine(), bitmap, state->m_880000regs[0x0], state->m_880000regs[0x1]);
+
+ return 0;
+}
+
+VIDEO_START(tecmosys)
+{
+ tecmosys_state *state = machine.driver_data<tecmosys_state>();
+ state->m_sprite_bitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16);
+ bitmap_fill(state->m_sprite_bitmap, NULL, 0x4000);
+
+ state->m_tmp_tilemap_composebitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16);
+ state->m_tmp_tilemap_renderbitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16);
+
+ bitmap_fill(state->m_tmp_tilemap_composebitmap, NULL, 0x0000);
+ bitmap_fill(state->m_tmp_tilemap_renderbitmap, NULL, 0x0000);
+
+
+ state->m_txt_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32*2,32*2);
+ tilemap_set_transparent_pen(state->m_txt_tilemap,0);
+
+ state->m_bg0tilemap = tilemap_create(machine, get_bg0tile_info,tilemap_scan_rows,16,16,32,32);
+ tilemap_set_transparent_pen(state->m_bg0tilemap,0);
+
+ state->m_bg1tilemap = tilemap_create(machine, get_bg1tile_info,tilemap_scan_rows,16,16,32,32);
+ tilemap_set_transparent_pen(state->m_bg1tilemap,0);
+
+ state->m_bg2tilemap = tilemap_create(machine, get_bg2tile_info,tilemap_scan_rows,16,16,32,32);
+ tilemap_set_transparent_pen(state->m_bg2tilemap,0);
+}