Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.99 KB | None | 0 0
  1. .data
  2.  
  3.  
  4. nazwa: .asciiz "kolo_na_trojkacie.bmp" #alokuje pamiec
  5. zapytanie_x1: .asciiz "podaj wspolrzedna x pierwszego wierzcholka \n"
  6. zapytanie_y1: .asciiz "podaj wspolrzedna y pierwszej wspolrzednej trojkata \n"
  7. zapytanie_x2: .asciiz "podaj wspolrzedna x drugiej wspolrzednej trojkata \n"
  8. zapytanie_y2: .asciiz "podaj wspolrzedna y drugiej wspolrzednej trojkata\n"
  9. zapytanie_x3: .asciiz "podaj wspolrzedna x trzeciej wspolrzednej trojkata \n"
  10. zapytanie_y3: .asciiz "podaj wspolrzedna y trzeciej wspolrzednej trojkata\n"
  11. #----------------- PLIK BMP -------------
  12. buf_zawartosc:
  13. header:
  14. file_size: .word 1960054 #800x600*4 +14 +40
  15. reserved: .word 0
  16. offset_to_bitmap: .word 0
  17. dib_header:
  18. header_size: .word 40 #
  19. width: .word 800
  20. height: .word 600
  21. planes: .half 1
  22. bits_per_pixel: .half 32
  23. compresion: .word 0
  24. image_size: .word 1920000 # wielkosc bitmapy bez naglowka
  25. x_meter: .word 0
  26. y_meter: .word 0
  27. colors: .word 0
  28. important: .word 0
  29.  
  30.  
  31. bitmap: .word 0
  32. #-------------------------------------
  33.  
  34. tmp: .ascii "BM"
  35.  
  36. .text
  37. #allocate mem (sbrk)
  38. li $a0, 1920000
  39. li $v0, 9
  40. syscall
  41. move $s7, $v0
  42.  
  43.  
  44. la $a0, zapytanie_x1
  45. li $v0, 4
  46. syscall
  47. la $v0, 5
  48. syscall
  49. move $s0, $v0 #zapisuje x pierwszego wierzcholka, s0
  50.  
  51.  
  52. la $a0, zapytanie_y1
  53. li $v0, 4
  54. syscall
  55. la $v0, 5
  56. syscall
  57. move $s1, $v0 #zapisuje y pierwszego wierzcholka, s1
  58.  
  59.  
  60. la $a0, zapytanie_x2
  61. li $v0, 4
  62. syscall
  63. li $v0, 5
  64. syscall
  65. move $s2, $v0 #zapisuje x drugiego wierzcholka, s3
  66.  
  67.  
  68.  
  69. la $a0, zapytanie_y2
  70. li $v0, 4
  71. syscall
  72. la $v0, 5
  73. syscall
  74. move $s3, $v0 #zapisuje y drugiego wierzcholka, s4
  75.  
  76. la $a0, zapytanie_x3
  77. li $v0, 4
  78. syscall
  79. li $v0, 5
  80. syscall
  81. move $s4, $v0 #zapisuje x trzeciego wierzcholka, s4
  82.  
  83. la $a0, zapytanie_y3
  84. li $v0, 4
  85. syscall
  86. li $v0, 5
  87. syscall
  88. move $s5, $v0 #zapisuje y trzeciego wierzcholka, s5
  89.  
  90.  
  91.  
  92. move $a0, $s0
  93. move $a1, $s1
  94. move $a2, $s2
  95. move $a3, $s3
  96. jal plotline
  97.  
  98.  
  99. move $a0, $s2
  100. move $a1, $s3
  101. move $a2, $s4
  102. move $a3, $s5
  103. jal plotline
  104.  
  105. move $a0, $s4
  106. move $a1, $s5
  107. move $a2, $s0
  108. move $a3, $s1
  109. jal plotline
  110.  
  111.  
  112. jal srodek
  113.  
  114. j open_file
  115.  
  116.  
  117.  
  118. plotline: #metoda bresenhama
  119. li $t9, 0x00ffffff
  120. plotline_x: # a0=x1, a1=y1, a2=x2, a3=y2 t0=sx t1=sy, t3=dx t4=dy t5=error, t6=e2
  121. bge $a2, $a0, x2_wiekszy # druga wspolrzedna
  122. li $t0, -1 #sx=-1
  123. sub $t3, $a0, $a2 #dx=x1-x2
  124. j plotline_y
  125. x2_wiekszy:
  126. li $t0, 1 #sx=1
  127. sub $t3, $a2, $a0 #dx=x2-x1
  128. plotline_y:
  129. bge $a3, $a1, y2_wiekszy #
  130. li $t1, -1 #sx=-1
  131. sub $t4, $a3, $a1 #dx=-(y1-y2)=y2-y1
  132. j error
  133. y2_wiekszy:
  134. li $t1, 1
  135. sub $t4, $a1, $a3 #dy=-(y2-y1)=y1-y2
  136. error:
  137. add $t5, $t3, $t4 #error= dx+dy
  138.  
  139. for: #(szerokosc*y1+x1)*4=pozycja bitu wstawianie pixela
  140. set_pixel: mul $t7, $a1, 800 #szerokosc* y1
  141. addu $t7, $t7, $a0 #(szerokosc*y1+x1)
  142. sll $t7, $t7, 2 #przemnozenie przez 4
  143. addu $t7, $s7, $t7
  144. sw $t9, ($t7) # zapis bialgo do t7
  145.  
  146. x1_equal_x2: bne $a0, $a2, e2_2_err #x1!=x2
  147. beq $a1, $a3, end #y1=y2
  148.  
  149.  
  150. e2_2_err: sll $t6, $t5, 1 # e2=2*error
  151. blt $t6, $t4, e2_blt_dy # if (e2>=dy) spwdzam czy e2<=dy jesli tak to omijam warunek
  152. addu $t5, $t5, $t4 # error+=dy
  153. addu $a0, $a0, $t0 #x0=x0+sx
  154.  
  155. e2_blt_dy: # jesli e2<dy to przechodze do if (e2<dx)
  156. bgt $t6, $t3, for # if (e2>dx) to wracam do na poczatek petli for
  157. addu $t5, $t5, $t3 #err=err+dx
  158. addu $a1, $a1, $t1 #y0= y0+sy
  159. j for
  160.  
  161. end:
  162. jr $ra
  163.  
  164. srodek:
  165.  
  166. ## wyliczam tu dlugosc odcinka 1-2
  167. sub $t0, $s0, $s2 #t0= x1-x2
  168. mul $t0, $t0, $t0 #t0=t0*t0
  169. sub $t1, $s1, $s3 # t1=y1-y2
  170. mul $t1, $t1, $t1 # t1=t1*t1
  171. addu $t0, $t0, $t1 # t0=t0+t1
  172. mtc1 $t0, $f0
  173. cvt.s.w $f0, $f0
  174. sqrt.s $f0, $f0
  175. cvt.w.s $f0,$f0
  176. mfc1 $t7, $f0
  177. ## wyliczam tu dlugosc odcinka 1-3
  178. sub $t0, $s0, $s4 #t0= x1-x2
  179. mul $t0, $t0, $t0 #t0=t0*t0
  180. sub $t1, $s1, $s5 # t1=y1-y2
  181. mul $t1, $t1, $t1 # t1=t1*t1
  182. addu $t0, $t0, $t1 # t0=t0+t1
  183. mtc1 $t0, $f0
  184. cvt.s.w $f0, $f0
  185. sqrt.s $f0, $f0
  186. cvt.w.s $f0,$f0
  187. mfc1 $t8, $f0
  188. ## wyliczam tu dlugosc odcinka 2-3
  189. sub $t0, $s2, $s4 #t0= x1-x2
  190. mul $t0, $t0, $t0 #t0=t0*t0
  191. sub $t1, $s3, $s5 # t1=y1-y2
  192. mul $t1, $t1, $t1 # t1=t1*t1
  193. addu $t0, $t0, $t1 # t0=t0+t1
  194. mtc1 $t0, $f0
  195. cvt.s.w $f0, $f0
  196. sqrt.s $f0, $f0
  197. cvt.w.s $f0,$f0
  198. mfc1 $t9, $f0
  199.  
  200. #### licze srodek okregu wpisanego
  201.  
  202. ## licze Ox
  203. add $t0, $t9, $t8
  204. add $t0, $t0, $t7
  205. mul $t1, $s0, $t9
  206. mul $t2, $s2, $t8
  207. mul $t3, $s4, $t7
  208. add $t1, $t1, $t2
  209. add $t1, $t1, $t3
  210. div $t5, $t1, $t0
  211. ## licze Oy
  212. add $t0, $t9, $t8
  213. add $t0, $t0, $t7
  214. mul $t1, $s1, $t9
  215. mul $t2, $s3, $t8
  216. mul $t3, $s5, $t7
  217. add $t1, $t1, $t2
  218. add $t1, $t1, $t3
  219. div $t4, $t1, $t0
  220.  
  221. mul $t7, $t4, 800 #szerokosc* y1
  222. addu $t7, $t7, $t5 #(szerokosc*y1+x1)
  223. sll $t7, $t7, 2 #przemnozenie przez 4
  224. addu $t7, $s7, $t7
  225. sw $t9, ($t7) # zapis bialgo do t7
  226.  
  227. ## licze promien korzystajac z tego ze r = 2P/abc P = 1/2 | [ (x1-x2)(y3-y1) - (y2-y1)(x3-x1) ] |
  228. sub $t0, $s0, $s2 # x1-x2
  229. sub $t1, $s5, $s1 #y3-y1
  230. mul $t0, $t0, $t1 # (x1-x2)(y3-y1)
  231. sub $t1, $s3, $s1 #y2-y1
  232. sub $t2, $s4, $s0 #x3-x1
  233. mul $t1, $t1, $t2 # (y2-y1)(x3-x1)
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247. open_file:
  248. la $a0, nazwa # adres to nazwy pliku
  249. li $a1, 1 # 0 odpowiada za czytanie 1 za pisanie
  250. li $a2, 0 #sposob
  251. li $v0, 13 #odpowiada za otwieranie
  252. syscall
  253.  
  254. move $s6, $v0 #identyfikator pliku uchwyt pliku
  255.  
  256. write_to_file:
  257. move $a0, $s6 #pobranie identyfikatora
  258. la $a1, tmp #adress bufora
  259. li $a2, 2 # liczba bajtow do zapisania
  260. li $v0, 15
  261. syscall
  262.  
  263. move $a0, $s6
  264. la $a1, buf_zawartosc #adress bufora
  265. li $a2, 52 # liczba bajtow do zapisania zapisuje wartosc
  266. li $v0, 15
  267. syscall
  268.  
  269. move $a0, $s6
  270. move $a1, $s7 #adress bufora
  271. li $a2, 1920000 # liczba bajtow do zapisania zapisuje wartosc
  272. li $v0, 15
  273. syscall
  274.  
  275. close_file:
  276. move $a0, $s6 #zamyka file descriptor
  277. li $v0, 16
  278. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement