ARMalyser
Manual
Version: 0.55
Written by: David J. Ruck
Date: 13-Apr-2006
Copyright © 2000-2003, DEEJ Technology PLC.
All Rights Reserved.
Contents
- INTRODUCTION
- File Types
- USE
- Command Line Argumants
- Print Formatting
- HTML
- XML
- Impression DDF
- Ovation Pro DDL
- ANALYSIS
- Instructions
- Invalid Instructions
- Unpredictable Instructions
- Non 32-bit Instructions
- Non ARM2/3 Instructions
- Performance
- Information From Instructions
- Code Following
- Partial Emulation
- 26 / 32 Bit Mode Guarding
- Surmised Code And Data
- Code Recognition
- Data Recognition
- Code Structure
- Swi Calls
- Shared C Library Functions
- Data Structures
- C++ Symbols
- DISASSEMBLY
- Comment Level
- Code Comments
- Cautions
- Performace
- Informational
- Data Comments
- ASSEMBLY
- Header Comment
- Declarations
- Labels
- Compilation
- STATISTICS
- RELEASE HISTORY
- Previous Releases
- Issues With Current Release
- Future Development
ARMalyser is a tool designed to analyse RISC OS executables providing identification of code and data areas with detailed comments, and facilities for turning executables back in to ObjAsm compatible assembler source. It identifies instructions that may have side effects in 32 bit processor modes, to aid in porting 32bit RISC OS variants.
It has built in knowledge ARM Architectures up to ARMv5TE, ARM procedure call standards, executable, object and library file formats and RISC OS SWI calls. Output can be in the form of disassembly, ObjAsm style assembly and statistical summary. Options are provided to format the output as text, HTML, XML, or fully customisable variants of those and most other textual tagged document formats.
ARMalyser is available for RISC OS™, Win32™, x86 and ARM Linux, and other UNIX™ variants on request.
Armalyser handles the following file types:-
- Absolute (AIF) &FF8
- DebImage (AIF) &FD3
- Relocatable Modules &FFA
- Relocatable Utilities &FFC
- Raw code Untyped (load & exec address)
- Acorn Object Format (AOF) &FFD
- Acorn Library Format (ALF) &FFD
Squeezed absolute and raw code may be handled directly if the xpand utility is present on the run path. Similarly compressed modules can be handled if the unmodsqz utility is available.
Usage: ARMalyser [options] infile
Where options are:-
-h | Output command syntax
|
-v | Verbose output, progress reports are sent to stdout, code analysis warnings are given
|
-d | Output disassembly to stdout,
|
-a | Produce ObjAsm format assembly
|
-r[a|r] | Set register naming used :-
|
|
a | APCS register names
| r | Standard register names
|
|
-s | Print statistics on code construction and 26-bit only instructions stdout
|
-t <target> | Target processor
ARM7 | ARM9 | StrongARM | XScale
|
-p<t|h|x> | Print format in Text (default), HTML or XML. If no option letter is supplied
|
-p <filename> | the format is taken from a messagetrans format file in the next argument
|
-xc <addr> | Display analysis backtrace when code marked
|
-xd <addr> | Display analysis backtrace when data marked
|
-xr | Display register contents during analysis
|
-o [filename] | Sent output to a file (uses stdout if not specified)
|
If print formatting is specified the output is encoded with tags that can be used to provide syntax colouring and hyper-linking for display in web browsers or printing in word processors. Pain text, HTML and XML formats are provided as standard, additional formats can be used by specifying a messagetrans file containing the tokens shown below.
The standard HTML file is provided as a template, as well as an inverted variant and file for Impression DDF (also suitable for EasiWriter and TechWriter) and Ovation Pro DDL. Almost any additional textual document format may be produced, as long as formatting codes are contained in tags with defined start and end characters, and illegal characters can be escaped either with defined start and end characters or a fixed length sequence. Note however that characters apart from " ' < >{ | } & may appear unescaped in comments in the current version.
Messagetrans token
| HTML default
| XML default
| Description
|
TagStart
| <
| <
| Tag start character
|
TagEnd
| >
| >
| Tag end character
|
tag_DOC1
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<HTML>\n
<HEAD>\n<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">\n
<META NAME="Generator" CONTENT="%s">\n<TITLE>%s</TITLE>\n
</HEAD>\n<BODY bgcolor="#FFFFFF" text="#000000" link="#BF3F00" vlink="#BF3F00" alink="#BF0000">\n
| <?xml version="1.0" encoding="iso-8859-1"?>\n <!DOCTYPE ARMalyser SYSTEM "ARMalyser.dtd">\n <%s filename="%s">\n
| Used at the start of document.
The first %s code is replaced with the name of the tool, and the second with the filename it has been run on.
Note for XML the name if the tools is used as the top level tag, this must be ARMalyser for the DTD to function.
The \n codes are used to put newlines in to the output
|
tag_DOC2
| \n</BODY>\n</HTML>\n
| </%s>
| Used at the end of the document. The %s is replaced with the name of the tool.
|
tag_DISS1
| <PRE>
| <Disassembly>
| Marks the start of the disassembly section
|
tag_DISS2
| </PRE><HR>
| </Disassembly>
| Marks the end of the disassembly section
|
tag_DISSLINE1
|
| <DissLine>
| Marks the start of a line of disassembly
|
tag_DISSLINE2
|
| </DissLine>
| Marks the end of a line of disassembly
|
tag_ASM1
| <PRE>
| <Assembly>
| Marks the start of the assembly section
|
tag_ASM2
| </PRE><HR>
| </Assembly>
| Marks the end of the assembly section
|
tag_ASMLINE1
|
| <AsmLine>
| Marks the start of a line of assembly
|
tag_ASMLINE2
|
| </AsmLine>
| Marks the end of a line of assembly
|
tag_STATS1
| <TABLE BORDER=1 CELLSPACING=1 CELLPADDING=5>\n
| <Stats>
| Start of the statistics table
|
tag_STATS2
| </TABLE>
| </Stats>
| End of the statistics table
|
tag_STATSTITLE1
| <TR><TD ALIGN="CENTER" COLSPAN=3><BIG><B>
| <StatsTitle>
| Start of the statistics table title row
|
tag_STATSTITLE2
| </B></BIG></TD></TR>
| </StatsTitle>
| End of the statistics table title row
|
tag_STATSLINE1
| <TR>
| <StatsLine>
| Start of a statistics table row
|
tag_STATSLINE2
| </TR>
| </StatsLine>
| End of a statistics table row
|
tag_STATSCOLUMNA1
| <TD><B>
| <StatsColumn column="1">
| Start of a statistics table column 1
|
tag_STATSCOLUMNA2
| </B></TD>
| </StatsColumn>
| End of a statistics table column 1
|
tag_STATSCOLUMNB1
| <TD ALIGN="RIGHT">
| <StatsColumn column="2">
| Start of a statistics table column 2
|
tag_STATSCOLUMNB2
| </TD>
| </StatsColumn>
| End of a statistics table column 2
|
tag_STATSCOLUMNC1
| <TD ALIGN="RIGHT">
| <StatsColumn column="3">
| Start of a statistics table column 3
|
tag_STATSCOLUMNC2
| </TD>
| </StatsColumn>
| End of a statistics table column 3
|
tag_WARNINGLINE1
| <FONT COLOR="#FF0000">
| <Warning>
| Start of a warning line from analysis engine. Will appear before disassembly.
|
tag_WARNINGLINE2
| </FONT><BR>
| </Warning>
| End of a warning line.
|
tag_ADDRESS1
| <A NAME="%s%08X"><FONT COLOR="#3F3F3F">
| <Address address=
"%s%08X">
| Start of a disassembly address field. The %s is replaced with 'L' in assembly (empty in disassembly), the %08X is replaced with the hex value of the address.
|
tag_ADDRESS2
| </FONT></A>
| </Address>
| End of a disassembly address field.
|
tag_LABEL1
| <A NAME="%s%08X"><FONT COLOR="#BF0000">
| <Label address=
"%s%08X">
| Start of an assembly label field. The %s is replaced with 'L' in assembly (empty in disassembly).
|
tag_LABEL2
| </FONT></A>
| </Label>
| End of an assembly label field.
|
tag_ADDRLINK1
| <A HREF="#%s%08X">
| <AddrLink address=\"%s%08X\">
| Start of an address hyperlink. Occurs around addresses in disassembly op codes or directives, labels in assembly op codes or directives, and in pointer indicators in comments. The %s is replaced with 'L' in assembly, empty in disassembly, so the hyper link refers to the correct section. The %08X is replaced with the hex value of the address.
|
tag_ADDRLINK2
| </A>
| </AddrLink>
| End of an address hyperlink.
|
tag_CHARS1
| <FONT COLOR="#00007F">
| <Chars>
| Start of the disassembly character display.
|
tag_CHARS2
| </FONT>
| </Chars>
| End of the disassembly character display.
|
tag_CTRLCHAR1
| <FONT COLOR="#FF0000">
| <CtrlChar>
| Start of a control character tag. Used around a control character in the character display field in disassembly. Note this is nested within the tag_CHARS section.
|
tag_CTRLCHAR2
| </FONT>
| </CtrlChar>
| End of a control character tag.
|
tag_MEMORY1
| <FONT COLOR="#5F5F5F">
| <Memory>
| Start of the disassembly memory field.
|
tag_MEMORY2
| </FONT>
| </Memory>
| End of the disassembly memory field.
|
tag_INSTRUCTION1
|
| <Instruction>
| Start of the instruction field in both disassembly and assembly.
|
tag_INSTRUCTION2
|
| </Instruction>
| End of the instruction field.
|
tag_OPCODE1
|
| <OpCode>
| Start of the op code mnemonic tag.
|
tag_OPCODE2
|
| </OpCode>
| End of the op code mnemonic tag,
|
tag_DIRECTIVE1
| <FONT COLOR="#3F00BF">
| <Directive>
| Start of the assembler directive tag.
|
tag_DIRECTIVE2
| </FONT>
| </Directive>
| End of the assembler directive tag.
|
tag_CONDITION1
| <FONT COLOR="#00007F">
| <Condition>
| Start of the op code condition tag.
|
tag_CONDITION2
| </FONT>
| </Condition>
| End of the op code condition tag.
|
tag_MODIFIER1
| <FONT COLOR="#7F007F">
| <Modifier>
| Start of the modifier tag, used for multiple register transfer flags, write back indication, and floating point precision and rounding.
|
tag_MODIFIER2
| </FONT>
| </Modifier>
| End of the modifier tag.
|
tag_REGISTER1
| <FONT COLOR="#003FBF">
| <Register>
| Start of the register tag, used for main and floating point registers.
|
tag_REGISTER2
| </FONT>
| </Register>
| End of the register tag.
|
tag_REGLIST1
|
| <RegisterList>
| Start of the register list tag, used around the parenthesis in the multiple data transfer instruction.
|
tag_REGLIST2
|
| </RegisterList>
| End of the register list tag.
|
tag_SHIFT1
| <FONT COLOR="#003F00">
| <Shift>
| Start of the op code shift tag, used around the shift type.
|
tag_SHIFT2
| </FONT>
| </Shift>
| End of the op code shift tag.
|
tag_SWI1
| <FONT COLOR="#7F7F00">
| <SWI>
| Start of the SWI tag, used around the SWI name (or number if unrecognised).
|
tag_SWI2
| </FONT>
| </SWI>
| End of the SWI tag.
|
tag_NUMBER1
| <FONT COLOR="#007F7F">
| <Number>
| Start of the number tag, used around any decimal or hex value in an instruction.
|
tag_NUMBER2
| </FONT>
| </Number>
| End of the number tag.
|
tag_STRING1
| <FONT COLOR="#007F00">
| <String>
| Start of the string tag, used around string values in assembler directives or comments.
|
tag_STRING2
| </FONT>
| </String>
| End of the string tag
|
tag_COMMENTA1
| <FONT COLOR="#00BF00">;
| <Comment>
| Start of the Comment A tag. Used when the location has been identified with certainty. Note there is a trailing space in the HTML tag.
|
tag_COMMENTA2
| </FONT>
| </Comment>
| End of the Comment A tag.
|
tag_COMMENTB1
| <FONT COLOR="#7FBF00">;~
| <Comment surmised="1">
| Start of the Comment B tag. Used when the location has been identified with high confidence. Note there is a trailing space in the HTML tag.
|
tag_COMMENTB2
| </FONT>
| </Comment>
| End of the Comment B tag.
|
tag_COMMENTC1
| <FONT COLOR="#BFBF00">;~~
| <Comment surmised="2">
| Start of the Comment C tag. Used when the location has been identified with medium confidence. Note there is a trailing space in the HTML tag.
|
tag_COMMENTC2
| </FONT>
| </Comment>
| End of the Comment C tag.
|
tag_COMMENTD1
| <FONT COLOR="#BF7F00">;~~~
| <Comment surmised="3">
| Start of the Comment D tag. Used when the location has been identified with low confidence. Note there is a trailing space in the HTML tag.
|
tag_COMMENTD2
| </FONT>
| </Comment>
| End of the Comment D tag.
|
tag_COMMENTE1
| <FONT COLOR="#FF0000">;?
| <Comment unidentified="1">
|
Start of the Comment E tag. Used when the location could not be identified.
| Note there is a trailing space in the HTML tag.
|
|
tag_COMMENTE2
| </FONT>
| </Comment>
| End of the Comment E tag.
|
EntityStart
| &
| &
| Start of entity character, used before characters that are invalid in the format.
|
EntityEnd
| ;
| ;
| End of entity character, or if 1 to 9, the number of characters after EntityStart to be skipped.
|
Char0
| ...
| Char31
|
| Char32
|
| Char38
| Char39
|
| Char60
| Char62
|
| Char1127
|
| Char128
| ...
| Char255
|
|
@
|
| _
|
|
|
| &
| '
|
| <
| >
|
| ?
|
| €
|
| ÿ
|
|
@
|
| _
|
| (space)
|
| '
| &apos
|
| <
| >
|
| ?
|
| (character 128)
|
| (character 255)
|
|
All characters in the output are replaced with the entities contained in the tokens CharN where N is 0 to 255. The characters 0 to 31 and 127 are also enclosed by the tag_CTRLCHAR tag.
|
| Note: in the current version there are some non-alphanumeric characters that appear in comments from the analysis engine. But these characters do not effect HTML, XML, DDF or DDL formats.
|
| In the HTML and XML all characters are mapped to themselves except where shown.
|
|
FileType
| &FAF
| &F80
| RISC OS file type to use for output file
|
The HTML generated is to the W3C 3.2 final specification. It fails the W3C valuator however, due to its use of font colour tags with in PRE blocks. No problems have been found with this in any browser.
Both Fresco and Browse are suitable for rendering the output, Fresco has a slight edge due to its increased speed when dealing with very large output files. Oregano will render it, but produces an inferior display. With both courier and typewriter fonts, top bit set characters are not displayed at the same width as the other leading to a ragged appearance to disassembly mode. The XTT font render produces a very light display with these fonts which is not as legible as the Acorn Font Manager's corpus font.
A DTD is provided to enable validation and parsing of the output.
Whilst the DDF produced is thought to be correct, Impression Publisher and Publisher+ can have difficulties with certain lines due to the number of style changes. This is not alleviated by using effects instead of styles, and has been put down to a bug in these programs. The problem can be circumvented by removing some of the tags, so that lines contain less style changes.
The output produced will load and display perfectly in EasiWriter and TechWriter.
As DDL is not a true tagged format (instead requiring the document text to be enclosed quotes), the formatting width calculations do work correctly and produce incorrect length instruction strings, but this is masked by using a tab in the closing instruction tag to ensure that following comments are aligned. Note a tab at the start of comments is not suitable, as they may start after the memory display in disassembly mode, where no instruction is present.
The entire ARMv4 instruction set is recognised and some elements of ARMv5.
A large amount of the potential instruction space is considered invalid for legitimate use by RISC OS applications, the following are rejected.
- Instruction word values:-
- &000000000
- &FFFFFFFF
- &20202020
- &30303030
- SWI instructions with comment field bits 20-23 set (non RISC OS)
- Co-processor instructions that are not valid FP (1 & 2) or processor control (15)
- Branch instructions
- Outside 26bit range for absolute and raw executables
- Outside the file for relocatable modules
- Block Data Transfer to or from R15
- MUL or MULA with Rd=PC or Rd=Rm
- MULL or MULLA with PC as any register , or any two registers the same
- SDS with PC as any register
The following instructions may have unpredictable results on different processor variants.
- Single, block or coprocessor data transfer with write back to PC
- Coprocessor data transfer negative unidexed
- Block Data transfer with base register in the list
- Block Data transfer with ! and ^
- Single data transer of non word to/from PC
- Single data transer with Rd=Rn and write back
- Single data transer with Rm=PC
- Multiply or single data swap with non unique register combinations
- MSR with non flags field and immediate operand
- MSR with control field and conditional (StrongARM bug)
- MSR with should be zero field non zero
- Data operations with Rm=PC
- Branches relying on wrapping round 26bit address space
- Branches to unaligned locations, or may select Thumb mode on some processors
The following instructions are not considered valid for use in 32-bit mode when found in 26-bit executables as the meaning of the instruction or its side effects are considerably different.
- Block Data Transfer with PSR bit set
- MUL or MULA with PC as any register
- Data processing instructions with Rd=PC and set flags bit
- Data processing instructions with Rs=PC
- SWI's that use flags in the high bits of addresses
Note: Branch Link is not included, as flag preserving is the consequence of the return instruction.
Use of the PSR manipulation instructions MSR and MRS are invalid on the ARM2 and ARM3 processors.
If the processor target is specified on the command line the analysis will gather information relating to performance issues. These include :-
ARM7
- 1 minimum cycle latency for shift by a register.
ARM9
- Use of single register LDM/STM (LDR/STR faster on the ARM9).
- 1 cycle minimum latency for shift by a register.
- 1 cycle minimum latency of LDR result.
StrongARM
- Use of conditional LDM/STM (always unrolled on the StrongARM).
- Use of single register LDM/STM (LDR/STR faster on the StrongARM).
- 1 cycle latency for shift by a register.
- 1 cycle minimum latency of LDR result.
- 1 cycle minimum latency of last LDM register transfered.
- 1 cycle minimum latency of Co-processor register transfer result.
XScale
- Use of conditional LDM/STM (always unrolled on the XScale).
- Use of single register LDM/STM (LDR/STR faster on the XScale).
- 1 cycle minimum latency for shift by a register.
- 2 cycle minimum latency of LDR result.
- 2 cycle minimum latency of LDRD low result.
- 3 cycle minimum latency of LDRD high result.
- 2 cycle minimum latency of last LDM register transfered.
- 1 cycle minimum latency on penultimeate LDM register transfered.
- 1 cycle minimum latency of result used as Rm in immediate shift.
- 2 cycle minimum latency of co-processor register transfer result.
- 1 cycle maximum latency of MRS result.
- 1 cycle maximum latency of QADD/QSUB/QDADD/QDSUB result.
- 1 cycle maximum latency of SMLALxy high result.
Note:Register latency calculations should only be taken as approximate. The current implementation will take in to account instruction issue latencies and blocking as a result of previous register latencies. However not all pipeline interactions and sequeneces involving conditionally exclusive instructions are fully modelled.
If the instruction contains an immediate address, or a register previously loaded with a PC relative address can be located, the following information is extracted from the instructions.
- SWI
- X bit set for error return
- V, C and Z flags altered
- Parmeters values and data blocks (see SWI Call section)
- Co-processor Data Transfer
- data area , size from type and number of FP registers transferred
- Branch and Branch Link
- target address
- function/label
- subroutine alters or presers flags
- call to SCL function for special action (see Shared C Library functions)
- Block Data Transfer
- data area using number of registers and addressing mode
- code flow stops at an unconditional PC in register list
- LDM R13! Recognised as function exit
- dynamic branch (PC in list and Rn!=sp or Rn!=fp for C code)
- If PC stacked, return location (both +8 and +12) marked
- Single Data Transfer
- data area using addressing mode
- data is byte/word accessed
- code flow stops at an unconditional Rd=PC
- data is array type if offset register used
- dynamic branch if Rd=PC (consecutive word offsets only)
- Single Data Swap
- data is marked as semaphore
- Data Processing
- target PC relative address loads (including long form) marked as referenced
- PC relative address investigated for potential string references
- code flow stops at an unconditional Rd=PC
- MOV(S) PC,R14 recognised as a function exit
- dynamic branch if instruction will jump to consecutive word branch table
- preceding CMP or TEQ used to determine range of branch table
- if range not known, continued until first instruction that does not end code flow
- arthimetic operations emulated where all registers contain known values
Entry points are determined into the code by analysis of the AIF or module header, or the execution address for raw code. The code is then followed, stacking addition program flow changes and registered entry points using a stack. The following order is:-
- Initialisation routine always first for modules
- Subroutines are followed immediately
- Dynamic branched are followed immediately
- Forward and reverse branches are stacked for later analysis
- Code is followed until
- an unconditional sequence termination instruction
- a mutually exclusive branch combination
- previously accessed data is encountered
- an invalid instruction is encountered
Partial emulation of code is used to track registers to enable code and data areas to be detected, either directly or by knowledge of values passed to SWI calls and Shared CLib functions arguments. Values enter registers via one of:-
- MOV immediate
- LDR when address known from registers, or PC relative
- LDM when address known from registers
- R14 address bits after BL
The following arithmetic operations are then emulated where all registers used by the instruction are known:-
- AND, EOR, SUB, RSB, AND, ORR, MOV, BIC, MVN with operand 2 types of
- Immediate
- Register with immediate shift (except RRX)
- Register with register shifts
- MUL and MULA
- Write back from LDR/STR or LDM/STM
Currently the PSR flag bits are not emulated so instructions that rely on the C flag such as ADC, SBC or with immediate shifts of RRX cannot be emulated, and invalidate the destination register.
If the instruction is conditional the register(s) set by the intruction will only be valid in subsequent intructions which also bear this condition, until flag alter instruction is encountered.
Register values are tracked through code sequences and are passed forward or reverse brnaches, any subroutines and SWI's. However if any of the following are encountered all known register are invalidaed.
- As yet unidentified code sequence
- Label (indication that program flow can skip address/value set-up)
- Subroutine call
- SWI call
Code only suitable for use in 26 bit modes, or instructions only present on the ARM 2/3, may appear in 32 bit programs if suitabled guarded by a test whether the procesor is running in 26bit mode. Similarly instructions only available on later ARM processors may be used if suitabled guarded by a test whether the procesor is running in a 32bit mode. ARMalyser recognises the following code constructions as guarding the use of 26bit only or 32bit only instructions:-
TEQ R0,R0 ; Ensure some flag bits set (only needed in USR mode code)
TEQ PC,PC ; Check if PC contains PSR, NE in 26bit mode, EQ in 32bit mode
; 26 bit only instructions safe if used with the NE condition
; 32 bit only instructions safe if used with the EQ condition
TEQ PC,#0 ; Ensure some flag bits set (only needed in USR mode code)
TEQ PC,PC ; Check if PC contains PSR, NE in 26bit mode, EQ in 32bit mode
BEQ in32
|in26|
; only executed in 26 bit mode, all 26 bit only instructions safe
B inEither
|in32|
; only executed in 32 bit mode, 32 bit only instructions safe
|inEither|
; executed in either mode
TEQ PC,#0 ; Ensure some flag bits set (only needed in USR mode code)
TEQ PC,PC ; Check if PC contains PSR, NE in 26bit mode, EQ in 32bit mode
BNE in26
|in32|
; only executed in 32 bit mode, 32 bit only instructions safe
B inEither
|in26|
; only executed in 26 bit mode, all 26 bit only instructions safe
|inEither|
; executed in either mode
Following the analysis of executable structure, code following and data recognition directly from code usage, additional steps must be taken to surmise the unidentified areas. There are 4 levels of recognition confidence:-
- Level 0 - identified with certainty.
- Level 1 - identified with high confidence.
- Level 2 - identified with medium confidence.
- Level 3 - identified with low confidence.
- Level 0
- Code directly called from entry executable points
- Level 1
- Code following C symbols (most commonly unused library functions)
- Likely function entry points, stacking R14
- Level 2
- Valid code sequences preceding unconditional flow end instructions
- Level 3
- Any further code as a result of data recognition
- Level 0
- Data defined in the executable file format
- Data accessed by level 0 code instructions,
- Data accessed by SWI's or SCL functions called from level 0 code
- Level 1
- Unlikely valid instruction values 0x00000000 and 0xFFFFFFF
- SWI's OS_WriteS or XOS_WriteS followed by inline string
- Known UnixLib data sequences (16 byte blocks of ' ' and '0', APCS register list)
- Referenced strings, rules are:-
- Only contains characters 9,10,13,32-126,127 to 255
- Terminates on a 0 character
- No two consecutive top bit characters
- If only two characters, both must be non top bit set
- C Symbol identifiers
- word of &FF0000xx
- string at address - xx of between xx-3 and xx chars including terminator
- Level 2
- Valid address following previously recognised valid address (non relocatable code)
- Valid string (rules as above)
- Previous word was identified as an array type
- Lone words surrounded by data or code
- Referenced single byte values
- Any invalid instruction
- Tables of values terminated by 0x00000000 or 0xFFFFFFF
- Level 3
- Read/write area of C AIF or module
- Any valid address offset in non-Relocatable code
- Single word followed by string - error block
- Valid instructions values, but are conditional and immediately followed by data
The following code structures are understood.
- AIF Header in Absolute code, including
- Entry Points
- Read/write data area
- Debug data
- Modules Header, for module files, including
- All code offsets
- RISCS OS 4 service table
- Command Table and help and syntax strings
- SWI table
- MessageTrans filename offset
- 32 bit module flags offset
- Raw executable execution address
- AOF object files, all chunks
- ALF library files, all chunks
- Branch tables (LDR PC,PC,Rx,shift) with range if identified
- Compiler Symbols proceeding functions
The following SWI's are recognised, and values or addresses set-up by proceeding instructions are used to enable data structures and handler functions to be identified.
- OS_WriteS - Inline string follows
- OS_Write0 - R0 =String
OS_CLI
OS_GSInit
- OS_Read - sets C flag
OS_GSRead
OS_CallAVector
OS_ValidateAddress
OS_ClaimScreenMemory
OS_ReadEscapeState
- OS_Word - R0 = reason
- 138 - sets C flag
145
152
153
- OS_Exit - Terminates code following if unconditional
OS_ExitAndDie
OS_Reset
- OS_Word - R0 = reason, R1 = block
- OSWord_ReadLine - 4 byte block, sets C flag
- OSWord_ReadSystemClock - 5 byte time block
OSWord_WriteSystemClock
OSWord_ReadIntervalTimer,
OSWord_WriteIntervalTimer
- OSWord_ReadGCOL - 4 byte colour coord + 1 byte colour no
- OSWord_ReadCharDefinition - 1 byte char no, 8 bytes data
- OSWord_ReadPalette - 1 byte col no, 4 bytes palette entry
OSWord_WritePalette
- OSWord_ReadCursorPosition - 8 bytes of coordinates
- OSWord_ReadClock - sub reason at R1+0
- OP_LOCAL_STRING - at least 24 byte buff
- OP_LOCAL_BCD - 7 byte BCD buffer
- OP_CONVERT_BCD_TO_STRING - 7 byte BDC at least 24 byte string buffer
- oswordreadclock_OP_UTC - 5 byte time buffer
- OSWord_WriteClock - sub reason at R1+0
- OP_TIME_LOCAL_STRING - string at +1, sets C flag
OP_DATE_LOCAL_STRING
OP_LOCAL_STRING
- OSWord_Pointer - sub reason at R1+0
- OP_DEFINE - 9 byte pointer def
- OP_SET_BBOX - 9 bytes coords
- OP_STEP - 2 byte steps
- OP_SET_POSITION - 4 byte coords
- OP_READ_POSITION
OP_SET_UNLINKED_POSITION
OP_READ_UNLINKED_POSITION
- OSWord_WriteScreenBase - 1 byte type, 4 bytes screen address
- OS_File - R0 = reason, R1 = filename string, reason
reason 12,13,14,15,21,22: R4 = path string,
reason 0,10: R4=start addr, R5 = end addr
- OS_Args - R0 = 7, R2=buffer at R5 = size
- OS_GBPB
- OSGBPB_WriteAt - R2 = buffer, R3 = size
OSGBPB_Write
OSGBPB_ReadAt
OSGBPB_Read
- OSGBPB_ReadDiscName - R2 = buffer
OSGBPB_ReadCSDName
OSGBPB_ReadLibName
- OSGBPB_CSDEntries - R2 = buffer, R3 = no 11 byte entries
- OSGBPB_DirEntries - R1 = directory name, R2 = buffer, R5 = buffer size
- OSGBPB_DirEntriesInfo R6 = wildcarded name
OSGBPB_DirEntriesSystemInfo
OSGBPB_DirEntriesInfoStamped
- OS_Find - R0=reason, R1=filename string
- OS_ReadLine - R0=buffer & flag, R1=buffer size, sets C flag
OS_ReadLine32
- OS_Control - Specific environment handlers in R0,R2-R3
- Error handler and error buffer
- Escape handler
- Event handler
- OS_ExitAndDie - R3=module name
terminates code following if unconditional
- OS_Exit, OS_Reset - terminates code following if unconditional
- OS_SetEnv - specific environment handlers in R0,R4-R7
- Exit handler
- Undefined instruction handler
- Prefetch abort handler
- Data abort handler
- Address exception handler
- OS_CallBack - R0, regsiter save block, R1 call back handler
- OS_BreakCtrl - R0 = register save block, R1=break point handler
- OS_UnusedSWI - R0 = unused SWI handler
- OS_Heap - R0 = 0 initialise, R1 = heap, R3 = size
- OS_Module - R0 = reason code
- OSModule_Enter - R1 = module name, R2 = parameters
- OSModule_Run - R1 = path/module name
OSModule_Load
OSModule_Reinit
OSModule_Kill
OSModule_Instantiate
OSModule_Prefer
OSModule_AddPoduleArea
OSModule_Lookup
- OSModule_AddArea - R1 = start of module, (R1)-4 = size
- OSModule_CopyArea - R1 = start of module, R2 = size
- OSModule_Rename - R1 = old name, R2 = new name
- OS_Claim - R0 = vector number, R1= software vector
OS_Release
OS_AddToVector
- UserV
- ErrorV
- IrqV
- WrchV
- RdchV
- CLIV
- ByteV
- WordV
- FileV
- ArgsV
- BGetV
- BPutV
- GBPBV
- FindV
- ReadLineV
- FSCV
- EventV
- Software Vector &11
- Software Vector &12
- Software Vector &13
- InsV
- RemV
- CnpV
- UKVDU23V
- UKSWIV
- UKPLOTV
- MouseV
- VDUXV
- TickerV
- UpcallV
- ChangeEnvironmentV
- SpriteV
- DrawV
- EconetV
- ColourV
- PaletteV
- SerialV
- OS_ReadUnsigned - R1 = string
- OS_SWINumberFromString - R1 = name
- OS_ReadVarVal, OS_GSTrans - R0 = var name/string , R1 = buffer, R2 = buffer size, sets C flag
- OS_SetVarVal - R0 = var name, R1 = buffer, R2 = buffer size, R4 = code variable entry points
- OS_FSControl - R0 = reason
- OSFSControl_StartApplication - R1 = command tail, R3 = command name
- OSFSControl_Dir - R1 = path/file name
OSFSControl_Lib
OSFSControl_Run
OSFSControl_Cat
OSFSControl_Ex
OSFSControl_LCat,
OSFSControl_LEx
OSFSControl_Info
OSFSControl_RemoveFS
OSFSControl_Wipe
OSFSControl_Count
OSFSControl_FileTypeFromString
OSFSControl_FileInfo
OSFSControl_InfoToFileType
OSFSControl_URD
OSFSControl_AddDefect
OSFSControl_AddDefect64
OSFSControl_ReadBootOption
OSFSControl_WriteBootOption
OSFSControl_FreeSpace
OSFSControl_StampImage
- OSFSControl_SetTemporaryFS - R1 = path/file name R3 = special field
- OSFSControl_Ad dFS - R2 = function block
OSFSControl_RegisterImageFS
- OSFSControl_Copy - R1= name, R2 = Attributes, R8 = extra info
- OSFSControl_AddSecondaryFS - R1 = fs name, R2 = secondary name
- OSFSControl_Access - R1 = name, R2 = Attributes
- OSFSControl_Rename - R1 = old name, R2 = new name
OSFSControl_NameDisc
- OSFSControl_ReadModuleBase - R2 = pointer to module private word
OSFSControl_ReadSecondaryFS
- OSFSControl_ReadFSName - R2 = buffer, R3=length
- OSFSControl_CanonicalisePath - R1 = filename, R2 = buffer, R3 = var, R4 = path, R5 = size
- OSFSControl_ObjectAtOffset - R1 = object name, R3 = buffer, R4 = length
- OSFSControl_SetDir - R1 = path, R2=dir, R3 = fs name, R6 = special field
- OSFSControl_ReadDir - R1 = buffer, R2=dir, R3 = fs name, R4 = buffer, R5 = length
- OS_GenerateError - R0 = error block
- OS_EvaluateExpression - R0 = string, R1 = buffer, R2 = size
- OS_SWINumberToString - R1 = buffer, R2 = size
OS_BinaryToDecimal
OS_ConvertHex1
OS_ConvertHex2
OS_ConvertHex4
OS_ConvertHex6
OS_ConvertHex8
OS_ConvertCardinal1
OS_ConvertCardinal2
OS_ConvertCardinal3
OS_ConvertCardinal4
OS_ConvertInteger1
OS_ConvertInteger2
OS_ConvertInteger3
OS_ConvertInteger4
OS_ConvertBinary1
OS_ConvertBinary2
OS_ConvertBinary3
OS_ConvertBinary4
OS_ConvertSpacedCardinal1
OS_ConvertSpacedCardinal2
OS_ConvertSpacedCardinal3
OS_ConvertSpacedCardinal4
OS_ConvertSpacedInteger1
OS_ConvertSpacedInteger2
OS_ConvertSpacedInteger3
OS_ConvertSpacedInteger4
OS_ConvertFixedFileSize
OS_ConvertFileSize
- OS_SpriteOp - R0 = reason
- OSSpriteOp_CreateSprite - R6 = mode spcifier
- OSSpriteOp_ScreenSave - R2 = filename
OSSpriteOp_ScreenLoad
OSSpriteOp_LoadSpriteFile
OSSpriteOp_MergeSpriteFile
OSSpriteOp_SaveSpriteFile
- OSSpriteOp_ReturnName - R2 = buffer, R3 = size
- OSSpriteOp_RenameSprite - R3 = new name
OSSpriteOp_CopySprite
- OSSpriteOp_AppendSprite - R3 = 2nd sprite pointer
- OSSpriteOp_SetPointerShape - R6 = scale factors, R7 = translation table
- OSSpriteOp_PlotMaskScaled - R6=scale factors
OSSpriteOp_PaintCharScaled
OSSpriteOp_PutSpriteScaled
OSSpriteOp_PutSpriteGreyScaled
- OSSpriteOp_PlotMaskTrfm - R3 = flags, R6 = matrix/coords
OSSpriteOp_PutSpriteTrfm
- OS_ServiceCall - R1= reason
- Service_ResourceFSStarting - R2 = function
- OS_ReadVduVariables - R0 = input block
- OS_ReadModeVariable - R0 = mode specifier R1 = output block, sets C Flag
- OS_CallAfter
OS_CallEvery
OS_RemoveTickerEvent - R1 = call after routine
- OS_InstallKeyHandler - R0 = keyboard handler
- OS_CheckModeValid - R0 = mode specifier, sets C Flag
- OS_ChangeEnvironment - R1 = Generic environment handler
- Undefined instruction handler
- Prefetch abort handler
- Data abort handler
- Address exception handler
- Other exceptions handler
- Error handler and error buffer
- CallBack handler and register block
- BreakPoint handler and register block
- Escape handler
- Event handler
- Exit handler
- Unused SWI handler
- Exception register block
- UpCall handler
- OS_SubstituteArgs - R0 = args (bit 31 is a flag) R1 = buffer, R2 = size, R3 = template, R4 = size
OS_SubstituteArgs32
- OS_PrettyPrint - R0 = string R2 = string
- OS_WriteN - R0 = string, R1 = size
- OS_WriteEnv - R0 = string, R1 = 5 byte time
- OS_ReadArgs - R0 = keyword, R1 = string, R2 = buffer, R3 = size
- OS_ClaimDeviceVector - R1 = device vector address
OS_ReleaseDeviceVector
- OS_DelinkApplication - R0 = buffer, R1=size
- OS_HeapSort - R0 = no elements, R1 = address/flags, R2 = type/sort routine
OS_HeapSort32
- OS_ReadMemMapEntries - R0 = request list (3 words, -1 terminated)
OS_SetMemMapEntries
OS_FindMemMapEntries
- OS_AddCallBack - R0=transient call back routine
OS_RemoveCallBack
- OS_SerialOp - R0 = reasion, sets C flag
- OS_Confirm - sets C and Z flags
- OS_ScreenMode - R0 = reasion
- OSScreenMode_Select - R1 = mode specifier
- OSScreenMode_Enumerate - R6 = address, R7 = size
- OS_DynamicArea - R0 =reason R6 =hander R8 = name
- OS_Memory - R0 =reason, R1 =page block, R2 = no 12 byte blocks
- OS_ClaimProcessorVector - R1 = hardware vector R2 = previous vector if bit 8 clear
- Branch through
- Undefined
- SWI
- Prefetch
- Data abort
- Address exception
- IRQ hardware
- FIQ hardware
- OS_ConvertDateAndTime - R0 = time R1 = buffer, R2 = size R3 = format string
- OS_ConvertStandardDateAndTime - R0 = time R1 = buffer, R2 = size
- OS_ConvertFixedNetStation - R0 = 2 word block R1=buffer, R2=size
OS_ConvertNetStation
- Font_FindFont - R1 = font name
- Font_StringWidth - R1 = string
Font_FindCaret
Font_FindCaretJ
Font_StringBBox
Font_FindField
- Font_UnCacheFile - R1 = filename
Font_Paint
- Font_ScanString - R1 = string, R2 = flags, R5 = coordinate block, R6 = transformation matrix
- Font_ListFonts - R1 = buffer, R2 = flags, R3 = size, R4 = buffer, R5 = size
- Font_ReadThresholds - R1 = 16 byte table
Font_ReadColourTable
- Font_SetThresholds - up to 16 byte table terminated with 0xFF
- Font_ReadFontPrefix - R1 = buffer, R2 = size
- Font_ReadEncodingFilename
- Font_DecodeMenu - R1 = menu def, R3 = buffer, R4 = size
- Font_ApplyFields - R0 = font identifier, R1 = string, R2 = buffer, R3 = size
- Sound_Configure - R3 = Channel handler, R4 = Scheduler
- Sound_InstallVoice - R0 = voice generator or reason code, R2 = function, R3 = string
- Sound_AttachNamedVoice - R1 = voice name
- Sound_LinearHandler - R0 = reason code, R2 = function
- Podule_ReadHeader - R1 = 16 byte buffer
- Podule_ReadBytes - R1 = number bytes, R2 = buffer
Podule_WriteBytes - R1 = buffer R2 = number bytes
Podule_RawRead
Podule_RawWrite
Podule_ReadInfo,
- FileCore_DiscOp - R1 = reason & alternate disc record, FileCore_SectorOp
ADFS_DiscOp R3 = buffer or address/size, R4 = length
ADFS_SectorDiscOp
RamFS_DiscOp
IDEFS_DiscOp
IDEFS_SectorDiscOp
SCSIFS_DiscOp
SCSIFS_SectorDiscOppairs
- FileCore_DescribeDisc - R1 = disc record
ADFS_DescribeDisc
RamFS_DescribeDisc
IDEFS_DescribeDisc
SCSIFS_DescribeDisc
- FileCore_FreeSpace - R0 = disc specifier string
FileCore_FreeSpace64
ADFS_FreeSpace
ADFS_FreeSpace64
RamFS_FreeSpace
IDEFS_FreeSpace
IDEFS_FreeSpace64
SCSIFS_FreeSpace
SCSIFS_FreeSpace64
- FileCore_FloppyStructure - R0 = 4K buffer
- FileCore_MiscOp - R0 = reason
ADFS_MiscOp
IDEFS_MiscOp
SCSIFS_MiscOp
- FileCoreMiscOp_Mount - R3 = buffer, R4 = size , R5 = disc record
- FileCoreMiscOp_PollPeriod - R1 = disc name
- ColourTrans_SelectTable
- ColourTrans_GenerateTable - R0 = mode specifier sprite area if>256
ColourTrans_SelectGCOLTable
- ColourTrans_ReturnGCOLForMode - R1 = mode specifier
ColourTrans_ReturnColourNumberForMode
ColourTrans_ReturnOppGCOLForMode
ColourTrans_ReturnOppColourNumberForMode
- ColourTrans_ConvertDevicePalette - R0 = num colours, R1 = source, R2 = dest
- ColourTrans_ReadPalette - R0 = mode specifier or sprite area, R2 = buffer, ColourTrans_WritePalette R3 = size
FilerAction_SendSelectedDirectory - R1 = directory name
FilerAction_SendSelectedFile
- FilerAction_SendStartOperation - R1 = reason
- FilerActionSendStartOperation_Copy - R2 = dest dir
FilerActionSendStartOperation_MoveLocal
FilerActionSendStartOperation_Move
FilerActionSendStartOperation_CopyLocal
FilerActionSendStartOperation_Find
- FilerActionSendStartOperation_Access - R2 = access/type word
FilerActionSendStartOperation_SetType
- Socket_Accept - R1 = address, R2 = address len
Socket_Accept_1
Socket_Bind
Socket_Connect
Socket_Getpeername
Socket_Getpeername_1
Socket_Getsockname
Socket_Getsockname_1
- Socket_Ioctl - R1 = request, R2 = data
- Socket_Read - R1 = data, R2 = data len
Socket_Write
Socket_Recv
Socket_Recvfrom
Socket_Recvfrom_1
Socket_Recvmsg
Socket_Recvmsg_1
Socket_Send
Socket_Sendto
Socket_Sendmsg
Socket_Sendmsg_1
- Socket_Readv - R1 = data vectors, R2 = num vectors
Socket_Writev
- Socket_Select - R0 = nfds, R1 = read fds, R2 = write fds, R3 = except fds. R4 = timeval
- Socket_Setsockopt - R3 = opts, R4 = opts len
Socket_Getsockopt
- Socket_Stat - R1 = stat buffer
- MessageTrans_OpenFile - R0 = pointer to descriptor
- MessageTrans_FileInfo - R1 = filename
- MessageTrans_GSLookup
- MessageTrans_Lookup - R0 = pointer to descriptor, R1 = token, R2 = buffer, R3 = size, R4 = parameter 0, R5 = parameter 1, R6 = parameter 2, R7 = parameter 3
- MessageTrans_EnumerateTokens - R0 = pointer to descriptor, R1 = token, R2 = buffer, R3 = size
- MessageTrans_CloseFile - R0 = pointer to descriptor
- MessageTrans_MakeMenus - R0 = pointer to descriptor, R1 = menu, R2 = buffer, R3 = size
- MessageTrans_ErrorLookup - terminates if uncoditional and non X form, R1 = pointer to descriptor, R2 = buffer, R3 = size, R4 = parameter 0, R5 = parameter 1, R6 = parameter 2, R7 = parameter 3
- MessageTrans_CopyError - R0 = error block , R1 = pointer to descriptor, R2 = buffer, R3 = size, R4 = parameter 0, R5 = parameter 1, R6 = parameter 2, R7 = parameter 3
- ResourceFS_RegisterFiles - Block at r0 containing:-
- Resource file header
- Resource file data
- DeviceFS_Register - R2 = device driver routine, R1 = device list, R5 = special field
- DeviceFS_DeregisterObjects - R1 = device name
- DeviceFS_ReceiveChar - sets C flag
DeviceFS_TransmitChar
- Buffer_Register - R1 = buffer start, R2 = buffer end
- Buffer_LinkDevice - R1,R2 = buffer routines
- Territory_Register - R1 = SWI entry points
- Territory_NumberToName - R1 = buffer, R2 = size
Territory_AlphabetNumberToName
- Territory_Exists - sets C flag
- Territory_SetTime - R1 = 0 byte time
- Territory_ConvertTimeToUTCOrdinals - R1 = 5 byte time, R2 = 36 byte buffer
Territory_ConvertTimeToOrdinals
Territory_ConvertOrdinalsToTime
- Territory_ConvertDateAndTime - R1 = 5 byte time, R2 = buffer, R3 = size, R4 = format string
- Territory_ConvertStandardDateAndTime -R1 = 5 byte time, R2 = buffer, R3 = size
Territory_ConvertStandardDate
Territory_ConvertStandardTime
- Territory_ConvertTimeStringToOrdinals - R2 = time string , R3 = 36 byte buffer
- Territory_Collate - R1,R2 = strings
- Territory_ReadCalendarInformation - R1 = 5 byte time, R2 = 12 word buffer
- Territory_TransformString - R1 = string, R2 = buffer, R3 = size
- Territory_NameToNumber - R1 = string
- DMA_RegisterChannel - R4 = routine addresses
- DMA Enambke Device
- DMA Disable Device
- DMA Start
- DMA Complete
- DMA Sync
- DMA_QueueTransfer - R0 = reason, R3 = scatter list, R5 = number of pairs
- JPEG_Info - R1 = buffer, R2 = size
- JPEG_FileInfo - R1 = filename
- JPEG_PlotScaled - R0 = buffer, R3 = scale factors, R4 = size
- JPEG_PlotFileScaled - R0 = filename, R3 = scale factors
- JPEG_PlotTransformed - R0 = buffer, R1 = flags, R2 = destination coord or matrix, R3 = size
- JPEG_PlotFileTransformed - R0 = filename, R1 = flags, R2 = destination coord or matrix depending
- CompressJPEG_Start - R0 = buffer, R1 = size*, R2 = 24 bytes of parameters, R3 = workspace, R4 = size
- PDriver_SetInfo - R4 = driver name
- PDriver_SelectJob - R1 = job name
PDriver_SelectIllustration
- PDriver_DeclareFont - R1 = font name
- PDriver_GiveRectangle - R1 = rectange 4 words, R2 = transformation table, R3 = position 2 words
- PDriver_DrawPage - R1 = rectange 4 words
PDriver_GetRectangle
- PDriver_CancelJobWithError - R1 = Error block
- PDriver_MiscOp - R0 = reason
- PDriverMiscOp_AddFont - R2 = Printer font name
- PDriverMiscOp_RemoveFont - R2 = Printer font name, R1 = RISC OS font name
- PDriverMiscOp_EnumerateFonts - R1 = buffer, R2 = size
- PDriverMiscOp_RegisterDumper - R4 = Dumper reason code handler
- PDriver_SetDriver - R3 = 256 byte data block, R4 = 256 byte data block
- DrawFile_Render
- DrawFile_BBox - R1 = buffer, R2 = size, R3 = transformation matrix, R4 = clipping rectangle
- IIC_Control - R1 = buffer, R2 = size
TaskManager_EnumerateTasks
DrawFile_DeclareFonts
- DragASprite_Start - R1 = sprite area if >2, R2 = sprite name, R3 = containing box, R4 = bounding box if R0 = flags
- Free_Register - R1 = routine
Free_DeRegister
- DragAnObject_Start - R0 = flags, R1 = SWI/routine, R2 = 10/4 words aruments, R3 = containing box, R4 = bounding box if R0 bits 4,5 = %10
- FSLock_ChangeStatus - R0 = action, R1 = current password, R2 = new password
- Wimp_Initialise - R2 = taskname, R3 = 0 terminated message list
- Wimp_CreateWindow - R1 = window block
- Window and icon block
- Titlbar icon data
- Wimp_CreateIcon - R1 = icon block
- Wimp_DeleteWindow - R1 = pointer to window handle
Wimp_CloseWindow
- Wimp_DeleteIcon - R1 = pointer to window and icon handles
- Wimp_OpenWindow - R1 = pointer to open window block
- Wimp_Poll - R1 = 256 byte block, R3 = Poll if R0 = mask & bit22
Wimp_PollIdle
- Wimp_RedrawWindow - R1 = pointer to window handle and redraw/update block
Wimp_UpdateWindow
Wimp_GetRectangle
- Wimp_GetWindowState - R1 = pointer window handle to window state block
- Wimp_GetWindowInfo - R1 = pointer to window handle window block
- Wimp_SetIconState - R1 = pointer to window and icon handles
- Wimp_GetIconState - R1 = pointer to window and icon handles, icon block
- Wimp_GetPointerInfo - R1 = pointer to 20 byte block
- Wimp_DragBox - R1 = pointer to window and 52 byte block
- Wimp_GetCaretPosition - R1 = pointer to window, icon handles and 16 byte block
- Wimp_DecodeMenu - R1 = pointer menu block
Wimp_CreateMenu
- Wimp_SetExtent - R1 = 4 word block
- Wimp_SetPointerShape - R1 = shape data, R2 = width, R3 = hieght
- Wimp_OpenTemplate - R1 = template filename
- Wimp_LoadTemplate - R2 = indirected workspace, R3 = byte after workspace, R4 = 256 byte font arra, R5 = wildcarded template name
- Wimp_StartTask - R0 = command string
- Wimp_CommandWindow - R0 = possible command name
- Wimp_ReportError - R0 = error block, R1 = flags, R2 = app name, R3 = sprite name, R5 = button text
- Wimp_GetWindowOutline - R1 = 5 word block
- Wimp_PlotIcon - R1 = icon block
- Wimp_SetMode - R0 = mode specifier
- Wimp_SetPalette - R1 = 20 word block
Wimp_ReadPalette
- Wimp_SendMessage - R1 = message block
- Wimp_SpriteOp - R2 = sprite name
- Wimp_ReadPixTrans - R1 = possible sprite area, R0 = sprite area type, R2 = sprite name, R6 = scale factors, R7 = 16 byte translation table
- Wimp_RegisterFilter - R0 = filter, R1 = handler
- Wimp_AddMessages - R1 = null terminated list of messages
Wimp_RemoveMessages
- Wimp_SetColourMapping - R1 = 16 word table, R2 = 2 byte table, R2 = 4 byte table, R3 = 16 byte table
- Wimp_TextOp - R0 = reason, R2 = sprite name
- Filter_RegisterPreFilter - R0 = filtername, R1 = filter routine
Filter_RegisterPostFilter
Filter_DeRegisterPreFilter
Filter_DeRegisterPostFilter
- Toolbox_CreateObject - R1 = template name
Toolbox_LoadResources
Toolbox_TemplateLookUp
- Toolbox_ShowObject - R2 = flags, R3 = 2 word block
- Toolbox_GetTemplateName - R2 = buffer, R3 = size
- Toolbox_RaiseToolboxEvent - R3 = toolbox event block
- Toolbox_GetSysInfo - Size of R1 buffer only known for R2 = 2
- Toolbox_Initialise - R2 = 0 terminated wimp message list, R3 = 0 terminated toolbox event list, R4 = resource directory name, R5 = message descriptor block, R6 = toolbox object ID block
- ColourDbox_ClassSWI - R2 = reason code
- ColourDbox_SetColour - R3 = block, second word is size
- ColourDbox_GetColour - R3 = buffer, R4 = size
ColourDbox_GetColourModel
- ColourDbox_SetColourModel - R3 = block, first word is size
- ColourMenu_ClassSWI - R2 = reason code
- ColourMenu_SetTitle - R3 = string
- ColourMenu_GetTitle - R3 = buffer, R4 = size
- DCS_ClassSWI - R2 = reason code
- DCS_SetMessage - R3 = string
- DCS_GetMessage - R3 = buffer, R4 = size
DCS_GetTitle
- FileInfo_ClassSWI - R2 = reason code
- FileInfo_SetFileName - R3 = string
FileInfo_SetTitle
- FileInfo_GetFileName - R3 = buffer, R4 = size
FileInfo_GetTitle
- FileInfo_SetDate - R3 = 5 byte date
FileInfo_GetDate
- FontDbox_ClassSWI - R2 = reason code
- FontDbox_SetFont - R3 = string
FontDbox_SetTryString
FontDbox_SetTitle
- FontDbox_GetFont - R3 = buffer, R4 = size
FontDbox_GetTryString
FontDbox_GetTitle
- FontMenu_ClassSWI - R2 = reason code
- FontMenu_SetFont - R3 = string
- FontMenu_GetFont - R3 = buffer, R4 = size
- Iconbar_ClassSWI - R2 = reason code
- Iconbar_SetHelpMessage - R3 = string
Iconbar_SetText
Iconbar_SetSprite
- Iconbar_GetHelpMessage - R3 = buffer, R4 = size
Iconbar_GetText
Iconbar_GetSprite
- Menu_ClassSWI - R2 = reason code
- Menu_SetEntryText - R4 = string
Menu_SetEntrySprite
Menu_SetEntryHelpMessage
Menu_AddEntry
- Menu_GetEntryText - R4 = buffer, R5 = size
Menu_GetEntrySprite
Menu_GetEntryHelpMessage
- Menu_SetHelpMessage - R3 = string
Menu_SetTitle
Menu_GetHelpMessage - R3 = buffer, R4 = size
Menu_GetTitle
- PrintDbox_ClassSWI - R2 = reason code
- PrintDbox_GetTitle - R3 = buffer, R4 = size
- ProgInfo_ClassSWI - R2 = reason code
- ProgInfo_SetVersion - R3 = string
ProgInfo_SetTitle
- ProgInfo_GetVersion - R3 = buffer, R4 = size
ProgInfo_GetTitle
- Quit_ClassSWI - R2 = reason code
- Quit_SetMessage - R3 = string
Quit_SetTitle
- Quit_GetMessage - R3 = buffer, R4 = size
Quit_GetTitle
- SaveAs_ClassSWI - R2 = reason code
- SaveAs_SetTitle - R3 = string
SaveAs_SetFileName
- SaveAs_GetTitle - R3 = buffer, R4 = size
SaveAs_GetFileName
- Scale_ClassSWI - R2 = reason code
- Scale_SetTitle - R3 = string
- Scale_GetTitle - R3 = buffer, R4 = size
- Window_ClassSWI - R2 = reason code
- Window_AddGadget - R3 = gadget block
- Window_SetPointer - R3 = string
Window_SetHelpMessage
Window_SetTitle
- Window_GetPointer - R3 = buffer, R4 = size
Window_GetHelpMessage
Window_GetTitle
- Window_AddKeyboardShortcuts - R3 = num shortcurts, R4 = shortcut block
Window_RemoveKeyboardShortcuts
- Window_SetExtent - R3 = extent block
Window_GetExtent
Window_ForceRedraw
- Gadget_SetHelpMessage - R4 = string
ActionButton_SetText
Button_SetValue
Button_SetValidation
Button_SetFont
DisplayField_SetValue
DisplayField_SetFont
Draggable_SetSprite
Draggable_SetText
OptionButton_SetLabel
RadioButton_SetLabel
StringSet_SetAvailable
StringSet_SetAllowable
WritableField_SetValue
WritableField_SetAllowable
WritableField_SetFont
- Gadget_GetHelpMessage - R4 = buffer, R5 = size
ActionButton_GetText
Button_GetValue
Button_GetValidation
DisplayField_GetValue
Draggable_GetSprite
Draggable_GetText
OptionButton_GetLabel
RadioButton_GetLabel
WritableField_GetValue
- Gadget_GetIconList - R4 = buffer, R5 = size
- Gadget_MoveGadget - R4 = bounding box
Gadget_GetBBox
- StringSet_SetSelected - R4 = string if R0 = flags bit 0 is unset
- StringSet_GetSelected - R4 = buffer, R5 = size
- Window_ExtractGadgetInfo - R1 = window template
- ColourPicker_OpenDialogue - R1 = colour picker block
- ColourPicker_UpdateDialogue - R2 = colour picker block
ColourPicker_ReadDialogue
- ColourPicker_HelpReply - R1 = Help_Reply Message Block
- SharedCLibrary_LibInitAPCS_R
SharedCLibrary_LibInitAPCS_32
SharedCLibrary_LibInitModule
SharedCLibrary_LibInitModule_APCS32
- Shared C Library stub chunks, Kernel and CLib
- C trap handlers
- Static data areas
- KERNEL_INIT, KERNEL_MODULEINIT, KERNEL_ENTERMODULE
- Language description blocks
- Run time initialisation routines
- Module read/write area
- KERNEL_EXIT, _EXIT - terminates execution
- KERNEL_SWI, KERNEL_SWI_C, _SWI, _SWIX - SWI name displayed if R0 value is known
- KERNEL_RAISE_ERROR - error block at R0
- _CLIB_INITIALISE - address of routine assigned to R0 in following code
- _MAIN - address of continuation routine in R1
- _COUNT - 4 bytes of inline data follows
- _COUNT1 - 8 bytes of inline data follows
- SIGNAL - signal handler function in R1
The following data structures are identified and annotated in comments:-
- Word
- Byte accessed
- 5 byte Time
- SCL static data
- Float
- Double
- Extended Float
- Packed Float
- Extended Packed Float
- Module Offset
- Address
- Relocated Address
- String
- BASIC string
- Inline string
- Symbol
- Symbol Word
- Semaphore
- Linker Relocated Data
- AIF Header
- Module Header
- Chunk File Header
- AOF OBJ_HEAD chunk
- AOF OBJ_AREA chunk
- AOF OBJ_AREA chunk
- AOF OBJ_IDFN chunk
- AOF OBJ_SYMT chunk
- AOF OBJ_STRT chunk
- ALF LIB_DIRY chunk
- ALF LIB_TIME chunk
- ALF LIB_VRSN chunk
- ALF OFL_SYMT chunk
- ALF OFL_TIME chunk
- Module Command Table
- Module Service Table
- Module SWI Table
- Branch Table
- Read/Write Area Start
- Debug Data
- Debug Symbol Table
- Debug String Table
- SharedCLib Stub Chunk
- SharedCLib Language Block
- SharedCLib
- ResourceFS File
- Wimp Message List
- Wimp Bounding Box
- Wimp Window Block
- Wimp Icon Block
- Wimp Window Handle
- Wimp Icon Handle
- Wimp Open Window Block
- Wimp Window State Block
- Wimp Redraw Block
- Wimp Poll Block
- Wimp Poll Word
- Wimp Menu Block
- Wimp Message Block
- Toolbox Event List
- Toolbox Event Block
- Toolbox Object ID Block
- Toolbox Gadget
- Toolbox Shortcut
- Filing System Info Block
- Image Filing System Info Block
- Error Block
- Error Buffer
- Register Save Block
- Sprite Area
- Scale Factors
- VDU Variable List
- Mode Descriptor
- SockAddr
- MessageTrans Descriptor
- Colour Picker Block
- Colour Model Block
C++ Symbol names are unmanaged for display in comments, courtesy of code provided by Robin Watts.
The disassembly output is similar to that produced by the RISC OS debugger module, but with a greater knowledge of the ARMv4 instruction set, and more comprehensive comments as a result of the code analysis.
The comment sequence describes the level of surmisation, or confidence of the analysis.
;
| Positively identified
|
;~
| Surmisation level 1
|
;~~
| Surmisation level 2
|
;~~~
| Surmisation level 3
|
;?
| Failed to Identify
|
Prefixed with CAUTION:
Bad Address - assumes 26bit wrapping
| Instruction may assume branches will wrap around the 26 bit address boundary, in 32 bit mode will jump outside the bottom 64MB
|
Bad Address - Thumb mode
| Bit 2 of branch address set, which will result in thumb mode being select on later ARM's
|
Bad Address - unaligned
| Bit 1 of branch address set
|
Not 32bit safe
| Instruction does not have the same behaviour in 32-bit modes as in 26-bit modes
|
Not 32bit safe (uses PSR)
| PC used in Rd or Rm or LDM with {PC}^ may cause problems in 32-bit modes
|
Not 32bit safe (uses NV)
| Instruction uses the former NV conditional encoding, which is used to provide instruction set extensions on later ARM's
|
Should be a NOP
| Current instructions should be a NOP to prevent side effects from the previous insrtruction on some ARM variants
|
Uses a banked register
| Current instructions should not accessed a banked register, due to side effects from the previous insrtruction.
|
SWI after CDP
| SWI follows a coprocessor data instruction, which may cause problems on some ARM variants
|
Conditional after BL/SWI
| Conditional instructions used after subroutine or SWI (except conditions based on flags altered by the SWI and the V flag from flag altering subroutines), suggesting flag preservation has been assumed.
|
Manipulation of PSR in address?
| Instruction may be assuming a combined PC+PSR and is trying to maniplulate the PSR bits in what is otherwise and address
|
Unpredictable - negative unindexed
| Coprocessor data transfer unindex mode with a negative offset
|
Unpredictable - write back to PC
| LDR/STR, LDM/STM or coprocessor data transfer instruction writing back to the PC
|
Unpredictable - base register in list and write back
| Base register in list with writeback set for LDM/STM
|
Unpredictable - ! and ^
| Use of writeback and load user regsiters with LDM/STM
|
Unpredictable - PC with byte/half word
| Program counter loaded or stored with a non word LDR/STR variant
|
Unpredictable - write back with Rd=Rn
| Write back to register also used as destinaton in LDR/STR
|
Unpredictable - write back with Rn=Rm
| Write back to register also used as index ion LDR/STR
|
Unpredictable - write back used
| Write back to register illegal in PLD
|
Unpredictable - use of PC
| PC used in a multiply or SDS instruction
|
Unpredictable - Rd odd or R14
| Odd number register or R14 used in LDRD or STRD
|
Unpredictable - non unique registers
| Invalid use of same register more than once in a multiply or SDS instruction
|
Unpredictable - StrongARM bug - next op exec'd twice
| On a StrongARM a conditional MSR setting the control field causes the next instruction to be executed twice, so should be a NOP to prevent side effects.
|
Unpredictable - immediate with non flag fields
| A MSR instruction with immediate value setting the non flags fields may cause side effects due when altering values of currently reserved bits
|
Unpredictable - SBZ non zero
| Bits that should be zero in an instruction are set
|
Unpredictable - SBO not ones
| Bits that should be ones in an instruction are clear
|
Unpredictable - Rm=PC
| PC used as the Rm register which results architecture specific values
|
Invalid Instruction
| Invalid instruction found in code area
|
Self Modifing
| Write detected to area of code
|
Enabled when the target processor is specified on the command line. Prefixed with PERF:
Conditional LDM/STM maybe slow
| Conditional LDM's and STM's on StrongARM and XScale's are unrolled and take more then one cycle even if not taken, reducing code performance
|
Single register LDM/STM slower than LDR/STR
| Single register LDM's and STM's are slower than LDR's and STR#s on StrongARM and XScale. LDR Rd,[Rn],#4 or STR Rd,[Rn,#-4]! should be used in preference.
|
n cycle latency on register
| A register used in the current instruction will not be available for a number of cycles. For maximum performance code should be reordered so that other instructions which do not use this register, are inserted between the where the register is written and used.
|
ARMvN
| Instruction is only available the specified architecture number onwards.
|
Guarded non ARMvN instruction
| Instruction is not available on the ARM 2 or ARM 3 but is only executed if the processor is running in 26bit mode due to a previous code sequence
|
Guarded not 32bit safe instruction
| Instruction is not 32bit safe but is only executed if the processor is running in 32bit mode due to a previous code sequence
|
Entry Point
| Code entered directly from OS
|
Function entry
| Target of BL
|
Label
| Target of branch instruction or dynamic branch
|
Ends
| Flow of code ends at this point
|
Dynamic branch
| Manipulates PC to alter code flow
|
(Referenced)
| ADR or memory pointer references this location
|
(Read as Data)
| Code area is read by a data instruction
|
=value
| Decimal or ASCII representation of immediate value used in instruction
|
Data comments consist of the following
[construct]<data type> <read write specifier> <array specifier> [pointer]
Where:-
Construct
| If data has been identified as belonging to a construct
|
Data type
| One of the following:-
- Word
- Byte accessed
- SCL static data
- Float
- Double
- Extended Float"
- Packed Float
- Extended Packed Float
- Offset
- Relative Offset
- Address
- Relocated Address
- String
- Inline string
- Symbol
- Symbol Word
- Semaphore
- Debug Data
- ResourceFS Data
|
Read Write specifier
| -/- Not directly accessed
|
| r/- Read from
|
| -/w Written to
|
| r/w Read and written
|
Array specifier
| If accessed as an array via an index register
|
Pointer
| If data is valid offset or address, the data is dereferenced, indicated by ->
|
Assembly produces an ObjAsm style output, but is not guaranteed to be immediately usable in ObjAsm. It contains the following elements:-
Gives the original executable file name, and the version of the tool used to produce the file, and compilation instructions.
Any named SWI calls used in code are declared at the start of the assembly.
Labels are constructed using the following fields where identified
Code:
| L<Address>.[construct].[codeinfo | funcname]
|
Data:
| L<Address>.[construct].[datatype]
|
Where:-
Address
| 8-digit hex address
|
Construct
| Code or data construct
|
Codeinfo
| Information on entry point
|
Funcname
| Function name Identified from C symbol (not unmangled for C++)
|
Datatype
| Type of data
|
The assembly output should be compiled with ObjAsm using the -ABSolute flag, and linked by Link with the -bin flag. This will produce output files of type Absolute (&FF8), so for modules or other types the file type should be set appropriately.
The following statistical information is gathered on the executable, and displayed both as the number of words, and percentage of the file.
Size in words
| Total size of the executable.
|
Code
| Words identified as valid code.
|
Surmised
| Amount of code which was surmised as opposed to directly identified.
|
Uses PSR
| Uses the processor status register, which may cause problems in 32-bit modes.
|
Not ARM2/3
| Instruction is not available on ARM2 or ARM3 processors.
|
Not 32 bit
| Instruction does have the same behaviour in 32-bit modes as in 26-bit modes.
|
Unpredictable
| Instruction does not produce predicable results on all ARM variants.
|
Data
| Words identified as data.
|
Surmised
| Amount of data which was surmised as opposed to directly identified.
|
Warnings
| Number of warnings produced by code analysis.
|
Unidentified
| Words that could not be identified as code or data.
|
If a target processor is specified, the additional statistics are displayed.
Total Cycles
| Sum of all the instruction cycle counts in the executable.
|
Latencies
| Sum of all the instruction and register latencies identified.
|
0.01 08-Apr-2000 | Initial revision
|
0.10 19-May-2000 | Alpha release
|
0.11 23-May-2000 | 2nd Alpha release
|
0.12 23-May-2000 | 3rd Alpha release
|
0.13 29-Nov-2000 | 32 bit CLib support added
|
| LDR PC,[R13],#4 recognised as function exit
|
0.14 04-Dec-2000 | PullCall returns 0xFFFFFFFF if empty not 0
|
0.15 21-Apr-2001 | xpand used for unsqueezing absolutes
|
| unmodsqz used for squeezed modules
|
0.16 25-Apr-2001 | AOF and ALF file checking added
|
0.17 23-Jul-2001 | SWI parameter checking greatly expanded
|
0.18 10-Aug-2001 | HTML and XML formatting added
|
0.19 14-Aug-2001 | Custom format loading added
|
0.20 30-Aug-2001 | Debug data and C++ name unmangling added
|
0.21 01-Sep-2001 | First Beta release
|
| Formatting fixes for DDF and DDL
|
0.22 27-Sep-2001 | Fixed length string emble display
|
| Wimp menu display fix
|
| MessageTrans menu structure added
|
| MarkData() and MarkString() will not override higher priority constructs
|
0.23 30-Oct-2001 | XML tags formalised with introduction of a DTD
|
0.24 01-Jan-2002 | Code expected warning addresses fixed
|
0.25 20-Jan-2002 | OBJ_AREA relocation directive aware of instruction type
|
0.26 13-Feb-2002 | Command line arguments rearranged
|
| Output to file added, correct RISC OS filetype set
|
0.27 22-Feb-2002 | Fixed warnings not being output to file
|
0.28 01-May-2002 | Last word of code storage cleared before loading
|
| SDT2 type (LDR SB/SH/H) instructions added
|
| MUL and SDS invalid combinations rejected
|
| Removed 26bit wrapping from PC relative address calcs
|
0.29 02-Jun-2002 | 32bit SCL jump table unknown entries analysed correctly
|
0.30 06-Jul-2002 | WIMP structure priorities altered
|
| Prefix added to EmbleWimpIconData
|
0.31 26-Jul-2002 | Patch candidate statistics added
|
| Sub stats now percentage of main stat not total words
|
0.32 01-Sep-2002 | Asm warning links generated if not disassembling
|
| Mutex flag sequence end correctly detected with R14 DP's
|
| SDT target address calculation fixed by adding offset
|
| FindAddr and FindValue terminates on BL or LDM Rx
|
| Code start sequence finder recognises if PC is stacked
|
| Code and data stack tracing added
|
| Trailing .0 removed from FP constants for ObjAsm
|
| FP precision added to FIX for ObjAsm
|
| Title and warning lines prefixed with ';' in text output
|
| Branch table endpoint label removal problem fixed
|
| Mid string assembler label offsets generated
|
| References generated from MarkData address
|
| MakeString single and double quote bugs fixed
|
| $$ quoted in assembler strings
|
| Greater precision used for DCFS and DCFD values
|
| Character following escape ignored in string
|
| Only BASIC or unknown string types terminate on \r
|
| Address word identification prevented in SCL modules
|
| Relocation table tragets and end points marked as ref'd
|
| Detection of sequential strings improved
|
0.33 05-Sep-2002 | FindAddr FindValue conditional instruction checking
|
0.34 21-Sep-2002 | Explicit Immediate value & rotate used in ASM instructions
|
| Non 32bit compliant SWI warningd added
|
| Label prescan to ensure only valid asm labels are generated
|
0.35 04-Nov-2002 | CPSR and SPSR variants made compatible with ObjAsm
|
| mnemoaic_opts added for control of immediate and ADRs
|
| Suprious OS_WriteI SWI variants removed from OSLib port
|
| Invalid FP instructs with prec=3 and FIX const rejected
|
| All code using NV condition marked as not 32 bit
|
| Settype comment added to aseembler output for modules
|
| Library directory chunk date stamp displayed correctly
|
| String detection prevented from running off end of data
|
| Error block detection fixed
|
| Sound SWI groups &40140-&4amp;0180-&401C0 dispatch corrected
|
| Sound_Install voice installation header identified
|
| Wimp Message block size validated by analysis
|
| 32bit module header analysis and display added
|
| C symbols searched in reverse order for code detection
|
| Non XScale instruction warning added for LDR Rd,[Rd],#0
|
| Warning added for branching outside 64MB or with thumb bit
|
| Non RISC OS: Bogus names for SWI &100 to &1FF removed
|
| Non RISC OS: Sound SWI names added &40140-&40180-&401C0
|
| Non RISC OS: osfile funcs dont convert extn to lower case
|
| Non RISC OS: Territory_ConvertDateAndTime fixed
|
| !ARMalyser auto runs 26 or 32 bit RISC OS executable
|
0.37 28-Nov-2002 | Code cautionary descriptions improved
|
0.38 29-Nov-2002 | Display of new cautions from state and decoding
|
0.39 05-Dec-2002 | Analysis state stacking added
|
0.40 06-Dec-2002 | 26/32bit guarding and conditional exit detection enhanced
|
0.41 08-Dec-2002 | AOF and ALF with filetype text as well as data allowed
|
| Relocated addresses handled in register memory loads
|
| Fix to label generation in during analysis warnings
|
| CRT on control processor decode type corrected
|
0.42 22-Dec-2002 | 16 bit half word data type handling added
|
| ARMv5 load/store double word instrucions added
|
| Wimp Icon Data buffer and validation marked as address
|
| Long ADR recognised and real label with offset used
|
| Label+offset links fixed in HTML output
|
| OBJAREA_START marker placement validity check
|
0.43 31-Jan-2003 | SDT Rm=Rn with write back is unpredictable
|
| MarkData exits if length is > 16MB (or signed negative)
|
| Caution if comparing PC against value of 1<<31 or more
|
| ARMv5 Misc and DSP instructions added
|
| ARMv5 instruction display conditional on 32bit executable
|
| MessageTrans menu structure display corrected
|
| RO4 fast service entry show as address in service table
|
| Instructure architecture version displayed
|
| Shared C Library APCS-A recognised and marked as non 32bit
|
| Co-pro data transfer instruction data marking corrected
|
| ResourceFS file length displayed
|
| Performance (XScale register latency) information added
|
| LDR/STR register emulation offset sign calc corrected
|
| Target processor command line option added
|
0.44 31-Jan-2003 | Executable extended to encompase SCL static data areas
|
| Shared C Library _swi and _swix vectors correctly labelled
|
| Instruction issue latency added
|
| Regsiter result latencies adjusted
|
| Instruction shift and register shift added to decode info
|
| AIF header dectection tightened
|
| Register emu ignores loads from memory modified at runtime
|
| Data not marked on unaligned loads and stores
|
| Control terminated strings allowed in error blocks and various SWI parameters
|
| ALIGN in assembler output replaced by DCB's of spare data
|
| SpriteArea display fixed and enhanced
|
| R14 address checked on SDT dynamic branch
|
| NOP/No Banked caution not triggered on exclusive condition
|
| End of file label added to assembler output
|
| Register condition validity sep'd from value known flag
|
| Instruction unpredictable info calculated in main decode
|
| MSR immediate decoding and display fixed
|
| AOF code detection and file structure display enhanced
|
| Relative offset data type and display added
|
0.45 05-Apr-2003 | Dynamic branches with R14=PC+4 trated as subroutine
|
| Flag modifications tracked over dynamic branch subroutines
|
| Instruction latency cycles added to register trace output
|
| Total instruction latency cycles display option
|
| Branch throughput latency corrected
|
| OS_ReadLine32, OS_SubstituteArgs32, OS_HeapSort32 added
|
| Mnemonic field length alterd in assem and dissassem modes
|
| Brkpt marked as unpredictable if conditional
|
| Error block marked on MSR CSPR_f,#Vflag
|
| Width of SWI names in assembler EQU table mode increased
|
| Detection of branch to thumb mode fixed
|
| Removed banked register warning for PC
|
0.46 17-Aug-2003 | PSR state invalidated after flag setting DP instruction
|
| Z & C flag returning SWI knowledge added
|
| Conditional after BL/SWI improved to use SWI BL flag info
|
| Base field removed from discontiguous enum debug display
|
0.47 21-Mar-2004 | Last word of module service table not marked as array
|
| Object file code attribute explicitly flagged as 26bit
|
| C flag set for OS_GBPB and OS_BGet
|
0.48 05-Jul-2004 | Check for sensible SCL chunk id added
|
0.49 02-Mar-2005 | Module header end detection improved
|
0.50 30-May-2005 | Test for cond not compatible with flags set by instr
|
0.51 14-Nov-2005 | PLD not treated as dynamic branch even if not ARMv5
|
| BL/BLX & CLZ decode subtype numbers corrected
|
0.52 02-Dec-2005 | Construct start markers added
|
| Debug data bitfield type omission corrected
|
| Labels used for debug data pointers in assembler output
|
| Assembler & Dissambler output string generation improved
|
| ARMv5 decoding suppressed unless target XScale specified
|
| Fixed Rm state caclulation for DP with register shift
|
| Data backtrace location moved to pickup byte modifications
|
| Dots substituted for characters 128 to 159 in HTML output
|
0.53 22-Dec-2005 | Debug FileInfo structure not skipped if length field zero
|
| Debug FileInfo formating for 3 digit increments
|
| Undefined rd in COPRO_CTRL CDT fixed
|
| Help text updated
|
0.54 02-Feb-2006 | Fixed reg latency reporting only when reg values known
|
0.55 13-Apr-2006 | Performance analysis corrected and enhanced, ARM9 addded
|
| SWI number displayed for kernel_SWI and swi functions
|
| Checking of command line arguments added
|
- The SWI analysis code is largely untested.
- The parameter detection for following SWIs have not been implemented
- Econet - depreciated
- NetFS - depreciated
- Draw - data generally dynamic
- PDumper - specialised
- CDFS - documentation not available at time
- Squash - data generally dynamic
- BASICTrans - not common use
- FSLock - not common use
- DOSFS - 2 SWIs not common use
- AIF self-relocation code not supported.
The following features are planned in future versions:-
- Improve performance analysis.
- Emulation of PSR flag bits.
- Only invalidate registers altered by SWI's.
- Improve conditional register value validity processing.
- Ability to treat characters 128 to 159 as control types with separate tag so they are not displayed as unknown characters in browsers.