Y otra vez me he liado la manta a la cabeza, pero esta vez por cabezón de dibujar pixels. No doy una con el ASM del Z80, vaya semanita llevo. Teóricamente esta rutina debería dibujar un pixel del color que me diera la gana, pero o no los dibuja o los hace con el color que le viene en gana...
$this->bbcode_second_pass_code('', '
void plot (unsigned char color, unsigned int x, unsigned int y)
{
#asm
ld hl,2 ; Pasamos la variable de entrada al acumulador
add hl,sp
ld d, (hl) ; D es el valor Y
inc hl
inc hl
ld e, (hl) ; E es el valor X
rr e ; quitamos el valor de las unidades (los pixels van de dos en dos por byte)
ld h,0
jr c, next ; si es impar no hacemos nada (se dibuja por defecto a la derecha)
ld h,1
inc hl
.next
inc hl
ld l, (hl) ; L es el color
ld a, d ; recuperamos el valor vertical
rrca
rrca ; rotamos para dejar su valor en múltiplos de 64 (linea, de dos en dos pixels)
and 192 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d ; cargamos el valor vertical
rrca
rrca ; rotamos para quedarnos con los bits altos
and 63 ; borramos el resto de bits
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado, ya tenemos la posición en pantalla
ld a,(de)
rr h
jr c, next2
and 240
or l
jr fin
.next2
and 15
rl l
rl l
rl l
rl l
or l
.fin
ld (de), a
#endasm
}
')
Help!
Pixels en el modo radastaniano del zxuno
Moderador: na_th_an
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Pixels en el modo radastaniano del zxuno
No tengo mucho tiempo, así que te voy a dar una solución parcial. Como cada byte alberga dos píxeles, tienes que comprobar si la coordenada x es par o impar y tener dos rutinas distintas, una que te escriba en el nibble alto (sin modificar el bajo) y otra que haga lo contrario. Supongamos que ya tienes calculada la posición del byte en HL y en A (nibble bajo) tienes el color, las rutinas serían así:
Posición X par
$this->bbcode_second_pass_code('', '
xor (hl)
and %00001111
xor (hl)
ld (hl), a
')
Posición X impar
$this->bbcode_second_pass_code('', '
rrca
rrca
rrca
rrca
xor (hl)
and %11110000
xor (hl)
ld (hl), a
')
Posición X par
$this->bbcode_second_pass_code('', '
xor (hl)
and %00001111
xor (hl)
ld (hl), a
')
Posición X impar
$this->bbcode_second_pass_code('', '
rrca
rrca
rrca
rrca
xor (hl)
and %11110000
xor (hl)
ld (hl), a
')
Última edición por antoniovillena el Vie, 23 Ene 2015, 00:35, editado 1 vez en total.
Re: Pixels en el modo radastaniano del zxuno
Es que ESO es lo que hago, pero uso OR y no XOR después del AND.
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Pixels en el modo radastaniano del zxuno
$this->bbcode_second_pass_quote('radastan', 'E')s que ESO es lo que hago, pero uso OR y no XOR después del AND.
Son métodos totalmente distintos. Lo bueno del método XOR/AND que te he puesto es que no se necesita un registro intermedio para almacenar el color del byte de pantalla, y además es más rápido.