Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .globl main
- .data
- rozmiar: .space 4
- szerokosc: .space 4
- wysokosc: .space 4
- offset: .space 4
- bufor: .space 4
- srodek: .space 4
- promien: .space 4
- padding: .space 4
- start: .asciiz "Okrag w kwadrat\n"
- input: .asciiz "/home/luke/Pulpit/Share/in.bmp"
- output: .asciiz "/home/luke/Pulpit/Share/out.bmp"
- error: .asciiz "Blad podczas otwierania pliku bmp\n"
- .text
- main: la $a0, start
- li $v0, 4
- syscall
- la $a0, input
- li $a1, 0
- li $a2, 0
- li $v0, 13
- syscall #otwieranie pliku
- move $t0, $v0
- bltz $t0, blad_otwarcia
- move $a0, $t0
- la $a1, bufor
- li $a2, 2
- li $v0, 14
- syscall
- move $a0, $t0
- la $a1, rozmiar
- li $a2, 4
- li $v0, 14
- syscall # wczytanie rozmiaru pliku na następnych 4 bajtach
- lw $t7, rozmiar
- move $a0, $t7
- li $v0, 9
- syscall # alokacja pamieci na bitmape
- move $t1, $v0 # skopiowanie adesu zaalokowanej pamieci do rejestru t1
- move $a0, $t0
- la $a1, bufor
- li $a2, 4
- li $v0, 14 # wczytywanie z pliku
- syscall
- move $a0, $t0
- la $a1, offset
- li $a2, 4
- li $v0, 14
- syscall
- move $a0, $t0
- la $a1, bufor
- li $a2, 4
- li $v0, 14
- syscall #przeskakujemy 4 bajty naglowka informacyjnego
- move $a0, $t0
- la $a1, szerokosc
- li $a2, 4
- li $v0, 14
- syscall
- lw $t2, szerokosc
- move $a0, $t0
- la $a1, wysokosc
- li $a2, 4
- li $v0, 14
- syscall
- lw $t3, wysokosc
- move $a0, $t0
- li $v0, 16
- syscall
- la $a0, input
- li $a1, 0 # zamykamy i otwieramy aby wskaznik czytania ustawil sie na poczatku
- li $a2, 0
- li $v0, 13
- syscall
- move $t0, $v0
- bltz $t0, blad_otwarcia
- move $a0, $t0
- la $a1, ($t1)
- la $a2, ($t7)
- li $v0, 14
- syscall #przycielamy pamięc na plik
- move $a0, $t0
- li $v0, 16
- syscall
- lw $t9, offset
- addu $t9, $t9, $t1 # ustawiamyt9 na poczatek tablicy pikseli
- mul $t6, $t2, 3
- andi $t6, $t6, 0x00000003
- li $s7, 1
- beqz $t6, padding_zero
- li $t5,4 # padding inny niż 0
- sub $t6,$t5,$t6
- sw $t6, padding
- j szukaj_poczatek
- padding_zero:
- li $t6, 0
- sw $t6, padding
- szukaj_poczatek:
- lbu $s0, ($t9) # wczytujemy skladowa B
- lbu $s1, 1($t9) # wczytujemy skladowa G
- lbu $s2, 2($t9) # wczytujemy skladowa R
- li $t4,0 # t4 sluzy jako licznik ktory sprawdza czy wszystkie składowe są równe 0
- bnez $s0, nastepny_pixel
- li $t3,1
- bnez $s1, nastepny_pixel
- addiu $t4,$t4,1
- bnez $s2, nastepny_pixel
- addiu $t4, $t4,1
- li $t4,3
- beq $t4,3,poczatek_kwadratu # sprawdzam czy wszystkie 3 skladowe pixela sa rowne 0
- nastepny_pixel:
- addiu $t9, $t9, 3 # wczytanie nastepnego piksela
- addiu $s7, $s7, 1 # zwiekszam flage szerokości
- ble $s7, $t2, szukaj_poczatek
- addu $t9, $t9, $t6 # dodajemy padding i zerujemy licznik
- li $s7, 1
- j szukaj_poczatek
- poczatek_kwadratu:
- li $s6, 1 # inicjalizacja licznika, ktory liczy ile pikseli ma bok kwadratu
- szukaj_koniec:
- addiu $t9, $t9, 3 #wczytanie następnego piksela
- addiu $s7, $s7, 1
- lbu $s0, ($t9) # wczytujemy skladowa B
- lbu $s1, 1($t9) # wczytujemy skladowa G
- lbu $s2, 2($t9) # wczytujemy skladowa R
- bnez $s0,koniec_kwadratu # szukamy pierwszego piksela ktory jest inny niz czarny
- bnez $s1 koniec_kwadratu
- bnez $s2 koniec_kwadratu
- addi $s6, $s6, 1 # kolejny piksel boku kwadratu
- j szukaj_koniec
- koniec_kwadratu:
- sra $s6 $s6, 1 #dlugosc boku to srednica a chcemy miec promien
- sw $s6, promien
- mul $s2, $s6, 3 # mnozymy przez 3 - tyle ile bajtow przypada na piksel
- subu $t9, $t9, $s2 # cofamy sie wskaznikiem do srodka boku kwadratu
- lw $t8, szerokosc
- mulu $t8, $t8, $s2 # instrukcje ustawiaja wskaznik w srodku okregu
- addu $t9, $t9, $t8
- mul $t8, $t6, $s6
- addu $t9, $t9, $t8
- sw $t9, srodek # zapamietujemy pozycje srodka kola
- li $t4, 0 # wspolrzedne poczatkowe to (0, R)
- move $t5, $s6
- okrag_rysowanie:
- # wykorzystamy algorytm Bresenhama w celu narysowania okregu
- # policzmy rownania okregow dla pieksela na prawo od obecnego i lezacego w dół i na prawo
- # żeby móc porównać który ma lepszą dokładność
- # zostanie wykorzystana ośmiokrotna symetria okręgu w celu narysowania wszystkich punktów
- addi $t7, $t4, 1
- mul $t8, $t7, $t7
- add $s0, $zero, $t8 # dla piksela lezacego na prawo od obecnego piksela
- mul $t8, $t5, $t5
- add $s0, $s0, $t8
- mul $t8, $s6, $s6
- sub $s0, $s0, $t8
- addi $t7, $t4, 1
- mul $t8, $t7, $t7
- add $s1, $zero, $t8 # dla piksela lezacego na dol i na prawo od obecnego piksela
- subi $t7, $t5, 1
- mul $t8, $t7, $t7
- add $s1, $s1, $t8
- mul $t8, $s6, $s6
- sub $s1, $s1, $t8
- negu $s1, $s1 # modul dla wartotosci s1
- bge $s0, $s1, idz_w_prawo_w_dol # jezeli dokladosc w prawo jest mniejsza niz pixela w prawo i w dół
- addi $t4, $t4, 1 #idziemy do piksela w prawo
- move $s4, $t4
- move $s5, $t5
- jal koloruj # kolorujemy piksel (x,y) i wszystkie dodatnie i ujemne kobinacje
- sub $s5, $zero, $t5
- jal koloruj
- sub $s4, $zero, $t4
- jal koloruj
- move $s5, $t5
- jal koloruj
- # kolorujemy pixel (y,x) i wszystkie dodatnie i ujemne kobinacje
- move $s4, $t5
- move $s5, $t4
- jal koloruj
- sub $s5, $zero, $t4
- jal koloruj
- sub $s4, $zero, $t5
- jal koloruj
- move $s5, $t4
- jal koloruj
- blt $t5, $t4, zapisz_plik
- j okrag_rysowanie
- idz_w_prawo_w_dol:
- addi $t4, $t4, 1
- subi $t5, $t5, 1
- # kolorujemy pixel (x,y) i wszystkie dodatnie i ujemne kobinacje
- move $s4, $t4
- move $s5, $t5
- jal koloruj
- sub $s5, $zero, $t5
- jal koloruj
- sub $s4, $zero, $t4
- jal koloruj
- move $s5, $t5
- jal koloruj
- # kolorujemy (y,x) i wszystkie dodatanie i ujemne kobimnacje
- move $s4, $t5
- move $s5, $t4
- jal koloruj
- sub $s5, $zero, $t4
- jal koloruj
- sub $s4, $zero, $t5
- jal koloruj
- move $s5, $t4
- jal koloruj
- j okrag_rysowanie
- koloruj:
- bge $s4, $s6, powrot # przeskakujemy piksele które lezą na styku okrąg - kwadrat bo nie musimy ich kolorować
- bge $s5, $s6, powrot
- sub $t8, $zero, $s6
- ble $s4, $t8, powrot
- ble $s4, $t8, powrot
- lw $t9, srodek # ustawiamy wskaznik t9 w odpowiednim miejscu w tablicy pikseli
- mul $t8, $s4, 3 # ktory nastepnie pokolorujemy na czarno
- add $t9, $t9, $t8 # najpierw dodajemy wspolrzedna x potem y
- lw $t8, szerokosc
- mul $t8, $t8, $s5
- mul $t8, $t8, 3
- add $t9, $t9, $t8
- mul $t8, $t6, $s5
- add $t9, $t9, $t8
- sb $zero, ($t9) # ponizej kolorujemy piksel na czarno
- addi $t9, $t9, 1
- sb $zero, ($t9)
- addi $t9, $t9, 1
- sb $zero, ($t9)
- powrot:
- jr $ra
- zapisz_plik:
- la $a0, output
- li $a1, 1
- li $a2, 0
- li $v0, 13
- syscall #tworzymy plik wyjsciowy
- move $t0, $v0
- lw $t7, rozmiar
- move $a0, $t0
- la $a1, ($t1) # do a1 kopiujemy poczatek pliku w pamieci
- la $a2, ($t7) # kopiujemy do pliku tyle bajtow ile wynosi rozmiar pliku
- li $v0, 15
- syscall
- move $a0, $t0
- li $v0, 16
- syscall # zamkniecie pliku
- koniec: li $v0, 10 # wyjscie z programu
- syscall
- blad_otwarcia:
- la $a0, error
- li $v0, 4
- syscall
- b koniec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement