PUSH: MACRO(ra) subu r30,r30,4 st ra,r30,0 ENDMACRO POP: MACRO(ra) ld ra,r30,0 addu r30,r30,4 ENDMACRO DBNZ: MACRO(ra,eti) sub ra,ra,1 ;Decrementa el registro ra cmp r4,ra,0 ;y salta a eti si no es cero. bb0 eq,r4,eti ENDMACRO LEA: MACRO (ra, eti) ;Carga el registro ra con el or ra, r0, low(eti) ;valor de la etiqueta eti. or.u ra,ra,high(eti) ENDMACRO CMP_FILA: PUSH (r1) PUSH (r31) or r31,r30,r0 ld r2,r31,12 ;r2 contiene el número de elementos mulu r4,r2,4 ;de la fila. Se reserva espacio para subu r30,r30,r4 ;NF variables locales de una palabra or r20,r30,r0 ;inicializadas a cero. or r5,r2,r0 P_CERO_F: st r0,r20,0 addu r20,r20,4 DBNZ (r5,P_CERO_F) ld r10,r31,8 ;r10 es el puntero a la fila. Se CARGA_F: ld r4,r10,0 ;accede a cada elemento de la fila sub r5,r4,1 ;y se almacena en la variable local mulu r5,r5,4 ;que ocupa la posición que st r4,r30,r5 ;corresponde al valor del elemento. addu r10,r10,4 DBNZ (r2,CARGA_F) xor r29,r29,r29 ;Se inicializa a cero el resultado. ld r2,r31,12 ;r2 es el contador de elementos. add r5,r0,0 ;r5 es el desplazamiento sobre r30. SIGUE_F: ld r4,r30,r5 ;Se accede a la variable local i y cmp r4,r4,0 ;se compara con el número 0, si son bb1 eq,r4,MAL_F ;iguales el resultado está mal. Se add r5,r5,4 ;incrementa el desplazamiento a r30. DBNZ (r2,SIGUE_F) br FIN_F MAL_F: add r29,r0,-1 FIN_F: or r30,r31,r0 POP (r31) POP (r1) jmp (r1) CMP_COLUMNA: PUSH (r1) PUSH (r31) or r31,r30,r0 ld r2,r31,12 ;r2 contiene el número de elementos mulu r4,r2,4 ;de la columna. Se reserva espacio para subu r30,r30,r4 ;NC variables locales de una palabra or r20,r30,r0 ;inicializadas a cero. or r5,r2,r0 P_CERO_C: st r0,r20,0 addu r20,r20,4 DBNZ (r5,P_CERO_C) ld r10,r31,8 ;r10 es el puntero a la columna. mulu r3,r2,4 ;r3 es el desplazamiento al ;siguiente elemento. Se CARGA_C: ld r4,r10,0 ;accede a cada elemento de la fila sub r5,r4,1 ;y se almacena en la variable local mulu r5,r5,4 ;que ocupa la posición que st r4,r30,r5 ;corresponde al valor del elemento. addu r10,r10,r3 DBNZ (r2,CARGA_C) xor r29,r29,r29 ;Se inicializa a cero el resultado. ld r2,r31,12 ;r2 es el contador de elementos. add r5,r0,0 ;r5 es el desplazamiento sobre r30. SIGUE_C: ld r4,r30,r5 ;Se accede a la variable local i y cmp r4,r4,0 ;se compara con el número 0, si son bb1 eq,r4,MAL_C ;iguales el resultado está mal. Se add r5,r5,4 ;incrementa el desplazamiento a r30. DBNZ (r2,SIGUE_C) br FIN_C MAL_C: add r29,r0,-1 FIN_C: or r30,r31,r0 POP (r31) POP (r1) jmp (r1) CMP_SMATRIZ: PUSH (r1) PUSH (r31) or r31,r30,r0 ld r2,r31,12 ;r2 contiene el número de elementos mulu r2,r2,r2 ;la submatriz. mulu r4,r2,4 ;Se reserva espacio para n*n subu r30,r30,r4 ;variables locales de una palabra or r20,r30,r0 ;inicializadas a cero. or r5,r2,r0 P_CERO_SM:st r0,r20,0 addu r20,r20,4 DBNZ (r5,P_CERO_SM) ld r10,r31,8 ;r10 es el puntero a la submatriz. ld r2,r31,12 ;r2 es el contador de filas. mulu r20,r2,r2 ;r20 es el desplazamiento a r10 mulu r20,r20,4 ;para pasar a la siguiente fila. CARGA_F_SM: or r11,r10,r0 ;r11 puntero para recorrer fila. ld r3,r31,12 ;r3 contador para cada fila. CARGA_C_SM: ld r4,r11,0 ;Se accede a cada elemento de ;la fila. sub r5,r4,1 ;y se almacena en la variable local mulu r5,r5,4 ;que ocupa la posición que st r4,r30,r5 ;corresponde al valor del elemento. addu r11,r11,4 DBNZ (r3,CARGA_C_SM) addu r10,r10,r20 DBNZ (r2,CARGA_F_SM) xor r29,r29,r29 ;Se inicializa a cero el resultado. ld r2,r31,12 ;r2 es el contador de elementos. mulu r2,r2,r2 add r5,r0,0 ;r5 es el desplazamiento sobre r30. SIGUE_SM: ld r4,r30,r5 ;Se accede a la variable local i y cmp r4,r4,0 ;se compara con el número 0, si son bb1 eq,r4,MAL_SM ;iguales el resultado está mal. Se add r5,r5,4 ;incrementa el desplazamiento a r30. DBNZ (r2,SIGUE_SM) br FIN_SM MAL_SM: add r29,r0,-1 FIN_SM: or r30,r31,r0 POP (r31) POP (r1) jmp (r1) CMP_SUDOKU: PUSH (r1) ld r2,r30,8 ;r2 con el orden de submatrices. ld r10,r30,4 ;r10 puntero a cada fila. mulu r3,r2,r2 ;r3 número de elementos de cada or r13,r3,r0 ;fila y r13 contador de filas. mulu r5,r3,4 ;r5 desplazamiento a la siguiente OTRA_FILA: PUSH (r5) ;fila. Se salva el desplazamiento. PUSH (r13) ;Se salva el estado del contador. PUSH (r3) ;Se pasa el parámetro NF. PUSH (r10) ;Se pasa el parámetro DirFila. bsr CMP_FILA POP (r10) POP (r3) POP (r13) POP (r5) cmp r4,r29,-1 ;Se comprueba si ha habido error. bb1 eq,r4,ERROR addu r10,r10,r5 ;Se pasa a la fila siguiente y DBNZ (r13,OTRA_FILA) ;se comprueba si final. ld r2,r30,8 ;r2 con orden de las submatrices. ld r10,r30,4 ;r10 puntero a cada fila. mulu r3,r2,r2 ;r3 número de elementos de cada or r13,r3,r0 ;columna. r13 contador de columnas. OTRA_COLUMNA: PUSH (r13) ;Se salva el estado del contador. PUSH (r3) ;Se pasa el parámetro NC. PUSH (r10) ;Se pasa el parámetro DirColumna. bsr CMP_COLUMNA POP (r10) POP (r3) POP (r13) cmp r4,r29,-1 ;Se comprueba si ha habido error. bb1 eq,r4,ERROR addu r10,r10,4 ;Se pasa a la columna siguiente y DBNZ (r13,OTRA_COLUMNA) ;se comprueba si final. ld r2,r30,8 ;r2 con orden de las submatrices. ld r10,r30,4 ;r10 puntero a matriz. r13 es el ld r13,r30,8 ;contador de filas de submatrices OTRA_SM_FIL:ld r3,r30,8 ;y r3 el contador de columnas de OTRA_SM_COL:PUSH (r13) ;submatrices. Se salva el estado PUSH (r3) ;de los contadores. PUSH (r2) ;Se pasa el parámetro n y PUSH (r10) ;el parámetro DirSubmatriz. bsr CMP_SMATRIZ POP (r10) POP (r2) POP (r3) POP (r13) cmp r4,r29,-1 ;Se comprueba si ha habido error. bb1 eq,r4,ERROR mulu r4,r2,4 ;r4 es el desplazamiento a la addu r10,r10,r4 ;siguiente submatriz fila. DBNZ (r3,OTRA_SM_COL) sub r4,r2,1 ;Se determina el incremento para mulu r4,r4,r2 ;pasar a la siguiente submatriz mulu r4,r4,r2 ;columna cuyo valor es 4*n*n*(n-1). mulu r4,r4,4 addu r10,r10,r4 DBNZ (r13,OTRA_SM_FIL) ERROR: POP (r1) jmp (r1) Ppal: addu r30,r0,60008 addu r29,r0,0xAAAA add r2,r0,3 ; add r2,r0,9 PUSH (r2) LEA (r2,SUDOKU) PUSH (r2) bsr CMP_SUDOKU stop SUDOKU: data 1, 4, 5, 8, 2, 3, 7, 9, 6 FILA2: data 8, 2, 6, 7, 9, 4, 5, 1, 3 FILA3: data 7, 3, 9, 6, 1, 5, 8, 4, 2 FILA4: data 6, 8, 1, 5, 4, 7, 2, 3, 9 FILA5: data 2, 7, 3, 1, 8, 9, 6, 5, 4 FILA6: data 9, 5, 4, 3, 6, 2, 1, 7, 8 FILA7: data 4, 1, 2, 9, 5, 8, 3, 6, 7 FILA8: data 3, 6, 8, 4, 7, 1, 9, 2, 5 FILA9: data 5, 9, 7, 2, 3, 6, 4, 8, 1