Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- komendy_txt: .asciiz "turtle.txt" #
- komendy_space: .space 4048 #
- bitmapa: .asciiz "turtle.bmp" #
- x: .word 0
- naglowek: .space 54
- bfType: .half 0x4d42 # pocżatek nagłówka
- bfSize: .word 57654 #
- bfReserved1: .half 0 #
- bfReserved2: .half 0 #
- bfOffBits: .word 54 #
- biSize: .word 40 #
- biWidth: .word 160 #
- biHeight: .word 120 #
- biPlanes: .half 1 #
- biBitCount: .half 24 #
- biCompression: .word 0 #
- biSizeImage: .word 0 #
- biXPelsPerMeter:.word 0 #
- biYPelsPerMeter:.word 0 #
- biClrUsed: .word 0 #
- biClrImportant: .word 0 #
- buf: .space 57600 # 160x120, 3 bajty na 1 piksel
- ustaw: .asciiz "ustaw"
- podnies: .asciiz "podnies"
- opusc: .asciiz "opusc"
- naprzod: .asciiz "naprzod"
- obrot: .asciiz "obrot"
- # 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 Z PLIKU TXT------------------------------------
- #otwarcie pliku
- li $v0, 13
- la $a0, komendy_txt
- li $a1, 0
- li $a2, 0
- syscall
- move $t0, $v0
- #odczyt danych z pliku
- li $v0, 14
- move $a0, $t0
- la $a1, komendy_space
- li $a2, 4048
- syscall
- #zamkniecie pliku
- li $v0, 16
- move $a0, $t0
- syscall
- #--------WYPELNIANIE BITMAPY NA BIALO-------------------------------
- li $t0, 0xFFFFFFFF
- la $t2, buf
- move $t1, $t2
- add $t1, $t1, 57600
- zamaluj:
- sw $t0, 0($t2)
- add $t2, $t2, 4
- blt $t2, $t1, zamaluj
- #------------------------------------------------------------------
- li $s1, 0 #x
- li $s2, 0 #y
- li $s3, 0 #kat
- li $s4, 0 #ruch
- li $s5, 0 #podniesione/opusczone - 0=podniesione
- #--------USTALANIE KOMENDY----------------------------------------
- # $t0 - adres danych z pliku .txt
- # $t1 - słowo z pod adresu ($t0)
- # $t2 - adres komendy
- # $t3 - słowo z pod adresu ($t2)
- # $t4 - znak spacji
- # $s0 - adres poczatku komendy (z pliku .txt)
- la $t0, komendy_space
- move $s0, $t0
- ustal_komende:
- lb $t1, 0($s0)
- beqz $t1, exit
- move $t0, $s0
- la $t2, ustaw
- ustal_komende_ustaw:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0, $t0, 1
- addiu $t2, $t2, 1
- beq $t1, ' ', komenda_ustaw
- beq $t1, $t3, ustal_komende_ustaw
- move $t0, $s0
- la $t2, podnies
- ustal_komende_podnies:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0, $t0, 1
- addiu $t2, $t2, 1
- beq $t1, ';', komenda_podnies
- beq $t1, $t3, ustal_komende_podnies
- move $t0, $s0
- la $t2, opusc
- ustal_komende_opusc:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0, $t0, 1
- addiu $t2, $t2, 1
- beq $t1, ';', komenda_opusc
- beq $t1, $t3, ustal_komende_opusc
- move $t0, $s0
- la $t2, naprzod
- ustal_komende_naprzod:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0, $t0, 1
- addiu $t2, $t2, 1
- beq $t1, ' ', komenda_naprzod
- beq $t1, $t3, ustal_komende_naprzod
- move $t0, $s0
- la $t2, obrot
- ustal_komende_obrot:
- lb $t1, 0($t0)
- lb $t3, 0($t2)
- addiu $t0, $t0, 1
- addiu $t2, $t2, 1
- beq $t1, ' ', komenda_obrot
- beq $t1, $t3, ustal_komende_obrot
- b exit
- #-------ODCZYTYWANIE ARGUMENTOW---------------------------
- odczyt_argumentow:
- li $t3, 0
- odczyt_argumentow_loop:
- lb $t1, 0($t0)
- lb $t2, 1($t0)
- sub $t1, $t1, '0'
- add $t3, $t3, $t1
- addiu $t0, $t0, 1
- beq $t2, ';', argument_odczytany
- beq $t2, ']', argument_odczytany
- beq $t2, ',', argument_odczytany
- mul $t3, $t3, 10
- b odczyt_argumentow_loop
- argument_odczytany:
- jr $ra
- #---------KOMENDY----------------------------------
- komenda_ustaw:
- addiu $t0, $t0, 1
- jal odczyt_argumentow
- move $s1, $t3
- addiu $t0, $t0, 1
- jal odczyt_argumentow
- move $s2, $t3
- addiu $t0, $t0, 3
- jal odczyt_argumentow
- move $s3, $t3
- add $t0, $t0, 3
- move $s0, $t0
- beqz $s5, podniesione
- jal zamaluj_pixel
- podniesione:
- b ustal_komende
- komenda_podnies:
- add $t0, $t0, 2
- move $s0, $t0
- li $s5, 0
- b ustal_komende
- komenda_opusc:
- add $t0, $t0, 2
- move $s0, $t0
- li $s5, 1
- jal zamaluj_pixel
- b ustal_komende
- komenda_naprzod:
- jal odczyt_argumentow
- move $s4, $t3
- add $t0, $t0, 3
- move $s0, $t0
- jal wyznacz_wspolrzedne
- bnez $s5, algorytm_Bresenhama
- jal przemieszczenie_bez_rysowania
- b ustal_komende
- komenda_obrot:
- jal odczyt_argumentow
- add $s3, $s3, $t3
- add $t0, $t0, 3
- move $s0, $t0
- b ustal_komende
- #-----------------------------------------------------------
- wyznacz_wspolrzedne:
- 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:
- move $s6, $s1
- add $s7, $s2, $s4
- jr $ra
- rowny_180:
- sub $s6, $s1, $s4
- move $s7, $s2
- jr $ra
- rowny_270:
- move $s6, $s1
- sub $s7, $s2, $s4
- jr $ra
- #-----------------------------------------------------------------------
- # $t8 = kx
- # $t9 = ky
- # $t6 = dx
- # $t7 = dy
- # $t5 = e
- 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 ustal_komende
- #-------------------------------------------------------
- zamaluj_pixel:
- la $t0, buf
- li $t1, 0
- move $t2, $s2 # ( 160 * y + x ) * 3
- mul $t2, $t2, 160
- add $t2, $t2, $s1
- mul $t2, $t2, 3
- add $t0, $t2, $t0 # pixel na czarno
- sb $t1, 0($t0)
- sb $t1, 1($t0)
- sb $t1, 2($t0)
- jr $ra
- #-------ZAPIS BITMAPY DO PLIKU I ZAMKNIECIE PROGRAMU---------
- 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
- #-----------------------------------------------------------
- exit:
- #utworzenie pliku bmp
- li $v0, 13
- la $a0, bitmapa
- 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, buf
- li $a2, 57600
- 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