![](https://seccdn.libravatar.org/avatar/e6be5c2aafd856f8e01e8b0fbd66999e.jpg?s=120&d=mm&r=g)
2009/5/20 Rafał Miłecki <zajec5@gmail.com>:
I need little help to understand disassembled code from by BIOS.
What does actually mean second column in AtomDis c output? 0009: 0308008001 MOVE work[00] [..XX] <- reg[0180] [..XX] I don't understand that 0308008001.
That's the bytecode for the instruction. The decoded instruction is written next to it. It's saying move the lower 2 bytes of register 0x180 to the lower two bytes of workspace 0.
Next, what is work[00]? Is this just some not used register for calculations? Am I right?
In atom you have param space (the inputs to the command tables), work space (local storage used by the interpreter when executing scripts and then the various registers: reg (direct mmio space), pll (indirect pll register space), mc (indirect memory controller register space).
Then how does MOVE work? MOVE work[00] [..XX] <- reg[0180] [..XX] Let's say I get following output: # rhd_dump -r 0180,0184 01:00.0 0x0180: 0x01234567 0x0184: 0x89ABCDE does it mean sth following: 0x0180: 0x01 0x0181: 0x23 0x0182: 0x45 0x0183: 0x67 ? If so, what is [..XX] part of 0x0180? Shuld I treat 0x0180 as 0x0001 and [..XX] means 0x01 then?
The direct registers are listed as dword offsets in atom so you have to multiply them by 4 to get the byte offsets. so 0x180 in atom is 0x600 is byte offsets. PLL and MC registers are indirect indexes so the offsets are index values. Registers are 32 bits, and the atom ops can operate on individual bytes or groups of bytes. In this case the op is operating on the lower two bytes (hence the ..XX). In your example the lower two bytes are 0x4567. So this op would roughly translate into: work[00] = (work[00] & 0xffff0000) | (INREG(0x600) & 0xffff);
Finally, how does work DIV WS_QUOT/LOW32 [XXXX] <- 00000008 ?
Divide the current workspace value by 8. Alex -- To unsubscribe, e-mail: radeonhd+unsubscribe@opensuse.org For additional commands, e-mail: radeonhd+help@opensuse.org