Some Ford IPC-s has lookup table with offset addresses to every menu element. In this case you can use the hexeditor easly.
But many other IPC isn't containing these index table and the language area also has many control caracters wich refers to different control characters, symbols or some gui elements. So hexediting these area is not so trivial and safe. I think is better the understand the control characters and create an unpacker/packer for the elements. The structure of one element is the following:
Code: Select all
<1BYTE CTRLCHAR><BYTES>
Where:
<b>0B </b>: length of the text
<b>Text</b>: Driver Door
The control character 0x1F is followed only be 2 bytes, and I think is means some symbol or gui element.
0xCX means russion code page, where X means the length of the text. (0 means 16 chars)
I already indetified some control characters but there are many other unknows.
Here is a small GO code how to parse the language area (not all control characters are handled or proper handled):
Code: Select all
n:=0x195304 //offset of language area
for i:=0; i<20000; i++ {
x := int(data[n]) & 0xff
n++
if (x & 0xf0) == 0xE0 {
n += (x & 0x0f)
continue
}
if (x & 0xf0) == 0x40 { //switch code page
n += (x & 0x0f)
continue
}
if (x & 0xf0) == 0x50 { //swich code page
if (x & 0x0f) == 0 {
n += 16
} else {
n += (x & 0x0f)
}
continue
}
if (x & 0xf0) == 0x60 { //
n += (x & 0x0f)
continue
}
if (x & 0xf0) == 0xA0 { //
n += (x & 0x0f)
continue
}
if (x & 0xf0) == 0xC0 { //Russian code page, 04XX
n += (x & 0x0f)
continue
}
if (x & 0xf0) == 0x20 {
n += (x & 0x0f)
continue
}
if x == 0x1F { //always followed by 2 bytes
n += 2
continue
}
if x == 0x3F { //always followed by 2 bytes
n += 3
continue
}
if x>0x80 { //Ascii text followed by code page switch (?)
x &= 0x0f
}
s := string(data[n:n+x])
fmt.Printf("%08X (%02X): %s\n", n, x, s)
n += x
}
![Smile :)](./images/smilies/icon_e_smile.gif)