Flashing Border

Hoy vamos a hacer un programita muy simple, pero con un efecto muy interesante, sobre todo porque lo hacemos en lenguaje maquina, y le da ciertas particularidades.
Este consistirá en un loop infinito que va ciclando los colores del borde. Al realizar el cambio tan rapidamente (mas incluso que la velocidad de refresco de pantalla, e incluso mas veloz que el barrido vertical) se mostrara como una serie de lineas horizontales de colores… para muestra, una captura.

 

Codigo

*=$c000

          ldx            #$0       
ciclo     stx            $d020
          inx
          jmp            ciclo     

ok, es muy basico… lo unico que hacemos es incrementar el registro x en un ciclo infinito. Al ser un registro de 8 bits, cuando pasa el valor 255 vuelve a 0.
¿y $D020? bueno, es la direccion del color de borde de la pantalla en la C64 (si cambiamos a $d021 cambia el fondo).
¿y por que las rayas? Eso es debido a la velocidad con la que se realiza, ya que el cambio de borde se realiza incluso antes que la linea cruce la pantalla, de ahi que se puedan apreciar incluso “columnas” de rayas.

Podemos darle un poco mas de complejidad, de paso usamos un condicional… vamos a hacer que cicle entre 2 colores, 0 (negro) y 1 (blanco).

*=$c000

init      ldx            #$0       
ciclo     stx            $d020
          inx
          cpx            #$02      
          bne            ciclo     
          jmp            init      

Aqui introducimos un ‘if’, aunque aca la instruccion es CPX, que en su modo inmediato compara el valor con $02, si no es igual (bne) sigue ciclando, pero si es igual salta a la siguiente instruccion, que hace un salto a la primera instruccion, en la que se inicializa en 0… o sea, X va tomando los valores 0, 1, 0, 1, …. ad infinutum.

Ok, sigue muy elemental… vamos a darle algo un poco mas interesante… vamos a hacer que dibuje una barra horizontal. Para ello vamos a ver el valor de $d012 que contiene la “posicion” del haz que dibuja la pantalla (tecnicamente: raster), y en un determinado valor vamos a cambiar el color, luego esperamos un valor un poco mas alto (una posicion mas avanzada del dibujado de pantalla) y volvemos a poner el color anterior.

 

*=$c000

init      ldx            #$0
          stx            $d020 
          stx            $d021     

; inicio de la barra horizontal          
waitrt   lda            $d012
          cmp            #60       
          bne            waitrt 

          ldx            #$1      
          stx            $d020     
          stx            $d021

; fin de la barra horizontal          
waitw    lda            $d012
          cmp            #75       
          bne            waitw

          jmp            init      

Esto ya toma color, bueno, sigue blanco y negro (un buen ejercicio seria cambiar los colores, que definimos en las 2 instrucciones LDX, previas a los STA a fondo y borde).
Aqui inicia seteando el color de fondo y borde en negro, y en la etiqueta wait_rt inicia un ciclo en el que carga en LDA el valor de la posicion del raster y la compara con un valor arbitrario, que es el que define la posicion vertical de la barra (mas o menos…).
Cuando es igual a $60 cambia los colores de fondo y borde, y va a otro ciclo en el que compara con un valor mas grande, que es el que define el ancho de la barra. Finalmente, cuando alcanza el nuevo valor hace un JMP a la etiqueta init, que setea los colores originales.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s