Last active
October 2, 2016 13:22
-
-
Save rafael-fernandes/41c45a660ab0c4c3c225fb78d4693d8b to your computer and use it in GitHub Desktop.
Função B
This file contains hidden or 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_B: .float -2 | |
LSUP_B: .float 2 | |
.text | |
MAIN: | |
l.s $f0, LINF_B | |
l.s $f1, LSUP_B | |
jal PLANO_CARTESIANO | |
jal INTERVALO | |
jal DEFINE_QUADRADO | |
jal DESENHA | |
li $v0, 10 | |
syscall | |
# FUNÇÃO B => f(x) = x² + 1 | |
FUNCAO_B: | |
mul.s $f12, $f0, $f0 | |
add.s $f12, $f12, $f3 | |
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, 160 # t0 = end_base + 160 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, 76480 # 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_B | |
# 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, -482 | |
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