Results 1 to 8 of 8

Thread: Multiple Integer formats? Motorola?

  1. #1

    Thread Starter
    Hyperactive Member
    Join Date
    Apr 1999
    Location
    Prague, Czech Republic
    Posts
    350
    I would like to know, what is Motorola integer and how to convert to/from it.

    Could somebody help me?

  2. #2
    Guru Yonatan's Avatar
    Join Date
    Apr 1999
    Location
    Israel
    Posts
    892

    Exclamation Indians!

    OK, it may seem like it has absolutely nothing to do with the subject, but read on anyway.

    Once upon a time, there was a tribe of indians. (See, I told you it may seem like it has nothing to do with anything! Just keep reading )
    That tribe was living normally like any tribe should! Until one day, they wanted to eat some eggs. And they noticed that the eggs have two ends, the little end and the big end.
    Which end should be cracked to open the egg?
    The tribe divided into two groups. The little-endians/little-indians, who decided to crack the little end. And the big-endians/big-indians, who disagreed and thought the big end is more important.

    Today, in the high-tech businesses, there are companies who make processors. I'll take Motorola and Intel as an example.
    Motorola are big-endians, and Intel are little-endians.
    What does this mean in computers?

    Let's say you have a 32-bit integer (Dim My32BitInteger As Long).
    Let's say this integer's value, in hex, is ABCDEF12.
    You see that the integer is composed of 4 bytes: AB, CD, EF, 12.
    The big (high) end is the one which is the leftmost in the hexadecimal representation of the number. (In ABCDEF12, A is the high-order nibble, AB is the high-order byte, ABCD is the high-order word)
    The little (low) end is the one which is the rightmost in the hexadecimal representation of the number. (In ABCDEF12, 2 is the low-order nibble, 12 is the low-order byte, EF12 is the low-order word)

    Now, let's say this is a piece of the memory model:

    ...RB RB RB RB RB XX XX XX XX RA RA RA RA RA...

    In this "illustration", XX XX XX XX are the 4 bytes in the 32-bit integer (a 32-bit integer is 4 bytes of RAM).
    Bytes marked as RB are bytes in the RAM before our integer, and bytes marked as RA are bytes in the RAM after our integer.
    With me so far?

    Now, with Intel's memory model (they are little-endians - the low-order bytes come first), ABCDEF12 looks like this:

    ...RB RB RB RB RB 12 EF CD AB RA RA RA RA RA...

    See? They are little (low) endians, and in the number ABCDEF12, the 12 is the lowest byte, so it comes first. EF is the next, then CD, and AB is the highest.

    How does it look like on Motorola's memory model?

    ...RB RB RB RB RB AB CD EF 12 RA RA RA RA RA...

    You may think Motorola's memory model is more logical. Well, so do I.

    Now, to convert integers... I did a little string thing so it's definitely not a very good function, just a lazy one:
    Code:
    Function ConvertEndian(ByVal lNumber As Long) As Long
        Dim sHex As String, sTemp As String
        
        ' Get the hex number: AABBCCDD
        sHex = Right("0000000" & Hex(lNumber), 8)
        
        ' Swap the outer-high-order byte with the outer-low-order byte: AABBCCDD -> DDBBCCAA
        sTemp = Left(sHex, 2)
        Mid(sHex, 1) = Right(sHex, 2)
        Mid(sHex, 7) = sTemp
        
        ' Swap the inner-high-order-byte with the inner-low-order byte: DDBBCCAA -> DDCCBBAA
        sTemp = Mid(sHex, 3, 2)
        Mid(sHex, 3) = Mid(sHex, 5, 2)
        Mid(sHex, 5) = sTemp
        
        ' Return the hex number as a long:
        ConvertEndian = CLng("&H" & sHex)
    End Function
    Enjoy! This converts to and from Motorola because it's the exact same action.

  3. #3
    Frenzied Member Jop's Avatar
    Join Date
    Mar 2000
    Location
    Amsterdam, the Netherlands
    Posts
    1,986
    wow where did you learn all these things man?
    And I believe my grand-grand-grand-father belongs to that IndainTribe
    Jop - validweb.nl

    Alcohol doesn't solve any problems, but then again, neither does milk.

  4. #4
    Guru Yonatan's Avatar
    Join Date
    Apr 1999
    Location
    Israel
    Posts
    892

    Cool Yep!

    I heard the indian story from my father. (Yes, it must be passed father-to-son for centuries to come!)
    All the rest... Ugh.
    I think I've been using CopyMemory too much.

  5. #5
    Frenzied Member Jop's Avatar
    Join Date
    Mar 2000
    Location
    Amsterdam, the Netherlands
    Posts
    1,986
    hehe
    Jop - validweb.nl

    Alcohol doesn't solve any problems, but then again, neither does milk.

  6. #6

    Thread Starter
    Hyperactive Member
    Join Date
    Apr 1999
    Location
    Prague, Czech Republic
    Posts
    350

    Cool

    Wow!

    Ok, thank you for the story, I will try to remember it for other children...

    I was reading from file, so I used...
    Code:
       For i = 1 To 4
        Get #1, , bByte      'Byte buffer
        FLS = String(2 - Len(Hex(bByte)), "0") + Hex(bByte) + FLS     ' a string-typed var
       Next i
       FLB = Dec(FLS) ' a currency-typed var, "long" vas too small
    where Dec:
    Code:
    Function Dec(HexString As String) As Currency
     HexString = UCase(HexString)
     For i = 0 To Len(HexString) - 1
      h = Mid(HexString, Len(HexString) - i, 1)
      v = Val(h)
      If v = 0 Then
       Select Case h
        Case "A": v = 10
        Case "B": v = 11
        Case "C": v = 12
        Case "D": v = 13
        Case "E": v = 14
        Case "F": v = 15
       End Select
      End If
      Dec = Dec + (16 ^ i) * v
     Next i
    End Function
    1) How can I determine if the bytes are in Intel or in Motorola order (in file/memory)?

    2) Is a difference in my Dec and your CLng("&H" + HexString)?



    PS: Thank you, I have solved my first problem...

  7. #7
    Guru Yonatan's Avatar
    Join Date
    Apr 1999
    Location
    Israel
    Posts
    892

    Exclamation Answers

    1) How can I determine if the bytes are in Intel or in Motorola order (in file/memory)?
    Ummm... Any hexadecimal number can be both.
    I mean if someone told you "ABCDEF12", then you can say, "Huh? Do you mean Motorola ABCDEF12, which equals 2882400018 when it's unsigned or negative 1412567278 when it's signed, or do you mean Intel ABCDEF12, which equals 317705643? Make up your mind!"
    Do you see what I mean? A hexadecimal number doesn't say anything about its byte order, and you can order it any way you want.
    Of course you could just forget about it, memorize the above numbers, say them at parties and be the night's center of attraction.
    2) Is a difference in my Dec and your CLng("&H" + HexString)?
    Well, your Dec supports higher numbers.
    That's basically all, I think...

  8. #8

    Thread Starter
    Hyperactive Member
    Join Date
    Apr 1999
    Location
    Prague, Czech Republic
    Posts
    350

    Theory again...

    Nice confusion, but why Intel started using the sternformmost ordered bytes? I think there should be a good reason if it was such company...

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width