eolith.c: Same modifications as dgpix -- almost identical hardware

dgpix.c: fixed video RAM masking I screwed up with the last update
This commit is contained in:
Zsolt Vasvari 2008-03-22 06:43:29 +00:00
parent d2b44c842f
commit 4f0b3c83db
3 changed files with 48 additions and 54 deletions

View File

@ -140,11 +140,19 @@ static WRITE32_HANDLER( flash_w )
static WRITE32_HANDLER( vram_w )
{
if ((((mem_mask & 0x0000ffff) == 0x0000ffff) && (data & 0x80000000)) ||
(((mem_mask & 0xffff0000) == 0xffff0000) && (data & 0x00008000)))
return;
UINT32 *dest = &vram[offset+(0x40000/4)*vbuffer];
COMBINE_DATA(&vram[offset+(0x40000/4)*vbuffer]);
if (mem_mask == 0)
{
if (~data & 0x80000000)
*dest = (*dest & 0x0000ffff) | (data & 0xffff0000);
if (~data & 0x00008000)
*dest = (*dest & 0xffff0000) | (data & 0x0000ffff);
}
else if (((mem_mask == 0x0000ffff) && (~data & 0x80000000)) ||
((mem_mask == 0xffff0000) && (~data & 0x00008000)))
COMBINE_DATA(dest);
}
static READ32_HANDLER( vram_r )

View File

@ -268,10 +268,13 @@ static MACHINE_DRIVER_START( eolith45 )
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB15)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
MDRV_PALETTE_INIT(BBBBB_GGGGG_RRRRR)
MDRV_PALETTE_LENGTH(32768)
MDRV_VIDEO_START(eolith)
MDRV_VIDEO_UPDATE(eolith)

View File

@ -1,74 +1,57 @@
#include "driver.h"
int eolith_buffer = 0;
static bitmap_t *bitmaps[2];
static UINT32 *eo_vram;
static UINT32 *vram;
static void plot_pixel_rgb(int x, int y, int color)
{
if (bitmaps[eolith_buffer]->bpp == 32)
{
UINT32 r = (color & 0x001f) << 3;
UINT32 g = (color & 0x03e0) >> 2;
UINT32 b = (color & 0x7c00) >> 7;
*BITMAP_ADDR32(bitmaps[eolith_buffer], y, x) = b | (g<<8) | (r<<16);
}
else
{
*BITMAP_ADDR16(bitmaps[eolith_buffer], y, x) = color;
}
}
WRITE32_HANDLER( eolith_vram_w )
{
int x,y;
switch(mem_mask)
UINT32 *dest = &vram[offset+(0x40000/4)*eolith_buffer];
if (mem_mask == 0)
{
case 0:
eolith_vram_w(machine,offset,data,0x0000ffff);
eolith_vram_w(machine,offset,data,0xffff0000);
return;
case 0xffff:
if(data & 0x80000000)
return;
break;
case 0xffff0000:
if(data & 0x8000)
return;
break;
}
COMBINE_DATA(&eo_vram[offset+(0x40000/4)*eolith_buffer]);
//logical line width = 336;
x = offset % (336/2);
y = offset / (336/2);
if(x < 320/2 && y < 240)
{
plot_pixel_rgb(x*2, y,(eo_vram[offset+(0x40000/4)*eolith_buffer]>>16) & 0x7fff);
plot_pixel_rgb(x*2+1,y, eo_vram[offset+(0x40000/4)*eolith_buffer] & 0x7fff);
if (~data & 0x80000000)
*dest = (*dest & 0x0000ffff) | (data & 0xffff0000);
if (~data & 0x00008000)
*dest = (*dest & 0xffff0000) | (data & 0x0000ffff);
}
else if (((mem_mask == 0x0000ffff) && (~data & 0x80000000)) ||
((mem_mask == 0xffff0000) && (~data & 0x00008000)))
COMBINE_DATA(dest);
}
READ32_HANDLER( eolith_vram_r )
{
return eo_vram[offset+(0x40000/4)*eolith_buffer];
return vram[offset+(0x40000/4)*eolith_buffer];
}
VIDEO_START( eolith )
{
eo_vram = auto_malloc(0x40000*2);
bitmaps[0] = video_screen_auto_bitmap_alloc(machine->primary_screen);
bitmaps[1] = video_screen_auto_bitmap_alloc(machine->primary_screen);
vram = auto_malloc(0x40000*2);
}
VIDEO_UPDATE( eolith )
{
copybitmap(bitmap,bitmaps[eolith_buffer ^ 1],0,0,0,0,cliprect);
int y;
for (y = 0; y < 240; y++)
{
int x;
UINT32 *src = &vram[(eolith_buffer ? 0 : 0x10000) | (y * (336 / 2))];
UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
for (x = 0; x < 320; x += 2)
{
dest[0] = (*src >> 16) & 0x7fff;
dest[1] = (*src >> 0) & 0x7fff;
src++;
dest += 2;
}
}
return 0;
}