Macros

Venimos de Flashing Border – Tutorial CBM prg Studio

Una ventaja de usar un macro assembler es justamente la posibilidad de escribir macros. Estas nos permiten definir un bloque de instrucciones que se ‘generaran’ en el codigo cada vez que las invoquemos. Podria decirse que son como funciones, pero se diferencian de las mismas en que no son llamadas a subrutinas que hace el micro, sino que directamente es codigo que se incrusta en el lugar en que se invoca la llamada, y que ese codigo lo genera el macro assembler.

Las macros se definen usando los comandos ´defm´ y ´endm´. Tambien se pueden definir hasta 20 parametros para pasarle. Un ejemplo de macro sencilla seria:

defm        miMacro
            ldx     #/2
            stx     /1
            endm

En este ejemplo, definimos una macro llamada ´mi_macro´, a la que le pasaremos como primer parametro una direccion de memoria, y como segundo parametro un valor. De esta manera nos queda un equivalente al comandp ´POKE´ en BASIC. La forma de llamarla seria:

            miMacro $d020,1
            miMacro $d021,     ; Aqui toma por defecto 0, al no pasarle parametro

Consideraciones a tener en cuenta

  • Las macros hay que definirlas antes de usarlas
  • Pueden definirse macros globales, simplemente agregando ‘$’ al final del nombre de (ej: mi_macro$). Unicamente hay que tener en cuenta que el archivo que contenga las macros globales debe ser el primero del proyecto.
  • si hay que usar etiquetas dentro de las macros estas tienen que estar precedidas por ‘@’. Esto hace que sean locales a la etiqueta o macro que las contengan.
  • una macro no puede tener una longitud superior a 1000 lineas.

Codigo de ejemplo

*=$c000

defm      waitRaster    ; espera el inicio del barrido de pantalla
@waitrt                 
          ldx            $d012     
          cpx            #80       
          bne            @waitrt  
          endm

defm      paperColor    ; establece el fondo de pantalla
          ldx            #/1       
          stx            $d021
          ldx            #$00 
@loop                     ; una pausa para engrosar la linea
          inx
          cpx            #20
          bne            @loop     
          endm

loop
          waitRaster
          paperColor   0         
          paperColor   11        
          paperColor   12        
          paperColor   15        
          paperColor   1         
          paperColor   15        
          paperColor   12
          paperColor   11        
          paperColor   0         
          jmp            loop      

y el resultado final:

 

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