Megadrive big-endian fixes from lantus

This commit is contained in:
Barry Harris 2012-01-26 20:00:14 +00:00
parent 4f93c2c5a0
commit bff64f162c
1 changed files with 31 additions and 31 deletions

View File

@ -581,7 +581,7 @@ static void DmaSlow(INT32 len)
//dprintf("DmaSlow[%i] %06x->%04x len %i inc=%i blank %i [%i|%i]", Pico.video.type, source, a, len, inc,
// (Pico.video.status&8)||!(Pico.video.reg[1]&0x40), Pico.m.scanline, SekCyclesDone());
for(a2 = a&0x7f; len; len--) {
CalcCol( a2>>1, *pd );
CalcCol( a2>>1, BURN_ENDIAN_SWAP_INT16(*pd) );
pd++;
// AutoIncrement
a2+=inc;
@ -790,9 +790,9 @@ UINT16 __fastcall MegadriveVideoReadWord(UINT32 sekAddress)
switch (sekAddress & 0x1c) {
case 0x00: // data
switch (RamVReg->type) {
case 0: res = RamVid [(RamVReg->addr >> 1) & 0x7fff]; break;
case 4: res = RamSVid[(RamVReg->addr >> 1) & 0x003f]; break;
case 8: res = RamPal [(RamVReg->addr >> 1) & 0x003f]; break;
case 0: res = BURN_ENDIAN_SWAP_INT16(RamVid [(RamVReg->addr >> 1) & 0x7fff]); break;
case 4: res = BURN_ENDIAN_SWAP_INT16(RamSVid[(RamVReg->addr >> 1) & 0x003f]); break;
case 8: res = BURN_ENDIAN_SWAP_INT16(RamPal [(RamVReg->addr >> 1) & 0x003f]); break;
}
RamVReg->addr += RamVReg->reg[0xf];
break;
@ -877,7 +877,7 @@ void __fastcall MegadriveVideoWriteWord(UINT32 sekAddress, UINT16 wordValue)
bprintf(PRINT_NORMAL, _T("Video address is odd, bytes are swapped!!!\n"));
wordValue = (wordValue<<8)|(wordValue>>8);
}
RamVid[(RamVReg->addr >> 1) & 0x7fff] = wordValue;
RamVid[(RamVReg->addr >> 1) & 0x7fff] = BURN_ENDIAN_SWAP_INT16(wordValue);
rendstatus |= 0x10;
break;
case 3:
@ -886,7 +886,7 @@ void __fastcall MegadriveVideoWriteWord(UINT32 sekAddress, UINT16 wordValue)
CalcCol((RamVReg->addr >> 1) & 0x003f, wordValue);
break;
case 5:
RamSVid[(RamVReg->addr >> 1) & 0x003f] = wordValue;
RamSVid[(RamVReg->addr >> 1) & 0x003f] = BURN_ENDIAN_SWAP_INT16(wordValue);
break;
}
//dprintf("w[%i] @ %04x, inc=%i [%i|%i]", Pico.video.type, a, Pico.video.reg[0xf], Pico.m.scanline, SekCyclesDone());
@ -3020,7 +3020,7 @@ static INT32 TileNorm(INT32 sx,INT32 addr,INT32 pal)
UINT32 pack=0;
UINT32 t=0;
pack = *(UINT32 *)(RamVid + addr); // Get 8 pixels
pack = BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid + addr)); // Get 8 pixels
if (pack) {
t=pack&0x0000f000; if (t) pd[0]=(UINT8)(pal|(t>>12));
t=pack&0x00000f00; if (t) pd[1]=(UINT8)(pal|(t>> 8));
@ -3041,7 +3041,7 @@ static INT32 TileFlip(INT32 sx,INT32 addr,INT32 pal)
UINT32 pack=0;
UINT32 t=0;
pack = *(UINT32 *)(RamVid + addr); // Get 8 pixels
pack = BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid + addr)); // Get 8 pixels
if (pack) {
t=pack&0x000f0000; if (t) pd[0]=(UINT8)(pal|(t>>16));
t=pack&0x00f00000; if (t) pd[1]=(UINT8)(pal|(t>>20));
@ -3068,7 +3068,7 @@ static INT32 TileNormSH(INT32 sx,INT32 addr,INT32 pal)
UINT32 pack=0; UINT32 t=0;
UINT8 *pd = HighCol+sx;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=(pack&0x0000f000)>>12; sh_pix(0);
t=(pack&0x00000f00)>> 8; sh_pix(1);
@ -3088,7 +3088,7 @@ static INT32 TileFlipSH(INT32 sx,INT32 addr,INT32 pal)
UINT32 pack=0; UINT32 t=0;
UINT8 *pd = HighCol+sx;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=(pack&0x000f0000)>>16; sh_pix(0);
t=(pack&0x00f00000)>>20; sh_pix(1);
@ -3111,7 +3111,7 @@ static INT32 TileNormZ(INT32 sx,INT32 addr,INT32 pal,INT32 zval)
INT8 *zb = HighSprZ+sx;
INT32 collision = 0, zb_s;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=pack&0x0000f000; if(t) { zb_s=zb[0]; if(zb_s) collision=1; if(zval>zb_s) { pd[0]=(UINT8)(pal|(t>>12)); zb[0]=(INT8)zval; } }
t=pack&0x00000f00; if(t) { zb_s=zb[1]; if(zb_s) collision=1; if(zval>zb_s) { pd[1]=(UINT8)(pal|(t>> 8)); zb[1]=(INT8)zval; } }
@ -3135,7 +3135,7 @@ static INT32 TileFlipZ(INT32 sx,INT32 addr,INT32 pal,INT32 zval)
INT8 *zb = HighSprZ+sx;
INT32 collision = 0, zb_s;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=pack&0x000f0000; if(t) { zb_s=zb[0]&0x1f; if(zb_s) collision=1; if(zval>zb_s) { pd[0]=(UINT8)(pal|(t>>16)); zb[0]=(INT8)zval; } }
t=pack&0x00f00000; if(t) { zb_s=zb[1]&0x1f; if(zb_s) collision=1; if(zval>zb_s) { pd[1]=(UINT8)(pal|(t>>20)); zb[1]=(INT8)zval; } }
@ -3170,7 +3170,7 @@ static INT32 TileNormZSH(INT32 sx,INT32 addr,INT32 pal,INT32 zval)
INT8 *zb = HighSprZ+sx;
INT32 collision = 0;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=(pack&0x0000f000)>>12; sh_pixZ(0);
t=(pack&0x00000f00)>> 8; sh_pixZ(1);
@ -3194,7 +3194,7 @@ static INT32 TileFlipZSH(INT32 sx,INT32 addr,INT32 pal,INT32 zval)
INT8 *zb = HighSprZ+sx;
INT32 collision = 0;
pack=*(UINT32 *)(RamVid+addr); // Get 8 pixels
pack=BURN_ENDIAN_SWAP_INT32(*(UINT32 *)(RamVid+addr)); // Get 8 pixels
if (pack) {
t=(pack&0x000f0000)>>16; sh_pixZ(0);
t=(pack&0x00f00000)>>20; sh_pixZ(1);
@ -3226,7 +3226,7 @@ static void DrawStrip(struct TileStrip *ts, INT32 sh)
for (; cells; dx+=8,tilex++,cells--) {
INT32 zero=0;
code=RamVid[ts->nametab + (tilex&ts->xmask)];
code=BURN_ENDIAN_SWAP_INT16(RamVid[ts->nametab + (tilex&ts->xmask)]);
if (code==blank) continue;
if (code>>15) { // high priority tile
INT32 cval = code | (dx<<16) | (ty<<25);
@ -3267,7 +3267,7 @@ static void DrawStripVSRam(struct TileStrip *ts, INT32 plane)
INT32 vscroll, line;
cell--; // have hscroll, start with negative cell
// also calculate intial VS stuff
vscroll = RamSVid[plane];
vscroll = BURN_ENDIAN_SWAP_INT16(RamSVid[plane]);
// Find the line in the name table
line = (vscroll+scan)&ts->line&0xffff; // ts->line is really ymask ..
@ -3280,7 +3280,7 @@ static void DrawStripVSRam(struct TileStrip *ts, INT32 plane)
if((cell&1)==0) {
INT32 line,vscroll;
vscroll = RamSVid[plane+(cell&~1)];
vscroll = BURN_ENDIAN_SWAP_INT16(RamSVid[plane+(cell&~1)]);
// Find the line in the name table
line = (vscroll+scan)&ts->line&0xffff; // ts->line is really ymask ..
@ -3288,7 +3288,7 @@ static void DrawStripVSRam(struct TileStrip *ts, INT32 plane)
ty = (line&7)<<1; // Y-Offset into tile
}
code = RamVid[ts->nametab + nametabadd + (tilex&ts->xmask)];
code = BURN_ENDIAN_SWAP_INT16(RamVid[ts->nametab + nametabadd + (tilex&ts->xmask)]);
if (code==blank) continue;
if (code>>15) { // high priority tile
INT32 cval = code | (dx<<16) | (ty<<25);
@ -3331,7 +3331,7 @@ static void DrawStripInterlace(struct TileStrip *ts)
for (; cells; dx+=8,tilex++,cells--) {
INT32 zero=0;
code=RamVid[ts->nametab+(tilex&ts->xmask)];
code=BURN_ENDIAN_SWAP_INT16(RamVid[ts->nametab+(tilex&ts->xmask)]);
if (code==blank) continue;
if (code>>15) { // high priority tile
INT32 cval = (code&0xfc00) | (dx<<16) | (ty<<25);
@ -3391,11 +3391,11 @@ static void DrawLayer(INT32 plane, INT32 *hcache, INT32 maxcells, INT32 sh)
htab += plane; // A or B
// Get horizontal scroll value, will be masked later
ts.hscroll = RamVid[htab & 0x7fff];
ts.hscroll = BURN_ENDIAN_SWAP_INT16(RamVid[htab & 0x7fff]);
if((RamVReg->reg[12]&6) == 6) {
// interlace mode 2
vscroll = RamSVid[plane]; // Get vertical scroll value
vscroll = BURN_ENDIAN_SWAP_INT16(RamSVid[plane]); // Get vertical scroll value
// Find the line in the name table
ts.line=(vscroll+(Scanline<<1))&((ymask<<1)|1);
@ -3408,7 +3408,7 @@ static void DrawLayer(INT32 plane, INT32 *hcache, INT32 maxcells, INT32 sh)
ts.line = ymask | (shift[width]<<24); // save some stuff instead of line
DrawStripVSRam(&ts, plane);
} else {
vscroll = RamSVid[plane]; // Get vertical scroll value
vscroll = BURN_ENDIAN_SWAP_INT16(RamSVid[plane]); // Get vertical scroll value
// Find the line in the name table
ts.line = (vscroll+Scanline)&ymask;
@ -3435,7 +3435,7 @@ static void DrawWindow(INT32 tstart, INT32 tend, INT32 prio, INT32 sh)
if(!(rendstatus & 2)) {
// check the first tile code
code = RamVid[nametab + tilex];
code = BURN_ENDIAN_SWAP_INT16(RamVid[nametab + tilex]);
// if the whole window uses same priority (what is often the case), we may be able to skip this field
if((code>>15) != prio) return;
}
@ -3444,7 +3444,7 @@ static void DrawWindow(INT32 tstart, INT32 tend, INT32 prio, INT32 sh)
for (; tilex < tend; tilex++) {
INT32 addr=0, zero=0, pal;
code = RamVid[nametab + tilex];
code = BURN_ENDIAN_SWAP_INT16(RamVid[nametab + tilex]);
if(code==blank) continue;
if((code>>15) != prio) {
rendstatus |= 2;
@ -3684,8 +3684,8 @@ static void DrawAllSpritesInterlace(INT32 pri, INT32 maxwidth)
sprite=(UINT32 *)(RamVid+((table+(link<<2))&0x7ffc)); // Find sprite
// get sprite info
code = sprite[0];
sx = sprite[1];
code = BURN_ENDIAN_SWAP_INT32(sprite[0]);
sx = BURN_ENDIAN_SWAP_INT32(sprite[1]);
if(((sx>>15)&1) != pri) goto nextsprite; // wrong priority sprite
// check if it is on this line
@ -3774,8 +3774,8 @@ static void PrepareSprites(INT32 full)
sprite=(UINT32 *)(RamVid+((table+(link<<2))&0x7ffc)); // Find sprite
// parse sprite info
code = sprite[0];
code2 = sprite[1];
code = BURN_ENDIAN_SWAP_INT32(sprite[0]);
code2 = BURN_ENDIAN_SWAP_INT32(sprite[1]);
code2 &= ~0xfe000000;
code2 -= 0x00780000; // Get X coordinate + 8 in upper 16 bits
sx = code2>>16;
@ -3802,7 +3802,7 @@ static void PrepareSprites(INT32 full)
sprite=(UINT32 *)(RamVid+((table+(link<<2))&0x7ffc)); // Find sprite
// parse sprite info
code = sprite[0];
code = BURN_ENDIAN_SWAP_INT32(sprite[0]);
sy = (code&0x1ff)-0x80;
hv = (code>>24)&0xf;
height = (hv&3)+1;
@ -3810,7 +3810,7 @@ static void PrepareSprites(INT32 full)
if(sy > 240 || sy + (height<<3) <= 0) skip|=1<<22;
width = (hv>>2)+1;
code2 = sprite[1];
code2 = BURN_ENDIAN_SWAP_INT32(sprite[1]);
sx = (code2>>16)&0x1ff;
sx -= 0x78; // Get X coordinate + 8
sx_min = 8-(width<<3);
@ -4089,7 +4089,7 @@ INT32 MegadriveFrame()
if (bMegadriveRecalcPalette) {
for (INT32 i=0;i<0x40;i++)
CalcCol(i, RamPal[i]);
CalcCol(i, BURN_ENDIAN_SWAP_INT16(RamPal[i]));
bMegadriveRecalcPalette = 0;
}