summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/mexico86.c
blob: e0e977ab00019d9afc8f39fff3e83418ef880cff (plain) (tree)
1
2
3
4
5
6
7
8
9
                
                              
 


                                       
                                                                               

                           
                                                         
 
                                                                
 
                                         



 
                         
 
                                                                                
                 

                                        




                                                                                   
                                           

               

                                                                          
                                                                         


                           
                                                                                              

                                 
                                                            
                                 



                                                                                        
                                                                

                                 

                                                        
 
                                                          













                                                                                            
                                                          
                                                         
                 
                                                                       
 
                                          
                 
                                                       
                         
                                                                           

                                                                         



                                                                                                                           
                                          

                                                  


                                                         
                                                                                          


                                                            
                                                        




                         
 
                        
 
                                                                                
                 
                       
                                            
                   
                                  

                   
                                                                        
               
                                                                 
         
                                                               
                                 
 



                                                          














                                                                                          
 


                                              
                                                  


                                                    

                                                                                                       

                                      
                                                                                  


                                              
                                                      
 

                                                                                                       
 
                                                                                  


                                              
                                                          



                 
#include "emu.h"
#include "includes/mexico86.h"


WRITE8_HANDLER( mexico86_bankswitch_w )
{
	mexico86_state *state = space->machine().driver_data<mexico86_state>();

	if ((data & 7) > 5)
		popmessage("Switching to invalid bank!");

	memory_set_bank(space->machine(), "bank1", data & 0x07);

	state->m_charbank = BIT(data, 5);
}



SCREEN_UPDATE( mexico86 )
{
	mexico86_state *state = screen->machine().driver_data<mexico86_state>();
	int offs;
	int sx, sy, xc, yc;
	int gfx_num, gfx_attr, gfx_offs;


	/* Bubble Bobble doesn't have a real video RAM. All graphics (characters */
	/* and sprites) are stored in the same memory region, and information on */
	/* the background character columns is stored inthe area dd00-dd3f */
	bitmap_fill(bitmap, cliprect, 255);

	sx = 0;

	/* the score display seems to be outside of the main objectram. */
	for (offs = 0; offs < state->m_objectram_size + 0x200; offs += 4)
	{
		int height;

		if (offs >= state->m_objectram_size && offs < state->m_objectram_size + 0x180)
			continue;

		if (offs >= state->m_objectram_size + 0x1c0)
			continue;

		/* skip empty sprites */
		/* this is dword aligned so the UINT32 * cast shouldn't give problems */
		/* on any architecture */
		if (*(UINT32 *)(&state->m_objectram[offs]) == 0)
			continue;

		gfx_num = state->m_objectram[offs + 1];
		gfx_attr = state->m_objectram[offs + 3];

		if (!BIT(gfx_num, 7))  /* 16x16 sprites */
		{
			gfx_offs = ((gfx_num & 0x1f) * 0x80) + ((gfx_num & 0x60) >> 1) + 12;
			height = 2;
		}
		else    /* tilemaps (each sprite is a 16x256 column) */
		{
			gfx_offs = ((gfx_num & 0x3f) * 0x80);
			height = 32;
		}

		if ((gfx_num & 0xc0) == 0xc0)   /* next column */
			sx += 16;
		else
		{
			sx = state->m_objectram[offs + 2];
			//if (gfx_attr & 0x40) sx -= 256;
		}
		sy = 256 - height * 8 - (state->m_objectram[offs + 0]);

		for (xc = 0; xc < 2; xc++)
		{
			for (yc = 0; yc < height; yc++)
			{
				int goffs, code, color, flipx, flipy, x, y;

				goffs = gfx_offs + xc * 0x40 + yc * 0x02;
				code = state->m_videoram[goffs] + ((state->m_videoram[goffs + 1] & 0x07) << 8)
						+ ((state->m_videoram[goffs + 1] & 0x80) << 4) + (state->m_charbank << 12);
				color = ((state->m_videoram[goffs + 1] & 0x38) >> 3) + ((gfx_attr & 0x02) << 2);
				flipx = state->m_videoram[goffs + 1] & 0x40;
				flipy = 0;

				//x = sx + xc * 8;
				x = (sx + xc * 8) & 0xff;
				y = (sy + yc * 8) & 0xff;

				drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],
						code,
						color,
						flipx,flipy,
						x,y,15);
			}
		}
	}
	return 0;
}

SCREEN_UPDATE( kikikai )
{
	mexico86_state *state = screen->machine().driver_data<mexico86_state>();
	int offs;
	int sx, sy, yc;
	int gfx_num, /*gfx_attr,*/ gfx_offs;
	int height;
	int goffs, code, color, y;
	int tx, ty;

	bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine()));
	sx = 0;
	for (offs = 0; offs < state->m_objectram_size; offs += 4)
	{
		if (*(UINT32*)(state->m_objectram + offs) == 0)
			continue;

		ty = state->m_objectram[offs];
		gfx_num = state->m_objectram[offs + 1];
		tx = state->m_objectram[offs + 2];
		//gfx_attr = state->m_objectram[offs + 3];

		if (gfx_num & 0x80)
		{
			gfx_offs = ((gfx_num & 0x3f) << 7);
			height = 32;
			if (gfx_num & 0x40) sx += 16;
			else sx = tx;
		}
		else
		{
			if (!(ty && tx)) continue;
			gfx_offs = ((gfx_num & 0x1f) << 7) + ((gfx_num & 0x60) >> 1) + 12;
			height = 2;
			sx = tx;
		}

		sy = 256 - (height << 3) - ty;

		height <<= 1;
		for (yc = 0; yc < height; yc += 2)
		{
			y = (sy + (yc << 2)) & 0xff;
			goffs = gfx_offs + yc;
			code = state->m_videoram[goffs] + ((state->m_videoram[goffs + 1] & 0x1f) << 8);
			color = (state->m_videoram[goffs + 1] & 0xe0) >> 5;
			goffs += 0x40;

			drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],
					code,
					color,
					0,0,
					sx&0xff,y,15);

			code = state->m_videoram[goffs] + ((state->m_videoram[goffs + 1] & 0x1f) << 8);
			color = (state->m_videoram[goffs + 1] & 0xe0) >> 5;

			drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],
					code,
					color,
					0,0,
					(sx+8)&0xff,y,15);
		}
	}
	return 0;
}