summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/video/gba.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/video/gba.c')
-rw-r--r--src/mess/video/gba.c1901
1 files changed, 0 insertions, 1901 deletions
diff --git a/src/mess/video/gba.c b/src/mess/video/gba.c
deleted file mode 100644
index 0699f047c98..00000000000
--- a/src/mess/video/gba.c
+++ /dev/null
@@ -1,1901 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:R. Belmont,Ryan Holtz
-/***************************************************************************
-
- gba.c
-
- File to handle emulation of the video hardware of the Game Boy Advance
-
- By R. Belmont, MooglyGuy
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/gba.h"
-
-#define VERBOSE_LEVEL (0)
-
-INLINE void ATTR_PRINTF(3,4) verboselog(running_machine &machine, int n_level, const char *s_fmt, ...)
-{
- if( VERBOSE_LEVEL >= n_level )
- {
- va_list v;
- char buf[ 32768 ];
- va_start( v, s_fmt );
- vsprintf( buf, s_fmt, v );
- va_end( v );
- logerror( "%08x: %s", machine.driver_data<gba_state>()->m_maincpu->pc(), buf );
- }
-}
-
-static const int coeff[32] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
-};
-
-/* Utility functions */
-INLINE UINT32 alpha_blend_pixel(UINT32 color0, UINT32 color1, int ca, int cb);
-INLINE UINT32 increase_brightness(UINT32 color, int coeff_);
-INLINE UINT32 decrease_brightness(UINT32 color, int coeff_);
-
-#define GBA_MODE0 0
-#define GBA_MODE1 1
-#define GBA_MODE2 2
-#define GBA_MODE345 3
-
-#define GBA_SUBMODE0 0
-#define GBA_SUBMODE1 1
-#define GBA_SUBMODE2 2
-
-inline void gba_state::update_mask(UINT8* mask, int mode, int submode, UINT32* obj_win, UINT8 inwin0, UINT8 inwin1, UINT8 in0_mask, UINT8 in1_mask, UINT8 out_mask)
-{
- UINT8 mode_mask = 0;
- if (submode == GBA_SUBMODE2)
- {
- for (int x = 0; x < 240; x++)
- {
- mask[x] = out_mask;
-
- if ((obj_win[x] & 0x80000000) == 0)
- mask[x] = m_WINOUT >> 8;
-
- if (inwin1)
- {
- if (is_in_window(x, 1))
- mask[x] = in1_mask;
- }
-
- if (inwin0)
- {
- if (is_in_window(x, 0))
- mask[x] = in0_mask;
- }
- }
- }
-
- if (mode == GBA_MODE1)
- {
- // disable line3
- mode_mask = ~0x08;
- }
- else if (mode == GBA_MODE2)
- {
- // disable line0 & line1
- mode_mask = ~0x03;
- }
- else if (mode == GBA_MODE345)
- {
- // disable line0, line1 & line3
- mode_mask = ~0x0b;
- }
-
-
- if (mode_mask)
- {
- for (int x = 0; x < 240; x++)
- mask[x] &= mode_mask;
- }
-}
-
-void gba_state::draw_modes(int mode, int submode, int y, UINT32* line0, UINT32* line1, UINT32* line2, UINT32* line3, UINT32* lineOBJ, UINT32* lineOBJWin, UINT32* lineMix, int bpp)
-{
- UINT32 backdrop = ((UINT16*)m_gba_pram.target())[0] | 0x30000000;
- int inWindow0 = 0;
- int inWindow1 = 0;
- UINT8 inWin0Mask = m_WININ & 0x00ff;
- UINT8 inWin1Mask = m_WININ >> 8;
- UINT8 outMask = m_WINOUT & 0x00ff;
- UINT8 masks[240]; // this puts together WinMasks with the fact that some modes/submodes skip specific layers!
-
- if (submode == GBA_SUBMODE2)
- {
- if (m_DISPCNT & DISPCNT_WIN0_EN)
- {
- UINT8 v0 = m_WIN0V >> 8;
- UINT8 v1 = m_WIN0V & 0x00ff;
- inWindow0 = ((v0 == v1) && (v0 >= 0xe8)) ? 1 : 0;
- if (v1 >= v0)
- inWindow0 |= (y >= v0 && y < v1) ? 1 : 0;
- else
- inWindow0 |= (y >= v0 || y < v1) ? 1 : 0;
- }
-
- if (m_DISPCNT & DISPCNT_WIN1_EN)
- {
- UINT8 v0 = m_WIN1V >> 8;
- UINT8 v1 = m_WIN1V & 0x00ff;
- inWindow1 = ((v0 == v1) && (v0 >= 0xe8)) ? 1 : 0;
- if (v1 >= v0)
- inWindow1 |= (y >= v0 && y < v1) ? 1 : 0;
- else
- inWindow1 |= (y >= v0 || y < v1) ? 1 : 0;
- }
- }
-
- // Draw BG
- switch (mode)
- {
- case 0:
- draw_bg_scanline(line0, y, DISPCNT_BG0_EN, m_BG0CNT, m_BG0HOFS, m_BG0VOFS);
- draw_bg_scanline(line1, y, DISPCNT_BG1_EN, m_BG1CNT, m_BG1HOFS, m_BG1VOFS);
- draw_bg_scanline(line2, y, DISPCNT_BG2_EN, m_BG2CNT, m_BG2HOFS, m_BG2VOFS);
- draw_bg_scanline(line3, y, DISPCNT_BG3_EN, m_BG3CNT, m_BG3HOFS, m_BG3VOFS);
- break;
- case 1:
- draw_bg_scanline(line0, y, DISPCNT_BG0_EN, m_BG0CNT, m_BG0HOFS, m_BG0VOFS);
- draw_bg_scanline(line1, y, DISPCNT_BG1_EN, m_BG1CNT, m_BG1HOFS, m_BG1VOFS);
- draw_roz_scanline(line2, y, DISPCNT_BG2_EN, m_BG2CNT, m_BG2X, m_BG2Y, m_BG2PA, m_BG2PB, m_BG2PC, m_BG2PD, &m_gfxBG2X, &m_gfxBG2Y, m_gfxBG2Changed);
- break;
- case 2:
- draw_roz_scanline(line2, y, DISPCNT_BG2_EN, m_BG2CNT, m_BG2X, m_BG2Y, m_BG2PA, m_BG2PB, m_BG2PC, m_BG2PD, &m_gfxBG2X, &m_gfxBG2Y, m_gfxBG2Changed);
- draw_roz_scanline(line3, y, DISPCNT_BG3_EN, m_BG3CNT, m_BG3X, m_BG3Y, m_BG3PA, m_BG3PB, m_BG3PC, m_BG3PD, &m_gfxBG3X, &m_gfxBG3Y, m_gfxBG3Changed);
- break;
- case 3:
- case 4:
- case 5:
- draw_roz_bitmap_scanline(line2, y, DISPCNT_BG2_EN, m_BG2CNT, m_BG2X, m_BG2Y, m_BG2PA, m_BG2PB, m_BG2PC, m_BG2PD, &m_gfxBG2X, &m_gfxBG2Y, m_gfxBG2Changed, bpp);
- break;
- }
-
- // Draw OAM
- draw_gba_oam(lineOBJ, y);
- if (submode == GBA_SUBMODE2)
- draw_gba_oam_window(lineOBJWin, y);
-
- memset(masks, 0xff, sizeof(masks));
- update_mask(&masks[0], mode, submode, lineOBJWin, inWindow0, inWindow1, inWin0Mask, inWin1Mask, outMask);
-
- for (int x = 0; x < 240; x++)
- {
- UINT32 color = backdrop;
- UINT8 top = 0x20;
-
- if ((UINT8)(line0[x] >> 24) < (UINT8)(color >> 24) && masks[x] & 0x01)
- {
- color = line0[x];
- top = 0x01;
- }
-
- if ((UINT8)(line1[x] >> 24) < (UINT8)(color >> 24) && masks[x] & 0x02)
- {
- color = line1[x];
- top = 0x02;
- }
-
- if ((UINT8)(line2[x] >> 24) < (UINT8)(color >> 24) && masks[x] & 0x04)
- {
- color = line2[x];
- top = 0x04;
- }
-
- if ((UINT8)(line3[x] >> 24) < (UINT8)(color >> 24) && masks[x] & 0x08)
- {
- color = line3[x];
- top = 0x08;
- }
-
- if ((UINT8)(lineOBJ[x] >> 24) < (UINT8)(color >> 24) && masks[x] & 0x10)
- {
- color = lineOBJ[x];
- top = 0x10;
- }
-
- if (color & 0x00010000)
- {
- if (submode != GBA_SUBMODE0 || top == 0x10)
- {
- UINT32 back = backdrop;
- UINT8 top2 = 0x20;
-
- if ((UINT8)(line0[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x01)
- {
- back = line0[x];
- top2 = 0x01;
- }
-
- if ((UINT8)(line1[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x02)
- {
- back = line1[x];
- top2 = 0x02;
- }
-
- if ((UINT8)(line2[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x04)
- {
- back = line2[x];
- top2 = 0x04;
- }
-
- if ((UINT8)(line3[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x08)
- {
- back = line3[x];
- top2 = 0x08;
- }
-
- if (top2 & (m_BLDCNT >> BLDCNT_TP2_SHIFT))
- color = alpha_blend_pixel(color, back, coeff[m_BLDALPHA & 0x1f], coeff[(m_BLDALPHA >> 8) & 0x1f]);
- else
- {
- if (top & m_BLDCNT)
- {
- switch(m_BLDCNT & BLDCNT_SFX)
- {
- case BLDCNT_SFX_LIGHTEN:
- color = increase_brightness(color, coeff[m_BLDY & 0x1f]);
- break;
- case BLDCNT_SFX_DARKEN:
- color = decrease_brightness(color, coeff[m_BLDY & 0x1f]);
- break;
- }
- }
- }
- }
- }
- else if (submode == GBA_SUBMODE1 || (submode == GBA_SUBMODE2 && masks[x] & 0x20))
- {
- if (top & m_BLDCNT)
- {
- switch(m_BLDCNT & BLDCNT_SFX)
- {
- case BLDCNT_SFX_NONE:
- break;
- case BLDCNT_SFX_ALPHA:
- {
- UINT32 back = backdrop;
- UINT8 top2 = 0x20;
-
- if ((UINT8)(line0[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x01)
- {
- if (top != 0x01)
- {
- back = line0[x];
- top2 = 0x01;
- }
- }
-
- if ((UINT8)(line1[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x02)
- {
- if (top != 0x02)
- {
- back = line1[x];
- top2 = 0x02;
- }
- }
-
- if ((UINT8)(line2[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x04)
- {
- if (top != 0x04)
- {
- back = line2[x];
- top2 = 0x04;
- }
- }
-
- if ((UINT8)(line3[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x08)
- {
- if (top != 0x08)
- {
- back = line3[x];
- top2 = 0x08;
- }
- }
-
- if ((UINT8)(lineOBJ[x] >> 24) < (UINT8)(back >> 24) && masks[x] & 0x10)
- {
- if (top != 0x10)
- {
- back = lineOBJ[x];
- top2 = 0x10;
- }
- }
-
- if (top2 & (m_BLDCNT >> BLDCNT_TP2_SHIFT))
- color = alpha_blend_pixel(color, back, coeff[m_BLDALPHA & 0x1f], coeff[(m_BLDALPHA >> 8) & 0x1f]);
- }
- break;
- case BLDCNT_SFX_LIGHTEN:
- color = increase_brightness(color, coeff[m_BLDY & 0x1f]);
- break;
- case BLDCNT_SFX_DARKEN:
- color = decrease_brightness(color, coeff[m_BLDY & 0x1f]);
- break;
- }
- }
- }
- lineMix[x] = color;
- }
- if (mode == GBA_MODE1 || mode == GBA_MODE2 || mode == GBA_MODE345)
- m_gfxBG2Changed = 0;
- if (mode == GBA_MODE2)
- m_gfxBG3Changed = 0;
-}
-
-void gba_state::draw_roz_bitmap_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed, int depth)
-{
- UINT8 *src8 = (UINT8 *)m_gba_vram.target();
- UINT16 *src16 = (UINT16 *)m_gba_vram.target();
- UINT16 *palette = (UINT16 *)m_gba_pram.target();
- INT32 sx = (depth == 4) ? 160 : 240;
- INT32 sy = (depth == 4) ? 128 : 160;
- UINT32 prio = ((ctrl & BGCNT_PRIORITY) << 25) + 0x1000000;
- INT32 cx, cy, pixx, pixy, x;
-
- if ((depth == 8) && (m_DISPCNT & DISPCNT_FRAMESEL))
- src8 += 0xa000;
-
- if ((depth == 4) && (m_DISPCNT & DISPCNT_FRAMESEL))
- src16 += 0xa000/2;
-
- // sign extend roz parameters
- if (X & 0x08000000) X |= 0xf0000000;
- if (Y & 0x08000000) Y |= 0xf0000000;
- if (PA & 0x8000) PA |= 0xffff0000;
- if (PB & 0x8000) PB |= 0xffff0000;
- if (PC & 0x8000) PC |= 0xffff0000;
- if (PD & 0x8000) PD |= 0xffff0000;
-
- if(ypos == 0)
- changed = 3;
-
- if(changed & 1)
- *currentx = X;
- else
- *currentx += PB;
-
- if(changed & 2)
- *currenty = Y;
- else
- *currenty += PD;
-
- cx = *currentx;
- cy = *currenty;
-
- if(ctrl & BGCNT_MOSAIC)
- {
- INT32 mosaic_line = ((m_MOSAIC & 0xf0) >> 4) + 1;
- INT32 tempy = (ypos / mosaic_line) * mosaic_line;
- cx = X + tempy*PB;
- cy = Y + tempy*PD;
- }
-
- pixx = cx >> 8;
- pixy = cy >> 8;
-
- for(x = 0; x < 240; x++)
- {
- if(pixx < 0 || pixy < 0 || pixx >= sx || pixy >= sy)
- {
- scanline[x] = 0x80000000;
- }
- else
- {
- if (depth == 8)
- {
- UINT8 color = src8[pixy*sx + pixx];
- scanline[x] = color ? (palette[color] | prio) : 0x80000000;
- }
- else
- {
- scanline[x] = src16[pixy*sx + pixx] | prio;
- }
- }
-
- cx += PA;
- cy += PC;
-
- pixx = cx >> 8;
- pixy = cy >> 8;
- }
-
- if(ctrl & BGCNT_MOSAIC)
- {
- INT32 mosaicx = (m_MOSAIC & 0x0f) + 1;
- if(mosaicx > 1)
- {
- INT32 m = 1;
- for(x = 0; x < 239; x++)
- {
- scanline[x+1] = scanline[x];
- m++;
- if(m == mosaicx)
- {
- m = 1;
- x++;
- }
- }
- }
- }
-}
-
-void gba_state::draw_roz_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed)
-{
- UINT32 base, mapbase, size;
- static const INT32 sizes[4] = { 128, 256, 512, 1024 };
- INT32 cx, cy, pixx, pixy;
- UINT8 *mgba_vram = (UINT8 *)m_gba_vram.target();
- UINT32 tile;
- UINT16 *pgba_pram = (UINT16 *)m_gba_pram.target();
- UINT16 pixel;
- UINT32 prio = ((ctrl & BGCNT_PRIORITY) << 25) + 0x1000000;
- int x = 0;
-
- for (x = 0; x < 240; x++)
- scanline[x] = 0x80000000;
-
- if (m_DISPCNT & enablemask)
- {
- base = ((ctrl & BGCNT_CHARBASE) >> BGCNT_CHARBASE_SHIFT) * 0x4000; // VRAM base of tiles
- mapbase = ((ctrl & BGCNT_SCREENBASE) >> BGCNT_SCREENBASE_SHIFT) * 0x800; // VRAM base of map
- size = (ctrl & BGCNT_SCREENSIZE) >> BGCNT_SCREENSIZE_SHIFT; // size of map in submaps
-
- // sign extend roz parameters
- if (X & 0x08000000) X |= 0xf0000000;
- if (Y & 0x08000000) Y |= 0xf0000000;
- if (PA & 0x8000) PA |= 0xffff0000;
- if (PB & 0x8000) PB |= 0xffff0000;
- if (PC & 0x8000) PC |= 0xffff0000;
- if (PD & 0x8000) PD |= 0xffff0000;
-
- if(ypos == 0)
- changed = 3;
-
- if(changed & 1)
- *currentx = X;
- else
- *currentx += PB;
-
- if(changed & 2)
- *currenty = Y;
- else
- *currenty += PD;
-
- cx = *currentx;
- cy = *currenty;
-
- if(ctrl & BGCNT_MOSAIC)
- {
- int mosaic_line = ((m_MOSAIC & 0xf0) >> 4) + 1;
- int y = ypos % mosaic_line;
- cx -= y*PB;
- cy -= y*PD;
- }
-
- pixx = cx >> 8;
- pixy = cy >> 8;
-
- if(ctrl & BGCNT_PALETTESET_WRAP)
- {
- pixx %= sizes[size];
- pixy %= sizes[size];
- if(pixx < 0)
- {
- pixx += sizes[size];
- }
- if(pixy < 0)
- {
- pixy += sizes[size];
- }
- }
-
- for(x = 0; x < 240; x++)
- {
- if(pixx < 0 || pixy < 0 || pixx >= sizes[size] || pixy >= sizes[size])
- {
- scanline[x] = 0x80000000;
- }
- else
- {
- int tilex = pixx & 7;
- int tiley = pixy & 7;
-
- // shall we shift for (ctrl & BGCNT_PALETTE256)?? or is not effective for ROZ?
- tile = mgba_vram[mapbase + (pixx >> 3) + (pixy >> 3) * (sizes[size] >> 3)];
- pixel = mgba_vram[base + (tile << 6) + (tiley << 3) + tilex];
-
- // plot it
- scanline[x] = pixel ? (pgba_pram[pixel] | prio) : 0x80000000;
- }
-
- cx += PA;
- cy += PC;
-
- pixx = cx >> 8;
- pixy = cy >> 8;
-
- if(ctrl & BGCNT_PALETTESET_WRAP)
- {
- pixx %= sizes[size];
- pixy %= sizes[size];
- if(pixx < 0)
- {
- pixx += sizes[size];
- }
- if(pixy < 0)
- {
- pixy += sizes[size];
- }
- }
- }
-
- if(ctrl & BGCNT_MOSAIC)
- {
- int mosaicx = (m_MOSAIC & 0x0f) + 1;
- if(mosaicx > 1)
- {
- int m = 1;
- for(x = 0; x < 239; x++)
- {
- scanline[x+1] = scanline[x];
- m++;
- if(m == mosaicx)
- {
- m = 1;
- x++;
- }
- }
- }
- }
- }
-}
-
-void gba_state::draw_bg_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, UINT32 hofs, UINT32 vofs)
-{
- UINT8 *vram = (UINT8*)m_gba_vram.target();
- UINT16 *palette = (UINT16*)m_gba_pram.target();
- UINT8 *chardata = &vram[((ctrl & BGCNT_CHARBASE) >> BGCNT_CHARBASE_SHIFT) * 0x4000];
- UINT16 *screendata = (UINT16*)&vram[((ctrl & BGCNT_SCREENBASE) >> BGCNT_SCREENBASE_SHIFT) * 0x800];
- UINT32 priority = ((ctrl & BGCNT_PRIORITY) << 25) + 0x1000000;
- INT32 width = 256;
- INT32 height = 256;
- INT32 maskx, masky, pixx, pixy;
- UINT8 use_mosaic = (ctrl & BGCNT_MOSAIC) ? 1 : 0;
- INT32 mosaicx = (m_MOSAIC & 0x000f) + 1;
- INT32 mosaicy = ((m_MOSAIC & 0x00f0) >> 4) + 1;
- INT32 stride;
- int x = 0;
-
- for (x = 0; x < 240; x++)
- scanline[x] = 0x80000000;
-
- if(m_DISPCNT & enablemask)
- {
- switch((ctrl & BGCNT_SCREENSIZE) >> BGCNT_SCREENSIZE_SHIFT)
- {
- case 1:
- width = 512;
- break;
- case 2:
- height = 512;
- break;
- case 3:
- width = 512;
- height = 512;
- break;
- }
-
- maskx = width - 1;
- masky = height - 1;
-
- pixx = hofs & maskx;
- pixy = (vofs + ypos) & masky;
-
- if(use_mosaic)
- {
- if((ypos % mosaicy) != 0)
- {
- mosaicy = (ypos / mosaicy) * mosaicy;
- pixy = (vofs + mosaicy) & masky;
- }
- }
-
- if(pixy > 255 && height > 256)
- {
- pixy &= 0x000000ff;
- screendata += 0x400;
- if(width > 256)
- {
- screendata += 0x400;
- }
- }
-
- stride = (pixy >> 3) << 5;
-
- UINT16 *src = screendata + 0x400 * (pixx >> 8) + ((pixx & 255) >> 3) + stride;
- for(x = 0; x < 240; x++)
- {
- UINT16 data = *src;
- INT32 tile = data & TILEOBJ_TILE;
- INT32 tilex = pixx & 7;
- INT32 tiley = pixy & 7;
- UINT8 color;
- UINT8 palindex;
-
- if(data & TILEOBJ_HFLIP)
- {
- tilex = 7 - tilex;
- }
- if(data & TILEOBJ_VFLIP)
- {
- tiley = 7 - tiley;
- }
-
- if (ctrl & BGCNT_PALETTE256)
- {
- color = chardata[(tile << 6) + (tiley << 3) + tilex];
- palindex = 0;
- }
- else
- {
- color = chardata[(tile << 5) + (tiley << 2) + (tilex >> 1)];
-
- if (tilex & 1)
- color >>= 4;
- else
- color &= 0x0f;
- palindex = (data >> 8) & 0x00f0;
- }
-
- if (color)
- scanline[x] = palette[palindex + color] | priority;
- else
- scanline[x] = 0x80000000;
-
- if (data & TILEOBJ_HFLIP)
- {
- if (tilex == 0)
- {
- src++;
- }
- }
- else if (tilex == 7)
- {
- src++;
- }
-
- pixx++;
- if(pixx == 256)
- {
- if(width > 256)
- {
- src = screendata + 0x400 + stride;
- }
- else
- {
- src = screendata + stride;
- pixx = 0;
- }
- }
- else if(pixx >= width)
- {
- pixx = 0;
- src = screendata + stride;
- }
- }
-
- if(use_mosaic)
- {
- if(mosaicx > 1)
- {
- INT32 m = 1;
- for(x = 0; x < 239; x++)
- {
- scanline[x+1] = scanline[x];
- m++;
- if(m == mosaicx)
- {
- m = 1;
- x++;
- }
- }
- }
- }
-
- }
-}
-
-void gba_state::draw_gba_oam_window(UINT32 *scanline, int y)
-{
- INT16 gba_oamindex;
- UINT32 tilebytebase, tileindex, tiledrawindex;
- UINT32 width, height;
- UINT16 *pgba_oam = (UINT16 *)m_gba_oam.target();
- UINT8 *src = (UINT8*)m_gba_vram.target();
- int x = 0;
-
- for (x = 0; x < 240; x++)
- scanline[x] = 0x80000000;
-
- if (m_DISPCNT & DISPCNT_OBJWIN_EN)
- {
- for( gba_oamindex = 127; gba_oamindex >= 0; gba_oamindex-- )
- {
- INT32 sx, sy;
- UINT16 attr0, attr1, attr2;
- INT32 cury;
-
- attr0 = pgba_oam[(4*gba_oamindex)+0];
- attr1 = pgba_oam[(4*gba_oamindex)+1];
- attr2 = pgba_oam[(4*gba_oamindex)+2];
-
- sx = (attr1 & OBJ_X_COORD);
- sy = (attr0 & OBJ_Y_COORD);
-
- if(sy > 160)
- {
- sy -= 256;
- }
-
- if ((attr0 & OBJ_MODE) != OBJ_MODE_WINDOW)
- {
- continue;
- }
- else
- {
- width = 0;
- height = 0;
- switch (attr0 & OBJ_SHAPE )
- {
- case OBJ_SHAPE_SQR:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 1;
- height = 1;
- break;
- case OBJ_SIZE_16:
- width = 2;
- height = 2;
- break;
- case OBJ_SIZE_32:
- width = 4;
- height = 4;
- break;
- case OBJ_SIZE_64:
- width = 8;
- height = 8;
- break;
- }
- break;
- case OBJ_SHAPE_HORIZ:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 2;
- height = 1;
- break;
- case OBJ_SIZE_16:
- width = 4;
- height = 1;
- break;
- case OBJ_SIZE_32:
- width = 4;
- height = 2;
- break;
- case OBJ_SIZE_64:
- width = 8;
- height = 4;
- break;
- }
- break;
- case OBJ_SHAPE_VERT:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 1;
- height = 2;
- break;
- case OBJ_SIZE_16:
- width = 1;
- height = 4;
- break;
- case OBJ_SIZE_32:
- width = 2;
- height = 4;
- break;
- case OBJ_SIZE_64:
- width = 4;
- height = 8;
- break;
- }
- break;
- default:
- width = 0;
- height = 0;
- verboselog(machine(), 0, "OAM error: Trying to draw OBJ with OBJ_SHAPE = 3!\n" );
- break;
- }
-
- tiledrawindex = tileindex = (attr2 & OBJ_TILENUM);
- tilebytebase = 0x10000; // the index doesn't change in the higher modes, we just ignore sprites that are out of range
-
- if (attr0 & OBJ_ROZMODE_ROZ)
- {
- INT32 fx, fy, ax, ay, rx, ry;
- INT16 dx, dy, dmx, dmy;
- UINT8 color;
-
- width *= 8;
- height *= 8;
-
- if ((attr0 & OBJ_ROZMODE) == OBJ_ROZMODE_DISABLE)
- {
- continue;
- }
-
- fx = width;
- fy = height;
-
- if((attr0 & OBJ_ROZMODE) == OBJ_ROZMODE_DBLROZ)
- {
- fx *= 2;
- fy *= 2;
- }
-
- cury = y - sy;
-
- if(cury >= 0 && cury < fy)
- {
- if(sx < 240 || ((sx + fx) & 0x1ff) < 240)
- {
- int rot = (attr1 & OBJ_SCALE_PARAM) >> OBJ_SCALE_PARAM_SHIFT;
- dx = (INT16)pgba_oam[(rot << 4)+3];
- dmx = (INT16)pgba_oam[(rot << 4)+7];
- dy = (INT16)pgba_oam[(rot << 4)+11];
- dmy = (INT16)pgba_oam[(rot << 4)+15];
-
- rx = (width << 7) - (fx >> 1)*dx - (fy >> 1)*dmx + cury * dmx;
- ry = (height << 7) - (fx >> 1)*dy - (fy >> 1)*dmy + cury * dmy;
-
- if((attr0 & OBJ_PALMODE) == OBJ_PALMODE_256)
- {
- int inc = 32;
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = sx >> 2;
- }
- else
- {
- tiledrawindex &= 0x3fe;
- }
- for(x = 0; x < fx; x++)
- {
- ax = rx >> 8;
- ay = ry >> 8;
-
- if(ax < 0 || ax >= sx || ay < 0 || ay >= sy)
- {
- }
- else
- {
- color = src[tilebytebase + ((((tiledrawindex + (ay >> 3) * inc) << 5) + ((ay & 0x07) << 3) + ((ax >> 3) << 6) + (ax & 0x07)) & 0x7fff)];
-
- if(color)
- {
- scanline[sx] = 1;
- }
- }
-
- sx = (sx + 1) & 0x1ff;
-
- rx += dx;
- ry += dy;
- }
- }
- else
- {
- int inc = 32;
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = sx >> 3;
- }
- for(x = 0; x < fx; x++)
- {
- ax = rx >> 8;
- ay = ry >> 8;
-
- if(ax < 0 || ax >= sx || ay < 0 || ay >= sy)
- {
- }
- else
- {
- color = src[tilebytebase + ((((tiledrawindex + (ay >> 3) * inc) << 5) + ((ay & 0x07) << 2) + ((ax >> 3) << 5) + ((ax & 0x07) >> 1)) & 0x7fff)];
-
- if(ax & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color)
- {
- scanline[sx] = 1;
- }
- }
-
- sx = (sx + 1) & 0x1ff;
-
- rx += dx;
- ry += dy;
- }
- }
- }
- }
- }
- else
- {
- INT32 ax;
- int cury_ = y - sy;
-
- width *= 8;
- height *= 8;
-
- if(cury_ >= 0 && cury_ < height)
- {
- if( ( (sx < 240) || ( ( (sx + width) & 0x1ff ) < 240 ) ) && (attr0 & OBJ_ROZMODE_DISABLE) == 0)
- {
- if((attr0 & OBJ_PALMODE) == OBJ_PALMODE_256)
- {
- int inc = 32;
- int address = 0;
- if(attr1 & OBJ_VFLIP)
- {
- cury_ = height - cury_ - 1;
- }
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 2;
- }
- else
- {
- tiledrawindex &= 0x3fe;
- }
-
- ax = 0;
- if(attr1 & OBJ_HFLIP)
- {
- ax = width - 1;
- }
-
- address = 0x10000 + ((((tiledrawindex + (cury_ >> 3) * inc) << 5) + ((cury_ & 7) << 3) + ((ax >> 3) << 6) + (ax & 7)) & 0x7fff);
-
- if(attr1 & OBJ_HFLIP)
- {
- ax = 7;
- }
-
- for(x = 0; x < width; x++)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
-
- if(color)
- {
- scanline[sx] = 1;
- }
- }
-
- sx = (sx + 1) & 0x1ff;
-
- if(attr1 & OBJ_HFLIP)
- {
- ax--;
- address--;
- if(ax == -1)
- {
- address -= 56;
- ax = 7;
- }
- if(address < 0x10000)
- {
- address += 0x8000;
- }
- }
- else
- {
- ax++;
- address++;
- if(ax == 8)
- {
- address += 56;
- ax = 0;
- }
- if(address > 0x17fff)
- {
- address -= 0x8000;
- }
- }
- }
- }
- else
- {
- int inc = 32;
- UINT32 address;
- if(attr1 & OBJ_VFLIP)
- {
- cury_ = height - cury_ - 1;
- }
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 3;
- }
-
- ax = 0;
- if(attr1 & OBJ_HFLIP)
- {
- ax = width - 1;
- }
-
- address = 0x10000 + ((((tiledrawindex + (cury_ >> 3) * inc) << 5) + ((cury_ & 0x07) << 2) + ((ax >> 3) << 5) + ((ax & 0x07) >> 1)) & 0x7fff);
- if(attr1 & OBJ_HFLIP)
- {
- ax = 7;
- for(x = width - 1; x >= 0; x--)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
- if(x & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color)
- {
- scanline[sx] = 1;
- }
- }
-
- sx = (sx + 1) & 0x1ff;
- ax--;
- if((x & 1) == 0)
- {
- address--;
- }
- if(ax == -1)
- {
- ax = 7;
- address -= 28;
- }
- if(address < 0x10000)
- {
- address += 0x8000;
- }
- }
- }
- else
- {
- for(x = 0; x < width; x++)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
-
- if(x & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color)
- {
- scanline[sx] = 1;
- }
- }
-
- sx = (sx + 1) & 0x1ff;
- ax++;
- if(x & 1)
- {
- address++;
- }
- if(ax == 8)
- {
- address += 28;
- ax = 0;
- }
- if(address > 0x17fff)
- {
- address -= 0x8000;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-void gba_state::draw_gba_oam(UINT32 *scanline, int y)
-{
- INT16 gba_oamindex;
- INT32 mosaiccnt = 0;
- INT32 mosaicy = ((m_MOSAIC & 0xf000) >> 12) + 1;
- INT32 mosaicx = ((m_MOSAIC & 0x0f00) >> 8) + 1;
- UINT32 tileindex, tiledrawindex; //, tilebytebase
- UINT8 width, height;
- UINT16 *pgba_oam = (UINT16 *)m_gba_oam.target();
- UINT8 *src = (UINT8 *)m_gba_vram.target();
- UINT16 *palette = (UINT16*)m_gba_pram.target();
- int x = 0;
-
- for (x = 0; x < 240; x++)
- scanline[x] = 0x80000000;
-
- if( m_DISPCNT & DISPCNT_OBJ_EN )
- {
- for( gba_oamindex = 0; gba_oamindex < 128; gba_oamindex++ )
- {
- UINT16 attr0, attr1, attr2;
- INT32 cury;
- UINT32 prio;
- UINT32 priority;
-
- attr0 = pgba_oam[(4*gba_oamindex)+0];
- attr1 = pgba_oam[(4*gba_oamindex)+1];
- attr2 = pgba_oam[(4*gba_oamindex)+2];
- priority = (attr2 & OBJ_PRIORITY) >> OBJ_PRIORITY_SHIFT;
- prio = (priority << 25) | ((attr0 & OBJ_MODE) << 6);
-
- if ((attr0 & OBJ_MODE) != OBJ_MODE_WINDOW)
- {
- width = 0;
- height = 0;
- switch (attr0 & OBJ_SHAPE)
- {
- case OBJ_SHAPE_SQR:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 1;
- height = 1;
- break;
- case OBJ_SIZE_16:
- width = 2;
- height = 2;
- break;
- case OBJ_SIZE_32:
- width = 4;
- height = 4;
- break;
- case OBJ_SIZE_64:
- width = 8;
- height = 8;
- break;
- }
- break;
- case OBJ_SHAPE_HORIZ:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 2;
- height = 1;
- break;
- case OBJ_SIZE_16:
- width = 4;
- height = 1;
- break;
- case OBJ_SIZE_32:
- width = 4;
- height = 2;
- break;
- case OBJ_SIZE_64:
- width = 8;
- height = 4;
- break;
- }
- break;
- case OBJ_SHAPE_VERT:
- switch(attr1 & OBJ_SIZE )
- {
- case OBJ_SIZE_8:
- width = 1;
- height = 2;
- break;
- case OBJ_SIZE_16:
- width = 1;
- height = 4;
- break;
- case OBJ_SIZE_32:
- width = 2;
- height = 4;
- break;
- case OBJ_SIZE_64:
- width = 4;
- height = 8;
- break;
- }
- break;
- default:
- width = 0;
- height = 0;
- verboselog(machine(), 0, "OAM error: Trying to draw OBJ with OBJ_SHAPE = 3!\n" );
- break;
- }
-
- tiledrawindex = tileindex = (attr2 & OBJ_TILENUM);
-// tilebytebase = 0x10000; // the index doesn't change in the higher modes, we just ignore sprites that are out of range
-
- if (attr0 & OBJ_ROZMODE_ROZ)
- {
- INT32 sx, sy;
- INT32 fx, fy, rx, ry;
- INT16 dx, dy, dmx, dmy;
-
- width *= 8;
- height *= 8;
-
- if ((attr0 & OBJ_ROZMODE) == OBJ_ROZMODE_DISABLE)
- {
- continue;
- }
-
- sx = (attr1 & OBJ_X_COORD);
- sy = (attr0 & OBJ_Y_COORD);
-
- if(sy > 160)
- {
- sy -= 256;
- }
-
- fx = width;
- fy = height;
-
- if((attr0 & OBJ_ROZMODE) == OBJ_ROZMODE_DBLROZ)
- {
- fx *= 2;
- fy *= 2;
- }
-
- cury = y - sy;
-
- if(cury >= 0 && cury < fy)
- {
- if(sx < 240 || ((sx + fx) & 0x1ff) < 240)
- {
- INT32 oamparam = (attr1 & OBJ_SCALE_PARAM) >> OBJ_SCALE_PARAM_SHIFT;
-
- dx = (INT16)pgba_oam[(oamparam << 4)+3];
- dmx = (INT16)pgba_oam[(oamparam << 4)+7];
- dy = (INT16)pgba_oam[(oamparam << 4)+11];
- dmy = (INT16)pgba_oam[(oamparam << 4)+15];
-
- if(attr0 & OBJ_MOSAIC)
- {
- cury -= (cury % mosaicy);
- }
-
- rx = (width << 7) - (fx >> 1)*dx - (fy >> 1)*dmx + cury*dmx;
- ry = (height << 7) - (fx >> 1)*dy - (fy >> 1)*dmy + cury*dmy;
-
- if((attr0 & OBJ_PALMODE) == OBJ_PALMODE_256)
- {
- INT32 inc = 32;
-
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 2;
- }
- else
- {
- tiledrawindex &= 0x3fe;
- }
-
- for(x = 0; x < fx; x++)
- {
- INT32 pixx = rx >> 8;
- INT32 pixy = ry >> 8;
-
- if(!(pixx < 0 || pixx >= width || pixy < 0 || pixy >= height || sx >= 240))
- {
- UINT8 color = src[0x10000 + ((((tiledrawindex + (pixy >> 3) * inc) << 5) + ((pixy & 7) << 3) + ((pixx >> 3) << 6) + (pixx & 7)) & 0x7fff)];
- if(color == 0 && priority < ((scanline[sx] >> 25) & 3))
- {
- scanline[sx] = (scanline[sx] & 0xf9ffffff) | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- else if(color != 0 && prio < (scanline[sx] & 0xff000000))
- {
- scanline[sx] = palette[256 + color] | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- mosaiccnt++;
- if(mosaiccnt == mosaicx)
- {
- mosaiccnt = 0;
- }
- }
- }
-
- sx++;
- sx &= 0x1ff;
-
- rx += dx;
- ry += dy;
- }
- }
- else
- {
- INT32 inc = 32;
- INT32 palentry = (attr2 >> 8) & 0xf0;
-
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 3;
- }
-
- for(x = 0; x < fx; x++)
- {
- INT32 pixx = rx >> 8;
- INT32 pixy = ry >> 8;
-
- if(!(pixx < 0 || pixx >= width || pixy < 0 || pixy >= height || sx >= 240))
- {
- UINT8 color = src[0x10000 + ((((tiledrawindex + (pixy >> 3) * inc) << 5) + ((pixy & 7) << 2) + ((pixx >> 3) << 5) + ((pixx & 7) >> 1)) & 0x7fff)];
-
- if(pixx & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color == 0 && priority < ((scanline[sx] >> 25) & 3))
- {
- scanline[sx] = (scanline[sx] & 0xf9ffffff) | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- else if(color != 0 && prio < (scanline[sx] & 0xff000000))
- {
- scanline[sx] = palette[256 + palentry + color] | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- mosaiccnt++;
- if(mosaiccnt == mosaicx)
- {
- mosaiccnt = 0;
- }
- }
-
- sx++;
-
- sx &= 0x1ff;
-
- rx += dx;
- ry += dy;
- }
- }
- }
- }
- }
- else
- {
- INT32 sx, sy;
- INT32 vflip = (attr1 & OBJ_VFLIP) ? 1 : 0;
- INT32 hflip = (attr1 & OBJ_HFLIP) ? 1 : 0;
-
- width *= 8;
- height *= 8;
-
- if ((attr0 & OBJ_ROZMODE) == OBJ_ROZMODE_DISABLE)
- {
- continue;
- }
-
- sx = (attr1 & OBJ_X_COORD);
- sy = (attr0 & OBJ_Y_COORD);
-
- if(sy > 160)
- {
- sy -= 256;
- }
-
- cury = y - sy;
- if(cury >= 0 && cury < height)
- {
- if(sx < 240 || ((sx + width) & 0x1ff) < 240)
- {
- if((attr0 & OBJ_PALMODE) == OBJ_PALMODE_256)
- {
- INT32 pixx;
- INT32 inc = 32;
- INT32 address = 0;
-
- if(vflip)
- {
- cury = height - cury - 1;
- }
-
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 2;
- }
- else
- {
- tiledrawindex &= 0x3fe;
- }
-
- pixx = 0;
- if(hflip)
- {
- pixx = width - 1;
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- cury -= (cury % mosaicy);
- }
-
- address = 0x10000 + ((((tiledrawindex + (cury >> 3) * inc) << 5) + ((cury & 7) << 3) + ((pixx >> 3) << 6) + (pixx & 7)) & 0x7fff);
-
- if(hflip)
- {
- pixx = 7;
- }
-
- for(x = 0; x < width; x++)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
- if(color == 0 && priority < ((scanline[sx] >> 25) & 3))
- {
- scanline[sx] = (scanline[sx] & 0xf9ffffff) | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- else if(color != 0 && prio < (scanline[sx] & 0xff000000))
- {
- scanline[sx] = palette[256 + color] | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- mosaiccnt++;
- if(mosaiccnt == mosaicx)
- {
- mosaiccnt = 0;
- }
- }
-
- sx++;
- sx &= 0x1ff;
-
- if(hflip)
- {
- pixx--;
- address--;
- if(pixx == -1)
- {
- address -= 56;
- pixx = 7;
- }
- if(address < 0x10000)
- {
- address += 0x8000;
- }
- }
- else
- {
- pixx++;
- address++;
- if(pixx == 8)
- {
- address += 56;
- pixx = 0;
- }
- if(address > 0x17fff)
- {
- address -= 0x8000;
- }
- }
- }
- }
- else
- {
- INT32 pixx;
- INT32 inc = 32;
- UINT32 address = 0;
-
- if(vflip)
- {
- cury = height - cury - 1;
- }
-
- if((m_DISPCNT & DISPCNT_MODE) > 2 && tiledrawindex < 0x200)
- {
- continue;
- }
-
- if((m_DISPCNT & DISPCNT_VRAM_MAP) == DISPCNT_VRAM_MAP_1D)
- {
- inc = width >> 3;
- }
-
- pixx = 0;
- if(hflip)
- {
- pixx = width - 1;
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- cury -= (cury % mosaicy);
- }
-
- address = 0x10000 + ((((tiledrawindex + (cury >> 3) * inc) << 5) + ((cury & 7) << 2) + ((pixx >> 3) << 5) + ((pixx & 7) >> 1)) & 0x7fff);
-
- if(hflip)
- {
- pixx = 7;
- for(x = width - 1; x >= 0; x--)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
- UINT8 palentry = (attr2 >> 8) & 0xf0;
-
- if(x & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color == 0 && priority < ((scanline[sx] >> 25) & 3))
- {
- scanline[sx] = (scanline[sx] & 0xf9ffffff) | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- else if(color != 0 && prio < (scanline[sx] & 0xff000000))
- {
- scanline[sx] = palette[256 + palentry + color] | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- }
-
- sx++;
- sx &= 0x1ff;
-
- pixx--;
- if(!(x & 1))
- {
- address--;
- }
- if(pixx == -1)
- {
- address -= 28;
- pixx = 7;
- }
- if(address < 0x10000)
- {
- address += 0x8000;
- }
- }
- }
- else
- {
- for(x = 0; x < width; x++)
- {
- if(sx < 240)
- {
- UINT8 color = src[address];
- UINT8 palentry = (attr2 >> 8) & 0xf0;
-
- if(x & 1)
- {
- color >>= 4;
- }
- else
- {
- color &= 0x0f;
- }
-
- if(color == 0 && priority < ((scanline[sx] >> 25) & 3))
- {
- scanline[sx] = (scanline[sx] & 0xf9ffffff) | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- else if(color != 0 && prio < (scanline[sx] & 0xff000000))
- {
- scanline[sx] = palette[256 + palentry + color] | prio;
- if((attr0 & OBJ_MOSAIC) != 0 && mosaiccnt != 0)
- {
- scanline[sx] = (scanline[sx - 1] & 0xf9ffffff) | prio;
- }
- }
- }
-
- if(attr0 & OBJ_MOSAIC)
- {
- mosaiccnt++;
- if(mosaiccnt == mosaicx)
- {
- mosaiccnt = 0;
- }
- }
-
- sx++;
- sx &= 0x1ff;
-
- pixx++;
- if(x & 1)
- {
- address++;
- }
- if(pixx == 8)
- {
- address += 28;
- pixx = 0;
- }
- if(address > 0x17fff)
- {
- address -= 0x8000;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-inline int gba_state::is_in_window(int x, int window)
-{
- int x0 = m_WIN0H >> 8;
- int x1 = m_WIN0H & 0x00ff;
-
- if(window == 1)
- {
- x0 = m_WIN1H >> 8;
- x1 = m_WIN1H & 0x00ff;
- }
-
- if(x0 <= x1)
- {
- if(x >= x0 && x < x1)
- {
- return 1;
- }
- }
- else
- {
- if(x >= x0 || x < x1)
- {
- return 1;
- }
- }
-
- return 0;
-}
-
-INLINE UINT32 alpha_blend_pixel(UINT32 color0, UINT32 color1, int ca, int cb)
-{
- if(color0 < 0x80000000)
- {
- int r0 = (color0 >> 0) & 0x1f;
- int g0 = (color0 >> 5) & 0x1f;
- int b0 = (color0 >> 10) & 0x1f;
- int r1 = (color1 >> 0) & 0x1f;
- int g1 = (color1 >> 5) & 0x1f;
- int b1 = (color1 >> 10) & 0x1f;
- int r = ((r0 * ca) >> 4) + ((r1 * cb) >> 4);
- int g = ((g0 * ca) >> 4) + ((g1 * cb) >> 4);
- int b = ((b0 * ca) >> 4) + ((b1 * cb) >> 4);
-
- if(r > 0x1f) r = 0x1f;
- if(g > 0x1f) g = 0x1f;
- if(b > 0x1f) b = 0x1f;
-
- return (color0 & 0xffff0000) | (b << 10) | (g << 5) | r;
- }
- return color0;
-}
-
-INLINE UINT32 increase_brightness(UINT32 color, int coeff_)
-{
- int r = (color >> 0) & 0x1f;
- int g = (color >> 5) & 0x1f;
- int b = (color >> 10) & 0x1f;
-
- r += ((0x1f - r) * coeff_) >> 4;
- g += ((0x1f - g) * coeff_) >> 4;
- b += ((0x1f - b) * coeff_) >> 4;
-
- if(r > 0x1f) r = 0x1f;
- if(g > 0x1f) g = 0x1f;
- if(b > 0x1f) b = 0x1f;
-
- return (color & 0xffff0000) | (b << 10) | (g << 5) | r;
-}
-
-INLINE UINT32 decrease_brightness(UINT32 color, int coeff_)
-{
- int r = (color >> 0) & 0x1f;
- int g = (color >> 5) & 0x1f;
- int b = (color >> 10) & 0x1f;
-
- r -= (r * coeff_) >> 4;
- g -= (g * coeff_) >> 4;
- b -= (b * coeff_) >> 4;
-
- if(r < 0) r = 0;
- if(g < 0) g = 0;
- if(b < 0) b = 0;
-
- return (color & 0xffff0000) | (b << 10) | (g << 5) | r;
-}
-
-void gba_state::draw_scanline(int y)
-{
- bitmap_ind16 &bitmap = m_bitmap;
- UINT16 *scanline = &bitmap.pix16(y);
- UINT8 submode = 0;
- int depth = 0;
-
- // forced blank
- if (m_DISPCNT & DISPCNT_BLANK)
- {
- // forced blank is white
- for (int x = 0; x < 240; x++)
- scanline[x] = 0x7fff;
- return;
- }
-
- if(!m_fxOn && !m_windowOn && !(m_DISPCNT & DISPCNT_OBJWIN_EN))
- submode = GBA_SUBMODE0;
- else if(m_fxOn && !m_windowOn && !(m_DISPCNT & DISPCNT_OBJWIN_EN))
- submode = GBA_SUBMODE1;
- else
- submode = GBA_SUBMODE2;
-
- if ((m_DISPCNT & 7) == 3)
- depth = 16;
- else if ((m_DISPCNT & 7) == 4)
- depth = 8;
- else if ((m_DISPCNT & 7) == 5)
- depth = 4;
-
- //printf("mode = %d, %d\n", m_DISPCNT & 7, submode);
-
- switch(m_DISPCNT & 7)
- {
- case 0:
- case 1:
- case 2:
- draw_modes(m_DISPCNT & 7, submode, y, &m_xferscan[0][1024], &m_xferscan[1][1024], &m_xferscan[2][1024], &m_xferscan[3][1024], &m_xferscan[4][1024], &m_xferscan[5][1024], &m_xferscan[6][1024], depth);
- break;
- case 3:
- case 4:
- case 5:
- draw_modes(GBA_MODE345, submode, y, &m_xferscan[0][1024], &m_xferscan[1][1024], &m_xferscan[2][1024], &m_xferscan[3][1024], &m_xferscan[4][1024], &m_xferscan[5][1024], &m_xferscan[6][1024], depth);
- break;
- default:
- fatalerror("Invalid screen mode (6 or 7)!\n");
- }
-
- for (int x = 0; x < 240; x++)
- {
- scanline[x] = m_xferscan[6][1024 + x] & 0x7fff;
- }
-
- return;
-}
-
-void gba_state::video_start()
-{
- machine().first_screen()->register_screen_bitmap(m_bitmap);
-}
-
-UINT32 gba_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
- return 0;
-}