mi codigo para la lectura del byte de los pixeles y el byte de los atributos es:
Código: Seleccionar todo
if(d==pxSCREEN && !(speccy->t & 0x3))
{
$if machineIs('48k') then
int y=speccy->line-64;
$elseif machineIs('128k','+2A','+3') then
int y=speccy->line-63;
$end
int x=speccy->t>>2;
uint p=tLine[y]+x;
uint b=0x1800+((y>>3)<<5)+x;
$if machineIs('snow') then
if(speccy->cpu->flags & 0x2)
{
$if machineIs('48k') then
if((speccy->T<=2 && speccy->T) && (speccy->cpu->r.i>=0x40 && speccy->cpu->r.i<0x80)) //Snow effect
$elseif machineIs('128k') then
if((speccy->T==3 || !speccy->T) && ((speccy->cpu->r.i>=0x40 && speccy->cpu->r.i<0x80) || (speccy->cpu->r.i>=0xc0 && (speccy->memory7f&0x1)))) //Snow effect
$end
{
p=(p & 0xff80) | (speccy->cpu->r.r & 0x7f);
b=(b & 0xff80) | (speccy->cpu->r.r & 0x7f);
}
}
$end
$if machineIs('48k') then
speccy->pixel=speccy->cpu->mem[1][p];
speccy->attr=speccy->cpu->mem[1][b];
$elseif machineIs('128k','+2A','+3') then
uint8 *spt=(speccy->memory7f & 0x8)?speccy->ram[7]:speccy->ram[5];
speccy->pixel=spt[p];
speccy->attr=spt[b];
$end
}
}
y es el primero de cada cuatro estados !speccy->t&0x3
En las variables p y b se almacena la dirección en el banco de memoria que hay que leer para esa posición y en b la dirección del atributo.
Y aquí la enjundia.
speccy->cpu->flags & 0x2 chequea que estamos en el estado M1 (cogiendo el opcode de la instrucción)
Y sigo para el 48k aunque en el código de arriba puedes ver también como lo hago para el 128k
Si el estado T del z80 es entre 0 y 1 y el registro I esta entre 0x40 y 0x7f SNOW EFFECT.
entonces a las dos direcciones anteriores les borro los 7 bits de abajo y les pongo los que en ese momento tenga el registro R.
Los valores de T cambian en el 128k porque este empieza a leer la memoria 2 o 3 (no lo recuerdo bien tendría que comprobarlo) T estados antes de que comience la linea.
A continuación sigue el código normal de la ULA se cargan los "latch" con los datos de memoria y se muestran 2 pixeles por pantalla cada T.
Cuando empece RVM comencé implementando el Spectrum porque a priori era la máquina más sencilla, cuando llegue a este punto ya había sufrido que de sencilla nada.
Me he explicado fatal pero espero que te sirva.