Página 1 de 1

Pixels en el modo radastaniano del zxuno

Publicado: Jue, 22 Ene 2015, 23:25
por radastan
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...

Código: Seleccionar todo

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!

Re: Pixels en el modo radastaniano del zxuno

Publicado: Vie, 23 Ene 2015, 00:08
por antoniovillena
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

Código: Seleccionar todo

        xor     (hl)
        and     %00001111
        xor     (hl)
        ld      (hl), a


Posición X impar

Código: Seleccionar todo

        rrca
        rrca
        rrca
        rrca
        xor     (hl)
        and     %11110000
        xor     (hl)
        ld      (hl), a

Re: Pixels en el modo radastaniano del zxuno

Publicado: Vie, 23 Ene 2015, 00:16
por radastan
Es que ESO es lo que hago, pero uso OR y no XOR después del AND.

Re: Pixels en el modo radastaniano del zxuno

Publicado: Vie, 23 Ene 2015, 00:34
por antoniovillena
radastan escribió:Es 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.

Re: Pixels en el modo radastaniano del zxuno

Publicado: Vie, 23 Ene 2015, 10:24
por Metalbrain
Al comienzo de la rutina, te cargas el valor de H antes de leer el valor del color de (HL).

Re: Pixels en el modo radastaniano del zxuno

Publicado: Vie, 23 Ene 2015, 11:04
por iforeve
Metalbrain escribió:Al comienzo de la rutina, te cargas el valor de H antes de leer el valor del color de (HL).


ld h,0 <----- Poniendo H a cero haces que HL direccione a la rom desde 0 a 255.
jr c, next ; si es impar no hacemos nada (se dibuja por defecto a la derecha)
ld h,1 <----- Poniendo H a uno haces que HL direccione a la rom desde 256 a 511
inc hl
.next
inc hl
ld l, (hl) ; L es el color

El color que te pone es el valor que coja en el direccionamiento HL que toque, es decir, tendrias que tener la suerte del narciso bello de walt disney, para que de una posibilidad entre 256 coincidiera el color en las pruebas que hicieras :lol: