.data memoria: .space 1920 eol: .asciiz "\n" .text main: li $t1,66 li $t2,1920 la $t0,memoria ini:sb $t1,0($t0) addi $t0,$t0,1 sub $t2,$t2,1 bne $t2,$0,ini #lui $a0,9 #addi $a0,$a0,2 #lui $a1,60 #addi $a1,$a1,24 li $t0,2 sll $t0,$t0,16 li $t1,6 sll $t1,$t1,16 srl $t1,$t1,16 or $a0,$t1,$t0 li $t0,70 sll $t0,$t0,16 li $t1,22 sll $t1,$t1,16 srl $t1,$t1,16 or $a1,$t1,$t0 la $a2,memoria lui $a3,80 addi $a3,$a3,24 li $t1,35 sb $t1,16($sp) li $t1,0 sb $t1,17($sp) li $t1,32 sb $t1,18($sp) DisegnaBoundingBox: sw $a0, 0($sp) #salvo coordinata I° estremo sw $a1, 4($sp) #salvo coordinata II° estremo sw $a3, 12($sp) #salvo coordinate dimensione immagine lh $t0, 0($sp) #carico la 'x' del primo estremo lh $t1, 2($sp) #carico la 'y' del primo estremo lh $t2, 4($sp) #carico la 'x' del secondo estremo lh $t3, 6($sp) #carico la 'y' del secondo estremo lh $t6, 12($sp) #carico la 'x' dimensione immagine lh $t7, 14($sp) #carico la 'y' dimensione immagine lb $t8, 16($sp) #carico colore del perimetro addi $sp,$sp, -8 #creazione stack sw $s0, 0($sp) li $v0, 1 #pongo il valore in uscita uguale a '1' slt $t5,$t1,$0 #verifico se il vertice ha riga negativa bne $t5,$0, PARA1 NEG2: slt $t5,$t7,$t1 #verifico se il vertice è fuori dalle bne $t5,$0, EXIT #coordinate della dimensione dell'immagine slt $t5,$t0,$0 bne $t5,$0, PARA2 #verifico se il vertice ha colonna negativa NEG3: sle $t5,$t6,$t0 #verifico se il vertice è fuori dalle bne $t5,$0, EXIT #coordinate della dimensione dell'immagine slt $t5,$t3,$0 bne $t5,$0, EXIT #verifico se il II° vertice della seconda riga è negativa sle $t5,$t7,$t3 #verifico se il vertice è fuori dalle bne $t5,$0, PARA3 #coordinate della dimensione dell'immagine NEG4: slt $t5,$t2,$0 bne $t5,$0, EXIT #verifico se il vertice ha colonna negativa sle $t5,$t6,$t2 bne $t5,$0, PARA4 #verifico se il vertice è tutto fuori #controllo se le coordinate dei vertici sono uguali #alle coordinate della mem video CONT: li $t4,1 #inizializzo un contatore lh $t5, 10($sp) #controllo se le coordinate vertice sono diverse bne $t5,$t1, PREP2 #dall'indirizzo della mem video salto a PREP2 mul $t5,$t1,$t6 #moltiplico la 'y' del primo vertice per la #coordinata 'x' dell'immagine add $t5,$t5,$t0 #sommo la coordinata del vertice add $t5,$t5,$a2 #sommo il puntatore alla memoria mul $t9,$t1,$t6 #moltiplico la seconda coordinata del vertice add $t9,$t9,$t2 add $t9,$t9,$a2 li $s0, 1 #incremento lo spostamento dell'indirizzo CICLO: sb $t8, 0($t5) #salvo il byte del colore add $t5,$t5,$s0 #mi sposto di riga ble $t5,$t9, CICLO #confronto di minoranza tra coord. e puntatore #addi $t4,$t4,1 #incremento il contatore li $t5,1 #carico il valore del primo lato beq $t5,$t4, PREP2 #salto preparazione secondo lato li $t5, 2 beq $t5,$t4, PREP3 #salto preparazione terzo lato li $t5, 3 beq $t5,$t4, PREP4 #salto alla preparazione del quarto lato PROSEGUI: lb $t5, 25($sp) #carico il byte controllo di riempimento beq $t5,$0, FINE lb $t5, 26($sp) #carico il byte colore riempimento bne $t0,$0, L2 #controllo se il lato e' sul bordo addi $s0,$t1,1 mul $t9,$t6,$s0 #calcolo indirizzo del pixel add $t9,$t9,$t0 add $t9,$t9,$a2 lb $s0, 0($t9) #carico il pixel bne $s0,$t8, LATO2 L2: addi $t0,$t0,1 LATO2: bne $t1,$0, L3 #controllo se il lato e' sul bordo addi $s0,$t0,1 mul $t9,$t6,$t1 #calcolo indirizzo del pixel add $t9,$t9,$s0 add $t9,$t9,$a2 lb $s0, 0($t9) #carico il pixel bne $s0,$t8, LATO3 L3: addi $t1,$t1,1 LATO3: move $s0,$t6 addi $s0,$s0,-1 bne $t2,$s0, L4 #controllo se il lato e' sul bordo addi $s0,$t1,1 mul $t9,$t6,$s0 #calcolo indirizzo del pixel add $t9,$t9,$t2 add $t9,$t9,$a2 lb $s0, 0($t9) #carico il pixel bne $s0,$t8, LATO4 L4: addi $t2,$t2,-1 LATO4: move $s0,$t7 addi $s0,$s0,-1 bne $t3,$s0, L5 #controllo se il lato e' sul bordo addi $s0,$t0,1 mul $t9,$t6,$t3 #calcolo indirizzo del pixel add $t9,$t9,$s0 add $t9,$t9,$a2 lb $s0, 0($t9) #carico il pixel bne $s0,$t8, LOOP1 L5: addi $t3,$t3,-1 LOOP1: move $t9,$t0 #copio la coordinata in t9 LOOP: mul $t8,$t6,$t1 #calcolo indirizzo pixel da colorare add $t8,$t8,$t9 add $t8,$t8,$a2 sb $t5, 0($t8) #coloro il pixel addi $t9,$t9,1 #incremento colonna (x) ble $t9,$t2, LOOP #controllo di fine linea addi $t1,$t1,1 #incremento della riga (y) bgt $t1,$t3, FINE #salta se maggiore move $t9,$t0 j LOOP PREP2: addi $t4,$t4,1 lh $t5, 12($sp) bne $t5,$t2, PREP3 #salta preparazione lato se diverso da perimetro mul $t5,$t1,$t6 add $t5,$t5,$t2 add $t5,$t5,$a2 mul $t9,$t3,$t6 add $t9,$t9,$t2 add $t9,$t9,$a2 move $s0,$t6 #determino spostamento nell'indirizzo j CICLO #salta al ciclo di disegno lato PREP4: addi $t4,$t4,1 lh $t9,14($sp) bne $t9,$t3, PROSEGUI #salta preparazione lato se diverso da perimetro mul $t9,$t3,$t6 add $t9,$t9,$t2 add $t9,$t9,$a2 mul $t5,$t3,$t6 add $t5,$t5,$t0 add $t5,$t5,$a2 li $s0, 1 #determino spostamento nell'indirizzo j CICLO #salta al ciclo di disegno lato PREP3: addi $t4,$t4,1 lh $t9, 8($sp) bne $t9,$t0, PREP4 #salta preparazione lato se diverso da perimetro mul $t9,$t3,$t6 add $t9,$t9,$t0 add $t9,$t9,$a2 mul $t5,$t1,$t6 add $t5,$t5,$t0 add $t5,$t5,$a2 #determino spostamento nell'indirizzo move $s0,$t6 j CICLO #salta al ciclo di disegno lato PARA1: move $t1,$0 #assegno valore 0 alla 'y' del primo vertice li $v0, -1 #assegno il valore di uscita j NEG2 PARA2: move $t0,$0 #assegno valore 0 alla 'x' del primo vertice li $v0, -1 #assegno il valore di uscita j NEG3 PARA3: move $t3,$t7 #assegno valore della 'y' del secondo vertice alla 'x' addi $t3,$t3,-1 #dell'immagine li $v0, -1 #assegno il valore di uscita j NEG4 PARA4: move $t2,$t6 #assegno valore della 'x' del secondo vertice alla 'y' addi $t2,$t2,-1 #dell'immagine li $v0, -1 #assegno il valore di uscita j CONT EXIT: li $v0, -2 j FINE FINE: lw $s0, 0($sp) addi $sp,$sp,8 #jr $ra #stampa della memoria video (24 righe da 80 colonne) la $t0,memoria #XXXXXX e' l'indirizzo della zona di memoria video, che dovete aver gia' dichiarata ed inizializzata li $v0,4 #per fare print string move $t1,$0 #azzero t1 pool: la $a0,eol #eol e' una stringa dichiarata con .asciiz contenente solo il fine riga syscall move $a0,$t0 lw $t0,80($a0) #metti da parte il byte in posizione $a0+80 sw $0,80($a0) #metti end_of_string in posizione $a0+80 syscall #print string sw $t0,80($a0) #ripristina il byte in posizione $a0+80 addiu $t0,$a0,80 #incrementa di 80 $a0 con risultato in $t0 addiu $t1,$t1,1 blt $t1,24,pool