Advertisement
SMicro

ROTAR_IMAGEN_RAW

May 25th, 2017 (edited)
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Title      :
  3. * Written by :
  4. * Date       :
  5. * Description:
  6. *-----------------------------------------------------------
  7. INIX     EQU 0
  8. INIY     EQU 0
  9. SIZEX   EQU 512
  10. SIZEY   EQU 512
  11.  
  12.     ORG    $1000
  13. START:                  ; first instruction of program
  14.     MOVE.L #FOTO1,A1   *A1 debe apuntar al principio de la imagen
  15.     MOVE.L #FOTO2,A2
  16.     CLR.L D1  *COORD X
  17.     CLR.L D2  *COORD Y
  18.  
  19.     JSR ROTA
  20.     JSR DIBUJAR    *dibuja la foto2
  21.    
  22.     SIMHALT             ; halt simulator    
  23.  
  24.  
  25. ROTA       *Esta subrutina rota una imagen RAW almacenada en memoria en formato 3 bytes/pixel
  26.            *uno por cada color en el orden BGR. Utiliza D1 y D2 para recorrer en horizontal
  27.            *las coordenadas de todos los pixeles que componen la imagen, de izquierda a derecha
  28.            *y de arriba a abajo, y la almacena en FOTO2 donde se el recorrido se realiza en
  29.            *vertical, de abajo a arriba y de izquierda a derecha.
  30.            *input: D1,D2: Coordenadas X,Y de la imagen
  31.            *       A1   : Apunta al buffer de memoria donde está la información del archivo raw
  32.            *       A2   : Apunta al buffer de memoria donde se almacena la imagen rotada
  33.            *SIZEX: Ancho de la imagen original. Corresponderá con el alto de la rotada
  34.            *SIZEY  Alto de la imagen origional. Corresponderá con el ancho de la rotada
  35.  
  36.     MOVEM.L D1-D2/A1-A2,-(A7) *Guarda los registros que modifica
  37. .NUEVAY    
  38.     ADD.L #(SIZEY)*3*(SIZEX-1),A2  *Nos movemos de la primera a la última fila para recorrer las
  39.                                    *columnas de FOTO2 (A2) en vertical de abajo a arriba
  40. .NUEVAX                            *La FOTO1 se recorre de manera normal, por líneas de izquierda a
  41.                                    *derecha y de arriba a abajo
  42.  
  43.     MOVE.B (A1)+,(A2)+  *Blue
  44.     MOVE.B (A1)+,(A2)+  *Green
  45.     MOVE.B (A1)+,(A2)+  *Red
  46.    
  47.     SUB.L #(SIZEY+1)*3,A2  *Retrocedemos a la línea anterior porque avanzamos por columnas
  48.                            *Restamos la longitud de una línea más los 3 del pixel que acaba
  49.                            *de procesar. Hay que tener en cuenta que en la FOTO2 una línea
  50.                            *corresponde a una columna de la FOTO1
  51.                            
  52.     ADD.L #1,D1            *Avanza coordenada X respecto a FOTO1
  53.     CMP.L #SIZEX,D1        *¿Ha llegado al tope de X?
  54.     BNE .NUEVAX            *No ha llegado, entonces a la siguiente
  55.      
  56.     ADD.L #(SIZEY+1)*3,A2  *Retrocedemos la ultima resta pues ahora toca cambio de columna
  57.                            *en FOTO2
  58.     CLR.L D1               *Coordenada X repuesta a 0
  59.     ADD.L #1,D2            *Avanza coordenada Y respecto a FOTO2
  60.     CMP.L #SIZEY,D2        *¿Ha llegado al final de la imagen?
  61.     BNE .NUEVAY            *Si no, entonces toca procesar la siguiente línea
  62.    
  63.     MOVEM.L (A7)+,D1-D2/A1-A2 *Repone registros desde la pila
  64.     RTS
  65.      
  66. DIBUJAR
  67.     MOVE.L #FOTO2,A2          
  68.     MOVE.L #INIX,D1            *Coordenada X inicial
  69.     MOVE.L #INIY,D2            *Coordenada Y inicial
  70.     *La FOTO2 está rotada y por tanto cambiados SIZEX y SIZEY respecto a FOTO1
  71.     MOVE.L #SIZEY+INIX,FINX    *Coordenada X final de FOTO2
  72.     MOVE.L #SIZEX+INIY,FINY    *Coordenada Y final de FOTO2
  73.     JSR PINTARAW
  74.     RTS
  75.  
  76. PINTARAW
  77.     MOVEM.L D2-D5/A2,-(A7)  *Guarda los registros que modifica
  78.     MOVE.L D1,-(A7)         *D1, ultimo guardado para poder recuperarlo desde la subrrutina
  79.    
  80. .NUEVAY  
  81.     MOVE.L (A7),D1    *Repone D1 con el valor inicial desde la pila al cambiar de línea
  82. .NUEVAX
  83.     CLR.L D5  
  84.     MOVE.B (A2)+,D5   *Coge el azul
  85.     LSL.L #8,D5       *Lo pasa al byte siguiente
  86.     MOVE.B (A2)+,D5   *Coge el verde
  87.     LSL.L #8,D5       *Pasa al byte siguiente
  88.     MOVE.B (A2)+,D5   *Con el rojo, quedan capturados el RGB en D5 como $00BBGGRR
  89.     JSR COLORD5
  90.     JSR PIXEL
  91.     ADD.L #1,D1      *Avanza coordenada X
  92.     CMP.L FINX,D1    *¿Ha llegado al tope de X?
  93.     BNE .NUEVAX      *No ha llegado, entonces mantiene
  94.     ADD.L #1,D2      *Avanza coordenada Y
  95.     CMP.L FINY,D2    *¿Ha llegado al final de la imagen?
  96.     BNE .NUEVAY      *Así repondrá la coordenada X y procesará siguiente línea
  97.    
  98.     MOVE.L (A7)+,D1
  99.     MOVEM.L (A7)+,D2-D5/A2 *Repone registros desde la pila
  100.     RTS
  101. COLORD5 *Subrutina que activa como color de tinta el almacenado en el registro D5
  102.         MOVEM.L D0-D1,-(A7)
  103.         MOVE.L #80,D0
  104.         MOVE.L D5,D1
  105.         TRAP #15
  106.         MOVEM.L (A7)+,D0-D1
  107.         RTS
  108.        
  109. PIXEL   *Subrutina que pinta el pixel correspondiente con el color de tinta
  110.         *previamente activado
  111.         MOVEM.L D0-D2,-(A7)
  112.         MOVE.L #82,D0
  113.      *D1 y D2 ya los tenemos definidos como X e Y al llamar a la función
  114.         TRAP #15
  115.         MOVEM.L (A7)+,D0-D2
  116.         RTS
  117.  
  118.     SIMHALT             ; halt simulator
  119.    
  120.     ORG $1100
  121. FOTO1 INCBIN "lena.raw"
  122. FINX DS.L 1
  123. FINY DS.L 1
  124.     ORG $D0000
  125. FOTO2 DS.L 2000000
  126.  
  127.     END    START        ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement