Last active
October 2, 2016 13:28
-
-
Save rafael-fernandes/b4f87fda6b12eec52ac1decac73bdef3 to your computer and use it in GitHub Desktop.
Função C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.eqv END_BASE 0xFF000000 # Endereço Base | |
.eqv COR_VERMELHA 7 | |
.eqv COR_PRETA 0 | |
.eqv WIDTH_INT 320 | |
.eqv HEIGHT_INT 240 | |
.data | |
# Dados do Bitmap Display | |
WIDTH: .float 320 | |
HEIGHT: .float 240 | |
# Limites Inferiores e Superiores | |
LINF_C: .float -1 | |
LSUP_C: .float 10 | |
.text | |
MAIN: | |
l.s $f0, LINF_C | |
l.s $f1, LSUP_C | |
jal PLANO_CARTESIANO | |
jal INTERVALO | |
jal DEFINE_QUADRADO | |
jal DESENHA | |
li $v0, 10 | |
syscall | |
# FUNÇÃO C => f(x) = sqrt(x) | |
FUNCAO_C: | |
sqrt.s $f12, $f0 | |
jr $ra | |
# REG Nº 25 TEM O TAMANHO DO INTERVALO DE X | |
INTERVALO: | |
sub.s $f25, $f1, $f0 # f25 = LSUP - LINF | |
abs.s $f25, $f25 | |
floor.w.s $f25, $f25 | |
cvt.s.w $f25, $f25 | |
jr $ra | |
# REG Nº 27 TEM O TAMANHO DO QUADRADO | |
DEFINE_QUADRADO: | |
l.s $f4, WIDTH | |
div.s $f27, $f25, $f4 # f4 = tamanho_x/320 | |
jr $ra | |
PLANO_CARTESIANO: | |
la $t0, END_BASE | |
li $t1, HEIGHT_INT | |
li $t2, WIDTH_INT | |
li $t3, COR_PRETA | |
addi $t4, $t0, 21 # t0 = end_base + 21 pixels | |
EIXO_Y: | |
sb $t3, 0($t4) | |
addi $t1, $t1, -1 # t1 = t1 - 1 = height - 1 | |
beq $t1, $zero, EXIT_Y | |
addi $t4, $t4, 320 | |
j EIXO_Y | |
EXIT_Y: | |
addi $t0, $t0, 59200 # offset para plotar eixo x | |
EIXO_X: | |
sb $t3, 0($t0) | |
addi $t2, $t2, -1 # t2 = t2 - 1 = width - 1 | |
beq $t2, $zero, EXIT_X | |
addi $t0, $t0, 1 | |
j EIXO_X | |
EXIT_X: | |
jr $ra | |
DESENHA: | |
la $t2, END_BASE | |
li $t3, COR_VERMELHA | |
li $t4, WIDTH_INT | |
addi $sp, $sp, -4 | |
sw $ra, 0($sp) | |
DESENHA_CALCULA_PONTO: | |
jal FUNCAO_C | |
# Verifica se o expoente é diferente de 255 | |
mfc1 $s0, $f12 | |
sll $s0, $s0, 1 | |
srl $s0, $s0, 24 | |
subi $s0, $s0, 255 | |
DESENHA_INCREMENTA: | |
add.s $f0, $f0, $f27 # x = x + tamanho_quadrado | |
c.lt.s $f1, $f0 # se LSUP < x | |
bc1t DESENHA_FIM | |
beq $s0, $zero, DESENHA_CALCULA_PONTO # Ignora f(x) = NaN ou f(x) = +/- inf | |
DESENHA_CALCULA_X: | |
div.s $f4, $f0, $f27 # f4 = x/tamanho_quadrado | |
floor.w.s $f4, $f4 # f4 = floor(f4) | |
mfc1 $t0, $f4 # t0 = x/tamanho_quadrado | |
DESENHA_CALCULA_Y: | |
div.s $f5, $f12, $f27 # f5 = y/tamanho_quadrado | |
floor.w.s $f5, $f5 # f5 = floor(f5) | |
cvt.s.w $f5, $f5 | |
abs.s $f5, $f5 | |
l.s $f6, HEIGHT | |
c.lt.s $f6, $f5 | |
bc1f DESENHA_CALCULA_Y_INVERTE_Y | |
j DESENHA_CALCULA_PONTO | |
DESENHA_CALCULA_Y_INVERTE_Y: | |
sub.s $f5, $f5, $f6 # f5 = y - 240 | |
abs.s $f5, $f5 # f5 = abs(y-240) | |
DESENHA_CALCULA_Y_MOVE_Y: | |
cvt.w.s $f5, $f5 | |
mfc1 $t1, $f5 # t1 = y/tamanho_quadrado | |
PLOTA_PONTO: | |
mul $t5, $t4, $t1 # t4 = 320*y | |
add $t5, $t5, $t0 # t4 = 320*y + x | |
add $t5, $t5, $t2 # t2 = END_BASE + 320*y + x | |
addi $t5, $t5, -15980 | |
sb $t3, 0($t5) # plota o ponto no Bitmap Display | |
j DESENHA_CALCULA_PONTO | |
DESENHA_FIM: | |
lw $ra, 0($sp) | |
addi $sp, $sp, 4 | |
jr $ra |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment