Advertisement
Guest User

Untitled

a guest
Jan 27th, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.46 KB | None | 0 0
  1. #--------------------------------------------------------
  2. #DANE WEJSCIOWE
  3. #--------------------------------------------------------
  4. .data
  5. komendy: .asciiz "komendy.txt"
  6. komendy_space: .space 1024
  7. zapis: .asciiz "zapis.bmp"
  8.  
  9. bfType: .half 0x4d42 # 4d - M, 42 - B razem BM
  10. bfSize: .word 76854 #
  11. bfReserved1: .half 0 #
  12. bfReserved2: .half 0 #
  13. bfOffBits: .word 54 #
  14.  
  15. biSize: .word 40 #
  16. biWidth: .word 160 #
  17. biHeight: .word 120 #
  18. biPlanes: .half 1 #
  19. biBitCount: .half 32 #
  20. biCompression: .word 0 #
  21. biSizeImage: .word 0 #
  22. biXPelsPerMeter:.word 0 #
  23. biYPelsPerMeter:.word 0 #
  24. biClrUsed: .word 0 #
  25. biClrImportant: .word 0 #
  26.  
  27. bufor: .space 76800 #160 * 120 * 4
  28.  
  29. ustaw: .asciiz "ustaw"
  30. podnies: .asciiz "podnies"
  31. opusc: .asciiz "opusc"
  32. naprzod: .asciiz "naprzod"
  33. obrot: .asciiz "obrot"
  34.  
  35. test: .asciiz "\ntest\n"
  36.  
  37. # sinusy i cosinusy z zakresu
  38. 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
  39. 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
  40.  
  41.  
  42.  
  43. .text
  44.  
  45.  
  46. main:
  47.  
  48. #---------------------------------------------------------
  49. #ODCZYT DANYCH Z PLIKU
  50. #---------------------------------------------------------
  51. # $t0 - file descriptor
  52. #---------------------------------------------------------
  53.  
  54. #otwieranie pliku
  55. li $v0, 13
  56. la $a0, komendy
  57. li $a1, 0
  58. li $a2, 0
  59. syscall
  60.  
  61. #przeniesienie file desciptora do $t0
  62. move $t0 , $v0
  63.  
  64. #odczytywanie z pliku
  65. li $v0, 14
  66. move $a0, $t0
  67. la $a1, komendy_space
  68. li $a2, 1024
  69. syscall
  70.  
  71. #zamykanie pliku
  72. li $v0, 16
  73. move $a0, $t0
  74. syscall
  75.  
  76. #---------------------------------------------------------
  77. #MALOWANIE POCZATKOWEJ MAPY NA BIALO
  78. #---------------------------------------------------------
  79. # $t0 - kolor bialy
  80. # $t1 - koniec bufora
  81. # $t2 - poszczegolne bajty bufora, ktore malujemy
  82. #---------------------------------------------------------
  83.  
  84. li $t0, 0xFFFFFFFF #kolor bialy
  85. la $t2, bufor
  86. move $t1, $t2
  87. add $t1, $t1, 76800
  88. zamaluj:
  89. sw $t0, 0($t2)
  90. add $t2, $t2, 4
  91. blt $t2, $t1, zamaluj
  92.  
  93.  
  94. #---------------------------------------------------------
  95. #USTAWIENIE WARTOSCI $s1 - $s5
  96. #---------------------------------------------------------
  97. li $s1, 0 #wspolrzedna x
  98. li $s2, 0 #wspolrzedna y
  99. li $s3, 0 #kat
  100. li $s4, 0 #przesuniecie
  101. li $s5, 0 #podniesione lub opusczone - 0=podniesione
  102.  
  103. #---------------------------------------------------------
  104. #POBIERANIE KOMEND Z PLIKU
  105. #---------------------------------------------------------
  106. # $s0 - poczatek komendy
  107. # $t0 - kolejne znaki komendy z txt
  108. # $t1 - pojedyncze znaki z $t0
  109. # $t2 - nazwy komend
  110. # $t3 - pojedyczne znaki z $t2
  111. #---------------------------------------------------------
  112.  
  113. la $t0, komendy_space
  114. move $s0,$t0
  115.  
  116. sprawdz_czy_jest_jakas_komenda:
  117. lb $t1, 0($s0)
  118. beqz $t1, exit
  119.  
  120. move $t0,$s0
  121. la $t2, ustaw
  122. sprzawdz_czy_to_komenda_ustaw:
  123. lb $t1, 0($t0)
  124. lb $t3, 0($t2)
  125. addiu $t0,$t0,1
  126. addiu $t2,$t2,1
  127. beq $t1,' ' komenda_ustaw
  128. beq $t1, $t3, sprzawdz_czy_to_komenda_ustaw
  129.  
  130. la $t2, podnies
  131. move $t0, $s0
  132. sprzawdz_czy_to_komenda_podnies:
  133. lb $t1, 0($t0)
  134. lb $t3, 0($t2)
  135. addiu $t0,$t0,1
  136. addiu $t2,$t2,1
  137. beq $t1,';' komenda_podnies
  138. beq $t1, $t3, sprzawdz_czy_to_komenda_podnies
  139.  
  140. la $t2, opusc
  141. move $t0, $s0
  142. sprzawdz_czy_to_komenda_opusc:
  143. lb $t1, 0($t0)
  144. lb $t3, 0($t2)
  145. addiu $t0,$t0,1
  146. addiu $t2,$t2,1
  147. beq $t1,';' komenda_opusc
  148. beq $t1, $t3, sprzawdz_czy_to_komenda_opusc
  149.  
  150. la $t2, naprzod
  151. move $t0, $s0
  152. sprzawdz_czy_to_komenda_naprzod:
  153. lb $t1, 0($t0)
  154. lb $t3, 0($t2)
  155. addiu $t0,$t0,1
  156. addiu $t2,$t2,1
  157. beq $t1,' ' komenda_naprzod
  158. beq $t1, $t3, sprzawdz_czy_to_komenda_naprzod
  159.  
  160. la $t2, obrot
  161. move $t0, $s0
  162. sprzawdz_czy_to_komenda_obroc:
  163. lb $t1, 0($t0)
  164. lb $t3, 0($t2)
  165. addiu $t0,$t0,1
  166. addiu $t2,$t2,1
  167. beq $t1,' ' komenda_obroc
  168. beq $t1, $t3, sprzawdz_czy_to_komenda_obroc
  169.  
  170. b exit
  171.  
  172. #---------------------------------------------------------
  173. #POBIERANIE ARGUMENTOW KOMENDY
  174. #---------------------------------------------------------
  175. # $t0 - kolejne znaki komendy
  176. # $t1 - pojedyncze znaki komendy
  177. # $t2 - pojedyncze kolejne znaki komendy
  178. # $t3 - wartosc arg
  179. #---------------------------------------------------------
  180.  
  181. pobieranie_argumentow:
  182. li $t3, 0
  183. pobieranie_liczby:
  184. lb $t1, 0($t0)
  185. lb $t2, 1($t0)
  186. sub $t1,$t1,'0' #w $t1 mamy znak liczby w ASCII a nie liczbe, iwec odejmujemy 0 w ASCII aby miec wartosc liczby
  187. add $t3,$t3,$t1
  188. addiu $t0, $t0,1
  189. beq $t2,',',zakonczenie_pobierania_argumentu
  190. beq $t2,']',zakonczenie_pobierania_argumentu
  191. beq $t2,';',zakonczenie_pobierania_argumentu
  192. mul $t3, $t3, 10
  193.  
  194. b pobieranie_liczby
  195.  
  196. zakonczenie_pobierania_argumentu:
  197. jr $ra
  198.  
  199.  
  200. #---------------------------------------------------------
  201. #WYKONANIE KOMEND
  202. #---------------------------------------------------------
  203. # $s0 - poczatek komendy
  204. # $t0 - przeskakiwanie z wczesniejszej linii komendy na poczatek kolejnej
  205. # $t3 - wartosc zwracana przez "pobieranie_argumentow"
  206. #---------------------------------------------------------
  207.  
  208. #********************************************
  209. #komenda ustawiania zolwia na mapie bitowej
  210. komenda_ustaw:
  211. add $t0,$t0,1 #przejscie z [ na wartosc wspolrzednej x
  212. jal pobieranie_argumentow
  213. move $s1, $t3 #wczytanie wspolrzednej x do $s1
  214.  
  215. add $t0,$t0,1 #przejscie z , na wartosc wspolrzednej y
  216. jal pobieranie_argumentow
  217. move $s2, $t3 #wczytanie wspolrzednej y do $s2
  218.  
  219. add $t0,$t0,3 #przejscie z ] na wartosc kata
  220. jal pobieranie_argumentow
  221. move $s3, $t3 #wczytanie kata do $s3
  222.  
  223. add $t0, $t0,2 #przejscie z ; na poczatek nowej komendy
  224. move $s0, $t0
  225.  
  226. #wypis
  227. li $v0, 4
  228. la $a0, test
  229. syscall
  230.  
  231. li $v0, 4
  232. la $a0, ustaw
  233. syscall
  234.  
  235. li $v0, 1
  236. move $a0, $s1
  237. syscall
  238.  
  239. li $v0, 1
  240. move $a0, $s2
  241. syscall
  242.  
  243. li $v0, 1
  244. move $a0, $s3
  245. syscall
  246. #koniec wypisu
  247.  
  248.  
  249. beqz $s5, podniesione
  250. jal zamaluj_pixel #jezeli jest opuszczony to malujemy pixel
  251. podniesione:
  252. b sprawdz_czy_jest_jakas_komenda
  253.  
  254. #********************************************
  255. #komenda podnoszenia zolwia ( nie rysuje )
  256. komenda_podnies:
  257. add $t0,$t0,1 #przejscie do nowej komendy
  258.  
  259. li $s5, 0 #"podniesienie" zolwia
  260. move $s0, $t0
  261.  
  262. #wypis
  263. li $v0, 4
  264. la $a0, test
  265. syscall
  266.  
  267. li $v0, 4
  268. la $a0, podnies
  269. syscall
  270. #koniec wypisu
  271.  
  272. b sprawdz_czy_jest_jakas_komenda
  273.  
  274.  
  275. #********************************************
  276. #komenda opuszcania zolwia ( rysuje )
  277. komenda_opusc:
  278. add $t0,$t0,1 #przejscie do nowej komendy
  279.  
  280. li $s5, 1 #"opuszczenie" zolwia
  281. move $s0, $t0
  282.  
  283. #wypis
  284. li $v0, 4
  285. la $a0, test
  286. syscall
  287.  
  288. li $v0, 4
  289. la $a0, opusc
  290. syscall
  291. #koniec wypisu
  292.  
  293. b sprawdz_czy_jest_jakas_komenda
  294.  
  295.  
  296. #********************************************
  297. #komenda poruszania zolwia i ewentualnego rysowania
  298. komenda_naprzod:
  299.  
  300. jal pobieranie_argumentow
  301. move $s4, $t3
  302. add $t0, $t0, 2
  303. move $s0, $t0
  304.  
  305. #wypis
  306. li $v0, 4
  307. la $a0, test
  308. syscall
  309.  
  310. li $v0, 4
  311. la $a0, naprzod
  312. syscall
  313.  
  314. li $v0, 1
  315. move $a0, $s4
  316. syscall
  317. #koniec wypisu
  318.  
  319. jal wyznaczanie_wspolrzednych
  320. bnez $s5, algorytm_Bresenhama
  321. jal przemieszczenie_bez_rysowania
  322.  
  323. b sprawdz_czy_jest_jakas_komenda
  324.  
  325.  
  326. #********************************************
  327. #komenda zmiany kata ustawienia zolwia
  328. komenda_obroc:
  329. jal pobieranie_argumentow #pobranie wartosci kata
  330. add $s3,$s3,$t3 #zwiekszenie wartosci kata
  331.  
  332. add $t0,$t0,2 #przejscie na nowa komende
  333. move $s0, $t0
  334.  
  335. #wypis
  336. li $v0, 4
  337. la $a0, test
  338. syscall
  339.  
  340. li $v0, 4
  341. la $a0, obrot
  342. syscall
  343.  
  344. li $v0, 1
  345. move $a0, $s3
  346. syscall
  347. #koniec wypisu
  348.  
  349. b sprawdz_czy_jest_jakas_komenda
  350.  
  351. #---------------------------------------------------------
  352. #WYZNACZANIE WSPOLRZEDNYCH
  353. #---------------------------------------------------------
  354. # $s3 - kat
  355. # todo
  356. #---------------------------------------------------------
  357. wyznaczanie_wspolrzednych:
  358.  
  359. wyznacz_kat:
  360. beq $s3, 0, rowny_0
  361. blt $s3, 90, mniejszy_90
  362. beq $s3, 90, rowny_90
  363. blt $s3, 180, mniejszy_180
  364. beq $s3, 180, rowny_180
  365. blt $s3, 270, mniejszy_270
  366. beq $s3, 270, rowny_270
  367. blt $s3, 360, mniejszy_360
  368. beq $s3, 360, rowny_0
  369. add $s3, $s3, -360
  370. b wyznacz_kat
  371.  
  372. mniejszy_90:
  373. la $t9, sinus
  374. la $t8, cosinus
  375. mul $t7, $s3, 4
  376. add $t9, $t9, $t7
  377. add $t8, $t8, $t7
  378. lw $t0, 0($t9) # sinus
  379. lw $t1, 0($t8) # cosinus
  380. mul $t0, $t0, $s4 # sinus * r
  381. mul $t1, $t1, $s4 # cosinus * r
  382. div $t0, $t0, 10000 # y
  383. div $t1, $t1, 10000 # x
  384. add $s6, $s1, $t1 # x2
  385. add $s7, $s2, $t0 # y2
  386. jr $ra
  387.  
  388. mniejszy_180:
  389. la $t9, sinus
  390. la $t8, cosinus
  391. move $t7, $s3
  392. add $t7, $t7, -90
  393. mul $t7, $t7, 4
  394. add $t9, $t9, $t7
  395. add $t8, $t8, $t7
  396. lw $t0, 0($t9) # sinus
  397. lw $t1, 0($t8) # cosinus
  398. mul $t0, $t0, $s4 # sinus * r
  399. mul $t1, $t1, $s4 # cosinus * r
  400. div $t0, $t0, 10000 # x
  401. div $t1, $t1, 10000 # y
  402. sub $s6, $s1, $t0 # x2
  403. add $s7, $s2, $t1 # y2
  404. jr $ra
  405.  
  406. mniejszy_270:
  407. la $t9, sinus
  408. la $t8, cosinus
  409. move $t7, $s3
  410. add $t7, $t7, -180
  411. mul $t7, $t7, 4
  412. add $t9, $t9, $t7
  413. add $t8, $t8, $t7
  414. lw $t0, 0($t9) # sinus
  415. lw $t1, 0($t8) # cosinus
  416. mul $t0, $t0, $s4 # sinus * r
  417. mul $t1, $t1, $s4 # cosinus * r
  418. div $t0, $t0, 10000 # y
  419. div $t1, $t1, 10000 # x
  420. sub $s6, $s1, $t1 # x2
  421. sub $s7, $s2, $t0 # y2
  422. jr $ra
  423.  
  424. mniejszy_360:
  425. la $t9, sinus
  426. la $t8, cosinus
  427. move $t7, $s3
  428. add $t7, $t7, -270
  429. mul $t7, $t7, 4
  430. add $t9, $t9, $t7
  431. add $t8, $t8, $t7
  432. lw $t0, 0($t9) # sinus
  433. lw $t1, 0($t8) # cosinus
  434. mul $t0, $t0, $s4 # sinus * r
  435. mul $t1, $t1, $s4 # cosinus * r
  436. div $t0, $t0, 10000 # x
  437. div $t1, $t1, 10000 # y
  438. add $s6, $s1, $t0 # x2
  439. sub $s7, $s2, $t1 # y2
  440. jr $ra
  441.  
  442.  
  443.  
  444. rowny_0:
  445. add $s6,$s1,$s4
  446. move $s7,$s2
  447. jr $ra
  448. rowny_90:
  449. add $s7,$s2,$s4
  450. move $s6,$s1
  451. jr $ra
  452. rowny_180:
  453. sub $s6,$s1,$s4
  454. move $s7,$s2
  455. jr $ra
  456. rowny_270:
  457. sub $s7,$s2,$s4
  458. move $s6,$s1
  459. jr $ra
  460.  
  461.  
  462. #----------------------------------
  463. #ALGORYTM BRESEN
  464. #--------------------------------
  465. # $t8 = kx
  466. # $t9 = ky
  467. # $t6 = dx
  468. # $t7 = dy
  469. # $t5 = e
  470. # $s1 = x1
  471. # $s2 = y1
  472. # $s6 = x2
  473. # $s7 = y2
  474. #--------------------------------
  475. algorytm_Bresenhama:
  476. ble $s1, $s6, kx_dodatnie # x1 <= x2
  477. li $t8, -1 # ky = -1
  478. sub $t6, $s1, $s6 # dx = x1 - x2
  479. b k02
  480. kx_dodatnie: li $t8, 1 # ky = 1
  481. sub $t6, $s6, $s1 # dx = x2 - x1
  482.  
  483. k02:
  484. ble $s2, $s7, ky_dodatnie # y1 <= y2
  485. li $t9, -1 # ky = -1
  486. sub $t7, $s2, $s7 # dy = y1 - y2
  487. b k05
  488. ky_dodatnie: li $t9, 1 # ky = 1
  489. sub $t7, $s7, $s2 # dy = y2 - y1
  490. k05:
  491. jal zamaluj_pixel
  492.  
  493. ble $t6, $t7, przestawione
  494.  
  495. div $t5, $t6, 2
  496.  
  497. petla_k09_k14: # powtarzaj dx razy
  498. bne $s1, $s6, k09 # x1 != x2
  499. beq $s2, $s7, koniec_malowania # y1 = y2
  500.  
  501. k09:
  502. add $s1, $s1, $t8 # x1 = x1 + kx
  503. bgez $s1, x1_wiekszy_0
  504. add $s1, $s1, 160
  505. add $s6, $s6, 160
  506. x1_wiekszy_0:
  507. ble $s1, 159, x1_mniejszy_159
  508. sub $s1, $s1, 160
  509. sub $s6, $s6, 160
  510. x1_mniejszy_159:
  511. sub $t5, $t5, $t7 # e = e - dy
  512. bgez $t5, k14 # e >= 0
  513. add $s2, $s2, $t9 # y1 = y1 + ky
  514. bgez $s2, y1_wiekszy_0
  515. add $s2, $s2, 120
  516. add $s7, $s7, 120
  517. y1_wiekszy_0:
  518. ble $s2, 119, y1_mniejszy_159
  519. sub $s2, $s2, 120
  520. sub $s7, $s7, 120
  521. y1_mniejszy_159:
  522. add $t5, $t5, $t6 # e = e + dx
  523.  
  524. k14:
  525. jal zamaluj_pixel
  526. b petla_k09_k14
  527.  
  528. przestawione:
  529. div $t5, $t7, 2
  530.  
  531. petla_k18_k23: # powtarzaj dx razy
  532. bne $s1, $s6, k18 # x1 != x2
  533. beq $s2, $s7, koniec_malowania # y1 = y2
  534.  
  535. k18:
  536. add $s2, $s2, $t9 # y1 = y1 + ky
  537. bgez $s2, przest_y1_wiekszy_0
  538. add $s2, $s2, 120
  539. add $s7, $s7, 120
  540. przest_y1_wiekszy_0:
  541. ble $s2, 119, przest_y1_mniejszy_159
  542. sub $s2, $s2, 120
  543. sub $s7, $s7, 120
  544. przest_y1_mniejszy_159:
  545. sub $t5, $t5, $t6 # e = e - dx
  546. bgez $t5, k23 # e >= 0
  547. add $s1, $s1, $t8 # x1 = x1 + kx
  548. bgez $s1, przest_x1_wiekszy_0
  549. add $s1, $s1, 160
  550. add $s6, $s6, 160
  551. przest_x1_wiekszy_0:
  552. ble $s1, 159, przest_x1_mniejszy_159
  553. sub $s1, $s1, 160
  554. sub $s6, $s6, 160
  555. przest_x1_mniejszy_159:
  556. add $t5, $t5, $t7 # e = e + dy
  557.  
  558. k23:
  559. jal zamaluj_pixel
  560. b petla_k18_k23
  561.  
  562. koniec_malowania:
  563. b sprawdz_czy_jest_jakas_komenda
  564.  
  565. #----------------------------------
  566. #MALOWANIE POJEDYNCZEGO PIXELA
  567. #----------------------------------
  568. zamaluj_pixel:
  569. la $t0, bufor
  570. li $t1, 0
  571.  
  572. move $t2, $s2 # ( 160 * y + x ) * 4
  573. mul $t2, $t2, 160
  574. add $t2, $t2, $s1
  575. mul $t2, $t2, 4
  576.  
  577. add $t0, $t2, $t0 # pixel na czarno
  578. sb $t1, 0($t0)
  579. sb $t1, 1($t0)
  580. sb $t1, 2($t0)
  581. sb $t1, 3($t0)
  582.  
  583. jr $ra
  584.  
  585. #----------------------------------
  586. #zmiana wspolrzednych x1 i y2 na x2 i y2 bez rysowania
  587. #----------------------------------
  588.  
  589. przemieszczenie_bez_rysowania:
  590. zmienna_x2:
  591. bgez $s6, x2_wieksze_0
  592. add $s6, $s6, 160
  593. b zmienna_x2
  594. x2_wieksze_0:
  595. ble $s6, 159, zmienna_y2
  596. sub $s6, $s6, 160
  597. b zmienna_x2
  598. zmienna_y2:
  599. bgez $s7, y2_wieksze_0
  600. add $s7, $s7, 120
  601. b zmienna_y2
  602. y2_wieksze_0:
  603. ble $s6, 119, x2_y2_poprawne
  604. sub $s6, $s6, 160
  605. b zmienna_y2
  606. x2_y2_poprawne:
  607. move $s1, $s6
  608. move $s2, $s7
  609. jr $ra
  610.  
  611. #---------------------------------------------------------
  612. #KONIEC PROGRAMU
  613. #---------------------------------------------------------
  614. exit:
  615.  
  616. #utworzenie pliku bmp
  617. li $v0, 13
  618. la $a0, zapis
  619. li $a1, 1
  620. li $a2, 0
  621. syscall
  622. move $t0, $v0
  623.  
  624. #zapis naglowka
  625. li $v0, 15
  626. move $a0, $t0
  627. la $a1, bfType
  628. li $a2, 54
  629. syscall
  630.  
  631. #zapis danych z pamięci do pliku
  632. li $v0, 15
  633. move $a0, $t0
  634. la $a1, bufor
  635. li $a2, 76800
  636. syscall
  637.  
  638. #zamkniecie pliku bmp
  639. move $a0, $t0
  640. li $v0, 16
  641. syscall
  642.  
  643. #zamkniecie programu
  644. li $v0, 10
  645. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement