Preliminary startx/starty support, display is repeated on left-right edges, to be improved

This commit is contained in:
Angelo Salese 2013-09-12 17:34:38 +00:00
parent 8b907e1af9
commit ddf4c2f101
3 changed files with 33 additions and 23 deletions

View File

@ -2648,7 +2648,9 @@ void avr8_device::execute_run()
break; break;
case 0x0080: // SLEEP case 0x0080: // SLEEP
//output += sprintf( output, "SLEEP" ); //output += sprintf( output, "SLEEP" );
unimplemented_opcode(op); m_pc--;
opcycles = 1;
//unimplemented_opcode(op);
break; break;
case 0x0090: // BREAK case 0x0090: // BREAK
//output += sprintf( output, "BREAK" ); //output += sprintf( output, "BREAK" );

View File

@ -104,7 +104,7 @@ const int powervr2_device::pvr_wordspolygon[24] = {8,8,8,8,8, 8, 8,8,8,8,16,16,8
#define DEBUG_FIFO_POLY (0) #define DEBUG_FIFO_POLY (0)
#define DEBUG_PVRTA 0 #define DEBUG_PVRTA 0
#define DEBUG_PVRDLIST (0) #define DEBUG_PVRDLIST (0)
#define DEBUG_PALRAM (1) #define DEBUG_PALRAM (0)
#define DEBUG_PVRCTRL (0) #define DEBUG_PVRCTRL (0)
inline INT32 powervr2_device::clamp(INT32 in, INT32 min, INT32 max) inline INT32 powervr2_device::clamp(INT32 in, INT32 min, INT32 max)
@ -1541,18 +1541,19 @@ void powervr2_device::update_screen_format()
INT32 spg_hbend = (spg_hblank >> 16) & 0x3ff; INT32 spg_hbend = (spg_hblank >> 16) & 0x3ff;
INT32 spg_vbstart = spg_vblank & 0x3ff; INT32 spg_vbstart = spg_vblank & 0x3ff;
INT32 spg_vbend = (spg_vblank >> 16) & 0x3ff; INT32 spg_vbend = (spg_vblank >> 16) & 0x3ff;
INT32 vo_horz_start_pos = vo_startx & 0x3ff; //INT32 vo_horz_start_pos = vo_startx & 0x3ff;
INT32 vo_vert_start_pos_f1 = vo_starty & 0x3ff; //INT32 vo_vert_start_pos_f1 = vo_starty & 0x3ff;
int pclk = spg_clks[(spg_control >> 6) & 3] * (((spg_control & 0x10) >> 4)+1); int pclk = spg_clks[(spg_control >> 6) & 3] * (((spg_control & 0x10) >> 4)+1);
attoseconds_t refresh = HZ_TO_ATTOSECONDS(pclk) * spg_hsize * spg_vsize; attoseconds_t refresh = HZ_TO_ATTOSECONDS(pclk) * spg_hsize * spg_vsize;
rectangle visarea = m_screen->visible_area(); rectangle visarea = m_screen->visible_area();
/* FIXME: right visible area calculations aren't known yet*/ /* FIXME: fix if spg_*bend > spg_*bstart */
visarea.min_x = 0; visarea.min_x = spg_hbend;
visarea.max_x = ((spg_hbstart - spg_hbend - vo_horz_start_pos) <= 0x180 ? 320 : 640) - 1; visarea.max_x = spg_hbstart - 1;
visarea.min_y = 0; visarea.min_y = spg_vbend;
visarea.max_y = ((spg_vbstart - spg_vbend - vo_vert_start_pos_f1) <= 0x100 ? 240 : 480) - 1; visarea.max_y = spg_vbstart - 1;
//printf("%d %d %d\n",spg_vbstart,spg_vbend,vo_vert_start_pos_f1);
m_screen->configure(spg_hsize, spg_vsize, visarea, refresh ); m_screen->configure(spg_hsize, spg_vsize, visarea, refresh );
} }
@ -2952,7 +2953,7 @@ void powervr2_device::pvr_accumulationbuffer_to_framebuffer(address_space &space
break; break;
// used by Suchie3 // used by Suchie3
case 0x04: // 888 RGB 24-bit (HACK! should not downconvert and pvr_drawframebuffer should change accordingly) case 0x04: // 888 RGB 24-bit
{ {
switch(unpackmode) switch(unpackmode)
{ {
@ -2995,6 +2996,11 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
UINT32 *fbaddr; UINT32 *fbaddr;
UINT32 c; UINT32 c;
UINT32 r,g,b; UINT32 r,g,b;
//INT32 vo_horz_start_pos = vo_startx & 0x3ff;
UINT8 interlace_on = ((spg_control & 0x10) >> 4);
INT32 ystart_f1 = (vo_starty & 0x3ff) << interlace_on;
//INT32 ystart_f2 = (vo_starty >> 16) & 0x3ff;
INT32 hstart = (vo_startx & 0x3ff);
UINT8 unpackmode = (fb_r_ctrl & 0x0000000c) >>2; // aka fb_depth UINT8 unpackmode = (fb_r_ctrl & 0x0000000c) >>2; // aka fb_depth
UINT8 enable = (fb_r_ctrl & 0x00000001); UINT8 enable = (fb_r_ctrl & 0x00000001);
@ -3009,6 +3015,8 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
dy++; dy++;
dy*=2; // probably depends on interlace mode, fields etc... dy*=2; // probably depends on interlace mode, fields etc...
// popmessage("%d %d %d %d %d",ystart_f1,ystart_f2,interlace_on,spg_vblank & 0x3ff,(spg_vblank >> 16) & 0x3ff);
switch (unpackmode) switch (unpackmode)
{ {
case 0x00: // 0555 RGB 16-bit, Cleo Fortune Plus case 0x00: // 0555 RGB 16-bit, Cleo Fortune Plus
@ -3020,7 +3028,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x*2+0); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+0 + hstart);
c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1)); c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1));
b = (c & 0x001f) << 3; b = (c & 0x001f) << 3;
@ -3030,7 +3038,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
fbaddr=&bitmap.pix32(y, x*2+1); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+1 + hstart);
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
addrp+=2; addrp+=2;
@ -3040,7 +3048,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x); fbaddr=&bitmap.pix32(y + ystart_f1, x + hstart);
c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1)); c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1));
b = (c & 0x001f) << 3; b = (c & 0x001f) << 3;
@ -3064,7 +3072,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x*2+0); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+0 + hstart);
c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1)); c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1));
b = (c & 0x001f) << 3; b = (c & 0x001f) << 3;
@ -3074,7 +3082,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
fbaddr=&bitmap.pix32(y, x*2+1); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+1 + hstart);
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
@ -3086,7 +3094,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x); fbaddr=&bitmap.pix32(y + ystart_f1, x + hstart);
c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1)); c=*((reinterpret_cast<UINT16 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 1));
b = (c & 0x001f) << 3; b = (c & 0x001f) << 3;
@ -3110,7 +3118,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x*2+0); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+0 + hstart);
c =*(UINT8 *)((reinterpret_cast<UINT8 *>(dc_framebuffer_ram)) + BYTE8_XOR_LE(addrp)); c =*(UINT8 *)((reinterpret_cast<UINT8 *>(dc_framebuffer_ram)) + BYTE8_XOR_LE(addrp));
b = c; b = c;
@ -3124,7 +3132,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
fbaddr=&bitmap.pix32(y, x*2+1); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+1 + hstart);
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
@ -3135,7 +3143,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x); fbaddr=&bitmap.pix32(y + ystart_f1, x + hstart);
c =*(UINT8 *)((reinterpret_cast<UINT8 *>(dc_framebuffer_ram)) + BYTE8_XOR_LE(addrp)); c =*(UINT8 *)((reinterpret_cast<UINT8 *>(dc_framebuffer_ram)) + BYTE8_XOR_LE(addrp));
b = c; b = c;
@ -3164,7 +3172,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x*2+0); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+0 + hstart);
c =*((reinterpret_cast<UINT32 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 2)); c =*((reinterpret_cast<UINT32 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 2));
b = (c & 0x0000ff) >> 0; b = (c & 0x0000ff) >> 0;
@ -3174,7 +3182,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
fbaddr=&bitmap.pix32(y, x*2+1); fbaddr=&bitmap.pix32(y + ystart_f1, x*2+1 + hstart);
if (y<=cliprect.max_y) if (y<=cliprect.max_y)
*fbaddr = b | (g<<8) | (r<<16); *fbaddr = b | (g<<8) | (r<<16);
@ -3185,7 +3193,7 @@ void powervr2_device::pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &
{ {
for (x=0;x < xi;x++) for (x=0;x < xi;x++)
{ {
fbaddr=&bitmap.pix32(y, x); fbaddr=&bitmap.pix32(y + ystart_f1, x + hstart);
c =*((reinterpret_cast<UINT32 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 2)); c =*((reinterpret_cast<UINT32 *>(dc_framebuffer_ram)) + (WORD2_XOR_LE(addrp) >> 2));
b = (c & 0x0000ff) >> 0; b = (c & 0x0000ff) >> 0;

View File

@ -284,7 +284,7 @@ static MACHINE_CONFIG_START( sbc6510, sbc6510_state )
MCFG_CPU_PROGRAM_MAP(sbc6510_mem) MCFG_CPU_PROGRAM_MAP(sbc6510_mem)
MCFG_CPU_ADD("videocpu",ATMEGA88, XTAL_16MHz) MCFG_CPU_ADD("videocpu",ATMEGA88, XTAL_16MHz)
MCFG_DEVICE_DISABLE() // trips SLEEP opcode, needs to be emulated // MCFG_DEVICE_DISABLE() // trips SLEEP opcode, needs to be emulated
MCFG_CPU_AVR8_CONFIG(atmega88_config) MCFG_CPU_AVR8_CONFIG(atmega88_config)
MCFG_CPU_PROGRAM_MAP(sbc6510_video_mem) MCFG_CPU_PROGRAM_MAP(sbc6510_video_mem)
MCFG_CPU_DATA_MAP(sbc6510_video_data) MCFG_CPU_DATA_MAP(sbc6510_video_data)