Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ta funcionando no caso da q x0 < x1 e y0 > y1
- #no caso esse codigo prova isso
- .data
- width: .word 320
- height: .word 240
- dois: .float 2.0
- zero: .float 0.0
- .text
- main:
- li $a0, 20
- li $a1, 200
- li $a2 , 100
- li $a3, 20
- jal desenhaReta
- li $a0,100
- li $a1,20
- li $a2,300
- li $a3,200
- jal desenhaReta
- li $a0, 20
- li $a1,200
- li $a2,300
- li $a3,200
- jal desenhaReta
- li $v0,10
- syscall
- #############################
- # Função que desenha a reta
- # Parametros : a0 : x0 , a1 : y0, a2:x1,a3:y1
- # VALOR DE RETORNO 1 sucesso, 0 falha. -> implementar ainda
- desenhaReta:
- #empilha
- addi $sp,$sp,-4
- sw $ra,0($sp)
- #descobrir o quadrante
- slt $t8,$a0,$a2 # x < x1
- bne $t8,$zero, x0menorx1
- x0maiorx1:
- add $s5,$zero,$a0
- add $s6,$zero,$a1
- add $a0,$a2,$zero
- add $a1,$a3,$zero
- add $a2,$s5,$zero
- add $a3,$s6,$zero
- x0menorx1:
- slt $t9,$a3,$a1 # if ( y1 < y0)?t0 = 1:0
- bne $t9,$zero,primeiroQuadrante # x < x1, y1 < y0
- j primQuadrInverti
- primQuadrInverti:
- sub $t0, $a2,$a0 # dx t0 = a2 - a0
- sub $t1, $a3,$a1 # dy t1 = a3 - a1
- mtc1 $t0, $f0 #f0 agora tem o valor de t0
- cvt.s.w $f0,$f0
- mtc1 $t1, $f1 #f1 agora tem o valor de t1
- cvt.s.w $f1,$f1
- #pinta primeiro pixel, como o primeiro pixel vai ser o valor de a0,a1 e eles ja estao no lugar certo.
- #eh so chamar a função
- addi $sp,$sp,-8
- sw $t0,0($sp)
- sw $t1,4($sp)
- jal ponto
- lw $t0,0($sp)
- lw $t1,4($sp)
- addi $sp,$sp,8
- # a partir daqui editar.
- #descobrir qual a direcao rapida.
- lwc1 $f10,dois #preciso do 2.0
- slt $at, $t0,$t1 # se t0 for menor que t1 , y é a direção rápida
- bne $at, $zero, yehrapida1
- xehrapida1:
- li $s2, 0 #vari aux dizendo que x é pos rapida
- div.s $f2, $f0,$f10 #F2 recebe o (erro) atual = direção rapida/ 2 nesse caso eh dx / 2 já q $f0 é dx nesse caso.
- j loop1
- yehrapida1:
- li $s2, 1 # vari aux dizendo que y é pos rápida
- div.s $f2, $f1,$f10 #F2 recebe o (erro) atual = direção rapida/ 2 nesse caso eh dy / 2 já q $f1 é dy nesse caso.
- j loop1
- #aqui que vai pintar os pontos.
- loop1:
- #fazer sair do loop
- slt $at,$a2,$a0 # se x2 < x1 sai
- bne $at,$zero, saiDoLoop1
- slt $at,$a3,$a1 # se y1 < y0 sai do loop.
- bne $at,$zero,saiDoLoop1
- #se nao saiu cont
- beq $s2,$zero,xPosRapida1 #checa qual eh a direcao rapida
- #caso y pos rapida
- addi $a1,$a1,1
- sub.s $f2,$f2, $f0 #aqui a pos rapida vai ser dy, fazemos erro - pos lenta no caso dx
- lwc1 $f10,zero
- c.lt.s $f2,$f10
- bc1t andoPosLentaX1
- j naoAndoNaPosLentaX1
- andoPosLentaX1:
- addi $a0,$a0,1
- add.s $f2,$f2,$f1 #erro + pos rapida
- jal ponto
- j loop1
- naoAndoNaPosLentaX1:
- jal ponto
- j loop1
- xPosRapida1:
- addi $a0,$a0,1 # anda na pos rapida .
- sub.s $f2,$f2, $f1 # aqui a pos rapida é dx , fazemos erro - pos lenta no caso dy
- lwc1 $f10,zero
- c.lt.s $f2,$f10 # comparar se o erro eh negativo se f2 (erro ) < 0 (fp = 1)
- bc1t andoPosLentay1 #se o erro foi negativo anda na pos lenta no caso y
- j naoAndoPosLentay1
- andoPosLentay1:
- addi $a1,$a1,1
- add.s $f2,$f2,$f0
- jal ponto
- j loop1
- naoAndoPosLentay1:
- jal ponto
- j loop1
- saiDoLoop1:
- lw $ra,0($sp)
- addi $sp,$sp,4
- jr $ra
- ##editar até aqui
- #inicioCod Primeiro Quadrante
- primeiroQuadrante:
- sub $t0, $a2,$a0 #calcula dx = a2 - a0 salva em $t0
- sub $t1, $a1,$a3 #calcula dy = a3, - a1 salva em $t1
- mtc1 $t0, $f0 #f0 agora tem o valor de t0
- cvt.s.w $f0,$f0
- mtc1 $t1, $f1 #f1 agora tem o valor de t1
- cvt.s.w $f1,$f1
- #pinta primeiro pixel, como o primeiro pixel vai ser o valor de a0,a1 e eles ja estao no lugar certo.
- #eh so chamar a função
- addi $sp,$sp,-8
- sw $t0,0($sp)
- sw $t1,4($sp)
- jal ponto
- lw $t0,0($sp)
- lw $t1,4($sp)
- addi $sp,$sp,8
- #descobrir qual a direcao rapida.
- lwc1 $f10,dois #preciso do 2.0
- slt $at, $t0,$t1 # se t0 for menor que t1 , y é a direção rápida
- bne $at, $zero, yehrapida
- xehrapida:
- li $s2, 0 #vari aux dizendo que x é pos rapida
- div.s $f2, $f0,$f10 #F2 recebe o (erro) atual = direção rapida/ 2 nesse caso eh dx / 2 já q $f0 é dx nesse caso.
- j loop
- yehrapida:
- li $s2, 1 # vari aux dizendo que y é pos rápida
- div.s $f2, $f1,$f10 #F2 recebe o (erro) atual = direção rapida/ 2 nesse caso eh dy / 2 já q $f1 é dy nesse caso.
- j loop
- #aqui que vai pintar os pontos.
- loop:
- #fazer sair do loop
- slt $at,$a2,$a0 # se x2 < x1 sai
- bne $at,$zero, saiDoLoop
- slt $at,$a1,$a3 # se y0 < y1 sai do loop.
- bne $at,$zero,saiDoLoop
- #se nao saiu cont
- beq $s2,$zero,xPosRapida #checa qual eh a direcao rapida
- #caso y pos rapida
- addi $a1,$a1,-1
- sub.s $f2,$f2, $f0 #aqui a pos rapida vai ser dy, fazemos erro - pos lenta no caso dx
- lwc1 $f10,zero
- c.lt.s $f2,$f10
- bc1t andoPosLentaX
- j naoAndoNaPosLentaX
- andoPosLentaX:
- addi $a0,$a0,1
- add.s $f2,$f2,$f1 #erro + pos rapida
- jal ponto
- j loop
- naoAndoNaPosLentaX:
- jal ponto
- j loop
- xPosRapida:
- addi $a0,$a0,1 # anda na pos rapida .
- sub.s $f2,$f2, $f1 # aqui a pos rapida é dx , fazemos erro - pos lenta no caso dy
- lwc1 $f10,zero
- c.lt.s $f2,$f10 # comparar se o erro eh negativo se f2 (erro ) < 0 (fp = 1)
- bc1t andoPosLentay #se o erro foi negativo anda na pos lenta no caso y
- j naoAndoPosLentay
- andoPosLentay:
- addi $a1,$a1,-1
- add.s $f2,$f2,$f0
- jal ponto
- j loop
- naoAndoPosLentay:
- jal ponto
- j loop
- saiDoLoop:
- lw $ra,0($sp)
- addi $sp,$sp,4
- jr $ra
- ##########################
- # FUNÇÃO QUE DESENHA PIXEL
- # PARÂMETROS : a0 = x; a1 = y ; a2 = cor
- # retorna 1 sucesso, retorna 0 erro - > ainda tem de implementar.
- ponto:
- lw $t0, width #largura em t0
- lw $t1, height #altura em t1
- slti $t2,$a0,0 #se x < 0 sai da função
- bne $t2, $zero, saida_ponto
- slti $t2,$a1,0 #se y < 0 sai da função
- bne $t2,$zero, saida_ponto
- slt $t2, $a0, $t0 # se x >= width : sai da função
- beq $t2, $zero, saida_ponto
- slt $t2,$a1,$t1 #se y>= weight : sai da função
- beq $t2,$zero, saida_ponto
- mul $t0,$a1,$t0 #faz y * 320 e coloca em t0
- add $t0,$t0,$a0 #faz y * 320 + x e coloca em t0
- addi $t0, $t0, 0xFF000000 # faz 0xFF000000 + y *320 + x e coloca em t0
- # li $a2, 0XF # depois retirar so pra debug
- sb $a2 , 0($t0) #desenha o ponto de cor a2(byte:= BBGGGRR) na tela (a0,a1:=x,y)
- saida_ponto:
- jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement