Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;DEFINICION DE MACROS
  2.  
  3. LEA:        MACRO   (reg, ETIQ)
  4.             or      reg, r0, low(ETIQ)
  5.             or.u    reg, reg, high(ETIQ)
  6.             ENDMACRO
  7.  
  8.  
  9. DBNZ:       MACRO   (reg, ETIQ)
  10.             sub     reg, reg, 1
  11.             cmp     r3, reg, r0
  12.             bb0     eq, r3, ETIQ
  13.             ENDMACRO
  14.  
  15.        
  16. PUSH:       MACRO   (reg)
  17.             subu    r30, r30, 4
  18.             st      reg, r30, r0
  19.             ENDMACRO
  20.        
  21.  
  22. POP:        MACRO   (reg)
  23.             ld      reg, r30, r0
  24.             addu    r30, r30, 4
  25.             ENDMACRO
  26.  
  27.  
  28. SWAP:       MACRO(ra,rb)
  29.             or r1, ra,ra
  30.             or ra,rb,rb
  31.             or rb,r1,r1
  32.             ENDMACRO
  33.            
  34.  
  35. CREATEFP:   MACRO()
  36.             PUSH(r1)
  37.             PUSH(r31)
  38.             or r31, r30, r30
  39.             ENDMACRO
  40.  
  41.  
  42. DESTROYFP:  MACRO()
  43.             or r30, r31, r31
  44.             POP (r31)
  45.             POP (r1)
  46.             jmp(r1)    
  47.             ENDMACRO
  48.  
  49.  
  50.  
  51. ;SETUP DE LA MEMORIA
  52.  
  53.             org 0
  54. nF:         data 4
  55.            
  56.             ;data 0x0000000E
  57.             ;data -1
  58.             ;data 0
  59.             ;data 1
  60.  
  61.        
  62.             org 20
  63.  
  64. Imagen1:    data 4, 8
  65.  
  66.             ;data 0xD1000000, 0x00000000
  67.             ;data 0x00000000, 0x00007A1D
  68.             ;data 0x01000000, 0x00000000
  69.             ;data 0x00000000, 0x000000FF
  70.  
  71.             data 0x00000000, 0x00000000
  72.             data 0x00000000, 0x00002100
  73.             data 0x00000000, 0x00000000
  74.             data 0x00000000, 0x00000000
  75.  
  76.             ;data 0x55FF55FF, 0x55FF55FF
  77.             ;data 0xFF55FF55, 0xFF55FF55
  78.             ;data 0x55FF55FF, 0x55FF55FF
  79.             ;data 0xFF55FF55, 0xFF55FF55
  80.  
  81.             org 128
  82.  
  83. Imagen2:    data 4, 8
  84.  
  85.             ;data 0x02000000, 0x00000000
  86.             ;data 0x00000000, 0x00000182
  87.             ;data 0xFF000000, 0x00000000
  88.             ;data 0x00000000, 0x00000010
  89.  
  90.             data 0x00000000, 0x00000000
  91.             data 0x00000000, 0x00000000
  92.             data 0x00000000, 0x00000000
  93.             data 0x00000000, 0x00000000
  94.  
  95.             ;data 0x54FE54FE, 0x54FE54FE
  96.             ;data 0xFD57FD57, 0xFD57FD57
  97.             ;data 0x54FE54FD, 0x54FE54FE
  98.             ;data 0xFD53FD53, 0xFD53FD53
  99.  
  100.             org 256
  101.  
  102. SubImagen:  data 0x13121110, 0x17161514, 0x00000018
  103.  
  104.             ;data 0x00000000, 0x00000055, 0x00
  105.            
  106.             ;data 0x00000000, 0x00000055, 0x00
  107.            
  108.             org 276
  109.  
  110. Filtro_M:   data 2, 0xFFFFFFFF, 0xFFFFFFFE, 1, 2, 0xFFFFFFFF
  111.             data 0xFFFFFFFE, 1, 0, 1, 0xFFFFFFFE, 1
  112.             data 2, 0xFFFFFFFF, 0xFFFFFFFE, 1, 2, 0xFFFFFFFF
  113.  
  114.             ;data 0, 1, 0, 1, 0, 1
  115.             ;data 0, 1, 2, 0xFFFFFFFF, 0, 1
  116.             ;data 0, 1, 0, 1, 0, 1
  117.  
  118.             ;data 0, 1, 0, 1, 0, 1
  119.             ;data 0, 1, 1, 1, 0, 1
  120.             ;data 0, 1, 0, 1, 0, 1
  121.            
  122.             org 512
  123.  
  124. Imagen_S:   data 5, 8
  125.             data 0x04030201, 0x08070605, 0x0C0B0A09
  126.             data 0x100F0E0D, 0x14131211, 0x18171615  
  127.             data 0x1C1B1A19, 0x201F1E1D, 0x24232221
  128.             data 0x28272625
  129.  
  130.             ;data 3, 3
  131.             ;data 0x40302010, 0x80706050, 0x90
  132.  
  133.             org 640
  134.  
  135. SubImagen_S:data 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
  136.  
  137.             ;data 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
  138.  
  139.             org 896
  140.  
  141.  
  142. Imagen_FP:  data 4, 8
  143.             data 0x40414243, 0x44454647
  144.             data 0x48494A4B, 0x4C4D4E4F
  145.             data 0x40994243, 0x44454647
  146.             data 0x48494A4B, 0x4C4D4E4F
  147.  
  148.             ;data 4, 8
  149.             ;data 0x44444444, 0x44444444
  150.             ;data 0x33343444, 0x44444444
  151.             ;data 0x44884444, 0x44444444
  152.             ;data 0x44444444, 0x44444444
  153.  
  154.             ;data 5, 5
  155.             ;data 0x44332211, 0x03020155
  156.             ;data 0x22210504, 0x31252423
  157.             ;data 0x35343332, 0x44434241
  158.             ;data 0x00000045
  159.  
  160.             org 1024
  161.  
  162. Filtro_FP:  data 1, 1, 1, 1, 1, 1
  163.             data 1, 1, 0xFFFFFFF8, 1, 1, 1
  164.             data 1, 1, 1, 1, 1, 1
  165.  
  166.             ;data 1, 8, 1, 8, 1, 8
  167.             ;data 1, 8, 0, 8, 1, 8
  168.             ;data 1, 8, 1, 8, 1, 8
  169.  
  170.             ;data 0, 1, 0, 1, 0, 1
  171.             ;data 0, 1, -5, -5, 0, 1
  172.             ;data 0, 1, 0, 1, 0, 1
  173.  
  174.  
  175.             org 1280
  176.  
  177. Imagen_F:   ;data 4, 6
  178.             ;data 0x12345678, 0xFFFEFDFC
  179.             ;data 0x13355779, 0xEEEDECEB
  180.             ;data 0x23456789, 0xDFDEDDDC
  181.  
  182.             data 4, 6
  183.             data 0x04030201, 0x02000605
  184.             data 0x05030104, 0x0C090603
  185.             data 0x0804120F, 0x80402010
  186.  
  187.             ;data 4, 8
  188.             ;data 0x04030201, 0x07060504
  189.             ;data 0x14134211, 0x17168514
  190.             ;data 0x24232221, 0x27262574
  191.             ;data 0x34333231, 0x37363534
  192.  
  193.             org 1360
  194.  
  195. Im_Filtrada:;data 0, 0
  196.             ;data 0x01020304, 0x05060102
  197.             ;data 0x03040506, 0x01020304
  198.             ;data 0x05060102, 0x03040506
  199.  
  200.             data 0xA5A5A5A5, 0xA5A5A5A5
  201.             data 0xA5A5A5A5, 0xA5A5A5A5
  202.             data 0xA5A5A5A5, 0xA5A5A5A5
  203.             data 0xA5A5A5A5, 0xA5A5A5A5
  204.  
  205.             ;res 40
  206.        
  207.  
  208.             org 1440
  209.  
  210. Fil_Filtro: ;data 0, 1, 0, 1, 0, 1
  211.             ;data 0, 1, 1, 1, 0, 1
  212.             ;data 0, 1, 0, 1, 0, 1
  213.            
  214.             data 0xFFFFFFFE, 0xFFFFFFF8
  215.             data 0x00000000, 0xFFFFFFF8
  216.             data 0xFFFFFFFE, 0xFFFFFFF8
  217.             data 0x00000000, 0xFFFFFFF8
  218.             data 0x00000000, 0xFFFFFFF8
  219.             data 0x00000000, 0xFFFFFFF8
  220.             data 0xFFFFFFFE, 0xFFFFFFF8
  221.             data 0x00000000, 0xFFFFFFF8
  222.             data 0xFFFFFFFE, 0xFFFFFFF8
  223.  
  224.             ;data 0, 1, -3, 1, 0, 1
  225.             ;data 0, 1, 4, 1, 0, 1
  226.             ;data 0, 1, 0, 1, 0, 1
  227.  
  228.  
  229.             org 2000
  230.  
  231. Imagen_Rec: data 4, 4
  232.             data 0x04030201, 0x0D0E0F10, 0x05040302, 0x23222120
  233.  
  234.             org 2200
  235.  
  236. Filtro_rec: data 1, 8, 1, 8, 1, 8
  237.             data 1, 8, 0, 8, 1, 8
  238.             data 1, 8, 1, 8, 1, 8
  239.  
  240.             org 2400
  241.  
  242. Res_rec:    res 24
  243.             data 0x55555555, 0x55555555
  244.  
  245.  
  246.  
  247. ;SUBRUTINAS AUXILIARES
  248.  
  249. Mess_reg:   or r2, r0, 2
  250.             or r3, r0, 3
  251.             or r4, r0, 4
  252.             or r5, r0, 5
  253.             or r6, r0, 6
  254.             or r7, r0, 7
  255.             or r8, r0, 8
  256.             or r9, r0, 9
  257.             or r10, r0, 10
  258.             or r11, r0, 11
  259.             or r12, r0, 12
  260.             or r13, r0, 13
  261.             or r14, r0, 14
  262.             or r15, r0, 15
  263.             or r16, r0, 16
  264.             or r17, r0, 17
  265.             or r18, r0, 18
  266.             or r19, r0, 19
  267.             or r20, r0, 20
  268.             or r21, r0, 21
  269.             or r22, r0, 22
  270.             or r23, r0, 23
  271.             or r24, r0, 24
  272.             or r25, r0, 25
  273.             or r26, r0, 26
  274.             or r27, r0, 27
  275.             or r28, r0, 28
  276.             or r29, r0, 29
  277.             jmp(r1)
  278.  
  279.  
  280. ;PROGRAMAS PRINCIPALES
  281.  
  282. PpalSqrt:   LEA (r30, 61440)
  283.             LEA (r10, 100100025);set Num
  284.             ;or r10, r0, 1     
  285.             ;or r10, r0, 0
  286.             ;or r10, r0, 100
  287.             ;or r10, r0, 144
  288.             PUSH(r10)
  289.             bsr Sqrt
  290.             POP(r10)
  291.             stop
  292.  
  293. PpalNF:     LEA (r30, 61440)
  294.             sub r10, r0, 1      ;oper es -1
  295.             ;or r10, r0, 14
  296.             PUSH(r10)
  297.             bsr nFiltrados
  298.             POP(r10)
  299.             stop
  300.  
  301. PpalComp:   bsr Mess_reg
  302.             LEA (r30, 61440)
  303.             or r10, r0, 128
  304.             PUSH (r10)
  305.             or r11, r0, 20
  306.             PUSH (r11)
  307.             bsr Comp
  308.             POP(r11)
  309.             POP(r10)
  310.             stop
  311.  
  312. PpalVPix:   bsr Mess_reg
  313.             LEA (r30, 61440)
  314.             or r10, r0, 276
  315.             PUSH (r10)
  316.             or r11, r0, 256
  317.             PUSH (r11)
  318.             bsr ValorPixel
  319.             POP(r11)
  320.             POP(r10)
  321.             stop
  322.  
  323. PpalSubImg: bsr Mess_reg
  324.             LEA (r30, 61440)
  325.             or r10, r0, 6
  326.             PUSH(r10)
  327.             or r11, r0, 3
  328.             PUSH(r11)
  329.             or r12, r0, 640
  330.             PUSH(r12)
  331.             or r13, r0, 512
  332.             PUSH (r13)
  333.             bsr SubMatriz
  334.             POP(r13)
  335.             POP(r12)
  336.             POP(r11)
  337.             POP(r10)
  338.             stop
  339.  
  340.  
  341. PpalFilP:   bsr Mess_reg
  342.             LEA (r30, 61440)
  343.             or r10, r0, 1024
  344.             PUSH(r10)
  345.             or r11, r0, 2
  346.             ;or r11, r0, 3
  347.             PUSH(r11)
  348.             or r12, r0, 2
  349.             PUSH(r12)
  350.             or r13, r0, 896
  351.             PUSH(r13)
  352.             bsr FilPixel
  353.             POP(r13)
  354.             POP(r12)
  355.             POP(r11)
  356.             POP(r10)
  357.             stop
  358.  
  359. PpalFiltro: bsr Mess_reg
  360.             LEA (r30, 61440)
  361.             or r10, r0, 1440
  362.             PUSH(r10)
  363.             or r11, r0, 1360
  364.             PUSH(r11)
  365.             or r12, r0, 1280
  366.             PUSH(r12)
  367.             bsr Filtro
  368.             POP(r12)
  369.             POP(r11)
  370.             POP(r10)
  371.             stop
  372.  
  373.  
  374. PpalRec:    bsr Mess_reg
  375.             LEA (r30, 61440)
  376.             or r10, r0, 2000
  377.             or r11, r0, 2200
  378.             or r12, r0, 2400
  379.             or r13, r0, 40
  380.             PUSH(r13)
  381.             PUSH(r11)
  382.             PUSH(r12)
  383.             PUSH(r10)
  384.             bsr FiltRec
  385.             POP(r10)
  386.             POP(r12)
  387.             POP(r11)
  388.             POP(r13)
  389.             stop
  390.  
  391. ;SUBRUTINAS
  392.  
  393. Sqrt:       ld r20, r30, 0      ; r20 es Num
  394.             cmp r3, r20, 2
  395.             bb1 lt, r3, END_EX_SQ
  396.             ld r7, r30, r0      ; r7 es a
  397.             or r8, r0, 1        ; r8 es b
  398. LOOP_SQ:    sub r5, r7, r8      ; Repite mientras (a – b) > 1
  399.             cmp r3, r5, 1
  400.             bb1 le, r3, END_SQ  ; No es menor o igual por lo que no repite
  401.             add r7, r7, r8
  402.             divs r7, r7, 2
  403.             divs r8, r20, r7    ; parte 3a
  404.             cmp r3, r8, r7
  405.             bb0 gt, r3, LOOP_SQ ; Si b no es mayor que a no hace falta intercambiar (parte 3b)
  406.             SWAP(r7, r8)       
  407.             br LOOP_SQ
  408. END_EX_SQ:  or r8, r20, r20     ; Si no se cumple la condicion inicial la raiz es el numero dado
  409. END_SQ:     or r29, r8, r8
  410.             jmp (r1)
  411.  
  412.  
  413.  
  414. nFiltrados: ld r20, r30, 0      ;r20 es oper
  415.             cmp r3, r20, 0
  416.             bb1 ge, r3, INIT_NF ;Parte 1 algoritmo
  417.             ld r5, r0, 0        ;r5 es nF (Inicio parte 2 algoritmo)
  418.             subu r5, r5, 0x1
  419.             cmp r3, r5, 0
  420.             bb1 lt, r3, RESTORE_NF
  421.             st r5, r0, 0
  422.             br END_NF
  423. INIT_NF:    st r20, r0, 0
  424.             or r5, r20, r20     ;r5 a nF para END_NF
  425.             br END_NF
  426. RESTORE_NF: or r5, r0, 0        ;r5 == 0
  427.             st r5, r0, 0        ;nF == 0
  428. END_NF:     or r29, r5, r5      ;return nF en r29
  429.             jmp(r1)
  430.  
  431.  
  432.  
  433. Comp:       CREATEFP()
  434.             subu r30, r30, 4
  435.             or r3, r0, 0        ;Inicializa a 0 dif. r3 será dif toda la subrutina
  436.             st r3, r31, -4      ;Guarda una variable contador (inicializada a 0) como variable local
  437.             or r2, r0, 0        ;r2 -> registro indice matriz. En vez de un load inicial a contador hacemos or (más rápido)
  438.             ld r20, r31, 8      ;Imagen 1
  439.             ld r21, r31, 12     ;Imagen 2
  440.             ld r4, r20, 0       ;r4 es M
  441.             ld r5, r20, 4       ;r5 es N
  442.             muls r4, r4, r5     ;r4 es MxN
  443. LOOP_COMP:  add r2, r2, 8       ;r2 apunta al siguiente elemento de las dos matrices
  444.             ld.bu r20, r20, r2  ;Load siguiente elemento Imagen1
  445.             ld.bu r21, r21, r2  ;Load siguiente elemento Imagen2
  446.             ld r2, r31, -4      ;r2 es contador
  447.             sub r8, r20, r21    ;Imagen1ij - Imagen2ij
  448.             muls r8, r8, r8     ;Al cuadrado
  449.             add r3, r3, r8      ;Actualizar Dif
  450.             add r2, r2, 1       ;Incrementar contador
  451.             cmp r7, r2, r4      ;r4 sigue siendo MxN, comprobamos si se ha recorrido toda la matriz
  452.             bb1 eq, r7, FIN_COMP;Salto si se ha recorrido entera
  453.             st r2, r31, -4      ;Store contador
  454.             ld r20, r31, 8     
  455.             ld r21, r31, 12     ;Se preparan r20 y 21 para la carga del siguiente elemento de las matrices
  456.             br LOOP_COMP
  457. FIN_COMP:   PUSH(r3)
  458.             bsr Sqrt
  459.             DESTROYFP()
  460.  
  461.  
  462. ValorPixel: CREATEFP()
  463.             subu r30, r30, 4
  464.             or r3, r0, 0        ;Inicializa a 0 ACC. r3 será ACC toda la subrutina
  465.             st r3, r31, -4      ;Guarda una variable contador (inicializada a 0) como variable local
  466.             or r2, r0, 0        ;r2 -> registro indice matriz. En vez de un load inicial a contador hacemos or (más rápido)
  467.             ld r20, r31, 8      ;r20 es SubImg
  468.             ld r21, r31, 12     ;r21 es MFiltro
  469. LOOP_V_PIX: ld.bu r4, r20, r2   ;Load siguiente elemento SubImg
  470.             mulu r2, r2, 8      ;Preparar r2 para cargar pares
  471.             ld r5, r21, r2      ;Load coeficiente N siguiente par MFiltro
  472.             mulu r4, r4, 256    ;Multiplica rxx por 256
  473.             muls r4, r4, r5     ;Y por el coeficiente N del filtro
  474.             add r2, r2, 4      
  475.             ld r5, r21, r2      ;Cargamos coeficiente D del par
  476.             divs r4, r4, r5     ;Divide entre el coeficiente D del filtro
  477.             add r3, r3, r4      ;Acumula en ACC
  478.             ld r2, r31, -4      ;Load contador
  479.             add r2, r2, 1       ;Incrementar contador
  480.             cmp r7, r2, 9      
  481.             bb1 eq, r7, FIN_V_PIX
  482.             st r2, r31, -4      ;Store contador
  483.             br LOOP_V_PIX
  484. FIN_V_PIX:  divs r3, r3, 256    ;Divide ACC por 256
  485.             or r29, r3, r3      ;Asigna r29 = ACC
  486.             DESTROYFP()
  487.  
  488.  
  489. SubMatriz:  CREATEFP()
  490.             or r3, r0, 0        ;Utilizaremos r3 como contador en bucle
  491.             or r11, r0, 0       ;Utilizaremos r11 como indice absoluto de SubImagen
  492.             ld r20, r31, 8      ;Load Imagen
  493.             ld r21, r31, 12     ;Load SubImagen
  494.             ld r4, r31, 16      ;Load i
  495.             ld r5, r31, 20      ;Load j
  496.             ld r6, r20, 4       ;Load N
  497.             muls r10, r6, r4    
  498.             add r10, r10, 8     ;Saltamos M y N y convertimos r10 en el indice absoluto a utilizar en la matriz Imagen
  499.             add r10, r10, r5    ;Offset elemento central
  500.             sub r10, r10, 1     ;Offset inicial fila central
  501.             sub r10, r10, r6    ;Offset primer elemento
  502. COPY_LOOP:  ld.bu r22, r20, r10 ;Cargar siguiente elemento
  503.             st.b r22, r21, r11  ;Guardarlo en SubMatriz
  504.             add r10, r10, 1     ;Mover indice de Imagen + 1
  505.             add r11, r11, 1     ;Indice SubMatriz + 1
  506.             add r3, r3, 1       ;r3 es un contador de columna
  507.             cmp r7, r3, 3       ;SubMatriz solo tiene 3 elementos por columna por lo que si llega a 3 hemos copiado la fila
  508.             bb1 eq, r7, END_ROW
  509.             br COPY_LOOP    
  510. END_ROW:    cmp r7, r11, 9      ;SubMatriz tiene 9 elementos por lo que si llega a 9 hemos terminado
  511.             bb1 eq, r7, FIN_SUB
  512.             or r3, r0, 0        ;Contador bucle anterior a 0       
  513.             sub r10, r10, 3     ;Se mueve el indice de imagen a la columna antes de la copia
  514.             add r10, r10, r6    ;Se mueve el indice de Imagen a la siguiente fila, sumando el numero de elementos por fila
  515.             br COPY_LOOP        ;Copiar la siguiente fila
  516. FIN_SUB:    DESTROYFP()
  517.  
  518.  
  519. FilPixel:   CREATEFP()
  520.             ld r2, r31, 12      ;Load i
  521.             ld r3, r31, 16      ;Load j
  522.             ld r20, r31, 8      ;Load Imagen
  523.             ld r4, r20, 0       ;Load M
  524.             ld r5, r20, 4       ;Load N
  525.             sub r4, r4, 1;      ;M-1
  526.             sub r5, r5, 1       ;N-1
  527.             cmp r7, r2, r4      ;i = M-1?
  528.             bb1 eq, r7, FIN_2_FILP
  529.             cmp r7, r2, r4      ;j = N-1?
  530.             bb1 eq, r7, FIN_2_FILP
  531.             cmp r7, r2, 0       ;i = 0?
  532.             bb1 eq, r7, FIN_2_FILP
  533.             cmp r7, r3, 0       ;j = 0?
  534.             bb1 eq, r7, FIN_2_FILP
  535.             subu r30, r30, 12   ;Reserva en el marco de pila 3 palabras
  536.             or r25, r30, r30    ;Puntero a SubMatriz
  537.             PUSH(r3)
  538.             PUSH(r2)
  539.             PUSH(r25)
  540.             PUSH(r20)
  541.             bsr SubMatriz
  542.             addu r30, r30, 16
  543.             ld r21, r31, 20     ;Load MFiltro
  544.             or r25, r30, r30    ;Puntero a SubMatriz
  545.             PUSH(r21)
  546.             PUSH(r25)
  547.             bsr ValorPixel
  548.             addu r30, r30, 8
  549.             cmp r7, r29, 0
  550.             bb1 lt, r7, FILP_0
  551.             cmp r7, r29, 255
  552.             bb1 gt, r7, FILP_255
  553.             br FIN_FILP
  554. FILP_0:     or r29, r0, 0
  555.             br FIN_FILP
  556. FILP_255:   or r29, r0, 255
  557.             br FIN_FILP
  558. FIN_2_FILP: ld r20, r31, 8      ;Load Imagen
  559.             ld r10, r20, 4      ;Load N de Imagen
  560.             ld r2, r31, 12      ;Load i
  561.             muls r10, r2, r10  
  562.             add r10, r10, 8     ;Saltamos M y N y convertimos r10 en el indice absoluto a utilizar en la matriz Imagen
  563.             ld r3, r31, 16      ;Load j
  564.             add r10, r10, r3    ;Offset elemento central
  565.             ld.bu r29, r20, r10 ;Cargar Imagenij
  566. FIN_FILP:   DESTROYFP()
  567.  
  568.  
  569. Filtro:     CREATEFP()
  570.             subu r30, r30, 12
  571.             ld r20, r31, 8      ;Load Imagen
  572.             ld r21, r31, 12     ;Load ImFiltrada
  573.             ld r22, r31, 16     ;Load MFiltro
  574.             ld r4, r20, 0       ;Load M Imagen
  575.             st r4, r21, 0       ;Store M Imagen en ImFiltrada
  576.             ld r5, r20, 4       ;Load N Imagen
  577.             st r5, r21, 4       ;Store N Imagen en ImFiltrada
  578.             or r2, r0, 0        ;r2 sera el contador de fila (i)
  579.             or r3, r0, 0        ;r3 sera el contador de columna (j)
  580.             or r6, r0, 0        ;r6 sera el indice de matriz de ImFiltrada
  581.             add r6, r6, 8       ;Saltamos M y N y apuntamos al primer byte de la matriz ImFiltrada
  582.             st r6, r31, -4      ;Guardamos el indice de ImFiltrada como local
  583.             st r3, r31, -8      ;Guardamos j como local
  584.             st r2, r31, -12     ;Guardamos i como local
  585. LOOP_N_F:   PUSH(r22)
  586.             PUSH(r3)
  587.             PUSH(r2)
  588.             PUSH(r20)
  589.             bsr FilPixel        ;Tras esto debemos asegurarnos de restaurar los registros a los valores que queremos
  590.             addu r30, r30, 16
  591.             ld r20, r31, 8      ;Load Imagen
  592.             ld r21, r31, 12     ;Load ImFiltrada
  593.             ld r22, r31, 16     ;Load MFiltro
  594.             ld r4, r20, 0       ;Load M Imagen
  595.             ld r5, r20, 4       ;Load N Imagen
  596.             ld r6, r31, -4      ;Load indice
  597.             ld r3, r31, -8      ;Load j
  598.             ld r2, r31, -12     ;Load i
  599.             st.b r29, r21, r6
  600.             add r6, r6, 1       ;Aumentamos el indice de la matriz ImFiltrada
  601.             add r3, r3, 1       ;j -> j+1
  602.             st r6, r31, -4      ;Guardamos el indice de ImFiltrada como local
  603.             st r3, r31, -8      ;Guardamos j como local
  604.             cmp r7, r3, r5      ;Comparar j y n
  605.             bb0 eq, r7, LOOP_N_F;Si j aun no es igual a N hacemos otra iteracion sobre la fila
  606. LOOP_M_F:   add r2, r2, 1       ;i -> i+1
  607.             st r2, r31, -12     ;Guardamos i como local
  608.             or r3, r0, 0        ;Restaurar j al principio de la columna
  609.             st r3, r31, -8      ;Guardamos j como local
  610.             cmp r7, r2, r4      ;Comparar i y m
  611.             bb0 eq, r7, LOOP_N_F;Si i aun no es igual a M hacemos otra iteracion sobre la siguiente fila
  612. FIN_FILTRO: DESTROYFP()
  613.  
  614.  
  615. FiltRec:    CREATEFP()
  616.             ld r20, r31, 8      ;Load ImagenIn
  617.             ld r4, r20, 0       ;Load M
  618.             ld r5, r20, 4       ;Load N
  619.             muls r6, r4, r5     ;Calcular numero elementos matriz. Usaremos r6 para calcular el espacio a reservar
  620. LOOP_RES:   and r8, r6, 3       ;Bitwise and con 3 para comprobar que los 2 ultimos bits son 0 (multiplo de 4)
  621.             cmp r7, r8, r0      ;Comprobamos el bitwise anterior. Si es eq 0, será multiplo de 4. Si no, sumaremos 1 al espacio
  622.             bb1 eq, r7, RESERVA ;No hace falta sumar el 1
  623.             add r6, r6, 1       ;Sumamos el 1 (no hemos saltado, el bitwise and no era 0)
  624.             br LOOP_RES
  625. RESERVA:    add r6, r6, 8       ;Dos palabras para M y N
  626.             subu r30, r30, r6   ;Reservamos el espacio en pila
  627.            
  628.             ;Paso 2
  629.             ld r22, r31, 16     ;Load MFiltro
  630.             ld r21, r31, 12     ;Load ImagenOut
  631.             PUSH(r22)
  632.             PUSH(r21)
  633.             PUSH(r20)
  634.             bsr Filtro
  635.             addu r30, r30, 12
  636.  
  637.             ;Paso 3
  638. brk1:       or r24, r30, r30    ;Puntero al principio de ImTmp
  639.             ld r21, r31, 12     ;Load ImagenOut
  640.             ld r3, r21, 0       ;Load M
  641.             st r3, r24, 0       ;Store M
  642.             ld r4, r21, 4       ;Load N
  643.             st r4, r24, 4       ;Store N
  644.             or r5, r0, 8        ;r5 será un puntero para ambas matrices
  645.             muls r6, r3, r4     ;Numero de elementos a copiar. Asi sabremos cuando parar
  646.             add r6, r6, 8       ;Añadimos 8 a las iteraciones ya que el contador empezara en 8, ya que se usa tambien como indice
  647. COPY_LOOP_R:ld.bu r9, r21, r5   ;Load el siguiente elemento
  648.             st.b r9, r24, r5    ;Y store en ImTmp
  649.             add r5, r5, 1       ;Avanzamos el contador
  650.             cmp r7, r5, r6      ;Comparamos al numero de iteraciones
  651.             bb0 eq, r7, COPY_LOOP_R     ;Si las iteraciones aun no son iguales hacemos otra
  652.            
  653.             ;Paso 4
  654.             sub r2, r0, 1       ;oper -1 para nFiltrados
  655.             PUSH(r2)
  656.             bsr nFiltrados
  657.             addu r30, r30, 4
  658.             cmp r7, r29, 0      ;si el resultado es 0...
  659.             bb1 eq, r7, FIN_2_REC  ;Salta para terminar el paso
  660.  
  661.             ;Paso 5
  662.             ld r20, r31, 8      ;Load ImagenIn
  663.             ld r21, r31, 12     ;Load ImagenOut
  664. brk3:       PUSH(r21)
  665.             PUSH(r20)
  666.             bsr Comp
  667. brk2:       addu r30, r30, 8
  668.             ld r2, r31, 20      ;Load NCambios
  669.             cmp r7, r29, r2    
  670.             bb1 lt, r7, FIN_REC
  671.  
  672.             ;Paso 6. Notese que, ya que no hemos hecho ningun otro push, la pila deberia seguir apuntando a ImgTemp
  673.             or r24, r30, r30
  674.             ld r21, r31, 12     ;Load ImagenOut
  675.             ld r22, r31, 16     ;Load MFiltro. Recordamos que tenemos ya NCambios del paso 5
  676.             PUSH(r2)
  677.             PUSH(r22)
  678.             PUSH(r21)
  679.             PUSH(r24)
  680.             bsr FiltRec
  681.  
  682.             ;Paso 7
  683. FIN_REC:    DESTROYFP()
  684. FIN_2_REC:  sub r29, r0, 1      ;si el resultado era 0, asigna r29 = -1 y retorna al llamante
  685.             br FIN_REC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement