kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
80 wiersze
2.3 KiB
C
80 wiersze
2.3 KiB
C
|
|
#include "shared.h"
|
|
|
|
t_vce vce;
|
|
|
|
void vce_w(int address, int data)
|
|
{
|
|
int msb = (address & 1);
|
|
|
|
switch(address & ~1)
|
|
{
|
|
case 0x404: /* Data */
|
|
{
|
|
if(data != vce.data[((vce.addr & 0x1FF) << 1) | (msb)])
|
|
{
|
|
vce.data[((vce.addr & 0x1FF) << 1) | (msb)] = data;
|
|
|
|
if((vce.addr & 0x0F) != 0x00)
|
|
{
|
|
// uint16 temp = *(uint16 *)&vce.data[(vce.addr << 1)]; // Execute error.
|
|
uint8 temp1 = vce.data[(vce.addr << 1)];
|
|
uint8 temp2 = vce.data[(vce.addr << 1)+1];
|
|
uint16 temp;
|
|
#ifndef LSB_FIRST
|
|
// temp = (temp >> 8) | (temp << 8);
|
|
temp = (((uint16)temp1) << 8) + (uint16)temp2;
|
|
#else
|
|
temp = (((uint16)temp2) << 8) + (uint16)temp1;
|
|
#endif
|
|
pixel[(vce.addr >> 8) & 1][(vce.addr & 0xFF)] = pixel_lut[temp];
|
|
temp = (temp >> 1) & 0xFF;
|
|
}
|
|
|
|
/* Update overscan color */
|
|
if((vce.addr & 0x0F) == 0x00)
|
|
{
|
|
int n;
|
|
uint16 temp = *(uint16 *)&vce.data[0];
|
|
#ifndef LSB_FIRST
|
|
temp = (temp >> 8) | (temp << 8);
|
|
#endif
|
|
for(n = 0; n < 0x10; n += 1)
|
|
pixel[0][(n << 4)] = pixel_lut[temp];
|
|
temp = (temp >> 1) & 0xFF;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Increment VCE address on access to the MSB data port */
|
|
if(msb) vce.addr += 1;
|
|
break;
|
|
|
|
case 0x402: /* Address */
|
|
if(msb)
|
|
vce.addr = (vce.addr & 0x00FF) | ((data & 1) << 8);
|
|
else
|
|
vce.addr = (vce.addr & 0x0100) | (data);
|
|
break;
|
|
|
|
case 0x0400: /* Control */
|
|
if(!msb) vce.ctrl = (data & 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
int vce_r(int address)
|
|
{
|
|
int msb = (address & 1);
|
|
|
|
if((address & ~1) == 0x0404)
|
|
{
|
|
uint8 temp = vce.data[((vce.addr & 0x1FF) << 1) | (msb)];
|
|
if(msb) vce.addr += 1;
|
|
return (temp);
|
|
}
|
|
|
|
return (0xFF);
|
|
}
|