| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 17.10.2014, 12:58    Titel: Nibble vom Byte tauschen. | 
				     | 
			 
			
				
  | 
			 
			
				Hallo, guten Tag.
 
 
Ich möchte ein Ascii Rom anfertigen für einen FPGA der ein Textscreen darstellt.  Im Rom müssen die Nibble vertauscht werden nach diesem Muster:
 
----------------------
 
Procedure.a ReverseNibbles(byte.a)   
 
   Protected result.a
 
   
 
   result | (byte & %00000001) << 3 
 
   result | (byte & %00000010) << 1
 
   result | (byte & %00000100) >> 1
 
   result | (byte & %00001000) >> 3
 
   result | (byte & %00010000) << 3
 
   result | (byte & %00100000) << 1
 
   result | (byte & %01000000) >> 1
 
   result | (byte & %10000000) >> 3
 
   
 
   ProcedureReturn result
 
EndProcedure
 
------------------------------------------------------
 
 
Wie kann man das bitte in Freebasic machen?
 
 
Danke.
 
 
Gruss | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Haubitze
 
 
  Anmeldungsdatum: 14.10.2009 Beiträge: 132
 
  | 
		
			
				 Verfasst am: 17.10.2014, 14:14    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				hi arduno,
 
 
die befehle die du suchst sind OR,AND,SHL,SHR.
 
 
zb koennte das so aussehen,
 
 
result=result OR ((byte AND &b00000001) SHL 3)
 
result=result OR ((byte AND &b00000100) SHR 2)
 
 
salute | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 17.10.2014, 14:26    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Jup, danke.
 
Gruss | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 19.10.2014, 18:22    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das haut noch nicht hin mit dem Ergebnis.
 
 
In Purebasic ist es richtig umgewandelt.
 
Das Ergebnis ist bei FreeBasic anders(falsch).
 
 
Wie geht es da richtig?
 
 
Danke.
 
Gruss
 
 
----------------------------
 
3C 66 6E 6E 60 62 3C 00  Ausgangsbyte
 
 
C3 66 67 67 60 64 C3 00 : Richtig mit Purebasic
 
result | (byte & %00000001) << 3 
 
result | (byte & %00000010) << 1
 
result | (byte & %00000100) >> 1
 
result | (byte & %00001000) >> 3
 
result | (byte & %00010000) << 3
 
result | (byte & %00100000) << 1
 
result | (byte & %01000000) >> 1
 
result | (byte & %10000000) >> 3
 
 
C3 E7 E7 E7 E7 E7 E7 E7  Falsch mit Freebasic
 
result=result  OR ((byte_n AND &b00000001) SHL 3) 
 
result=result  OR ((byte_n AND &b00000010) SHL 1) 
 
result=result  OR ((byte_n AND &b00000100) SHR 1)
 
result=result  OR ((byte_n AND &b00001000) SHR 3) 
 
result=result  OR ((byte_n AND &b00010000) SHL 3) 
 
result=result  OR ((byte_n AND &b00100000) SHL 1) 
 
result=result  OR ((byte_n AND &b01000000) SHR 1) 
 
result=result  OR ((byte_n AND &b10000000) SHR 3) | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 20.10.2014, 02:20    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Probier es mal damit:
 
 
result=(byte_n AND &b00000001) SHL 3
 
result=result OR ((byte_n AND &b00000010) SHL 1)
 
result=result OR ((byte_n AND &b00000100) SHR 1)
 
result=result OR ((byte_n AND &b00001000) SHR 3)
 
result=result OR ((byte_n AND &b00010000) SHL 3)
 
result=result OR ((byte_n AND &b00100000) SHL 1)
 
result=result OR ((byte_n AND &b01000000) SHR 1)
 
result=result OR ((byte_n AND &b10000000) SHR 3)
 
 
oder kürzer:
 
 
result=(byte_n AND &b00010001) SHL 3 _
 
	         OR ((byte_n AND &b00100010) SHL 1) _
 
	         OR ((byte_n AND &b01000100) SHR 1) _
 
	         OR ((byte_n AND &b10001000) SHR 3)
 
 
Und wenn dein Hex-String immer genau 8 Bytes lang ist, kannst du das Ganze auch elegant in einem Arbeitsgang erledigen:
 
 	  | Code: | 	 		  Dim As String quelle = Chr(&h3C, &h66, &h6E, &h6E, &h60, &h62, &h3C, &h00)
 
Dim As ULongInt lresult
 
 
lresult = CVLongInt(quelle) 'string in 64-bit-zahl umwandeln
 
lresult = (lresult AND &b0001000100010001000100010001000100010001000100010001000100010001) SHL 3 _
 
          Or ((lresult AND &b0010001000100010001000100010001000100010001000100010001000100010) SHL 1) _
 
          Or ((lresult AND &b0100010001000100010001000100010001000100010001000100010001000100) SHR 1) _
 
          Or ((lresult AND &b1000100010001000100010001000100010001000100010001000100010001000) SHR 3)
 
quelle = MkLongint(lresult) '64-bit-zahl in string umwandeln
 
 
 'zur Kontrolle
 
For x As Integer = 0 To Len(quelle) - 1
 
   Print Hex(quelle[x],2);" ";
 
Next
 
Sleep
 
 | 	  
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 20.10.2014, 12:01    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Jup danke.
 
 
Dein Programm funktioniert wunderbar.
 
 
Gruss | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		 |