PageRenderTime 511ms CodeModel.GetById 216ms app.highlight 9ms RepoModel.GetById 193ms app.codeStats 0ms

/MedianaElka/inside.asm

http://github.com/fiedukow/MedianaElka
Assembly | 103 lines | 94 code | 9 blank | 0 comment | 0 complexity | 55e2bce353f5e7c75a8c1efa0bc99b3d MD5 | raw file
  1
  2	addiu $sp, $sp, -36
  3	move $t1, $sp
  4	
  5	li $t4,0
  6	li $t3,0
  7	li $t2,0
  8	li $t8,0
  9	li $t5,0
 10	
 11	# t0 - poczatek fragmentu stosu, skad czytamy (obszar pamieci zawierajacy 3 wczytane z pliku linie)
 12	# t1 - poczatek fragmentu stosu, gdzie piszemy (obszar pamieci zarezerwowany na wyliczenie jasnosci 9 pixeli)
 13	
 14	read_9pixel_loop:
 15		beq $t2,3,read_9pixel_loop_end
 16		read_3pixel_loop:
 17			beq $t3,3,read_3pixel_loop_end
 18			read_3bytes_loop:
 19				beq $t4,3,read_3bytes_loop_end
 20				
 21				li $t8,3
 22				mult $t8,$t3
 23				mflo $t8
 24				
 25				addu $t7,$t0,$t8
 26				
 27				mult $s6,$t2
 28				mflo $t8
 29				
 30				addu $t7,$t7,$t8 # przesuniecie wynikajace z wiersza bitmapy
 31				#addu $t7,$t7,$t0
 32				addu $t7,$t7,$t4 # dodajemy do adresu pobranych danych offset wynikajcy z kroku ptli
 33				
 34				lb $t9, 0($t7) # pobieramy odpowiedni kolor (R, G albo B)
 35				andi $t9,$t9,0x000000ff # nakladamy maske na odczytany bit, poniewaz lb nie gwarantuje nam co sie stanie z pozostala czescia slowa (dopelnia jedynkami), co mogloby nam popsuc dodawanie (obliczanie brightness'a)
 36				addu $t6, $t6, $t9 # dodajemy brightness (R+G+B)				
 37				addiu $t4,$t4,1 # czytaj kolejny bajt
 38				j read_3bytes_loop
 39			read_3bytes_loop_end:
 40						
 41			li $t8,4
 42			mult $t5, $t8
 43			mflo $t8
 44			
 45			sll $t4, $t5, 16 # przesuwamy wartosc offsetu na drugi starszy bajt, zeby moc go nastepnie zsumowac z jasnoscia (ID pixela z kratki)
 46			addu $t6,$t6,$t4
 47			
 48			li $t4,0 # przygotuj licznik petli read_3bytes_loop do kolejnego wejscia
 49			
 50			addu $t7,$t1,$t8 # dodajemy do adresu pobranych danych offset wynikajcy z obiegu ptli
 51			sw $t6,0($t7) # zapisz odczytany brightness pixela (pixel = 3 bajty, brightness = B+B+B = 2B)
 52			
 53			li $t6,0 # wyczysc brightness, tak zeby moc wyliczyc go dla nowego pixela w nastepnym obiegu petli
 54			
 55			addiu $t3,$t3,1 # kolejny obieg petli
 56			addiu $t5,$t5,1 # zapamietujemy ogolny offset dla zapisywanych danych
 57			j read_3pixel_loop
 58		read_3pixel_loop_end:
 59		
 60		li $t3, 0 # przygotuj licznik petli read_3pixel_loop do kolejnego wejscia
 61		
 62		addiu $t2,$t2,1 # kolejny obieg petli
 63		j read_9pixel_loop
 64	read_9pixel_loop_end:
 65	
 66	
 67	## t2-t9 - FREE
 68	
 69	# process brightness (sort + find mediana)
 70	# t2,t3 loops markers
 71	li $t2,0
 72	ls: #sort by brightness for mediana (on stack)
 73		bge $t2,9,ls_end
 74		li $t3,0
 75		lsin:
 76			bge $t3,9,lsin_end
 77			mul $t6,$t3,4
 78			addu $t6,$t1,$t6
 79			lhu $t4,0($t6)
 80			lhu $t5,4($t6)
 81			bgt $t5, $t4, skip_swap
 82			lb $t7,2($t6)
 83			sll $t7,$t7,16
 84			and $t4,$t4,$t7
 85			lb $t7,6($t6)
 86			sll $t7,$t7,16
 87			and $t5,$t5,$t7
 88			sw $t5,0($t6)
 89			sw $t4,4($t6)
 90			skip_swap:
 91			addiu $t3,$t3,1
 92			j lsin
 93		lsin_end:
 94		addiu $t2,$t2,1
 95		j ls
 96	ls_end:
 97	
 98	lb $t2, 18($t1) #tmp mediana id
 99	 
100	
101	addiu $sp,$sp,36 # zwalniamy stos na brigthnessy
102	
103