Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #--------------------------------------------------------
- #DANE WEJSCIOWE
- #--------------------------------------------------------
- .data
- komendy: .asciiz "komendy.txt"
- komendy_space: .space 1024
- zapis: .asciiz "zapis.bmp"
- bfType: .half 0x4d42 # 4d - M, 42 - B razem BM
- bfSize: .word 76854 #
- bfReserved1: .half 0 #
- bfReserved2: .half 0 #
- bfOffBits: .word 54 #
- biSize: .word 40 #
- biWidth: .word 160 #
- biHeight: .word 120 #
- biPlanes: .half 1 #
- biBitCount: .half 32 #
- biCompression: .word 0 #
- biSizeImage: .word 0 #
- biXPelsPerMeter:.word 0 #
- biYPelsPerMeter:.word 0 #
- biClrUsed: .word 0 #
- biClrImportant: .word 0 #
- bufor: .space 76800 #160 * 120 * 4
- ustaw: .asciiz "ustaw"
- podnies: .asciiz "podnies"
- opusc: .asciiz "opusc"
- naprzod: .asciiz "naprzod"
- obrot: .asciiz "obrot"
- test: .asciiz "\ntest\n"
- # sinusy i cosinusy z zakresu
- sinus: .word 0, 175, 349, 523, 698, 872, 1045, 1219, 1392, 1564, 1736, 1908, 2079, 2250, 2419, 2588, 2756, 2924, 3090, 3256, 3420, 3584, 3746, 3907, 4067, 4226, 4384, 4540, 4695, 4848, 5000, 5150, 5299, 5446, 5592, 5736, 5878, 6018, 6157, 6293, 6428, 6561, 6691, 6820, 6947, 7071, 7193, 7314, 7431, 7547, 7660, 7771, 7880, 7986, 8090, 8192, 8290, 8387, 8482, 8572, 8660, 8746, 8829, 8910, 8988, 9063, 9135, 9205, 9272, 9336, 9397, 9455, 9511, 9563, 9613, 9659, 9703, 9744, 9781, 9816, 9848, 9877, 9903, 9925, 9945, 9962, 9976, 9986, 9994, 9998
- cosinus: .word 10000, 9998, 9994, 9986, 9976, 9962, 9945, 9925, 9903, 9877, 9848, 9816, 9781, 9744, 9703, 9659, 9613, 9563, 9511, 9455, 9397, 9336, 9272, 9205, 9135, 9063, 8988, 8910, 8829, 8746, 8660, 8572, 8482, 8387, 8290, 8192, 8090, 7986, 7880, 7771, 7660, 7547, 7431, 7314, 7193, 7071, 6947, 6820, 6691, 6561, 6428, 6293, 6157, 6018, 5878, 5736, 5592, 5446, 5299, 5150, 5000, 4848, 4695, 4540, 4384, 4226, 4067, 3907, 3746, 3584, 3420, 3256, 3090, 2924, 2756, 2588, 2419, 2250, 2079, 1908, 1736, 1564, 1392, 1219, 1045, 872, 698, 523, 349, 175
- .text
- main:
- #---------------------------------------------------------
- #ODCZYT DANYCH Z PLIKU
- #---------------------------------------------------------
- # $t0 - file descriptor
- #---------------------------------------------------------
- #otwieranie pliku
- li $v0, 13
- la $a0, komendy
- li $a1, 0
- li $a2, 0
- syscall
- #przeniesienie file desciptora do $t0
- move $t0 , $v0
- #odczytywanie z pliku
- li $v0, 14
- move $a0, $t0
- la $a1, komendy_space
- li $a2, 1024
- syscall
- #zamykanie pliku
- li $v0, 16
- move $a0, $t0
- syscall
- #---------------------------------------------------------
- #MALOWANIE POCZATKOWEJ MAPY NA BIALO
- #---------------------------------------------------------
- # $t0 - kolor bialy
- # $t1 - koniec bufora
- # $t2 - poszczegolne bajty bufora, ktore malujemy
- #---------------------------------------------------------
- li $t0, 0xFFFFFFFF #kolor bialy
- la $t2, bufor
- move $t1, $t2
- add $t1, $t1, 76800
- zamaluj:
- sw $t0, 0($t2)
- add $t2, $t2, 4
- blt $t2, $t1, zamaluj
- #---------------------------------------------------------
- #USTAWIENIE WARTOSCI $s1 - $s5
- #---------------------------------------------------------
- li $s1, 0 #wspolrzedna x
- li $s2, 0 #wspolrzedna y
- li $s3, 0 #kat
- li $s4, 0 #przesuniecie
- li $s5, 0 #podniesione lub opusczone - 0=podniesione
- #---------------------------------------------------------
- #POBIERANIE KOMEND Z PLIKU
- #---------------------------------------------------------
- # $s0 - poczatek komendy
- # $t0 - kolejne znaki komendy z txt
- # $t1 - pojedyncze znaki z $t0
- # $t2 - nazwy komend
- # $t3 - pojedyczne znaki z $t2
- #---------------------------------------------------------
- la $t0, komendy_space
- move $s0,$t0
- sprawdz_czy_jest_jakas_komenda:
- lb $t1, 0($s0)
- beqz $t1, exit
- move $t0,$s0
- la $t2, ustaw
- sprzawdz_czy_to_komenda_ustaw:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0,$t0,1
- addiu $t2,$t2,1
- beq $t1,' ' komenda_ustaw
- beq $t1, $t3, sprzawdz_czy_to_komenda_ustaw
- la $t2, podnies
- move $t0, $s0
- sprzawdz_czy_to_komenda_podnies:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0,$t0,1
- addiu $t2,$t2,1
- beq $t1,';' komenda_podnies
- beq $t1, $t3, sprzawdz_czy_to_komenda_podnies
- la $t2, opusc
- move $t0, $s0
- sprzawdz_czy_to_komenda_opusc:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0,$t0,1
- addiu $t2,$t2,1
- beq $t1,';' komenda_opusc
- beq $t1, $t3, sprzawdz_czy_to_komenda_opusc
- la $t2, naprzod
- move $t0, $s0
- sprzawdz_czy_to_komenda_naprzod:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0,$t0,1
- addiu $t2,$t2,1
- beq $t1,' ' komenda_naprzod
- beq $t1, $t3, sprzawdz_czy_to_komenda_naprzod
- la $t2, obrot
- move $t0, $s0
- sprzawdz_czy_to_komenda_obroc:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0,$t0,1
- addiu $t2,$t2,1
- beq $t1,' ' komenda_obroc
- beq $t1, $t3, sprzawdz_czy_to_komenda_obroc
- b exit
- #---------------------------------------------------------
- #POBIERANIE ARGUMENTOW KOMENDY
- #---------------------------------------------------------
- # $t0 - kolejne znaki komendy
- # $t1 - pojedyncze znaki komendy
- # $t2 - pojedyncze kolejne znaki komendy
- # $t3 - wartosc arg
- #---------------------------------------------------------
- pobieranie_argumentow:
- li $t3, 0
- pobieranie_liczby:
- lb $t1, 0($t0)
- lb $t2, 1($t0)
- sub $t1,$t1,'0' #w $t1 mamy znak liczby w ASCII a nie liczbe, iwec odejmujemy 0 w ASCII aby miec wartosc liczby
- add $t3,$t3,$t1
- addiu $t0, $t0,1
- beq $t2,',',zakonczenie_pobierania_argumentu
- beq $t2,']',zakonczenie_pobierania_argumentu
- beq $t2,';',zakonczenie_pobierania_argumentu
- mul $t3, $t3, 10
- b pobieranie_liczby
- zakonczenie_pobierania_argumentu:
- jr $ra
- #---------------------------------------------------------
- #WYKONANIE KOMEND
- #---------------------------------------------------------
- # $s0 - poczatek komendy
- # $t0 - przeskakiwanie z wczesniejszej linii komendy na poczatek kolejnej
- # $t3 - wartosc zwracana przez "pobieranie_argumentow"
- #---------------------------------------------------------
- #********************************************
- #komenda ustawiania zolwia na mapie bitowej
- komenda_ustaw:
- add $t0,$t0,1 #przejscie z [ na wartosc wspolrzednej x
- jal pobieranie_argumentow
- move $s1, $t3 #wczytanie wspolrzednej x do $s1
- add $t0,$t0,1 #przejscie z , na wartosc wspolrzednej y
- jal pobieranie_argumentow
- move $s2, $t3 #wczytanie wspolrzednej y do $s2
- add $t0,$t0,3 #przejscie z ] na wartosc kata
- jal pobieranie_argumentow
- move $s3, $t3 #wczytanie kata do $s3
- add $t0, $t0,2 #przejscie z ; na poczatek nowej komendy
- move $s0, $t0
- #wypis
- li $v0, 4
- la $a0, test
- syscall
- li $v0, 4
- la $a0, ustaw
- syscall
- li $v0, 1
- move $a0, $s1
- syscall
- li $v0, 1
- move $a0, $s2
- syscall
- li $v0, 1
- move $a0, $s3
- syscall
- #koniec wypisu
- beqz $s5, podniesione
- jal zamaluj_pixel #jezeli jest opuszczony to malujemy pixel
- podniesione:
- b sprawdz_czy_jest_jakas_komenda
- #********************************************
- #komenda podnoszenia zolwia ( nie rysuje )
- komenda_podnies:
- add $t0,$t0,1 #przejscie do nowej komendy
- li $s5, 0 #"podniesienie" zolwia
- move $s0, $t0
- #wypis
- li $v0, 4
- la $a0, test
- syscall
- li $v0, 4
- la $a0, podnies
- syscall
- #koniec wypisu
- b sprawdz_czy_jest_jakas_komenda
- #********************************************
- #komenda opuszcania zolwia ( rysuje )
- komenda_opusc:
- add $t0,$t0,1 #przejscie do nowej komendy
- li $s5, 1 #"opuszczenie" zolwia
- move $s0, $t0
- #wypis
- li $v0, 4
- la $a0, test
- syscall
- li $v0, 4
- la $a0, opusc
- syscall
- #koniec wypisu
- b sprawdz_czy_jest_jakas_komenda
- #********************************************
- #komenda poruszania zolwia i ewentualnego rysowania
- komenda_naprzod:
- jal pobieranie_argumentow
- move $s4, $t3
- add $t0, $t0, 2
- move $s0, $t0
- #wypis
- li $v0, 4
- la $a0, test
- syscall
- li $v0, 4
- la $a0, naprzod
- syscall
- li $v0, 1
- move $a0, $s4
- syscall
- #koniec wypisu
- jal wyznaczanie_wspolrzednych
- bnez $s5, algorytm_Bresenhama
- jal przemieszczenie_bez_rysowania
- b sprawdz_czy_jest_jakas_komenda
- #********************************************
- #komenda zmiany kata ustawienia zolwia
- komenda_obroc:
- jal pobieranie_argumentow #pobranie wartosci kata
- add $s3,$s3,$t3 #zwiekszenie wartosci kata
- add $t0,$t0,2 #przejscie na nowa komende
- move $s0, $t0
- #wypis
- li $v0, 4
- la $a0, test
- syscall
- li $v0, 4
- la $a0, obrot
- syscall
- li $v0, 1
- move $a0, $s3
- syscall
- #koniec wypisu
- b sprawdz_czy_jest_jakas_komenda
- #---------------------------------------------------------
- #WYZNACZANIE WSPOLRZEDNYCH
- #---------------------------------------------------------
- # $s3 - kat
- # todo
- #---------------------------------------------------------
- wyznaczanie_wspolrzednych:
- wyznacz_kat:
- beq $s3, 0, rowny_0
- blt $s3, 90, mniejszy_90
- beq $s3, 90, rowny_90
- blt $s3, 180, mniejszy_180
- beq $s3, 180, rowny_180
- blt $s3, 270, mniejszy_270
- beq $s3, 270, rowny_270
- blt $s3, 360, mniejszy_360
- beq $s3, 360, rowny_0
- add $s3, $s3, -360
- b wyznacz_kat
- mniejszy_90:
- la $t9, sinus
- la $t8, cosinus
- mul $t7, $s3, 4
- add $t9, $t9, $t7
- add $t8, $t8, $t7
- lw $t0, 0($t9) # sinus
- lw $t1, 0($t8) # cosinus
- mul $t0, $t0, $s4 # sinus * r
- mul $t1, $t1, $s4 # cosinus * r
- div $t0, $t0, 10000 # y
- div $t1, $t1, 10000 # x
- add $s6, $s1, $t1 # x2
- add $s7, $s2, $t0 # y2
- jr $ra
- mniejszy_180:
- la $t9, sinus
- la $t8, cosinus
- move $t7, $s3
- add $t7, $t7, -90
- mul $t7, $t7, 4
- add $t9, $t9, $t7
- add $t8, $t8, $t7
- lw $t0, 0($t9) # sinus
- lw $t1, 0($t8) # cosinus
- mul $t0, $t0, $s4 # sinus * r
- mul $t1, $t1, $s4 # cosinus * r
- div $t0, $t0, 10000 # x
- div $t1, $t1, 10000 # y
- sub $s6, $s1, $t0 # x2
- add $s7, $s2, $t1 # y2
- jr $ra
- mniejszy_270:
- la $t9, sinus
- la $t8, cosinus
- move $t7, $s3
- add $t7, $t7, -180
- mul $t7, $t7, 4
- add $t9, $t9, $t7
- add $t8, $t8, $t7
- lw $t0, 0($t9) # sinus
- lw $t1, 0($t8) # cosinus
- mul $t0, $t0, $s4 # sinus * r
- mul $t1, $t1, $s4 # cosinus * r
- div $t0, $t0, 10000 # y
- div $t1, $t1, 10000 # x
- sub $s6, $s1, $t1 # x2
- sub $s7, $s2, $t0 # y2
- jr $ra
- mniejszy_360:
- la $t9, sinus
- la $t8, cosinus
- move $t7, $s3
- add $t7, $t7, -270
- mul $t7, $t7, 4
- add $t9, $t9, $t7
- add $t8, $t8, $t7
- lw $t0, 0($t9) # sinus
- lw $t1, 0($t8) # cosinus
- mul $t0, $t0, $s4 # sinus * r
- mul $t1, $t1, $s4 # cosinus * r
- div $t0, $t0, 10000 # x
- div $t1, $t1, 10000 # y
- add $s6, $s1, $t0 # x2
- sub $s7, $s2, $t1 # y2
- jr $ra
- rowny_0:
- add $s6,$s1,$s4
- move $s7,$s2
- jr $ra
- rowny_90:
- add $s7,$s2,$s4
- move $s6,$s1
- jr $ra
- rowny_180:
- sub $s6,$s1,$s4
- move $s7,$s2
- jr $ra
- rowny_270:
- sub $s7,$s2,$s4
- move $s6,$s1
- jr $ra
- #----------------------------------
- #ALGORYTM BRESEN
- #--------------------------------
- # $t8 = kx
- # $t9 = ky
- # $t6 = dx
- # $t7 = dy
- # $t5 = e
- # $s1 = x1
- # $s2 = y1
- # $s6 = x2
- # $s7 = y2
- #--------------------------------
- algorytm_Bresenhama:
- ble $s1, $s6, kx_dodatnie # x1 <= x2
- li $t8, -1 # ky = -1
- sub $t6, $s1, $s6 # dx = x1 - x2
- b k02
- kx_dodatnie: li $t8, 1 # ky = 1
- sub $t6, $s6, $s1 # dx = x2 - x1
- k02:
- ble $s2, $s7, ky_dodatnie # y1 <= y2
- li $t9, -1 # ky = -1
- sub $t7, $s2, $s7 # dy = y1 - y2
- b k05
- ky_dodatnie: li $t9, 1 # ky = 1
- sub $t7, $s7, $s2 # dy = y2 - y1
- k05:
- jal zamaluj_pixel
- ble $t6, $t7, przestawione
- div $t5, $t6, 2
- petla_k09_k14: # powtarzaj dx razy
- bne $s1, $s6, k09 # x1 != x2
- beq $s2, $s7, koniec_malowania # y1 = y2
- k09:
- add $s1, $s1, $t8 # x1 = x1 + kx
- bgez $s1, x1_wiekszy_0
- add $s1, $s1, 160
- add $s6, $s6, 160
- x1_wiekszy_0:
- ble $s1, 159, x1_mniejszy_159
- sub $s1, $s1, 160
- sub $s6, $s6, 160
- x1_mniejszy_159:
- sub $t5, $t5, $t7 # e = e - dy
- bgez $t5, k14 # e >= 0
- add $s2, $s2, $t9 # y1 = y1 + ky
- bgez $s2, y1_wiekszy_0
- add $s2, $s2, 120
- add $s7, $s7, 120
- y1_wiekszy_0:
- ble $s2, 119, y1_mniejszy_159
- sub $s2, $s2, 120
- sub $s7, $s7, 120
- y1_mniejszy_159:
- add $t5, $t5, $t6 # e = e + dx
- k14:
- jal zamaluj_pixel
- b petla_k09_k14
- przestawione:
- div $t5, $t7, 2
- petla_k18_k23: # powtarzaj dx razy
- bne $s1, $s6, k18 # x1 != x2
- beq $s2, $s7, koniec_malowania # y1 = y2
- k18:
- add $s2, $s2, $t9 # y1 = y1 + ky
- bgez $s2, przest_y1_wiekszy_0
- add $s2, $s2, 120
- add $s7, $s7, 120
- przest_y1_wiekszy_0:
- ble $s2, 119, przest_y1_mniejszy_159
- sub $s2, $s2, 120
- sub $s7, $s7, 120
- przest_y1_mniejszy_159:
- sub $t5, $t5, $t6 # e = e - dx
- bgez $t5, k23 # e >= 0
- add $s1, $s1, $t8 # x1 = x1 + kx
- bgez $s1, przest_x1_wiekszy_0
- add $s1, $s1, 160
- add $s6, $s6, 160
- przest_x1_wiekszy_0:
- ble $s1, 159, przest_x1_mniejszy_159
- sub $s1, $s1, 160
- sub $s6, $s6, 160
- przest_x1_mniejszy_159:
- add $t5, $t5, $t7 # e = e + dy
- k23:
- jal zamaluj_pixel
- b petla_k18_k23
- koniec_malowania:
- b sprawdz_czy_jest_jakas_komenda
- #----------------------------------
- #MALOWANIE POJEDYNCZEGO PIXELA
- #----------------------------------
- zamaluj_pixel:
- la $t0, bufor
- li $t1, 0
- move $t2, $s2 # ( 160 * y + x ) * 4
- mul $t2, $t2, 160
- add $t2, $t2, $s1
- mul $t2, $t2, 4
- add $t0, $t2, $t0 # pixel na czarno
- sb $t1, 0($t0)
- sb $t1, 1($t0)
- sb $t1, 2($t0)
- sb $t1, 3($t0)
- jr $ra
- #----------------------------------
- #zmiana wspolrzednych x1 i y2 na x2 i y2 bez rysowania
- #----------------------------------
- przemieszczenie_bez_rysowania:
- zmienna_x2:
- bgez $s6, x2_wieksze_0
- add $s6, $s6, 160
- b zmienna_x2
- x2_wieksze_0:
- ble $s6, 159, zmienna_y2
- sub $s6, $s6, 160
- b zmienna_x2
- zmienna_y2:
- bgez $s7, y2_wieksze_0
- add $s7, $s7, 120
- b zmienna_y2
- y2_wieksze_0:
- ble $s6, 119, x2_y2_poprawne
- sub $s6, $s6, 160
- b zmienna_y2
- x2_y2_poprawne:
- move $s1, $s6
- move $s2, $s7
- jr $ra
- #---------------------------------------------------------
- #KONIEC PROGRAMU
- #---------------------------------------------------------
- exit:
- #utworzenie pliku bmp
- li $v0, 13
- la $a0, zapis
- li $a1, 1
- li $a2, 0
- syscall
- move $t0, $v0
- #zapis naglowka
- li $v0, 15
- move $a0, $t0
- la $a1, bfType
- li $a2, 54
- syscall
- #zapis danych z pamięci do pliku
- li $v0, 15
- move $a0, $t0
- la $a1, bufor
- li $a2, 76800
- syscall
- #zamkniecie pliku bmp
- move $a0, $t0
- li $v0, 16
- syscall
- #zamkniecie programu
- li $v0, 10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement