home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d2xx
/
d232
/
resourcedemo
/
docs
/
manual.doc
next >
Wrap
Text File
|
1989-08-02
|
172KB
|
3,358 lines
ReSource Reference Manual V1.0
For ReSource V3.05 and later
Intelligent Interactive Disassembler for Amiga® Programmers
Copyright © 1988, 1989 by Glen McDiarmid
All Rights Reserved.
Copyright Notice
ReSource software and documentation are copyright by Glen McDiarmid. No part
of the software or documentation may be reproduced, transmitted, translated
into other languages, posted to a network, or distributed by electronic or
other means without the express permission of the author, or his agents.
In an effort to minimize piracy, each copy of ReSource sold is individually
assembled and linked. Complex macros used during assembly are capable of
creating literally millions of unique code combinations, making it easy to
trace any illegal copies back to the original purchaser. Software thieves
will be prosecuted to the full extent of the law.
Disclaimer
No responsibility will be accepted for damage that may appear to have
resulted from the use of this product. The user assumes all responsibility
in using this product. The material contained in this documentation is
believed to be accurate, but the author reserves the right to update the
software and/or documentation without notice.
Distribution
ReSource software and documentation are available from:
Glen McDiarmid The Puzzle Factory
28 Marginson Street P.O. Box 986
Ipswich, Queensland Veneta, OR 97487
AUSTRALIA 4305 U.S.A.
(07) 812-2963 (503) 935-3709
Update Policy
Our update policy is very simple: For updates within a version (revision
changes only), we simply ask that you return your original ReSource disk. If
you provide postage and a return mailer, we will return it free of charge
with the latest revision of the software. Otherwise, there will be a charge
for media and shipping.
For major updates, we will charge a nominal fee. Please send in your
original ReSource disk and we will ship you the latest version.
Trademarks
Amiga, AmigaDOS, Kickstart, Intuition, and Workbench are trademarks of
Commodore-Amiga, Inc.
C.A.P.E. 68K, and C.A.P.E. are trademarks of Inovatronics, Inc.
FastFonts © by MicroSmiths, Blitzfonts © by Hayes Haugen.
[NOTE: Page numbers are only shown in the printed manual. Also, this
document is an early version, and there have been some additions and
corrections to the final, printed version. Sorry! JL]
Table Of Contents
Introduction . . . . . . . . . . . . . . . . . . . . . . . xx
Getting Started . . . . . . . . . . . . . . . . . . . . . xx
System Requirements . . . . . . . . . . . . . . . . . . xx
The Command Line . . . . . . . . . . . . . . . . . . . xx
Part 1. Tutorial . . . . . . . . . . . . . . . . . . . . xx
1. About the User Interface . . . . . . . . . . . . . xx
2. Definition of the Current Line . . . . . . . . . . xx
3. Disassembling a Program . . . . . . . . . . . . . . xx
4. About Menus . . . . . . . . . . . . . . . . . . . . xx
5. About Keys . . . . . . . . . . . . . . . . . . . . xx
6. About Load Files . . . . . . . . . . . . . . . . . xx
7. About Data Files . . . . . . . . . . . . . . . . . xx
8. About Output . . . . . . . . . . . . . . . . . . . xx
9. About Symbols . . . . . . . . . . . . . . . . . . . xx
10. Display Preferences . . . . . . . . . . . . . . . . xx
11. About Searches . . . . . . . . . . . . . . . . . . xx
12. ARP and Wildcards . . . . . . . . . . . . . . . . . xx
Part 2. Reference . . . . . . . . . . . . . . . . . . . . xx
1. PROJECT MENU . . . . . . . . . . . . . . . . . . . xx
1. Abort . . . . . . . . . . . . . . . . . . . . . xx
2. Open load file . . . . . . . . . . . . . . . . xx
3. Open binary file. . . . . . . . . . . . . . . . xx
4. Restore file . . . . . . . . . . . . . . . . . xx
5. Dismble memory . . . . . . . . . . . . . . . . xx
6. Read tracks . . . . . . . . . . . . . . . . . . xx
7. O'lay binary image . . . . . . . . . . . . . . xx
8. Save .RS . . . . . . . . . . . . . . . . . . . xx
9. About . . . . . . . . . . . . . . . . . . . . . xx
10. Quit . . . . . . . . . . . . . . . . . . . . . xx
2. DISPLAY MENU . . . . . . . . . . . . . . . . . . . xx
1. Hiliting (menu) . . . . . . . . . . . . . . . . xx
1. None . . . . . . . . . . . . . . . . . . . xx
2. BSS hunks . . . . . . . . . . . . . . . . . xx
3. DATA hunks . . . . . . . . . . . . . . . . xx
4. CODE hunks . . . . . . . . . . . . . . . . xx
5. Chip load hunks . . . . . . . . . . . . . . xx
6. Fast load hunks . . . . . . . . . . . . . . xx
7. Reloc32 . . . . . . . . . . . . . . . . . . xx
8. Symbol scan . . . . . . . . . . . . . . . . xx
9. Data type uncertain . . . . . . . . . . . . xx
10. Data type known . . . . . . . . . . . . . . xx
11. Internally produced refs . . . . . . . . . xx
2. Set data type (menu) . . . . . . . . . . . . . xx
3. Set numeric base (menu) . . . . . . . . . . . . xx
4. Decimal conversion (menu) . . . . . . . . . . . xx
5. Blank lines (menu) . . . . . . . . . . . . . . xx
6. Cursor address (menu) . . . . . . . . . . . . . xx
1. Relative . . . . . . . . . . . . . . . . . xx
2. Absolute . . . . . . . . . . . . . . . . . xx
7. Titlebar info (menu) . . . . . . . . . . . . . xx
1. Filename . . . . . . . . . . . . . . . . . xx
2. Attributes . . . . . . . . . . . . . . . . xx
3. Accumulator . . . . . . . . . . . . . . . . xx
8. Wrap . . . . . . . . . . . . . . . . . . . . . xx
9. Block-fill . . . . . . . . . . . . . . . . . . xx
10. Fill-in data types . . . . . . . . . . . . . . xx
11. Fill-in D/T Fwd . . . . . . . . . . . . . . . . xx
12. Set counter . . . . . . . . . . . . . . . . . . xx
13. Reset counter . . . . . . . . . . . . . . . . . xx
14. Flip case - code . . . . . . . . . . . . . . . xx
15. Flip case - data . . . . . . . . . . . . . . . xx
3. SYMBOLS1 MENU . . . . . . . . . . . . . . . . . . . xx
1. Set Source/dest (Menu) . . . . . . . . . . . . xx
2. Object (Menu) . . . . . . . . . . . . . . . . . xx
4. SYMBOLS2 MENU . . . . . . . . . . . . . . . . . . . xx
5. CURSOR MENU . . . . . . . . . . . . . . . . . . . . xx
1. Remember . . . . . . . . . . . . . . . . . . . xx
2. Clear loc stack . . . . . . . . . . . . . . . . xx
3. Relative (Menu) . . . . . . . . . . . . . . . . xx
1. Next byte . . . . . . . . . . . . . . . . . xx
2. Previous byte . . . . . . . . . . . . . . . xx
3. Next line . . . . . . . . . . . . . . . . . xx
4. Previous line . . . . . . . . . . . . . . . xx
5. Next label . . . . . . . . . . . . . . . . xx
6. Previous label . . . . . . . . . . . . . . xx
7. Next symbol . . . . . . . . . . . . . . . . xx
8. Previous symbol . . . . . . . . . . . . . . xx
9. Next section . . . . . . . . . . . . . . . xx
10. Previous section . . . . . . . . . . . . . xx
11. Next reloc32 . . . . . . . . . . . . . . . xx
12. Previous reloc32 . . . . . . . . . . . . . xx
13. Next page . . . . . . . . . . . . . . . . . xx
14. Previous page . . . . . . . . . . . . . . . xx
15. Skip forward . . . . . . . . . . . . . . . xx
16. Skip backward . . . . . . . . . . . . . . . xx
17. Next unparsed code . . . . . . . . . . . . xx
18. Next D/T change . . . . . . . . . . . . . . xx
19. Previous D/T change . . . . . . . . . . . . xx
20. Next uncertain D/T . . . . . . . . . . . . xx
21. Next backward reference . . . . . . . . . . xx
4. Absolute (Menu) . . . . . . . . . . . . . . . . xx
1. End of file . . . . . . . . . . . . . . . . xx
2. Start of file . . . . . . . . . . . . . . . xx
3. Forward reference . . . . . . . . . . . . . xx
4. Second forward reference . . . . . . . . . xx
5. Backward reference . . . . . . . . . . . . xx
6. Previous location . . . . . . . . . . . . . xx
7. Specify offset . . . . . . . . . . . . . . xx
8. Specify label . . . . . . . . . . . . . . . xx
9. Specify symbol . . . . . . . . . . . . . . xx
10. Specify percentage . . . . . . . . . . . . xx
5. Copy (Menu) . . . . . . . . . . . . . . . . . . xx
6. Paste (Menu) . . . . . . . . . . . . . . . . . xx
7. Swap (Menu) . . . . . . . . . . . . . . . . . . xx
8. Scrolling speed (Menu) . . . . . . . . . . . . xx
9. Normal search (Menu) . . . . . . . . . . . . . xx
1. Set search string . . . . . . . . . . . . . xx
2. Find next occurrence . . . . . . . . . . . xx
3. Find previous occurrence . . . . . . . . . xx
4. Find nearest occurrence . . . . . . . . . . xx
5. Search this line . . . . . . . . . . . . . xx
6. Search accumulator . . . . . . . . . . . . xx
10. Pattern search (Menu) . . . . . . . . . . . . . xx
6. LABELS MENU . . . . . . . . . . . . . . . . . . . . xx
1. Create single (Menu) . . . . . . . . . . . . . xx
1. End-of-line comment . . . . . . . . . . . . xx
2. Full-line comment . . . . . . . . . . . . . xx
3. Label . . . . . . . . . . . . . . . . . . . xx
4. Label - fwd ref . . . . . . . . . . . . . . xx
5. Symbol . . . . . . . . . . . . . . . . . . xx
6. Symbol - dest . . . . . . . . . . . . . . . xx
2. Edit single (Menu) . . . . . . . . . . . . . . xx
3. Replace single (Menu) . . . . . . . . . . . . . xx
1. Label . . . . . . . . . . . . . . . . . . . xx
4. Remove single (Menu) . . . . . . . . . . . . . xx
1. Label . . . . . . . . . . . . . . . . . . . xx
2. Symbol . . . . . . . . . . . . . . . . . . xx
3. End-of-line comment . . . . . . . . . . . . xx
4. Full-line comment . . . . . . . . . . . . . xx
5. All . . . . . . . . . . . . . . . . . . . . xx
5. Create multiple (Menu) . . . . . . . . . . . . xx
1. Reloc32 . . . . . . . . . . . . . . . . . . xx
2. All . . . . . . . . . . . . . . . . . . . . xx
7. LOCAL MACROS MENU . . . . . . . . . . . . . . . . . xx
8. GLOBAL MACROS MENU . . . . . . . . . . . . . . . . xx
9. STRINGS MENU . . . . . . . . . . . . . . . . . . . xx
1. Get (Menu) . . . . . . . . . . . . . . . . . . xx
1. Label . . . . . . . . . . . . . . . . . . . xx
2. Symbol . . . . . . . . . . . . . . . . . . xx
3. Symbol - dest . . . . . . . . . . . . . . . xx
4. Symbol value . . . . . . . . . . . . . . . xx
5. Symbol value - dest . . . . . . . . . . . . xx
6. End-of-line comment . . . . . . . . . . . . xx
7. Full-line comment . . . . . . . . . . . . . xx
8. Search string . . . . . . . . . . . . . . . xx
9. Filename . . . . . . . . . . . . . . . . . xx
10. Save .asm name . . . . . . . . . . . . . . xx
11. Save .RS name . . . . . . . . . . . . . . . xx
12. Macros filename . . . . . . . . . . . . . . xx
13. Keytable filename . . . . . . . . . . . . . xx
14. Cursor longword . . . . . . . . . . . . . . xx
15. Cursor offset . . . . . . . . . . . . . . . xx
16. Accumulator length . . . . . . . . . . . . xx
17. Partial save size . . . . . . . . . . . . . xx
18. File . . . . . . . . . . . . . . . . . . . xx
19. Attribute bits . . . . . . . . . . . . . . xx
2. Put label . . . . . . . . . . . . . . . . . . . xx
3. Put attributes . . . . . . . . . . . . . . . . xx
4. Edit functions (Menu) . . . . . . . . . . . . . xx
1. Clip start . . . . . . . . . . . . . . . . xx
1. Clip end . . . . . . . . . . . . . . . . . xx
1. Prepend . . . . . . . . . . . . . . . . . . xx
1. Append . . . . . . . . . . . . . . . . . . xx
1. Reverse . . . . . . . . . . . . . . . . . . xx
1. Lower case . . . . . . . . . . . . . . . . xx
5. Operand size (Menu) . . . . . . . . . . . . . . xx
6. Accumulator (Menu) . . . . . . . . . . . . . . xx
7. Maths functions (Menu) . . . . . . . . . . . . xx
1. Increment . . . . . . . . . . . . . . . . . xx
2. Decrement . . . . . . . . . . . . . . . . . xx
3. Add . . . . . . . . . . . . . . . . . . . . xx
4. Subtract . . . . . . . . . . . . . . . . . xx
5. Multiply . . . . . . . . . . . . . . . . . xx
6. Divide . . . . . . . . . . . . . . . . . . xx
7. Negate . . . . . . . . . . . . . . . . . . xx
8. Logical NOT . . . . . . . . . . . . . . . . xx
9. Logical AND . . . . . . . . . . . . . . . . xx
10. Logical OR . . . . . . . . . . . . . . . . xx
11. Exclusive OR . . . . . . . . . . . . . . . xx
8. Define string (Menu) . . . . . . . . . . . . . xx
9. Swap with buffer (Menu) . . . . . . . . . . . . xx
10. Input buffer (Menu) . . . . . . . . . . . . . . xx
11. Output buffer (Menu) . . . . . . . . . . . . . xx
10. SPECIAL FUNCTIONS MENU . . . . . . . . . . . . . . xx
1. Repeat last command . . . . . . . . . . . . . . xx
2. Dos Command . . . . . . . . . . . . . . . . . . xx
3. Zap . . . . . . . . . . . . . . . . . . . . . . xx
4. Screen (Menu) . . . . . . . . . . . . . . . . . xx
5. Set task priority . . . . . . . . . . . . . . . xx
6. Origin (Menu) . . . . . . . . . . . . . . . . . xx
7. Convert xx(A4) EA's (Menu) . . . . . . . . . . xx
8. Convert specific EA's (Menu) . . . . . . . . . xx
9. Data type set (Menu) . . . . . . . . . . . . . xx
10. Convert to.. (Menu) . . . . . . . . . . . . . . xx
11. Reloc32 (Menu) . . . . . . . . . . . . . . . . xx
11. SAVE MENU . . . . . . . . . . . . . . . . . . . . . xx
1. O/P Directory . . . . . . . . . . . . . . . . . xx
2. Partial save (Menu) . . . . . . . . . . . . . . xx
1. Set start . . . . . . . . . . . . . . . . . xx
2. Set end . . . . . . . . . . . . . . . . . . xx
3. Save binary image (Menu) . . . . . . . . . . . xx
4. Save .asm (Menu) . . . . . . . . . . . . . . . xx
5. Calculate .asm size (Menu) . . . . . . . . . . xx
1. All . . . . . . . . . . . . . . . . . . . . xx
2. Partial . . . . . . . . . . . . . . . . . . xx
6. Save to memory (Menu) . . . . . . . . . . . . . xx
7. Save tracks (Menu) . . . . . . . . . . . . . . xx
8. Tabs (Menu) . . . . . . . . . . . . . . . . . . xx
9. Symbol table (Menu) . . . . . . . . . . . . . . xx
12. OPTIONS1 MENU . . . . . . . . . . . . . . . . . . . xx
1. Show offsets (Menu) . . . . . . . . . . . . . . xx
2. Display beep (Menu) . . . . . . . . . . . . . . xx
3. User feedback (Menu) . . . . . . . . . . . . . xx
4. Feedback Delays (Menu) . . . . . . . . . . . . xx
5. Labels (Menu) . . . . . . . . . . . . . . . . . xx
6. Hidden labels (Menu) . . . . . . . . . . . . . xx
7. Symbols (Menu) . . . . . . . . . . . . . . . . xx
8. End-of-line comments (Menu) . . . . . . . . . . xx
9. Full-line comments (Menu) . . . . . . . . . . . xx
10. Chip-load info (Menu) . . . . . . . . . . . . . xx
11. Section statements (Menu) . . . . . . . . . . . xx
12. End statement (Menu) . . . . . . . . . . . . . xx
13. DCB statements (Menu) . . . . . . . . . . . . . xx
14. Reference recognition (Menu) . . . . . . . . . xx
13. OPTIONS2 MENU . . . . . . . . . . . . . . . . . . . xx
1. ASCII longs (Menu) . . . . . . . . . . . . . . xx
2. Short branches (Menu) . . . . . . . . . . . . . xx
3. Leading zeroes (Menu) . . . . . . . . . . . . . xx
4. Assembler (Menu) . . . . . . . . . . . . . . . xx
14. KEY BINDINGS MENU . . . . . . . . . . . . . . . . . xx
Introduction
ReSource was originally just an interactive disassembler, but Version 3 is
much more than this. Because ReSource can get its input from a file, track,
or memory, and output all or part to any of these, it is more of a general
purpose hacking tool. It can be used to browse through files, without ever
bothering to save anything, just to find out what is inside. It also knows
quite a bit about AmigaDOS(TM) and the Amiga® OS. This built-in intelligence
will save you a great deal of time when disassembling files. ReSource is
also blindingly fast. It is completely written in assembly language, and
does all text rendering using its own special internal routines.
When you run ReSource, you cannot do anything until you give it something to
work on. You can supply the name of the file to load on the command line:
1> [run] ReSource c:popcli
Alternatively, you can wait until ReSource starts running, and select a file
using the ARP file requester. For full specifications on command line
parameters, see below. Providing that there is enough memory available, you
can load ANY file into ReSource. If ReSource recognizes it as a load file
(one that can be run; an executable program), it will load the program,
and perform any necessary relocation, etc., as if the program is going to be
actually run. If the file that you request loaded is not a load file, it
will be loaded "as-is". Load files may be also loaded "as-is", by using the
"Load binary" function, in the "PROJECT" menu. This will give you access to
the hunk, symbol, and relocation information, that otherwise gets stripped
when the program is loaded into memory. Libraries, devices drivers, and
fonts are also load files, which means that you can disassemble them, save
the assembler source code, modify them, and re-assemble them.
Getting Started
If the version/revision of ReSource you have purchased is higher than the
version indicated on the title page of this manual, please refer to
"History.doc", an ASCII file on your ReSource disk containing incremental
documentation. A "ReadMe" file may also be present containing information
about your particular release of ReSource.
System Requirements
ReSource is designed to work on any properly configured Amiga® 500, 1000,
2000, or 2500.
Kickstart V1.2 or higher is required.
Because ReSource uses functions in the "ARP" library, you must have the file
"arp.library" in your "LIBS:" directory when you run ReSource. This file is
supplied with the commercial version of ReSource, and is available from most
BBS's. The version of "arp.library" must be 34 or higher.
While ReSource will run on a 512K Amiga®, you will be severely limited in the
size of programs that you may disassemble. One megabyte of RAM should be
considered the minimum necessary to disassemble all but the smaller programs,
and you will need 1 1/2 to 2 megabytes of RAM if you want to work with
programs larger than 30-40K.
To make the best use of the menus, run FastFonts©, or Blitzfonts©.
Otherwise, scanning through the menus will be very sluggish due to the large
number of sub-items.
The Command Line
When you run ReSource from a CLI, you can supply a parameter, so that
ReSource gets its input right away. The following parameters are accepted
with the following meanings:
1> ReSource <ProgName>
(The executable program <ProgName> will be loaded as a load file
ONLY if it is a load file. Otherwise it will be loaded as a
binary file)
1> ReSource *b <FileName>
(The file <FileName> will be loaded as a binary image)
1> ReSource *m <Sloc> <Eloc>
(Load memory, from location <Sloc> to location <Eloc>)
1> ReSource *DFn: <Scyl> <Ecyl+1> [#sec] [Offsec]
(Load from drive DFn: starting at cylinder <Scyl> and continuing
to <Ecyl+1>. The default is to read complete track(s). This may
be modified by the next two optional parameters: The fourth
parameter specifies that ReSource should read [#sec] sectors,
and the fifth parameter specifies that these sectors should start
at [Offsec] sector.)
1> ReSource *
(Kickstart(TM) as it appears in memory is loaded)
Examine the following examples:
1> ReSource c:popcli
(The program "popcli" will be loaded as a load file, from the C: device)
1> ReSource libs:arp.library
(Load the file "arp.library", from the LIBS: device, as a load file)
1> ReSource *b c:popcli
(The file "popcli" will be loaded as a binary image, from the C: device)
1> ReSource *m $FC0000 $FD0000
(The first 64K of Kickstart(TM) will be loaded)
1> ReSource *DF0: 0 0 1
(The boot sector from DF0: will be loaded, a total of 512 bytes.
Use this to check for/disassemble viruses)
1> ReSource *DF1: 40 41
(The entire directory cylinder from DF1: will be loaded, 11K in all)
1> ReSource *m $400 $800
(For most Amigas®, this will load the Exec library)
1> ReSource *m 0 1
(Load one byte of memory, at location zero)
ReSource may be "Run" without problem, and multitasks beautifully. It will
even allow you to change the task priority from inside ReSource.
Do not load ReSource from the Workbench(TM).
Tutorial
About the User Interface
Because of the large number of functions in ReSource, it was decided to use
one-and two-character menu names, so that more menus could be used. Looking
from the left, the first menu is "P", which stands for "PROJECT". The real
menu name is directly under the one-or two-character name, in capital
letters, so should be fairly easy to find them. In all future reference to
menus, the full menu name will be used.
In the reference section, a heading ending with a ":" refers to the lowest
hierarchical menu item for that function. In some cases, the heading will
end with a "/:" to indicate that there are several sub-items with related
functions being discussed under that heading, e.g.:
DISPLAY/Block-fill: Refers to a single item.
DISPLAY/Wrap/: Refers to a group of sub-items.
When describing a function, rather than tell you what key to press to invoke
that function, I'll describe where in the menus you will find it. For
example, the "Quit" function would be described as "PROJECT/Quit". The
function to restore the current file would be "PROJECT/Restore". You will
find both of these under the "PROJECT" menu. Functions in sub-menu boxes
will be described in a similar way, e.g., "SAVE/Tabs/Spaces". Because any
key can have any function bound to it (except "PROJECT/Abort"), key usage
will not be discussed, when referencing functions. However, to make it
easier to get started, some key bindings will be present, even without
loading a keytable. Note that loading a keytable may override these
keybindings:
up arrow..............................scroll up one line
down arrow............................scroll down line line
shift-up arrow........................page backward
shift-down arrow......................page forward
right arrow...........................forward reference
left arrow............................previous location
right-Amiga Q.........................quit
right-Amiga O.........................open a file
To rebind a key, select "KEY BINDINGS/Rebind key" from the menus, select a
function from the menus to have bound, then press the key that you want it
bound to. You can overwrite key bindings if you want. When done, you should
save the keytable as "S:RS.keytable". This can be done by selecting "KEY
BINDINGS/Save" from the menus. Even both of these functions can be bound to
a key, in fact the only function that is not practical to rebind is "PROJECT/
Abort", which is always bound to right-Amiga A.
A sample keytable is provided for your use. The key mapping used in the file
is described in a file named "MyKeyBindings.doc". Alternately, you may use
the supplied program "ShowKeys" to read your S:RS.keytable at any time.
ShowKeys may be used without parameters or it will accept the pathname of a
keytable as an optional parameter. You may want to redirect output to your
printer for hardcopy.
Definition of the Current Line
Many functions in ReSource operate only on the current line. Because there
is no real "cursor", it is necessary to define the "current line":
>> The "current line" is the top line, as you see it on ReSource's screen. <<
If there is a section statement (e.g., SECTION BSS) to be displayed at the
cursor address, this will be shown before any other text, and will force it
to be shown on the next line down. If this is not the first section
statement in the program, there will be an extra blank line, which will be
shown before the section statement. After the section statement, and before
the rest of the line, one or more "full-line comments" can be attached.
Immediately after the cursor line, any "hidden labels" will be shown. A
hidden label may also have a full-line comment attached, which will be shown
immediately before it, but after the cursor line. Note that in this example:
SECTION prog000000,CODE ;Section statement
;This is a full line comment!
;This is another full line comment!
MOVE.L D1-D4/A2-A6,-(SP) ;Line of code
all the above text is one line. Whenever you scroll up or down a line, all
parts of the "current line" will scroll together, which may sometimes be
visually jarring if there are many extra lines of text attached. To put it
simply, the first "real" line of code or data in the window is the current
line.
Disassembling a Program
To disassemble a program is to interpret what went into the program to make
it work. It can be a very complex and trying task, but with practice one can
become quite adept at it. There are many different and separate things to do
when disassembling. One of the most important is to separate the code from
the data. There is only one part of a load file that is guaranteed to be
code, and that is at the very start.
One very useful function of ReSource is its ability to scan lines of code,
looking for references to other parts of the program being disassembled.
When a reference is made, it creates a label at that address, which will be
used in all future references to that part of the program. More importantly,
ReSource can determine what type of data is being referenced, and be correct
(almost) every time. If you intend to reassemble the source, you should
still verify it before saving, as mistakes will occasionally occur. Before
ReSource makes a decision about what type of data is being referenced, it
examines many different pieces of information that are available, including
the actual instruction that made the reference. There are a few ways of
getting ReSource to scan lines of code. The simplest way is by using the
"LABELS/Create single/Label - fwd ref". This scans only the current line,
and does NOT advance the cursor.
If a line of code makes a reference to somewhere within the program, that
HASN'T got a label yet, it will be shown as some offset from the label
"START", which is imagined to be (but is not actually, unless YOU have done
it) attached to the first byte of the program. You could create a label
called "START", at the first byte of the program. However, when you re-
assemble, there is a chance that some different length instructions will be
generated. This will make all references past the first different length
instruction inaccurate.
Another way to get ReSource to scan lines of code is with the "LABELS/Create
multiple/ALL". This function scans the current line. If ReSource is
reasonably sure that it is code, it will scan the line, and move on to the
next line. This process will repeat until either the end of file, or until
ReSource believes that the current line may not be code, even though it may
currently be displayed as such. After executing this function, if the cursor
isn't at the end of file, and there is more code that hasn't been "scanned"
yet, you can scroll to the start of the next block of code, and execute this
function again, repeating until all code in the program has been scanned. At
this point, most references within the program will be to labels, and not use
the "START+$xxxx" type of reference. To make sure of this, you can set up a
search for "START+", and perhaps scan the lines individually.
There is still another way to scan code, and it may be best when you are
first starting to use ReSource and haven't yet learned when to scan the
entire program, and when not to. First, make the top of the file the current
line. Then, hold down the left-Amiga key, and while also holding down the
left mouse button, scroll through the file until you come to the end. This
sequence calls the function "LABELS/Create single/Label - fwd ref" repeatedly
and generates labels for all forward references within the file.
When all code in a program has been "scanned", the next function that you
will generally want to use is "DISPLAY/Fill-in data types". This function
does two passes over the entire program, and does NOT shift the cursor. The
first pass looks at what data types have been set, and makes some assumptions
about all places in the program where the data type has not been specifically
set. When you "Set data type", you are telling ReSource "this is CODE", or
"this is ASCII", or "these are to be displayed as bytes", etc. Generally,
this data type will be assumed from this byte forward, until the next byte
that has had the data type specifically set. Many conditions are tested when
making decisions about what type of data is where. Providing that you have
"scanned" all code in the program, after executing the "Fill-in data types"
function the resulting source code will look like source code should look.
The second pass in "Fill-in data types" is called "Calculating line lengths"
in the title bar. This is used to let ReSource know how far back to go, when
scrolling backwards. Also, string lengths are determined during this pass.
When you first load in a file, all line lengths are set to two bytes. When
scrolling forward, most things will be shown properly anyway, but if you
scroll backwards before first doing a "Fill-in data types", a jarring display
will result.
At this point, if you output to a ".asm" file, it will probably be good
enough to re-assemble. However, most people will want to examine the file,
and make it more readable, especially if the program needs to be modified.
An excellent place to start is by finding where any libraries are being
opened, finding where the library base is being stored, and giving meaningful
names to these data storage locations. Assume that the following code is a
small part of a program:
MOVE.L 4,A6
LEA START+$06B6(PC),A1
JSR -$0198(A6)
MOVE.L D0,START+$0C36
BNE.S START+$06AE
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S START+$06B2
JSR START+$0142
ADDQ.W #8,SP
RTS
BCC START+$0727
????
BGE START+$0725
BHI START+$0730
BSR START+$0732
????
After scanning all code in this program, it would look like this:
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR -$0198(A6)
MOVE.L D0,START+$0C36
BNE.S lbC0006AE
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S lbC0006B2
lbC0006AE JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'do'
dc.b 's.'
dc.b 'li'
dc.b 'br'
dc.b 'ar'
dc.b 'y',0
Next, "DISPLAY/Fill-in data types" will be used:
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR -$0198(A6)
MOVE.L D0,lbL000C36
BNE.S lbC0006AE
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S lbC0006B2
lbC0006AE JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
The astute will have noticed that because the A6 register was loaded from
location 4, it will point to the Exec library base. Therefore, the third
line of this block of code is a call to somewhere in the Exec library. By
scrolling so that this line becomes the top line on the screen, and selecting
the "SYMBOLS/Libraries/Exec", our block of code will now look like this:
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,lbL000C36
BNE.S lbC0006AE
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S lbC0006B2
lbC0006AE JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
Checking the documentation for the "OldOpenLibrary" Exec call will tell us
that on return, the D0 register will contain the library base for the library
just opened, if successful. Because we know that it was the DOS library that
was opened, the label "lbL000C36" referenced on the fourth line could now be
called "Dos_Base", instead of "lbL000C36":
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,Dos_Base
BNE.S lbC0006AE
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S lbC0006B2
lbC0006AE JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
If the D0 register DID contain a non-zero value, it means that "dos.library"
did open successfully, and the following conditional branch WILL be taken.
Where this branches to, is labeled "lbC0006AE". A better name for this might
be "DosOpenedOkay". Scroll so that the line "lbC0006AE JSR lbC000142" is on
the top line of the display, and select "LABELS/Create single/Label". When
requested, type in "DosOpenedOkay":
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,Dos_Base
BNE.S DosOpenedOkay
MOVE.L #$00038007,D7
JSR -$006C(A6)
BRA.S lbC0006B2
DosOpenedOkay JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
If the call to "OldOpenLibrary" was unsuccessful, the branch on the fifth
line would NOT be taken. In this case, the D7 register is loaded with the
value "$38007", and a call is made to the subroutine at offset -$6C from
where the A6 register is currently pointing. We do know that the A6 register
was pointing to the Exec library base before, and we also know that none of
the code executed so far has destroyed the value in A6, so we can safely
assume that A6 still points to Exec library base. Hence, by scrolling so
that the seventh line of this block is on the top line of the display, and
selecting "SYMBOLS/Libraries/Exec" again, our block will look like this:
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,Dos_Base
BNE.S DosOpenedOkay
MOVE.L #$00038007,D7
JSR _LVOAlert(A6)
BRA.S lbC0006B2
DosOpenedOkay JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
After reading the documentation for the Exec call "Alert", we find out that
on entry, the D7 register should contain a number representing an alert code.
By scrolling so the the line "MOVE.L #$00038007,D7" is on the top line of the
display, and selecting "SYMBOLS/A-B/Alert codes", our block will now look
like this:
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,Dos_Base
BNE.S DosOpenedOkay
MOVE.L #AT_Recovery!AG_OpenLib!AO_DOSLib,D7
JSR _LVOAlert(A6)
BRA.S lbC0006B2
DosOpenedOkay JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
Examining the include file "exec/alerts.i" will tell us that "AT_Recovery" is
used for recoverable alerts, "AG_OpenLib" means that a library failed to
open, and "AO_DOSLib" tells us which library is in question. Because this is
a recoverable alert, the following line of code ("BRA.S lbC0006B2") WILL be
executed, in which case we might change the label "lbC0006B2" to something
like "DosDidntOpen", or "NoDosAvailable". This is important, since if any
other code in this program makes a reference to one of the labels that we
have changed, it too will use the new name. In this example, another part of
the program that WAS:
lbC0007DE MOVE.L 4(SP),D1
MOVE.L lbL000C36,A6
JMP -$0024(A6)
lbC0007EA MOVE.L D4,-(SP)
MOVEM.L 8(SP),D1-D4
MOVE.L lbL000C36,A6
JSR -$008A(A6)
MOVE.L (SP)+,D4
RTS
lbC0007FE MOVE.L 4(SP),D1
MOVE.L lbL000C36,A6
JMP -$007E(A6)
now will be shown as:
lbC0007DE MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP -$0024(A6)
lbC0007EA MOVE.L D4,-(SP)
MOVEM.L 8(SP),D1-D4
MOVE.L Dos_Base,A6
JSR -$008A(A6)
MOVE.L (SP)+,D4
RTS
lbC0007FE MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP -$007E(A6)
After using the function "SYMBOLS/Libraries/Dos" a few times, it would become:
lbC0007DE MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP _LVOClose(A6)
lbC0007EA MOVE.L D4,-(SP)
MOVEM.L 8(SP),D1-D4
MOVE.L Dos_Base,A6
JSR _LVOCreateProc(A6)
MOVE.L (SP)+,D4
RTS
lbC0007FE MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP _LVOCurrentDir(A6)
To continue, we would replace a few labels:
CloseSUB MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP _LVOClose(A6)
CreateProcSUB MOVE.L D4,-(SP)
MOVEM.L 8(SP),D1-D4
MOVE.L Dos_Base,A6
JSR _LVOCreateProc(A6)
MOVE.L (SP)+,D4
RTS
CurrentDirSUB MOVE.L 4(SP),D1
MOVE.L Dos_Base,A6
JMP _LVOCurrentDir(A6)
Okay, so far so good. Now, where the line:
JSR lbC0007FE
used to be, it would be replaced by:
JSR CurrentDirSUB
This happens automatically, whenever you replace any label. The process
helps itself; starting is hardest, the rest come fairly easily.
In general, where a label is used, if you have any idea of what is happening
at all, you should replace it with a label that will remind you of what the
code is doing. It doesn't matter what name you use (as long as it is a legal
label for the assembler that you plan to use); if necessary you can replace
it with something better later on. Anything nominally mnemonic will be
superior to a "shop" label while you're trying to understand the code.
One last point that needs to be covered briefly is the cursor location stack.
When certain functions are called, or whenever YOU want to, the current
cursor loacation may be pushed onto ReSource's location stack. This will
allow you to easily move around in code. Returning to our example program,
place the second line, at label lbC000694, on the cursor line, and then
select "CURSOR/Absolute/Forward reference". The last line will move up to
the cursor line. You can now use "LABELS/Create single/Label" to change the
name "doslibrary.MSG" into something more meaningful, like "DosName". Now
use "CURSOR/Absolute/Previous location", and you will find yourself back at
the second line of the file, with a new name for the first operand. Normally
you will just use right-Arrow, and left-Arrow for these two functions rather
than using the menus.
MOVE.L 4,A6
lbC000694 LEA doslibrary.MSG(PC),A1
JSR _LVOOldOpenLibrary(A6)
MOVE.L D0,Dos_Base
BNE.S DosOpenedOkay
MOVE.L #AT_Recovery!AG_OpenLib!AO_DOSLib,D7
JSR _LVOAlert(A6)
BRA.S lbC0006B2
DosOpenedOkay JSR lbC000142
lbC0006B2 ADDQ.W #8,SP
RTS
doslibrary.MSG dc.b 'dos.library',0
About Menus
The menus in ReSource fully support drag-selecting, and multiple selection.
Many options within ReSource have a "checked" menu, which in most cases is
"hot". This means that even though ReSource may be busy doing something, if
you make a selection in the menus that effects the current operation, it will
take effect IMMEDIATELY. For example, while saving the source code to a
".asm" file, if you select "OPTIONS 1/Symbols/Off", from that point on, the
output file will not show any symbols. Similarly, if you selected "OPTIONS/
DCB statements/On" during the save, DCB statements would be used in the
output file from that point on. This feature is handy during the execution
of macros, as you will see in the section on macros.
About Keys
As mentioned previously, any function except the "PROJECT/Abort" function can
be bound to any key. All non-qualifier keys can be used, with or without any
of the following combinations of qualifier keys:
shift - left or right, or caps lock, all treated as one
alt - left or right, both treated as one
ctrl shift-ctrl alt-ctrl shift-alt shift-alt-ctrl
left-Amiga right-Amiga
For example, to rebind the "Open load file" function to right-Amiga O, select
"KEY REBINDINGS/Rebind key", then select "PROJECT/Open load file", then press
and hold down the right-Amiga key, press and release the "O" key, and finally
release the right Amiga key. From then on, instead of using the menus for
opening a file, you could just press right-Amiga O. To make this binding
permanent, you would save the current bindings, to a ReSource KEYTABLE.
Select "KEY BINDINGS/Save", and type in the name of a file to save the key
bindings to. If you want these bindings used every time you start ReSource,
you need to save the key bindings as "S:RS.keytable".
With many programs, when you press and hold down the down arrow key, to
scroll down, a backlog of key repeats will form, making it difficult to stop
the scrolling, even after releasing the offending key. Where this would be a
problem, the repeats are flushed, making key control better.
About Load Files
There are five functions that deal with loading. These are:
"PROJECT/Open load file"
"PROJECT/Open binary file"
"PROJECT/Restore"
"PROJECT/Dismble memory"
"PROJECT/Read tracks"
The first of these will examine the start of the file, to check if it is an
Amiga® load file. Amiga® load files include all executable programs
(excepting those using overlays), libraries, device drivers, and fonts. With
this type of load, ReSource examines, then strips out, all hunk, relocation,
and debug symbol information. This information is not lost, it is used
internally to ReSource, to make better decisions about data type setting, etc.
ReSource was designed with speed as the PRIMARY objective. It is does not
use memory sparingly. To load a file, ReSource sometimes requires a great
deal of memory, especially when disassembling large files. For any file, the
approximate memory requirement will be 6 to 10 times the file size. As a
further requirement, much of this is required to be contiguous. ReSource is
NOT practical on a 512K machine. If you have 2 Megs of fast memory, you will
be able to disassemble most programs. Users with 1 Meg machines will feel
constrained when attempting to disassemble 30-40K executables, but should
have little difficulty with programs smaller than this and most C: programs.
Any debug symbols will be shown as labels in their proper places within the
program, and even the relocation information is available. For example, if
you select "DISPLAY/Hiliting/Reloc32", any relocated pointers are hilited.
When disassembling, this information is quite valuable, as it helps you to
tell where code is, where tables of pointers are, etc. ReSource also makes
heavy use of this information in many functions, and this is one of the main
reasons that it is so accurate in determining data types, especially when
telling code from ASCII. The hunk information also tells you whether
something was meant to load into chip memory, which immediately lets you know
that it is probably graphics or sound data.
If a program has the debug symbols left in it, it makes the disassembling
process much easier. When the file is loaded, for each debug symbol found,
if it is nine characters long, starts with "lb", and is followed by an upper
case "A", "B", "C", "L", or "W", at the point that the label is attached, the
data type will immediately be set to ASCII, bytes, code, longwords, or words,
respectively. Additionally, local labels, of the "1$" variety, and labels
ending in "SUB" are recognized as code, and labels ending in ".MSG" are
recognized as ASCII.
Thus, if you have to disassemble a program that you previously disassembled,
then reassembled, most of the data types will be set for you, as the file is
loaded.
There is one other type of file that can be loaded in using "PROJECT/Open
load file", the ReSource data file, or ".RS" file. It is discussed in detail
in another section.
If ReSource cannot load the file as an Amiga® load file, it will
automatically attempt to load it as a binary file, without looking for hunk,
relocation, and debug symbol information. If it is an Amiga® load file, but
has been corrupted, ReSource will refuse to load it. You can still load it,
however, using the "PROJECT/Load binary file" function. With this function,
you can load any file that will fit into available memory. This is handy for
disassembling operating systems, or text files. In the case of normal Amiga®
load files, you may wish to examine the hunk information in them.
The "PROJECT/Restore" function will attempt to load the same file that you
loaded last, this is useful when you make a mess of things, and just want to
start again. The restore function is only usable when you loaded a file, NOT
when you disassemble memory directly, or read tracks from a floppy disk.
This will be fixed in a future version.
When you are asked to select a file using the file requester, you may cancel
the load immediately, and retain the current file. If you hit the "okay"
gadget, and the file is not successfully loaded, (perhaps because it is too
large for available memory), you have lost your current file. If, at this
time, you select "cancel", ReSource will give you the chance to quit, in case
you cannot or are unwilling to load any file. If you don't quit, ReSource
will again offer the file requester, where you may select a file to
disassemble.
About Data Files
The ReSource data file, or ".RS" file, is a file containing most of the data
areas internal to ReSource, while any particular file is loaded. This is
used to save your work, and later load it back into ReSource, so you can
continue disassembling a program some other time, without losing any of what
you have already done. You could even send this file to a friend, assuming
that he/she has purchased ReSource. This should be particularly useful in
disassembling the Amiga® operating system, (Kickstart(TM)), as the
Kickstart(TM) ".RS" file does not contain any copyrighted material, and so
can be legally distributed. This is only true for Kickstart(TM) ".RS" files.
The executable must be cleared before you distribute ".RS" files of any
program that is not in the Public Domain. See "PROJECT/O'lay binary image"
in the reference section. Be aware that you will require at least two megs
of fast memory to load a Kickstart(TM) ".RS" file. Even the cursor position
is saved in a .RS file, making it easy for you to remember what you were
doing last when you saved the ".RS" file. The ".RS" file is only recognized
with "PROJECT/Open load file", not the "PROJECT/Open binary file", although
you may load it as a binary image if you want.
It is the content of the file that allows ReSource to recognize a ".RS" file,
not the name of the file. However, the file should have an extension of
".RS", so it is immediately recognizable by humans as a ReSource data file.
To save your work (it doesn't matter how you loaded it), select "PROJECT/Save
.RS", and select a filename to save to.
About Output
Eventually, after disassembling a program, you will probably want to save it
as a text file, that you will later assemble, perhaps after doing some
modifications. By using the "SAVE/Save .asm" function, the entire file can
be saved as a text file, exactly as you see it on the screen. If you only
wish to save part of the file, use "SAVE/Save .asm/Partial".
Another output function is "SAVE/Save binary image". One use for this is to
perform modifications to a file, by overwriting the current information. For
example, if you have a program that has some annoying feature, you could
quickly find the offending code with ReSource, then simply overwrite it with
"NOP" instructions. You may use "SPECIAL FUNCTIONS/Zap" to enter "NOP"
opcodes as "'Nq" or "$4E71". Look up the hex values of any other opcodes
that you may need. Once this has been done, select "SAVE/Save binary image",
and you can use the file immediately, without going through the complete
disassemble/re-assemble/link process.
To find out how large the output .asm file will be, you can select "SAVE/
Calculate .asm size/ALL". This will tell you the output size, in bytes, K's,
and as a percentage of a floppy disk (which may be larger than 100%). If you
change any of the options, it will most probably have some effect on the size
of the output file. To make the output .asm file smaller, most things in the
"OPTIONS" menu should be switched OFF, except for "DCB instructions", which
if used, can shrink the size of a .asm file considerably, especially if there
are large data areas. Either real tabs (ASCII value 9) or spaces may be used
in the output file. Selecting "SAVE/Tabs/Real tabs" will also make the
output file size smaller, as will "DISPLAY/Blank lines/None". If the size of
the output file is not a problem, then set these options to suit your tastes.
Another way to deal with limited space for .asm files, is to save them as two
or more partial files using "SAVE/Save .asm/Partial" repeatedly.
Before leaving this section, a brief look at how ReSource achieves its fast
screen output is in order. All text that is displayed on the ReSource
screen, except that which is done for the menus by Intuition, uses text
rendering routines internal to ReSource. This makes text rendering extremely
fast, but also means that the font can't be easily changed. The text
rendering routines were originally inspired by Warptext II. The major
difference here is that four characters instead of one are rendered in the
main loop. This has the obvious benefit of increasing speed of rendering,
but is also the reason why the start and end of hilited areas are sometimes
displaced by up to 3 characters. For efficiency, large cleared areas (such
as the first tab in a line) are handled by separately. The blitter is
currently not explicitly used in ReSource at all.
About Symbols
When you create a symbol, unless you have set "SAVE/Symbol table" to "None",
the symbol and its value will be stored, so that a symbol table can be
created at the beginning of the output source code file. This symbol table
can take the form of an equate table, e.g.:
AG_OpenLib EQU $00030000
AO_DOSLib EQU $00008007
AT_Recovery EQU $00000000
_LVOAlert EQU $FFFFFF94
_LVOClose EQU $FFFFFFDC
_LVOCreateProc EQU $FFFFFF76
_LVOCurrentDir EQU $FFFFFF82
Alternatively, it can take the form of an "XREF" table, e.g.:
XREF AG_OpenLib
XREF AO_DOSLib
XREF AT_Recovery
XREF _LVOAlert
XREF _LVOClose
XREF _LVOCreateProc
XREF _LVOCurrentDir
The symbol table is also stored in a ".RS" file. When it is time to create
the .asm file, you can select either "EQU" or "XREF" as the type of symbol
table to create. Even though you may create many symbols with the same name,
the symbol table will contain only one entry for each symbol. Thus, it will
correctly assemble with most assemblers. If you select the "None" option, no
symbol table will be generated.
Display Preferences
To cater to different tastes, the manner in which ReSource displays
information may be varied dramatically. Overlong lines may or may not wrap
around, code may be shown in upper case, or lower case. Data declarations
may be shown in upper case or lower case. You may have blank lines appear
after conditional branches, after all branches, after system calls, or none
at all. Any number may be shown in hexadecimal, decimal, binary, or ASCII
if within the required range. Leading zeroes may be suppressed, or shown.
Numbers below 10 in value, or below 16 in value may be globally converted to
decimal, or there may be no conversion. Each line that doesn't start with a
label may instead show the current offset. Section statements, the END
statement, labels, hidden labels, symbols, and two types of comments may
individually be set ON or OFF at any time. The settings of these options can
be made permanent by selecting the required functions in Macro #19 (the last
local macro), and saving the macro table as "S:RS.macros". See the section
on macros for more information. Selecting "OPTIONS 1/Labels/Off" does NOT
remove any labels, it simply stops them from being shown, until you select
"OPTIONS 1/Labels/On". For example, you might wish to search for "lbC" as a
string inside a comment, and unless you turn labels off, you will have to
spend a long time searching for the real target, as many labels will start
with "lbC".
About Searches
ReSource has some very powerful search functions. You may select from a
normal search, or a pattern search. You may search forward, backward, or a
special combined search, that searches in both directions at the same time,
which will find the "nearest" occurrence of the search string. For use in
macros, you can also search just the current line, or the accumulator.
The text that you see on the display will be the text that is searched. For
the purpose of searches, tabs are set to real tabs, not spaces. Thus, if you
wish to search for:
MOVE.L #100,D0
you would press "tab" where you see spaces in the above line. When using the
pattern search, the wildcards are those used in all ARP programs. For
completeness, they are repeated here.
ARP and Wildcards
ARP has an extensive set of wildcards, and most ARP programs allow them to be
used. ARP supports ALL of the AmigaDOS(TM) set of wildcards, as well as the
more standard Unix style of wildcards. ARP supports the following wildcard
characters. Note that these are valid inside or out of quotes:
(a|b|c) Will match one of a, b or c. These can be patterns.
? Matches any single character
#<pat> Pattern repeated 0 or more times,
in particular, #? matches anything.
[char] A set of characters, for example,
[abc] or [a..c] specify the same set.
[^char] Match everything but this set of characters.
* 0 or more occurrences of any character.
These can be used in combination, of course, so that *.(c|h) or *.[ch] will
match any filenames ending in either .c or .h proceeded by any number of
characters, including no characters.
For example, if you want to search for "JSR" or "BSR", you could specify
"?SR" as the search pattern, and you would use the pattern search, not the
normal search. Here are some more examples:
lb[ABCWL] would find any occurrence of "lbA", "lbB", "lbC", "lbW", or "lbL"
"lbM" would NOT constitute a valid match.
J(MP|SR) -$????*(A6*) would get a match on the following lines:
JMP -$00C6(A6)
JSR -$00C6(A6)
JSR -$01FE(A6)
JMP -$FFFF(A6) but not on the following lines:
JMP $00C6(A6)
JSR -$00C6(A5)
JSR $1FE(A6)
JMP (A6)
Note that a real tab character was used above, between "J(MP|SR)" and
"-$????*(A6*)". During a search, it is unimportant whether tabs are set to
real tabs or spaces.
Reference Section
2.1.1 PROJECT/Abort:
Use this to abort searches and macros. This is the only function in ReSource
which should NOT be bound to a different key. It is permanently bound to
right-Amiga A, for "Abort".
2.1.2 PROJECT/Open load file:
ReSource will present the ARP file requester. When you either double-click
on a file name, select a file and press "return", or click on the "okay"
gadget, ReSource will attempt to load the file as an executable, or "load"
file. If there are any debug symbols in the executable, these will be
stored, and will become labels at the appropriate places in the file.
Relocation is performed where required. If the file has overlays, ReSource
will attempt to load the root hunk. Each debug symbol encountered is
attached to the appropriate byte in the file, and for those debug symbols
(labels) that are nine characters long, and start with "lb", immediately
followed by 'A', 'B', 'C', 'L', or 'W', the data type at the appropriate byte
will be set to ASCII, Bytes, Code, Longwords, or Words, respectively.
Additionally, local labels, of the "1$" variety, and labels ending in "SUB"
are recognized as code, and labels ending in ".MSG" are recognized as ASCII.
Any BSS hunks or uninitialized data areas found are expanded fully. You may
hilite areas where relocation has been performed by selecting "DISPLAY/
Hiliting/Reloc32".
You are limited to files smaller than 16 Megabytes, and further limited by
how much memory you have. To disassemble a 100K file, you will require
approximately 850K of memory, of which at least 400K must be contiguous. If
the file has large BSS hunks, this will greatly increase the memory
requirements. If you intend to load a file, do some zaps, then save it and
later run it, use "PROJECT/Open binary file" instead, otherwise the file will
get saved with the loader information stripped out of it.
2.1.3 PROJECT/Open binary file:
Similar to "PROJECT/Open load file", except that no translation of the file
is performed; the file is read in "as-is". This allows you to see the loader
information in executables, object files, etc. You can also load in text
files, data base files, in fact any file whatsoever, memory permitting. If
you select "PROJECT/Open load file" for a non-executable file, the file will
be loaded as a binary image instead, therefore "PROJECT/Open binary file" is
not really required except when you wish to force an "as-is" load for an
executable file. If you wish to do some zaps (small modifications) to an
executable file, (or an ".RS" file, for that matter) without going through
the disassemble/edit/reassemble/link cycle, you could load the file with this
function, do the zaps (see "SPECIAL FUNCTIONS/Zap"), then use "SAVE/Save
binary image/All" to save the modified program.
2.1.4 PROJECT/Restore file:
Useful only when the current buffer was loaded using "PROJECT/Open binary
file" or "PROJECT/Open load file". This function will attempt to load a file,
with the same name as the current file, using the same function that loaded
the current file originally. Do not use this function if the current buffer
was loaded from tracks, or directly from memory.
2.1.5 PROJECT/Dismble memory:
Disassembles a block of memory directly. You will be asked to supply a start
and end address for the memory region to be disassembled. The memory is NOT
copied to a separate buffer, it is disassembled "as-is", which means that if
you hold down the left mouse button, in some areas you can see the memory
being dynamically updated. It also means that you can modify memory
directly. Anywhere. For each address that you supply, if the number starts
with a "$", the number is assumed to be hexadecimal. If it starts with "%",
it is assumed to be a binary number. If neither, decimal is assumed. If you
wish to work on a COPY of a block of memory, to avoid modifying the original,
or perhaps because the original will not be around for long, disassemble the
memory directly, and save the data with the "PROJECT/Save .RS" function.
Then use "PROJECT/Open load file" to load the ".RS" file normally.
2.1.6 PROJECT/Read tracks:
You will be asked to supply the parameters for the track to read. The first
parameter must be either "DF0:", "DF1:", "DF2:", or "DF3:" (lower case is
okay). This represents the drive that holds the disk to be read from. The
second parameter is the number of the cylinder to start reading from. The
third parameter is the number of the last cylinder to be read, plus one. For
example, if you wanted to read the first cylinder from the disk in DF0:, the
parameters would be "DF0: 0 1". The fourth parameter is optional, and
represents the number of extra sectors to read. For example, if you wished
to read only the very first sector from DF1:, the parameters would be "DF1: 0
0 1". If you wished to read the first sector from the directory track of
DF2:, the parameters would be "DF2: 40 40 1". The fifth parameter is also
optional, and it represents the sector offset, to start the read. For
example, if you wished to read sectors nine and ten on cylinder 79 of the
disk in DF3:, the parameters would be "DF3: 79 79 2 9".
2.1.7 PROJECT/O'lay binary image:
This function prompts you for a filename. ReSource will attempt to open the
file, and read the contents, overlaying the current file. This is NOT the
same as opening a file normally, as all labels, symbols, comments, data
types, etc., stay as they are. Only the actual contents of the executable
itself are overwritten. For example, you may wish to pass on a ".RS" file to
someone, but because the program you have disassembled is copyrighted, you
cannot legally distribute the normal ".RS" file, as it contains the
executable. By using this function, and inputting a filename of "*"
(asterisk), ReSource will completely clear the executable within the current
file. You may then save to a ".RS" file, which may then be distributed,
devoid of the executable. If another person has previously purchased the
program that you have disassembled, they may load it into ReSource, and use
"SAVE/Save binary image/All", to save the executable to a file. They then
load the special ".RS" file which you created. Next, they then use "PROJECT/
O'lay binary image", supplying as a filename, the name of the file previously
saved with the "SAVE/Save binary image/All" function. This effectively puts
the executable back into the ".RS" file. The other save functions may then
be used, to save to a .asm file, for example.
Please make sure the executable section IS cleared before you share ".RS"
files that are disassemblies of copyrighted material. Failure to do this may
result in your meeting many new people - mostly lawyers.
2.1.8 PROJECT/Save .RS:
Use this function to save what you are currently working on, regardless of
how far you have gotten in disassembling it. EVERYTHING is saved, even your
current position within the file. Actually, if you disassemble the Amiga®
operating system directly, the ".RS" file that you create will NOT contain
the executable, therefore the ".RS" files can be legally distributed, as they
contain no copyrighted material. This is not the case for other ".RS" files,
as the executable will be saved along with other information. Please see
"PROJECT/O'lay binary image", above.
2.1.9 PROJECT/About:
Get information about the version number, author, agents, and people that
helped in the development of ReSource.
2.1.10 PROJECT/Quit:
Asks you for confirmation, then quits without saving. If this function is
used within an executing macro, it will NOT ask the operator for confirmation.
2.2.1.1 DISPLAY/Hiliting/None:
Use the hiliting functions to select attributes for which the data with those
attributes will be shown with the foreground/background colors inverted.
Selecting this function will disable all types of hiliting.
2.2.1.2 DISPLAY/Hiliting/BSS hunks:
Data within BSS hunks and uninitialized data areas will be hilited.
2.2.1.3 DISPLAY/Hiliting/Data hunks:
Data within data hunks will be hilited. Data hunks often will contain only
data constants, but may also contain code.
2.2.1.4 DISPLAY/Hiliting/Code hunks:
Data within code hunks will be hilited. Code hunks often will contain only
code, but may also contain data constants.
2.2.1.5 DISPLAY/Hiliting/Chip load hunks:
Data within code or data hunks that MUST be loaded into chip memory (only)
will be hilited. Data falling into this category will usually be graphics or
sound data, to be accessed directly by the blitter, copper or DMA.
2.2.1.6 DISPLAY/Hiliting/Fast load hunks:
Similar to the above function, except that the data is forced to load into
FAST memory only.
2.2.1.7 DISPLAY/Hiliting/Reloc32:
Being able to see where relocation has been performed is extremely useful
when disassembling a program. If it were not for the relocation information,
disassembling programs would be many times harder. ReSource makes use of
this information internally, especially when filling in data types.
2.2.1.8 DISPLAY/Hiliting/Symbol scan:
When you use the "LABELS/Create single/Label - fwd ref" or "LABELS/Create
multiple/All", all data scanned for references are marked as being scanned.
Use this function to hilite data falling into this category.
2.2.1.9 DISPLAY/Hiliting/Data type uncertain:
For most labels that ReSource creates automatically, it is certain of the
data type that it assigns. Sometimes though, it cannot be 100% sure, and
this function will hilite all lines that fall into this category.
2.2.1.10 DISPLAY/Hiliting/Data type known:
Similar to above function, only the lines where the ReSource WAS certain of
the data type, will be hilited. This will also include lines that YOU have
set using "DISPLAY/Set data type/" (see below).
2.2.1.11 DISPLAY/Hiliting/Internally produced refs:
All lines which have a label that was created by ReSource, rather than
directly by the user, will be hilited.
2.2.2 DISPLAY/Set data type/:
When you are certain of which type of data that you are looking at, select
from one of the sub-menu items: Code, ASCII, Bytes, Words, Longwords.
2.2.3 DISPLAY/Set numeric base/:
By default, all numbers are shown in hexadecimal (base 16). You can change
this to ASCII, DECIMAL, BINARY, or back to HEXADECIMAL on any line by
selecting from the appropriate sub-item. It is possible to change the
default to decimal for numbers less than 16, or less than 10, using the
decimal conversion function (see below).
The function "DISPLAY/Set numeric base/ASCII" will enable virtually any
number at all to be shown as ASCII, providing that no non-valid ascii
characters are present. Be aware that the following lines:
dc.l $4E
dc.l $4E00
dc.l $4E004E00
dc.l $4E4E00
dc.l $4E000000
dc.l $444F53
dc.l $444F5300
dc.l $4B49434B
will, by using the ASCII numeric base, be shown as:
dc.l 'N'
dc.l 'N'<<8
dc.l $4E004E00
dc.l 'NN'<<8
dc.l 'N'<<24
dc.l 'DOS'
dc.l 'DOS'<<8
dc.l 'KICK'
Note that the third line contained a non-valid ASCII character. Although
some others contained zeroes in the lower byte(s), they can be safely shown
as being an ASCII value shifted 8/16/24 to the left.
2.2.4 DISPLAY/Decimal conversion/:
By default, all numbers are shown in hexadecimal. You can have numbers less
than 16, or numbers less than 10, shown in decimal throughout the file, by
selecting one of the appropriate sub-items.
2.2.5 DISPLAY/Blank lines/:
To better define subroutines, and logical blocks of code, ReSource can insert
blank lines in the source code. You may select whether a blank line is
inserted after each conditional branch, unconditional branch, return, or
system call.
You may select more than one, in which case a blank line will appear after
any line which falls into any of the selected categories. A line will never
be followed by more than one blank line, regardless of how many selected
categories it falls into.
2.2.6.1 DISPLAY/Cursor address/Relative:
The cursor address will be shown in the title bar, as a hexadecimal offset
from the start of the file.
2.2.6.2 DISPLAY/Cursor address/Absolute:
The cursor address will be shown in the title bar, as a hexadecimal absolute
machine address. This allows you to quickly find the cursor position in
memory with other utilities, such as MetaScope, perhaps to carry out large
scale modifications.
2.2.7.1 DISPLAY/Titlebar info/Filename:
Information is displayed in the title bar in several fields. From the left,
the first is the program name. The second is a decimal number, representing
the cursor position relative to the file size, and is a percentage. The next
field is a hexadecimal number, representing the cursor position, and can be
shown either as an offset from the start of the file, or as an absolute
memory location. The next field is the one that this function relates to.
By selecting this function, the current file name will be shown. If user
feedback is ON, informative messages will sometimes be shown in this field
also.
2.2.7.2 DISPLAY/Titlebar info/Attributes:
The second field of the title bar will display information representing the
current attributes of the cursor byte. This information is NOT required for
general program usage, and was originally included for debugging purposes
only, and left in to satisfy those that want to know how the attributes table
in ReSource works. The attributes table is four times the size of the
current file, plus 16 bytes. It is used internally as a large bitmap, to
store information about each and every byte in the current file. Because it
is four times the file size, 32 bits are available for each byte in the
current file. For each character in the string displayed, if lower case, the
bit that that character represents is clear, if upper case, the bit is set.
Going from the left, the bit definitions are:
S: Start of a line of code/data
B: Bss hunk
D: Data hunk
C: Code hunk
R: Reloc32 area
F: First byte of reloc32 area
L: Label attached to this byte
S: Symbol attached to this byte
F: Full-line comment attached to this byte
E: End-of-line comment attached to this byte
P: Parsed previously (symbol scan)
I: Internally referenced
L: Low priority. The data type has been set, but can be overridden by
internal routines. The data type can always be overridden by the
user. This bit was generally set when ReSource had to decide on a
data type to set for a byte, but when it did so, it wasn't really
sure that it was correct.
A: Show numeric operands as ASCII if possible. Decimal conversion
is on a higher priority than this bit.
B: Show numeric operands as Binary. Decimal conversion is on a higher
priority than this bit.
D: Show numeric operands as Decimal if possible.
F: Data in this hunk is to be loaded into FAST memory only.
C: Data in this hunk is to be loaded into CHIP memory only.
: [Next 4 bits are reserved for future use]
U: User should check the data type that has been set, as ReSource wasn't
really sure that it chose the correct one. Use "CURSOR/Relative/Next
uncertain D/T" to find the next occurrence. If such a line is already
the current line when you use that function, it will clear this bit.
H: High priority. The data type has been set either by the user, or by
ReSource when it was quite certain that it set the data type
correctly. This does not mean that it cannot make mistakes, it
simply means that if some operation attempts to set the data type for
this byte, it will NOT override the currently set data type. This
will not ever stop the user from redefining the data type, however.
C: This line is code.
dddd: Data type hasn't been set yet
ddDd: Data type is bytes
dDdd: Data type is words
dDDd: Data type is longwords
Dddd: Data type is bytes, within a BSS hunk or uninitialized data area.
DddD: Data type is ASCII.
DDDd: Data type is words, within a BSS hunk or uninitialized data area.
DDDD: Data type is longwords, within a BSS hunk or uninitialized data area.
2.2.7.3 DISPLAY/Titlebar info/Accumulator:
The third field of the title bar will display information representing the
contents of the ACCUMULATOR. This is a 240 byte buffer, used as a central
number and string processor, which will find most of its uses within macros.
Only the first 30 characters or so can be shown in the title bar. However,
often the string will not be longer than that anyway. For more information
on the accumulator, see the functions within the "STRINGS" menu.
2.2.8 DISPLAY/Wrap/:
With wrap on, any lines longer than the current display width will be shown
on several lines, much the same way that text editors allow you to use word
wrap. Otherwise, any lines longer than the current display width will be
truncated.
2.2.9 DISPLAY/Block-fill:
Some background information is required here: ReSource internally keeps a
stack of cursor locations. The current cursor location is "pushed" onto this
stack with any use of the following functions:
CURSOR/Remember
CURSOR/Absolute/End of file
CURSOR/Absolute/Start of file
CURSOR/Absolute/Forward reference
CURSOR/Absolute/Second forward reference
CURSOR/Absolute/Backward reference
To "pop" a cursor location, you use the function "CURSOR/Absolute/Previous
location". The stack is cleared when you load a new file. The stack is NOT
stored within ".RS" files.
Block-fill uses the cursor location stored on the top of this location stack,
finds out what the data type at that location has been set to, and copies
that data type to all locations between there and the current cursor
location. It has several disadvantages, and should be used only when special
display effects are required. For example, if you wish to display a file as
bytes throughout, even though much of it is actually code or ASCII, this
function may come in handy.
2.2.10 DISPLAY/Fill-in data types:
This function has several uses, and will be one of the most-used functions.
To understand what this function does, you will need to know how ReSource
keeps track of data types. Suffice it to say, when you set the data type
anywhere within a file, that data type is immediately echoed forward, to a
maximum of several hundred bytes, but will not change any other places where
the data type has already been set, or where there is a label on a line.
Where there is large areas of a file where the data type has not been set,
this function attempts to set the data type appropriately. All of this is
done on the first pass. On the second pass, the length of each line is set.
This is particularly useful where there are large areas of ASCII. This
function should always be used before saving a file as source code.
2.2.11 DISPLAY/Fill-in D/T Fwd:
Similar to the above function, except that both passes will start from the
current cursor location, and NOT the start of the file. Also, the action of
this function will stop at the end of the current section, OR the end of the
file, whichever occurs first. Useful if you need to make changes to data and
BSS areas towards the end of the file.
2.2.12 DISPLAY/Set counter:
If cursor address has been set to "relative", the current offset in a file is
shown in the title bar, in hexadecimal. This is normally zero at the start
of the file. You can change this, so that it is zero at somewhere other than
the start of the file, by using this function. You may use this function to
measure the size of a hunk, for example. To "reset" the counter, use the
function "DISPLAY/Reset counter". If cursor address has been set to
"absolute", it will correctly display the current address of the cursor,
regardless of this function.
2.2.13 DISPLAY/Reset counter:
Similar to the above function, except that the cursor position is assumed to
be at the start of the file.
2.2.14 DISPLAY/Flip case - code:
If code is currently being displayed using upper case, it will be instead
shown in lower case, and vice versa. Note that all searches are case
sensitive.
2.2.15 DISPLAY/Flip case - data:
If data is currently being displayed using upper case, it will be instead be
shown in lower case, and vice versa.
2.3 SYMBOLS 1/:
Some background information is required here: When you assemble a program,
you will use symbols such as "_LVOAllocMem", "MEMF_CHIP", "Open",
"MODE_OLDFILE", etc. When you disassemble a program, you see only the
numbers that equate to the symbols that you used. To convert these numbers
back into strings, you basically tell ReSource what the "symbol base" is, and
it will do the rest. For example, in the following line:
JSR -$0228(A6)
the number "-$0228" could be interpreted in many different ways. If you
happened to know that the A6 register at that point in the program was
pointing to the Exec library base, you would interpret that line as:
JSR _LVOOpenLibrary(A6)
To make ReSource do this automatically, you would scroll so that this line
became the cursor line, and then select the function "SYMBOLS 1/Libraries/
Exec", or "SYMBOLS 2/E-G/Exec library". There are hundreds of other symbol
bases that are available, including libraries, devices, structures,
parameters, and error code names.
2.3.1 SYMBOLS 1/Set Source/dest/:
Examine the following line of code:
MOVE.L #-$0228,$0022(A6)
If you wished to create a symbol for the second number on this line, "$0022",
you should first select "Destination". The setting of "Set Source/dest" will
go back to "Source" with virtually any function you use, therefore when
creating a symbol for the second field in a line of code, use "SYMBOLS 1/Set
Source/dest/Destination" only just prior to actually creating the symbol.
2.3.2 SYMBOLS 1/Object/:
By default the number, or object, used to find the string will come from the
cursor line. You can instead have ReSource get the number from the
accumulator, by selecting "Accumulator". In this case, the output string
will be placed back into the accumulator. To set it back, select "Cursor".
2.4 SYMBOLS 2/:
Some special symbol bases are in the "SYMBOLS 1" menu, mostly different
library bases. The remainder are in alphabetical order in the "SYMBOLS 2"
menu.
2.5.1 CURSOR/Remember:
ReSource keeps a stack of cursor locations internally. Using this function
will "push" the current cursor location onto the top of this stack. Other
functions that call this function are:
CURSOR/Remember
CURSOR/Absolute/End of file
CURSOR/Absolute/Start of file
CURSOR/Absolute/Forward reference
CURSOR/Absolute/Second forward reference
CURSOR/Absolute/Backward reference
To "pop" a cursor location, you use the function "CURSOR/Absolute/Previous
locations". The stack is cleared when you load a new file, or when you select
"CURSOR/Clear loc stack". The stack is NOT stored within ".RS" files.
2.5.2 CURSOR/Clear loc stack:
See above function.
2.5.3.1 CURSOR/Relative/Next byte:
The cursor location is incremented. If at the last location within the
current file, a macro "fail" will result.
2.5.3.2 CURSOR/Relative/Previous byte:
The cursor location is decremented. If at the first location within the
current file, a macro "fail" will result.
2.5.3.3 CURSOR/Relative/Next line:
Scroll forward one line of code/data. If at the last line of code/data in
the file already, a macro "fail" will result. The speed at which this scroll
is done is set by the "CURSOR/Scrolling speed" settings.
2.5.3.4 CURSOR/Relative/Previous line:
Scroll backwards one line of code/data. If at the first line of code/data in
the file already, a macro "fail" will result. The speed at which this scroll
is done is set by the "CURSOR/Scrolling speed" settings.
2.5.3.5 CURSOR/Relative/Next label:
Move cursor to the next location that has a label attached to it. If one
cannot be found, a macro "fail" will result.
2.5.3.6 CURSOR/Relative/Previous label:
Move cursor to the previous location that has a label attached to it. If one
cannot be found, the start of the file will become the new cursor position.
2.5.3.7 CURSOR/Relative/Next symbol:
Move cursor to the next location that has a symbol attached to it. If one
cannot be found, a macro "fail" will result. Note that this location may be
in the middle of a line of code. Where the actual operand is stored will
become the new cursor position.
2.5.3.8 CURSOR/Relative/Previous symbol:
Move cursor to the previous location that has a symbol attached to it. If
one cannot be found, the start of the file will become the new cursor
position. Note that this location may be in the middle of a line of code.
Where the actual operand is stored will become the new cursor position.
2.5.3.9 CURSOR/Relative/Next section:
Move cursor to the start of the next section (hunk). If this is the last
section in the file, a macro "fail" will result.
2.5.3.10 CURSOR/Relative/Previous section:
Move cursor to the start of this section (hunk). If already at the start of a
section, move to the start of the previous section.
2.5.3.11 CURSOR/Relative/Next reloc32:
Move cursor to the start of the next relocated longword. If one cannot be
found, a macro "fail" will result. Note that this may be in the middle of a
line of code.
2.5.3.12 CURSOR/Relative/Previous reloc32:
Move cursor to the start of the previous relocated longword. Note that this
may be in the middle of a line of code. If one cannot be found, the start of
the file will become the new cursor position.
2.5.3.13 CURSOR/Relative/Next page:
Move cursor forward 24 lines.
2.5.3.14 CURSOR/Relative/Previous page:
Move cursor backwards 24 lines.
2.5.3.15 CURSOR/Relative/Skip forward:
Move cursor forward approximately 4K.
2.5.3.16 CURSOR/Relative/Skip backward:
Move cursor backward approximately 4K.
2.5.3.17 CURSOR/Relative/Next unparsed code:
Move cursor forward to the next location that satisfies both of the following
conditions:
1. The data type has been set to CODE
2. This location has NOT been scanned for forward references previously.
This function is useful when combined with the "LABELS/Create multiple/All"
function.
2.5.3.18 CURSOR/Relative/Next D/T change:
Move cursor to the next location that has its data type set differently than
the data type at the current cursor location.
2.5.3.19 CURSOR/Relative/Previous D/T change:
Move cursor to the previous location that has its data type set differently
than the data type at the current cursor location.
2.5.3.20 CURSOR/Relative/Next uncertain D/T:
Move cursor forward to the next location that has the "Uncertain" bit set in
the attribute table. This bit indicates that ReSource really wasn't sure of
the data type of this byte.
2.5.3.21 CURSOR/Relative/Next backward reference:
Once you have used the "CURSOR/Absolute/Backwards reference" function, you
can use this function to get to other backward references.
2.5.4.1 CURSOR/Absolute/End of file:
Move cursor to the start of the last line of the file.
2.5.4.2 CURSOR/Absolute/Start of file:
Move cursor to the start of the file.
2.5.4.3 CURSOR/Absolute/Forward reference:
If there is a reference to a position in the current file within the current
line of code, move cursor to the location being referenced. If there are two
forward references within the current line, the first is used.
2.5.4.4 CURSOR/Absolute/Second forward reference:
If there are two references to a position with the current file, within the
current line of code, move cursor to the second location being referenced.
If there are less than two forward references, a macro "fail" will result.
2.5.4.5 CURSOR/Absolute/Backward reference:
Starting from the start of the file, search for references to the cursor
location. If there are several references, you can use "CURSOR/Relative/Next
backward reference" to get to successive references.
2.5.4.6 CURSOR/Absolute/Previous location:
"Pop" the cursor location from the top of the cursor location stack. If the
stack is empty, a macro "fail" will result.
2.5.4.7 CURSOR/Absolute/Specify offset:
You will be asked to supply an offset representing how far from the start of
the file, the cursor location should be. The number may be specified in
hexadecimal, decimal, or binary. If hexadecimal, the string must start with
"$", if binary, it must start with "%". If the given offset is not within
the current file, this function will fail.
2.5.4.8 CURSOR/Absolute/Specify label:
You will be asked to supply the name of a label. If the label is used within
the current file, its location will become the new cursor location. Note
that this may be in the middle of a line of code.
2.5.4.9 CURSOR/Absolute/Specify symbol:
You will be asked to supply the name of a symbol. If the symbol is used
within the current file, its location will become the new cursor location.
Note that this may be in the middle of a line of code. Also note that if
there is more than one symbol of that name, ReSource will pick the one that
was defined first.
2.5.4.10 CURSOR/Absolute/Specify percentage:
You will be asked to supply a decimal percentage of the current file, where
the cursor will be positioned. In this case 0 is the beginning of the file
and 99 is the end. Note that this may be in the middle of a line of code.
The actual positioning will not be exact. It will generally be placed a
little before the required percentage.
2.5.5 CURSOR/Copy/:
2.5.6 CURSOR/Paste/:
2.5.7 CURSOR/Swap/:
Some background information is required here: ReSource has 3 internal cursor
"clipboards". You can copy a cursor location to any of these, and then later
"paste" one of these locations, which in effect moves the cursor to where it
was when you used the "copy" function. Also, you can swap cursor locations,
between the current, and a stored cursor location. The contents of these
cursor "clipboards" are cleared when you load a new file, or restore the
current one.
2.5.8 CURSOR/Scrolling speed/:
Whenever you use either "CURSOR/Relative/Next line" or "CURSOR/Relative/
Previous line" functions, the text on the display will move N number of
display lines (NOT text lines) at a time. This is how most text editors,
word processors, etc., scroll text.
Scrolling Lines
Speed Scrolled Notes
--------- -------- -----
Very fast 8 Exceptionally fast scrolling, good for scanning
through a file.
Fast 4 Reasonably fast scrolling, allows scanning,
but difficult to read.
Normal 2 Reasonably smooth scrolling, allowing you to
read text fairly easily WHILE it is scrolling.
Slow 1 Extremely smooth scrolling, allowing you to
easily read text WHILE it is scrolling.
Very Slow 1 w/delay Exceptionally smooth scrolling, and is
excellent for slowly browsing through a file.
2.5.9.1 CURSOR/Normal search/Set search string:
You will be asked to supply a string, which will be used in future searches.
Like all other string requests, you may instead supply a two byte string,
starting with escape, and followed by either another escape character, or a
letter a-m, representing a string buffer where the string should be copied
from. If you supply escape-escape as the string, the string currently in the
accumulator will be copied into the search string buffer.
2.5.9.2 CURSOR/Normal search/Find next occurrence:
Using the currently defined search string, search forward for the next
occurrence of that string. The string is searched for as-is, including
question marks, asterisks, etc., which in a pattern search take on special
meaning.
2.5.9.3 CURSOR/Normal search/Find previous occurrence:
Similar to the above function, except that the search proceeds backwards.
2.5.9.4 CURSOR/Normal search/Find nearest occurrence:
Similar to the above function, except that the search proceeds in both
directions at the same time. The search is done line-for-line, and the first
line that contains the search string, whether it be before the current cursor
or after, will become the new cursor location. This function is handy when
you know that a string is somewhere close, but you're not sure whether it may
be just past, or just before, the current cursor location. Note that you may
NOT use this function to find the second occurrence of a string; it will keep
finding the same two closest occurrences.
2.5.9.5 CURSOR/Normal search/Search this line:
This function is useful in macros, for determining whether a given string is
within the current line. If the search string is not found in the current
line, a macro "fail" will result, and unless your macro has prepared for this
condition with an "End conditional" directive, the macro will abort.
2.5.9.6 CURSOR/Normal search/Search accumulator:
Similar to the above function, except that the accumulator is searched.
2.5.10 CURSOR/Pattern search/:
These functions are identical to their counterparts above, except that "Set
search pattern" is used instead of "Set search string" and ARP wildcard
characters are expanded (not used literally).
2.6.1.1 LABELS/Create single/End-of-line comment:
You will be asked to supply a string of less than 240 characters, which will
become a comment to be attached to the end of the cursor line. Only one end-
of-line comment is allowed per line; if you create one on a line that has
already got one, it will replace the old comment.
2.6.1.2 LABELS/Create single/Full-line comment:
You will be asked to supply a string of less than 240 characters, which will
become a comment to be attached to the start of the cursor line. Multiple
full-line comments are allowed, and successive comments will be displayed
AFTER previously defined full-line comments. Normally, full-line comments
will be displayed starting with a semicolon (";"). However, if you start the
string with a semicolon, the logic is reversed, and it becomes an extra line
of code/data. Thus, you can insert extra lines of code/data, even before
saving the source code to a text file. By creating a label that starts with
a semicolon for a given line, when that code is assembled, that line of code/
data is effectively treated as a comment only, therefore you can both insert
and effectively remove code/data using ReSource, during the disassembly
process.
2.6.1.3 LABELS/Create single/Label:
You will be asked to supply a string of less than 240 characters, which will
become a label to be attached to the cursor line. Duplicate labels are NOT
allowed, unless they start with a semicolon (";"), an asterisk ("*"), or a
number directly followed by a "$". This last case is useful for creating
local labels, but be careful. They are not checked for duplication and if
used imprudently may make your assembler very unhappy. In the first two
cases, they effectively make the rest of the line a comment. If this
function is used within a macro, duplicate labels WILL be accepted.
2.6.1.4 LABELS/Create single/Label - fwd ref:
The current line of code will be searched for references to positions within
the current file. If any are found, ReSource will make a decision on which
type of data is at the position referenced. It will then set the data type
(unless it has already been set), and create a label at that offset (unless a
label has already been defined for that location). This new label will be
immediately used for all references to that location, which of course
includes the reference within the current line. If there are no references,
or there is a reference, but it is outside of the range of the current file,
then this function will do nothing. Normally, this function will only be
used within macros, as it is easier and quicker to hold down the left-Amiga
key, while holding down the left mouse button, possibly while scrolling also.
2.6.1.5 LABELS/Create single/Symbol:
You will be asked to supply a string, which will replace the first
encountered number in the current line. For example, if you supplied the
string "MyColdStartData", the following line:
MOVE.L D0,4(A0) would become:
MOVE.L D0,MyColdStartData(A0)
If there is more than one number mentioned in the current line, the first is
used. If there are no numbers in the current line, a macro "fail" will
result.
2.6.1.6 LABELS/Create single/Symbol - dest:
Similar to the above function, except that the second number in the current
line will be replaced with the string that you supply. If there is only one
number, or if there are no numbers in the current line, a macro "fail" will
result.
2.6.2 LABELS/Edit single/:
Similar to their above counterparts, except that if there is already a label/
symbol/comment defined, you will have the chance to edit that string, rather
than type the entire new string into the requester. Note that, as far as
ReSource is concerned, in the example "$0022(A1)", "$0022" is a number, NOT a
symbol, unless YOU have defined it previously. If you try to edit it, you
will be presented with an empty requester. Like all requests for a string,
you can use indirection, so that ReSource gets the string from either the
accumulator, or from one the buffers A-M. See the section on the STRINGS
menu for more details.
2.6.3.1 LABELS/Replace single/Label:
Create a "shop" label at the cursor position. A "shop" label is one that is
9 characters long, begins with "lb", has the data type immediately following,
and ends with the code offset. It may also be of some other length, and end
with ".MSG".
2.6.4.1 LABELS/Remove single/Label:
Removes the label from the cursor position.
2.6.4.2 LABELS/Remove single/Symbol:
Removes any symbols in the current line.
2.6.4.3 LABELS/Remove single/End-of-line comment:
Removes the end-of-line comment from the current line, if any.
2.6.4.4 LABELS/Remove single/Full-line comment:
Removes the first full-line comment attached to the current line.
2.6.4.5 LABELS/Remove single/All:
Removes any label, symbols, comments from the current line. Also, the data
type for the current cursor position is set to 'undefined', and the 'start of
line' bit is cleared. This is useful when a bogus reference was made, as
when ReSource (or you) thought code was being scanned, and it was actually
data or ASCII.
2.6.5.1 LABELS/Create multiple/Reloc32:
For each reloc32 pointer within the current file, determine and set the data
type being referenced, and create a label at that location. This function
will be called automatically whenever you load a load file that has at least
one reloc32 pointer, unleass you override this option.
2.6.5.2 LABELS/Create multiple/All:
Starting at the current address, the "LABELS/Create single/Symbol - dest"
function is executed, and if ReSource thinks that there was valid code in the
current line, the "CURSOR/Relative/Next line" function is executed, and the
entire function loops, otherwise the "PROJECT/-=Abort=-" function is
executed. This function can make the disassembly process very fast, the
disadvantage being that there is a very slight chance that what ReSource
thinks is valid code is really ASCII, and invalid labels will be created.
2.7 LOCAL MACROS/:
2.8 GLOBAL MACROS/:
Much background information is required here: The macro facilities available
in ReSource are quite extensive. There are a maximum of 38 macros available
on line at one time. These are divided into two banks of 19 macros, called
"LOCAL MACROS" and "GLOBAL MACROS". The idea being that the 'local' macros
are for your own personal use, and global macros are meant to be distributed
to others. Therefore, you can load a 'global macros' file, and use them, but
still have access to your own personal macros.
The 19th local macro is special, in that it is executed when you first run
ReSource, after the first file is loaded. This macro will often contain
functions to set the various options to your personal taste, but may contain
anything you care to put into it.
When first creating a macro, you will be asked to supply a name for it. This
name will be shown in the MACRO menu immediately after, and if you save that
bank of macros to a file, the names of the macros are also saved.
The functions "LOCAL MACROS/Execute/-unused-" and "GLOBAL MACROS/Execute/-
unused-" are used to give macros in either bank a name. These names are also
saved when you save a bank of macros, and when you load the macro file later,
these names will immediately appear in the menus, making it much easier to
remember what previously created macros did.
The size of a macro is limited only by how much memory you have. To create a
macro, select one of the sub-items in "LOCAL MACROS/Create/End/" or "GLOBAL
MACROS/Create/End/". If the current name for the macro is "-empty-", you
will be asked to supply a new name for the macro. If you create a macro of
zero length, the name for that macro will revert to "-empty-". To execute
the macro, simply select the appropriate sub-item in "LOCAL MACROS/Execute/"
or "LOCAL MACROS/Execute/".
You have control over the speed at which macros execute. The following chart
indicates whether there will be a delay, and for how long, and whether the
display will be refreshed between executing functions within the macro.
Speed Selected Delay Refresh
-------------- ----- -------
Very Fast No No
Fast No Yes
Slow .1 sec Yes
Very Slow .5 sec Yes
To have complete control over execution of the macro, select "LOCAL MACROS/
Execution speed/Wait on mouse". With this selected, you must press and
release the left mouse button for each and every function within the macro to
be executed. This is an excellent way to find bugs in a macro that you (or
someone else) has created.
Macros may be nested within macros, provided that the nesting depth does not
exceed (approx.) 30.
While you are creating a macro, you might find that you have to execute some
functions to continue the macro definition, but you don't want them included
in the macro itself. When this occurs, select "LOCAL MACROS/Suspend learn/
suspend", select the various functions that need to be done, then select
"LOCAL MACROS/Suspend learn/Normal" to continue the macro definition.
There are many functions that will make a macro fail, when it is executed.
For example, using a cursor movement function that would place the cursor
outside of the current file, will cause a macro 'fail'. A failed search will
also cause a macro 'fail'. When executing a macro, if ReSource detects a
macro 'fail', it searches forward in the macro definition for a "Conditional
end" directive. Is none is found, all macro processing aborts immediately.
If one IS found, macro processing continues normally from that point in the
macro definition. If, while searching for a "End conditional" directive, a
"Start conditional" directive is found, the next "End conditional" is
skipped. Thus, conditional macro processing may be nested.
There are five macro labels available. These are placed into the macro
definition, and you can insert "goto previous macro label" and "goto next
macro label" directives into the macro definition, which when found, will
start a search either forward or backward, for the appropriate macro label.
When found, macro processing will proceed normally from that point forward.
Thus, you can loop a macro. If a search is made backwards for a macro label
that is non-existent, macro processing will continue from the start of the
macro definition. If a search is made forward for a macro label that is non-
existent, the macro will exit, possibly to another macro that called this
one. For example, the following macro will continuously scroll forward to
the end of the file, then scroll backwards, one line at a time, to the start
of the file, then forward to the end of the file again, etc., indefinitely,
stopping only when you select "PROJECT/Abort":
LOCAL MACROS/Set macro label/#1
CURSOR/Relative/Next line
LOCAL MACROS/Previous macro label/#1
LOCAL MACROS/Directives/End conditional
LOCAL MACROS/Set macro label/#2
CURSOR/Relative/Previous line
LOCAL MACROS/Previous macro label/#2
LOCAL MACROS/Directives/End conditional
LOCAL MACROS/Previous macro label/#1
Notice that the directive "Start conditional" was not required in the above
example, as conditional sections were NOT nested.
When you are creating a macro, and you are asked for a string (even the name
of a file to load), if you select "okay" or press return after supplying a
string, the string will be stored in the macro definition, and will be used
when the macro is later executed, unless at the time that you execute the
macro, "LOCAL MACROS/Interactive/" has been set to "ON". In this case, you
will be prompted for any strings that are requested during the execution of
the macro. Normally, this will not be required, but it does give you more
control over an executing macro, especially if it was created by someone
other than yourself.
If, when creating a macro, you are asked for a string, and you want to force
the user to input a string during the execution of the macro, you should
select the "cancel" gadget in the string requester. Any string that you
typed into the requester will still be used while creating the macro, however
when the macro is executed, the user is forced to input a new string each
time, even though 'Interactive' may be set to "OFF". Instead of actually
supplying a string literal to a string requester, you may instead use
indirection, to force the string to get copied from either the accumulator,
or from one of the buffers A-M. For example, if the accumulator contains the
string "MOVE", and you wish to create a label called "MOVE", select "LABELS/
Create single/Label", and when asked for the label name, press the escape key
twice, and select the "okay" gadget, or press "return". If the required
string was in buffer C, instead of pressing the escape key twice, you would
press it once, followed immediately by "C".
Buffers A-M are simply 13 separate 240-byte string buffers, in which you can
store any strings that you like. A more appropriate name might be 'text
registers'. Buffers L and M are special, in that if you select "STRINGS/
Define string/M", if buffer L is not empty, the string contained in it will
be used as the prompt, in the requester. This is handy during macros
functions where you want to get a string from the user. The user can then
see what the string is required for.
Normally, every function you put into a macro definition will be executed.
This does not always have to be the case. The "LOCAL MACROS/Commentary/"
functions sets the commentary level. When creating a macro, if you set the
commentary level to "None", it is like specifying "The functions following
are absolutely essential to the execution of this macro". If you set the
commentary level to "Full" during the creation of a macro, you are specifying
"The functions following are by no means required, they are simply running
commentary, perhaps explaining what is happening in the macro at this point".
Thus, by setting the commentary level during the creation of a macro, you are
letting ReSource know how important the functions are, that follow. The
commentary level may be changed many times during a macro, and for tutorial
macros, such as showing someone how to disassemble/zap a particular program,
the commentary level should be set appropriately. When it comes time to
execute the macro, if the commentary level is set to "Full" by the user
before the macro starts executing, ALL functions within the macro will be
executed normally. If the commentary level was set to something other than
"Full", only those functions in the macro that were set to a commentary level
lower than that presently set, will be executed; the rest will be skipped
over. Examine the following example macro:
LOCAL MACROS/Commentary level/Full
CURSOR/Relative/Next line
LOCAL MACROS/Commentary level/Heavy
CURSOR/Relative/Next line
LOCAL MACROS/Commentary level/Normal
CURSOR/Relative/Next line
LOCAL MACROS/Commentary level/Light
CURSOR/Relative/Next line
LOCAL MACROS/Commentary level/None
CURSOR/Relative/Next line
If you set the commentary level to "None" and execute this macro, the cursor
will move down one line. If you set the commentary level to "Light", and
execute this macro, the cursor will move down two lines. If you set the
commentary level to "Full" and execute this macro, the cursor will move down
five lines. Using the "SPECIAL FUNCTIONS/Dos command" function, you can use
the "SAY" command, to add speech to macros, to give excellent running
commentary to tutorial macros.
While executing a macro, if you have set the execution speed to "Wait on
mouse", you can use other functions, perhaps to scroll backwards or forwards,
to see what effect the last function had on the file. When you press the
left mouse button to single-step the next function in the macro, the cursor
address is restored in case you didn't return the cursor to the appropriate
place within the file. If this was not done, macro processing would not
proceed normally from that point on.
When you load a macro file, only one bank of macros is affected. If the
macro file only contains one macro, then only the one macro in that bank will
be overwritten, and the rest will remain untouched. Thus, it is possible for
a macro in the "LOCAL MACROS" bank to load other local macro files, giving an
"overlay" effect.
2.9.1.1 STRINGS/Get/Label:
If there is a label defined at the cursor location, it will be copied to the
accumulator.
2.9.1.2 STRINGS/Get/Symbol:
Copy the first symbol on the current line to the accumulator.
2.9.1.3 STRINGS/Get/Symbol - dest:
Copy the second symbol on the current line to the accumulator.
2.9.1.4 STRINGS/Get/Symbol value:
Get the value of the first number on the current line, and write text to the
accumulator, representing that value in hex, decimal, or binary, as set by
the "STRINGS/Accumulator/" options. The 'operand size' will be set by this
function.
2.9.1.5 STRINGS/Get/Symbol value - dest:
Get the value of the second number in the current line, and write text to the
accumulator, representing that value in hex, decimal, or binary, as set by
the "STRINGS/Accumulator/" options. The 'operand size' will be set by this
function.
2.9.1.6 STRINGS/Get/End-of-line comment:
Copy the end-of-line comment attached to the current line to the accumulator.
2.9.1.7 STRINGS/Get/Full-line comment:
Copy the first full-line comment attached to the current line to the
accumulator.
2.9.1.8 STRINGS/Get/Search string:
Copy the current search string to the accumulator.
2.9.1.9 STRINGS/Get/Filename:
Copy the current filename to the accumulator.
2.9.1.10 STRINGS/Get/Save .asm name:
If the current file has already been saved as source code (to a ".asm" file),
copy the filename used to the accumulator. If the current file has not
already been saved, the name will be the same as the current filename, with
".asm" appended.
2.9.1.11 STRINGS/Get/Save .RS name:
If the current file has already been saved to a .RS file, copy the filename
used to the accumulator. If the current file has not already been saved, the
name will be the same as the current filename, with ".RS" appended, unless
".RS" is already appended.
2.9.1.12 STRINGS/Get/Macros filename:
Copy the current macros filename to the accumulator.
2.9.1.13 STRINGS/Get/Keytable filename:
Copy the current keytable filename to the accumulator.
2.9.1.14 STRINGS/Get/Cursor longword:
Write the data where the cursor is to the accumulator in hexadecimal. This
may be a byte, word, or longword, depending on the setting of 'operand size'.
2.9.1.15 STRINGS/Get/Cursor offset:
The currently displayed cursor location is written into the accumulator in
hexadecimal as a longword (the "operand size" is set to longwords).
2.9.1.16 STRINGS/Get/Accumulator length:
The length of the string currently in the accumulator is written into the
accumulator in hexadecimal. The 'operand size' setting is not affected, but
is used to decide how many leading zeroes to use.
2.9.1.17 STRINGS/Get/Partial save size:
The number representing the difference between the partial save end and the
partial save start is written into the accumulator in hex, decimal, or
binary, as set by the "STRINGS/Accumulator/" options. The 'operand size' is
set to longwords.
2.9.1.18 STRINGS/Get/File:
You will be asked to supply the name of a file, of which up to 240 characters
will be copied into the accumulator. The data is copied "as-is", no hex to
ASCII translation is performed.
2.9.1.19 STRINGS/Get/Attribute bits:
The attribute bits for the current location are copied into the accumulator,
using the current numeric base (hex/decimal/binary). The definitions for
these bits are described under "DISPLAY/Titlebar info/Attributes".
2.9.2 STRINGS/Put label:
If the string within the accumulator is not used as a label anywhere within
the current file, it will be used as a label on the current line. If it is
already used as a label, then a digit is appended to it, and again it is
tested to see if a label already exists of that name. This continues until a
unique label is created, then that label is attached to the current line.
This is a safe way of creating labels during macros.
2.9.3 STRINGS/Put attributes:
If the accumulator contains a valid number, that number will overwrite the
attributes for the current location. The definitions for these bits are
described elsewhere.
2.9.4.1 STRINGS/Edit functions/Clip start:
You will be asked to supply a string. Starting from the left, each character
in the supplied string is compared to the character in the accumulator at
that position, and if they are equal, the next character is compared, and so
on. When either the end of one of the strings is found, or when a mismatch
is found, the characters in the accumulator that matched are deleted. The
question mark ('?') is used as a wildcard, and you can use the asterisk once
only, to "delete everything until and including" the following character.
Examples follow:
Accumulator User-supplied string Resulting accumulator
-----------------------------------------------------------
MOVE.L M OVE.L
MOVE.L MUVE.L OVE.L
MOVE.L MOV.L E.L
MOVE.L move.l MOVE.L
MOVE.L M?V E.L
MOVE.L ??? E.L
MOVE.L *. L
MOVE.L *M OVE.L
MOVE.L ?MOVE.L OVE.L
_LVOAllocMem _LVO AllocMem
$00000004 $000000 04
2.9.4.2 STRINGS/Edit functions/Clip end:
Similar to the above function, except clipping is performed on the end of the
accumulator string. The question mark is still used as a wildcard, but the
asterisk does not have a special meaning in this function. Examples follow:
Accumulator User-supplied string Resulting accumulator
-----------------------------------------------------------
MEMF_PUBLIC ?PUBLIC MEMF
MEMF_PUBLIC ??? MEMF_PUB
MEMF_PUBLIC ?LC MEMF_PUBLI
meMcollAOVL_ OVL_ meMcollA
2.9.4.3 STRINGS/Edit functions/Prepend:
You will be asked to supply a string, which will be prepended to (added to
the beginning of) the accumulator, providing that the resulting string is no
longer than 240 characters. Examples follow:
Accumulator User-supplied string Resulting accumulator
-----------------------------------------------------------
PUBLIC MEMF_ MEMF_PUBLIC
AllocMemSUB _ _AllocMemSUB
PUBLIC CHIP CHIPPUBLIC
2.9.4.4 STRINGS/Edit functions/Append:
You will be asked to supply a string, which will be appended to (added to the
end of) the accumulator, providing that the resulting string is no longer
than 240 characters. Examples follow:
Accumulator User-supplied string Resulting accumulator
-----------------------------------------------------------
PUBLIC MEMF_ PUBLICMEMF_
AllocMemSUB _ AllocMemSUB_
PUBLIC CHIP PUBLICCHIP
AllocMem SUB AllocMemSUB
2.9.4.5 STRINGS/Edit functions/Reverse:
The contents of the accumulator are reversed. Examples follow:
Accumulator Resulting accumulator
----------------------------------------
PUBLIC CILBUP
AllocMemSUB BUSmeMcollA
AllocMem meMcollA
2.9.4.6 STRINGS/Edit functions/Lower case:
Any upper case characters in the accumulator are changed to their lower case
counterparts. Examples follow:
Accumulator Resulting accumulator
----------------------------------------
PUBLIC0123 public01243
All0cMemSUB all0cmemsub
All0cMem all0cmem
2.9.5 STRINGS/Operand size/:
Some background information is required here: Some functions in ReSource
require to know whether to work at the byte, word, or longword level. For
example, "STRINGS/Get/Cursor value" could get a byte, word, or longword from
the cursor position, and this is your way of specifying at which level you
wish those functions to work. Generally, they specify the size of the
numeric operand in the accumulator. Some functions that write a numeric
value into the accumulator will set the operand size themselves, others that
get the value out of the accumulator need to know the operand size.
2.9.6 STRINGS/Accumulator/:
Options control whether to write the results of any maths functions to the
accumulator in hex, decimal, or binary.
2.9.7.1 STRINGS/Maths functions/Increment:
Some background information is required here: All maths functions make some
change to the number within the accumulator. If the string within the
accumulator is not a valid number (hex, decimal or binary), the function will
fail. Some functions are immediate, others will ask the user for a required
operand, such as what to add to the accumulator.
The increment function adds one to the accumulator. If the resulting number
develops a carry (using the current operand size), a macro 'fail' will
result. Thus, loops in macros can exit after a given number of iterations,
rather than a failed search, etc.
2.9.7.2 STRINGS/Maths functions/Decrement:
Similar to the above function, except that one is subtracted from the
accumulator. If a carry results, a macro 'fail' will occur. Thus, loops in
macros can exit after a given number of iterations, rather than a failed
search, etc.
2.9.7.3 STRINGS/Maths functions/Add:
You will be asked for a number, to be added to the accumulator. If a carry
results, a macro 'fail' will occur.
2.9.7.4 STRINGS/Maths functions/Subtract:
You will be asked for a number, to be subtracted from the accumulator. If a
carry results, a macro 'fail' will occur.
2.9.7.5 STRINGS/Maths functions/Multiply:
You will be asked for a number, to be multiplied by the number within the
accumulator. If a carry results, a macro 'fail' will occur. Full 32-bit
multiplies are supported, however the setting of 'operand size' is used when
determining the size of the operands.
2.9.7.6 STRINGS/Maths functions/Divide:
You will be asked for a number. The contents of the accumulator will be
divided by the number that you specify. The divide function does NOT operate
on 32-bit operands, but otherwise will work at the currently set operand
size. If the current operand size is set to longwords, the divide will be
performed on the lower 16 bits only.
2.9.7.7 STRINGS/Maths functions/Negate:
The number within the accumulator is negated, using the currently set operand
size. If the result is zero, a macro 'fail' will result.
2.9.7.8 STRINGS/Maths functions/Logical NOT:
The number within the accumulator is NOT'd in bitwise fashion, using the
currently set operand size. If the result is zero, a macro 'fail' will
result.
2.9.7.9 STRINGS/Maths functions/Logical AND:
You will be asked to supply a number, which will be bitwise AND'd with the
contents of the accumulator, and the result is stored back into the
accumulator. If the result is zero, a macro 'fail' will result.
2.9.7.10 STRINGS/Maths functions/Logical OR:
You will be asked to supply a number, which will be bitwise OR'd with the
contents of the accumulator, and the result is stored back into the
accumulator. If the result is zero, a macro 'fail' will result.
2.9.7.11 STRINGS/Maths functions/Exclusive OR:
You will be asked to supply a number, which will be bitwise exclusive-OR'd
with the contents of the accumulator, and the result is stored back into the
accumulator. If the result is zero, a macro 'fail' will result.
2.9.8 STRINGS/Define string/:
These functions allow to you define the contents of either the accumulator,
or one of the string buffers A-M. Whenever you are asked for a string using
the simple string requester (NOT the large file requester), you can either
type in a string literal, or input an escape character (just press the escape
key), followed by either another escape character, or one of the letters A-M
inclusive. If the second character is the escape character, the string being
requested will be copied from the accumulator instead. If the second
character that you typed (after the escape character) is one of the letters
A-M, then the string being requested will instead be copied from the
appropriate buffer A-M. This applies even when you are defining the contents
of one of the string buffers. This method of using indirection should be
particularly handy in sophisticated macros.
The maximum string length in any buffer (including the accumulator) is 240
characters.
2.9.9 STRINGS/Swap with buffer/:
The contents of the accumulator is swapped with the contents of the buffer
that you select.
2.9.10 STRINGS/Input buffer/:
The Input and Output buffers can be used to buffer textual information
between a file and the accumulator within ReSource. To transfer information
into ReSource, you load the input buffer, using "Load", and transfer a line
at a time to the accumulator, using "Read line". Each time you read a line
from the input buffer, it replaces the contents of the accumulator.
Successive uses of "Read line" will get successive lines from the input
buffer. A line means all text up to a line feed, to a maximum of 240
characters. The line feed is NOT transferred, as the line will be null
terminated within the accumulator. To start reading lines from the start of
the buffer again, use "Restart". For example, you may have a list of labels
that you wish to put into the current file. Use "Load" to get the list of
labels into the input buffer, then create a macro something like:
CURSOR/Relative/Next label
STRINGS/Input buffer/Read line
STRINGS/Put label
LOCAL MACROS/Previous macro label/#1
The first function will advance the cursor to the next label. The second
function reads the next label to use into the accumulator. The third
function will replace the current label with the one in the accumulator. The
last function ("LOCAL MACROS/Previous macro label/#1") is optional. It will
make the function repeat for the entire file, or the entire list of labels,
whichever ends first.
2.9.11 STRINGS/Output buffer/:
The output buffer is used to hold information that you wish to save from
ReSource. The idea here is that you append the contents of the accumulator
to the end of the output buffer, and eventually save the entire contents of
the output buffer to a file. For example, you might wish to create a list of
labels for the current file (see "STRINGS/Input buffer/:"). The following
macro will do this:
Note: Prior to actually running this macro, you should ensure that the cursor
is at the start of file, and use the function "STRINGS/Output buffer/Clear",
to ensure the output buffer is empty.
CURSOR/Relative/Next label
STRINGS/Get/Label
STRINGS/Edit functions/Append
STRINGS/Output buffer/Append accumulator
LOCAL MACROS/Previous macro label/#1
The first line will move the cursor to the next label in the file. The
second function will put the current label into the accumulator. The third
function will prompt you for a string to append to the accumulator. A line
feed (ASCII value 10) is required here, to do this, first click inside the
requester string gadget, hold down the ctl key, and press "J", then press
return or click on the "OKAY" gadget. The fourth function, "STRINGS/Output
buffer/Append accumulator", will add the current contents of the accumulator
to the end of the Output buffer. Memory is dynamically allocated for the
output buffer, so maximum size is only determined by how much memory you
have. The fifth function is optional, use it if you want the macro to loop
until all labels in the current file are added to the list. Once this is
done, use "STRINGS/Output buffer/Save" to save the current contents of the
output buffer. You will be asked for a filename to use. In practice, most
people will probably combine several pieces of information for each line that
gets appended to the output buffer, such as label, followed by its offset
from the start of the file, or its data type, etc.
2.10.1 SPECIAL FUNCTIONS/Repeat last command:
Repeat the last menu function used. Functions bound to keys may be used
without resetting the last menu function. For example, suppose you access a
symbol base from the "SYMBOLS 2" menu. You then define some labels, using
whatever KEY that function is bound to. Finally, you use the "Repeat last
command" KEY. This will invoke the "SYMBOLS 2" function, rather than
repeating the last KEY used. Cursor movement functions are NOT repeated,
except the search functions. This function should be bound to a high-
priority key, such as the space bar, for best effect.
2.10.2 SPECIAL FUNCTIONS/Dos Command:
You will be asked for a string, which will be given as the operand to the Dos
"execute" function. Anything that you normally type into a CLI window, you
can give as a command. Any output will go to the CLI window from which you
started ReSource, unless you redirect the output elsewhere. The "Run"
command must be in your C: directory.
2.10.3 SPECIAL FUNCTIONS/Zap:
You will be asked for a number/string, which will overwrite the byte/word/
longword/characters at the cursor position. The current setting of 'operand
size' is used. Using PROJECT/Open binary file, then this function, followed
by "SAVE/Save binary image/ALL", you can quickly modify a program, without
having to go through the disassemble/edit/reassemble/link cycle. However,
when using this method of modification, you are restricted as to the size of
changes that may be legally made. For example, you cannot insert extra code
or data, nor can you delete it. You may "NOP" it instead, though.
If the string that you supply starts with a single quote ("'"), the following
characters are treated as a string, and are copied to the cursor position
"as-is".
If the string that you supply starts with "$", the following number is
assumed to be hexadecimal. If the string that you supply starts with "%",
the number that follows is assumed to be binary, otherwise it is assumed to
be a decimal number.
2.10.4 SPECIAL FUNCTIONS/Screen/:
"Front" moves ReSource's screen in front of all other screens. "Back" moves
ReSource's screen behind all other screens.
2.10.5 SPECIAL FUNCTIONS/Set task priority:
You will be asked for a number, representing the priority at which to set the
current task. For example, if you have a program being assembled in the
background, and you don't want it to slow down the operation of ReSource, you
might set the task priority to one or two. Negative numbers are not
supported. Sorry! However, "$FF" will effectively mean "-1" with this
function.
2.10.6 SPECIAL FUNCTIONS/Origin/:
There is sometimes a requirement to disassemble a block of code, as if it is
loaded to some particular area of memory, other than that to which it is now
loaded. For example, if you disassemble Kickstart(TM), and save the binary
image, then later load this into ReSource, it will not disassemble properly
unless ReSource "thinks" that its origin is $FC0000. To do this, load the
file, then use the "Specify" option. Both the "Specify" and "Set" set the
origin to an absolute address; the "Set" option is the same as "Specify",
except that it assumes that the current loading address is to be used. These
options are really only useful if the file is loaded as a binary image, or
from track, or memory. If loaded from an executable, the reloc32 information
will ensure that proper relocation is done where needed. It is because no
reloc32 information is available when loading files other than load files,
that this function is required. To remove the origin, so that it uses
whatever actual address the file is loaded to, use the "Clear" option.
2.10.7 SPECIAL FUNCTIONS/Convert xx(A4) EA's/:
These functions were specifically designed to be used when disassembling 'C'
programs, in which the A4 register is frequently used as a base register for
accessing data, throughout all or most of the program. Let's use an example
program here:
SECTION test000000,CODE
LEA lbB00011E,A4 ;scanning has already been done
LEA 0(A4),A1
MOVE.L $000C(A4),D0
... ;rest of code
SECTION test00011E,DATA
lbB00011E dc.b 'dos.library',0
dc.l $00010001
END
In the above example program, the A4 register points to the start of the data
segment. There are three ways to tell ReSource where the A4 register points;
in the above example, the "This operand" function could be used with the
cursor at start of file, or the "This address" function could be used with
the cursor at offset $00011E, or the "Specify" function could be used,
supplying a parameter of "$11E". Basically, with this function you are
telling ReSource where the A4 register can be assumed to be pointing,
relative to the start of the program. After you do this, any effective
address that involves a word offset to the A4 register, will be shown
symbolically. If you have selected "Convert xx(A4) EA's/Absolute", the
effective addresses will be shown as absolute addresses. Thus, the example
program above will appear as:
SECTION test000000,CODE
LEA lbB00011E,A4
LEA lbB00011E,A1
MOVE.L lbL00012A,D0
... ;rest of code
SECTION test00011E,DATA
lbB00011E dc.b 'dos.library',0
lbL00012A dc.l $00010001 ;This label will be created after
END ;left-Amiga mouse-button is used.
On the other hand, if you had selected "Convert xx(A4) EA's/Relative", the
effective addresses would be shown as symbolic word offsets, and our example
program would look like this:
SECTION test000000,CODE
LEA DT,A4 ;Note the new base label "DT"
LEA lbB00011E-DT(A4),A1
MOVE.L lbL00012A-DT(a4),D0
... ;rest of code
SECTION test00011E,DATA
DT
lbB00011E dc.b 'dos.library',0
lbL00012A dc.l $00010001 ;This label will be created after
END ;left-Amiga mouse-button is used.
The advantage here is that labels can automatically be created where they
could not before. After more iterations, our code could look like this:
SECTION test000000,CODE
LEA DT,A4
LEA DOSName-DT(A4),A1
MOVE.L Mem_Parms-DT(a4),D0
... ;rest of code
SECTION test00011E,DATA
DT
DOSName dc.b 'dos.library',0
Mem_Parms dc.l MEMF_CLEAR!MEMF_PUBLIC
END
If this conversion process is not used, it is likely that the program will
not successfully re-assemble, as different assemblers assemble the same
source code into different opcodes. For example, the assembler that I
normally use does virtually no optimizing, and so the resulting program is
often larger than the original, even if I did not modify the source code.
For example:
MOVE.L 4,A6
If absolute long addressing is used, the instruction above will be 6 bytes
long, whereas if absolute short addressing is used, it will be only 4 bytes
long. Where you wish to do EA conversions in only a portion of a program,
you can set the lower and upper limits.
Changing to absolute EA's will increase the size of the resulting program,
unless you convert back to relative addressing, within the source code. I
believe that one of the features of BLINK (from the Software Distillery) can
help to make this conversion, during the link process.
2.10.8 SPECIAL FUNCTIONS/Convert specific EA's/:
Please read and understand the "SPECIAL FUNCTIONS/Convert xx(A4) EA's"
functions first! Where you want to do specific EA (Effective Address)
conversions, use "Set base #1" (or #2, or #3), when the cursor is the same as
where the base register (whatever that is, it does not have to be A4 this
time) can be assumed to point to. Assuming that you set base #1, and it is
the A5 register that is being used as a base register, you will then use the
"Convert W/Base #1" function to convert lines like:
MOVE.L $0032(A5),A6 into:
MOVE.L lbL0014AC(A5),A6
Note here that there has not actually been an EA conversion, but a label has
been created, the data type at label "lbL0014AC" has been determined and set,
and a symbol ("lbL0014AC") has been created for this line. It is up to you
then to make the necessary changes to the resulting source code, if re-
assembling is required. Whereas the "Convert xx(A4) EA's" function converts
immediately and automatically, you must use the "Convert W/Base #1" function
on each line that you want converted. If you wish to convert a destination
address, use the "SYMBOLS 1/Set Source/dest/Destination" function first.
2.10.9 SPECIAL FUNCTIONS/Data type set/:
These functions affect how the "SPECIAL FUNCTIONS/Convert specific EA's"
functions work. When the data type must be determined, it can be automatic,
or you can force it to be set to Bytes, Words, Longwords, ASCII, Code.
2.10.10 SPECIAL FUNCTIONS/Convert to../:
The setting here will determine the type of symbol created when the "SPECIAL
FUNCTIONS/Convert specific EA's" functions are used, either an Absolute or
Offset value.
2.10.11 SPECIAL FUNCTIONS/Reloc32/:
Use these functions to specifically delocate or relocate the current file.
This is only useful if file was loaded from an executable, where reloc32
information is present. Be aware that relocation is performed immediately
after the "PROJECT/O'lay binary image" function, when a file is actually
loaded.
2.11.1 SAVE/O/P Directory:
You will be asked to supply the name of a directory. Whenever you are asked
to supply the name of a file to save source code to, the name will have this
directory name prepended to it. For example, if you supply the string "RAM:"
as the output directory name, and the current filename is "c:stack", when you
select "SAVE/Save .asm/ALL", the new name to save to will be "RAM:stack.asm".
2.11.2.1 SAVE/Partial save/Set start:
For any partial saves, the current cursor position (as it is NOW) will be
where the save will start from. By default, this position is equivalent to
the start of the file.
2.11.2.2 SAVE/Partial save/Set end:
For any partial saves, the current cursor position will be where the save
will end. If this happens to be the last line in the file, any partial save
will include the last line. Normally, the partial save will NOT include the
line where the partial save end is set.
2.11.3 SAVE/Save binary image/:
Save the current buffer contents "as-is", to a file. If the file was loaded
with "PROJECT/Open load file", and was NOT loaded as a binary image file, the
resulting saved file will NOT be the same as that originally loaded, because
the loader information, and relocation information, has been stripped. If
you wish to load a file, and then save it exactly as it was loaded, you must
use "PROJECT/Open binary file". Even though you may have disassembled memory
directly, or read tracks from a floppy disk, it does NOT stop you from saving
the binary image. Once something is loaded into ReSource, it can be saved as
source code, as a binary image file, directly to memory, or it can be written
directly to a floppy disk, to a specific sector or track. This gives
fantastic flexibility for general hacking, for as little as one byte of the
current buffer can be saved to memory, to a binary image file, or as source
code. Track writes must be in multiples of 512 bytes. However the clipping
is done for you.
Save "Partial" is similar to the above function, except only the data between
the partial save start and the partial save end is saved.
2.11.4 SAVE/Save .asm/:
You will be asked to supply the name of a file to save source code to, for
the entire current buffer contents. The output will be very similar to how
you see it on the display.
Save "Partial" is similar to the above function, except only the code/data
between the partial save start and the partial save end is disassembled.
2.11.5.1 SAVE/Calculate .asm size/ALL:
Calculates the size of the source code file that would result if you had used
the "SAVE/Save .asm/ALL" function.
2.11.5.2 SAVE/Calculate .asm size/Partial:
Calculates the size of the source code file that would result if you had used
the "SAVE/Save .asm/Partial" function. "Start" and "End" must have been set
previously.
2.11.6 SAVE/Save to memory/:
You will be asked to supply a memory address to save the contents of the
current buffer. The buffer will be saved "as-is"; it is NOT disassembled.
Care should be taken with this function, as a system crash will likely result
if you supply the wrong address. By finding out where the current buffer is
in memory, it is possible to copy one part of the current buffer to another
part.
Save "Partial" is similar to the above function, except that only the data
between the partial save start and the partial save end is saved.
2.11.7 SAVE/Save tracks/:
You will be asked for a string representing where to start writing tracks.
The first parameter you give must be either "DF0:", "DF1:", "DF2:", or
"DF3:". The second parameter is the starting cylinder to save to. The third
parameter is optional, and represents an offset, in sectors, where the track
write is to start. For example, to save the sector #3 on cylinder 5 on DF2:,
the parameters required would be "DF2: 5 3". To save to the first sector on
DF0:, the parameters required would be "DF0: 0". Whole sector writes ONLY
are done, clipping is performed automatically.
Save "Partial" is similar to the above function, except that only the data
between the partial save start and the partial save end is saved.
Furthermore, only even multiples of 512 bytes will be written. For example,
if the partial save size is 1027 bytes, only two sectors (1024 bytes) will be
written to the disk.
2.11.8 SAVE/Tabs/:
Use to select between real tabs (ASCII value 9) and spaces being used in the
output source code as separators.
2.11.9 SAVE/Symbol table/:
When creating symbols, either automatically or manually, if the setting of
this function is to something other than "None", the value and name of the
symbol is stored, so that when the source code is saved, an equate table, or
XREF table can be generated. If this function is set to "EQUate", a symbol
table similar to the following will precede the source code in the output
file:
AG_OpenLib EQU $00030000
AO_DOSLib EQU $00008007
AT_Recovery EQU $00000000
_LVOAlert EQU $FFFFFF94
_LVOClose EQU $FFFFFFDC
_LVOCreateProc EQU $FFFFFF76
_LVOCurrentDir EQU $FFFFFF82
If, instead, this function is set to "XREF", a symbol table similar to the
following will preceed the source code in the output file:
XREF AG_OpenLib
XREF AO_DOSLib
XREF AT_Recovery
XREF _LVOAlert
XREF _LVOClose
XREF _LVOCreateProc
XREF _LVOCurrentDir
2.12.1 OPTIONS 1/Show offsets/:
For lines displayed without labels, the current offset (relative from the
start of the file) will be displayed where the label is usually displayed.
If "DISPLAY/Set counter" is used, offsets will be relative to where the
counter was set.
2.12.2 OPTIONS 1/Display beep/:
Many functions demand attention from the user, and a display beep is used for
this purpose. Normally, this will make the screen flash. However, if you
have run the program "addbeep", or a similar DisplayBeep() replacement, you
will hear an audible "beep" instead. If you don't appreciate the beep, then
switch it off.
2.12.3 OPTIONS 1/User feedback/:
Many functions will give informative messages, to let the user know what is
happening internally. If you don't appreciate the feedback, then switch it
off.
2.12.4 OPTIONS 1/Feedback Delays/:
If you have User feedback set to "OFF", then the setting of this function is
irrelevant. If feedback is ON, you may occasionally find that feedback
message are being displayed too fast for you to read them. This is
especially so when opening a load file, since as many as thirty informative
messages can be displayed in between raster scans, which means that you don't
actually get to see any of the messages at all. If normal text rendering
were used, rather than using the special rendering routines in ReSource, this
would probably not be a problem, as the writing of the text itself would be
done much slower, and you would probably get time to read at least some of
the messages. If you set feedback delays to "ON", there will be a one second
delay after each message is displayed, which should be plenty of time to read
each message. While you hold the menu button down, feedback messages are
skipped altogether.
2.12.5 OPTIONS 1/Labels/:
If this option is set to ON, labels will be displayed. This is the default.
2.12.6 OPTIONS 1/Hidden labels/:
If this option is set to ON, hidden labels (labels attached to a byte in the
middle of a line of code/data) will be displayed. This is the default.
2.12.7 OPTIONS 1/Symbols/:
If this option is set to ON, symbols will be displayed. This is the default.
2.12.8 OPTIONS 1/End-of-line comments/:
If this option is set to ON, end-of-line comments will be displayed. This is
the default.
2.12.9 OPTIONS 1/Full-line comments/:
If this option is set to ON, full-line comments will be displayed. This is
the default.
2.12.10 OPTIONS 1/Chip-load info/:
If this option is set to ON, where a section statement is displayed, and that
section either is forced to load into chip memory, or is forced to load into
fast memory, a ",CHIP" or ",FAST" will be appended to the section statement.
Not all assemblers support this parameter for the section statement, so you
may want to switch this option OFF if your assembler can't handle it.
2.12.11 OPTIONS 1/Section statements/:
If this option is set to ON, section statements will be displayed. This is
the default.
2.12.12 OPTIONS 1/End statement/:
If this option is set to ON, the "END" statement will be displayed as the
last line in the file. This is the default.
2.12.13 OPTIONS 1/DCB statements/:
If this option is set to ON, "dcb" type statements will be used where
appropriate. This is NOT the default. For example, the following data:
dc.b 0
dc.b 0
dc.l 7
dc.l 8
dc.l 8
dc.l 8
dc.l 8
dc.l 8
dc.l 8
will be shown as:
dcb.b 2,0
dc.l 7
dcb.l 6,8
This is useful for shrinking the required .asm file size, especially where
there are large areas of zeroes.
2.12.14 OPTIONS 1/Reference recognition/:
If this option is set to ON, references to memory locations within the
current file are recognized. For example, assuming that the absolute address
of the start of the current file is at $200000, the following lines might be
displayed with Reference recognition ON:
dc.l $48638335
dc.l START+$1097
dc.l START+$3086
whereas if reference recognition was OFF, it would be displayed as:
dc.l $48638335
dc.l $201097
dc.l $203086
Reference recognition is ON by default. If any pointer (32 bits) is in a
reloc32 area, the reference will be recognized regardless of the setting of
this option.
2.13.1 OPTIONS 2/ASCII longs/:
If this option is set to ON, where longword operands are recognized as all
ASCII characters, such as 'KICK', they will be displayed as such. This is
the default. By using the "DISPLAY/Set numeric base/ASCII", lines such as:
MOVE.L #'DOS'<<8,(A2)
MOVE.L #'KICK',(A2)
or virtually any lines containing valid ASCII characters may be independently
displayed as ASCII, despite the setting here.
2.13.2 OPTIONS 2/Short branches/:
If this option is set to ON, any short branches will be displayed as such,
with the ".S" appended to the opcode. This is the default. Note that this
option will NOT show you all POSSIBLE short branches, only those that are
already present in the code that's being disassembled.
2.13.3 OPTIONS 2/Separate labels/:
Under normal conditions, if a label is longer than 20 characters, it is
broken at that point, and the remainder is shown on the next line. This
option forces the entire label to be shown on one line.
2.13.4 OPTIONS 2/Label colons/:
This option will display colons ,":", after all labels.
2.13.5 OPTIONS 2/Leading zeroes/:
Use these options to specify whether or not you wish the leading zeroes on
hex values to be shown, e.g., "$0000003A" versus "$3A".
2.13.6 OPTIONS 2/Assembler/:
Use these options to specify for which assembler the output should be
suitable. Metacomco output currently works with CAPE(TM) as well, although
smaller files will result with CAPE(TM) output. Currently, "dc.b" will be
shown as "db", "dc.w" is shown as "dw", and "dc.l" is shown as "dl", if CAPE
is chosen.
2.14 KEY BINDINGS/:
Every function in ReSource can be found in the menus. You do not need to use
any keys at all, but you probably will want to. You can bind any function to
any key, however there is just one function that makes no sense to rebind,
and that is the "PROJECT/Abort" function. Both Amiga-keys are supported, you
may use shift, alt, ctrl, lAmiga, rAmiga, shift-alt, shift-ctrl, alt-ctrl, or
shift-alt-ctrl in combination with any non-qualifier key, as a distinct key
to which to bind a function. Thus, you have complete control over which keys
do what. After re-binding some keys, you will probably want to save the
keytable. If you save the keytable as "S:RS.keytable", it will be loaded
every time you run ReSource. You may want to create several keytables,
suitable for doing differing program types (C, assembler, etc.). If a
keytable file is loaded, ALL current key bindings will be overwritten by the
bindings present in the keytable. If you don't load any keytable, and
ReSource couldn't find "S:RS.Keytable" when you first ran it, some keys will
still be bound:
right-Amiga Q PROJECT/Quit
right-Amiga O Open load file
up arrow CURSOR/Relative/Next line
down arrow CURSOR/Relative/Previous line
right arrow CURSOR/Absolute/Fwd reference
left arrow CURSOR/Absolute/Previous location
shift-up arrow CURSOR/Relative/Previous page
shift-down arrow CURSOR/Relative/Next page
To rebind a key, select "KEY BINDING/Rebind key", and follow the prompts in
the title bar.
Index
[The index is only in the printed manual. Sorry! JL]
*****************************************************************************
Bug Fixes and Changes Since V3.05
---------------------------------
V3.06 (April 1989): The "LABELS/Create multiple/Reloc32" function is called
automatically after every "Open load file", unless there was no reloc32 table
in the file, and providing that this is not overridden by the new "OPTIONS2/
Auto labels/OFF" option. It may be stopped by pressing rAmiga-A, anyway.
Attempts to set the data type to ASCII or CODE in a BSS or unitialized data
area will now instead set the data type to BYTES. Regardless of the setting
of the attributes bits, data in a BSS hunk or in an unitialized data area
will *always* show as "ds.b", "ds.w" or "ds.l".
Holding down the left mouse button during macro execution no longer temporar-
ily sets the execution speed to "Slow". This was previously causing some
minor multitasking difficulties.
Previously, where code, words or longwords started very close to the end of a
section (this includes the end of the file), sometimes it would extend right
across the section start, preventing the section statement from being disp-
layed. Where this occurs, the data type at the first byte is now changed to
bytes, and disassembly is restarted from the same address. This continues
until the section statement is no longer hidden.
When a data type other than code is set manually, previously this would some-
times cause reloc32 areas to be shown as bytes or words. This will no longer
happen.
The second pass of "Fill-in data types" determines the line lengths. Much of
this is now done on-the-fly, during normal disassembly. This is most notice-
able when strings are displayed.
When a line is disassembled, if a reloc32 starts the line, it will now
*always* show as a longword. Previously, it sometimes showed as code, until
the first "Fill-in data types" was done.
If a line is displayed such that a reloc32 longword will overlap to the next
line, the data type at the start of that line is changed to words, effective-
ly preventing the overlap.
It is now possible to abort from a "Save .asm", by using the normal abort key
sequence (rAmiga-A). The file will still be created, but no further text
will be saved to it.
When the left mouse button is held down, as well as the ctl key, symbols and
full-line comments are now temporarily disabled. This allows you to quickly
see the value of any symbols present in code.
When a user-defined label is created, the "internally produced" bit in the
attributes table is now cleared.
While using the mouse to scroll, if the left Amiga key is held down, labels
are created using forward references. Now, if the left mouse button is
pressed while the pointer is within 3 pixels of the right screen border,
ReSource will assume that you are holding the left-Amiga key down, until you
let the left mouse button go. This makes it easy to create labels single-
handed. You don't have to keep the pointer on the right while scrolling,
only its position when you actually press the LMB is important.
The "DISPLAY/Block fill" function had some severe limitations, namely:
1> Changing the data type for a byte or area with an area that had been
block-filled, was extremely difficult, as it had to be done for each and
every byte.
2> After a block fill, ASCII was not displayed correctly.
3> Scrolling backwards through an area that had been block-filled would
give an inconsistent display.
4> The wait pointer should have been displayed, especially for large fills.
These problems have been fixed.
It is now possible to abort from an "Open load file" operation.
If the workbench screen is using interlace, ReSources' screen will now also
use interlace. Previously, ReSource tried to open a screen of the same size
as the Workbench screen, but didn't pick up the fact that interlace was on.
Thanks to Brian Jackson and Darren M. Greenwald for reporting this bug.
The "SAVE/Save .asm" functions now give you a profile of the source code as
it is saved. This may be disabled by selecting the new "OPTIONS2/Verbose
saves/OFF" function. Each entry in the displayed table is counted as that
particular condition occurs during the save, and the totals are displayed
continuously. It is now possible to get a printout of this and any other
screen in ReSource, using the new "SAVE/Save screen" function (see below).
There is a new function, "SAVE/Save screen". It will prompt you for the name
of a file. If the file can be opened, it will save the currently displayed
text to that file. Use this to send a screen dump to the printer, or other
file. Note that this can be used at the completion of a "save .asm", to get
a printout of the source code profile.
When scrolling, the display used to "jump" when the top line on the display
had any full-line comments, hidden labels, or a trailing blank line. This
has been eliminated.
Tab characters in full-line comments are now supported and will be displayed
as they should, on-screen, in a screen printout, and in any saved source code.
There is a new symbol base, "String control". This is meant to be used for
ASCII control characters, such as DEL ($7F), BS (8), etc.
The "LABELS/Create multiple/Reloc32" function now checks the validity of
reloc32 pointers before attempting label creation.
It is now possible to append to files when saving, rather than simply replac-
ing them. To do this, the filename that you supply must start with "*>".
For example, if you wish to append information to the file "ram:MySavedFile",
when requested for a filename, you would type "*>ram:MySavedFile". This is
valid for *any* file save, including screen saves, binary image saves, etc.
On extreme rare occasions, when creating labels or symbols, ReSource would
corrupt memory, the obvious symptoms being that most labels and symbols would
display random characters. The bug would only appear if a "Save .RS" was
performed immediately prior to more memory being allocated for the string
buffer. Fixed.
When the result of a "STRINGS/Maths functions/Logical OR" was zero, a macro
fail should have resulted, but didn't. Fixed.
If a label longer than 19 bytes was displayed as a "hidden" label, a system
crash was likely. Fixed.
When creating "shop" ascii labels, if no valid text can be found to use in
the label name, instead of creating a label starting with "lbA", ReSource now
creates the label "ascii.MSG", or "ascii.MSG0", or "ascii.MSG1", etc.
During the creation of a macro, if an attempt to create some other macro was
initiated, the resulting macro often caused a system crash. Now, if an
attempt is made to create a macro while already creating a macro, it will be
ignored.
It was sometimes difficult to abort from an executing macro, especially if
the macro execution speed was set to "wait on mouse". Fixed.
Whenever functions within a macro are being executed, a very small group of
pixels within the title bar are constantly changed. This is the only visible
feedback that you will see while executing a macro when the execution speed
is set to "Very fast". This is also done during searches, etc.
When quitting, if any new macros have been defined, without being saved to a
macro file, this fact will now be mentioned in the quit requester.
During the creation of a macro, the responses within requesters are now
"STORE" and "USE" instead of "OKAY" and "CANCEL" as a better indication of
how ReSource responds to text input during a macro creation.
References to the START+$FFFFFFFC and START+$FFFFFFF8 are now shown as
"ProgStart-4" and "ProgStart-8" respectively. If the label "ProgStart" is
not defined anywhere, it will be displayed as a label attached to the first
byte of the current file. You can still have some other label attached to
the start of the file.
When using "xx(A4)" type Effective Address conversions, the label "DT" has
always been assumed to be defined. Now, if it is not defined by the user,
ReSource will define it for you. It will be attached to the last data hunk
in the file, or if no data hunks exists, the last CODE hunk.
Using the "SAVE/Save binary image/" functions would sometimes save less than
what it should have saved. This would happen if there was at least 4 null
bytes at the end of the current file. Fixed.
The double-quote character ($22) was not being recognized as a valid ASCII
character. These will now be displayed in ASCII strings, just like any other
valid ASCII characters.
The "SPECIAL FUNCTIONS/Convert xx(A4) EA's/This operand" previously would
only work for lines following the pattern "LEA START+$xxxxxx,A4". Now, lines
such as "MOVE.L #START+$xxxxxx,A4" will also work.
There is a new option; "OPTIONS 2/Assembler/CaPatch". Source code produced
for this assembler uses the "DX" directive, to support unitialized data
areas. This is the extra space at the end of data or code hunks, that
appears to be BSS, but is actually attached to the data or code hunk. Other
assemblers would use the "DS" directive instead, which makes the resulting
program much larger than the original. This was previously only available to
"C" programmers.
There is a new hilite option; "Unitialized data". When selected, any uninit-
ialized data areas will be hilited.
When the selected assembler type is "Cape" or "CaPatch", the directives
"bnryonly", "exeobj" and "objfile" are used where appropriate.
When supplying a string that will become a label, symbol, or comment, you may
now use indirection to include in that string, some other already-defined
label, symbol, or comment. Indirection must start with an "escape" character
(decimal value 27, just hit the "escape" key), and must be followed by a
decimal digit between zero and three inclusive. This is how you specify
which type of string that you require:
0 = Label
1 = Symbol
2 = Full-line comment (the first one only)
3 = End-of-line comment
This should be immediately followed by a hex, decimal, or binary number,
specifying the offset in the current file where the required string is
attached to. Another escape character is required immediately following the
number, as a delimiter. You are then free to either supply more "normal"
text, or you may use indirection several times within a single string
specification.
Because the escape character is not normally displayable, the following
example will use a "^" character where the escape character is really meant
to be:
lbW000140 dc.w 6
dc.w 8
dc.w 12
lbC000146: RTS
lbC000148: MOVEQ #0,D0
RTS
lbC00014C: MOVEQ #1,D0
RTS
In the above program, the word values at label "lbW000140" correspond to the
distance between "lbC000146" and "lbW000140" on the first line (6), the
distance between "lbC000148" and "lbW000140" on the second line (8), and the
distance between "lbC00014C" and "lbW000140" on the third line (12). This is
what is commonly referred to as a "jump table". In order to make the program
assemble properly, the values 6, 8, and 12 should be changed to symbols
specifying their true meaning, rather than just the value that they happen to
be when the program was last assembled/compiled:
lbW000140 dc.w lbC000146-lbW000140
dc.w lbC000148-lbW000140
dc.w lbC00014C-lbW000140
lbC000146: RTS
lbC000148: MOVEQ #0,D0
RTS
lbC00014C: MOVEQ #1,D0
RTS
It has been possible to use the "SPECIAL FUNCTIONS/Convert specific EA's"
functions to make the creation of these symbols easy. However, there has
always been a problem; if you later change the label "lbC000148" to
"ClearValue", or any other label, the symbol "lbC000148-lbW000140" will cause
an assembly error. Now, by using dynamic indirection, whenever the symbols
at label "lbW000140" are displayed, it will use whatever labels are in use at
that moment. For example, for the line:
lbW000140 dc.w lbC000146-lbW000140
instead of creating the symbol "lbC000146-lbW000140", you would instead
specify "^0$146^-^0$140^" when requested by the "LABELS/Create single/Symbol"
function (remember that the "^" is actually an escape character, press the
escape key).
This dynamic indirection is now also used internally in ReSource, where it
seems required. For example, the "SPECIAL FUNCTIONS/Convert specific EA's/"
functions now use dynamic indirection when creating symbols.
Functions that access labels, symbols, and comments will normally support
dynamic indirection in strings, unless the option "OPTIONS 1/Symbols/" is set
to "OFF". In this case, the raw string will be used. Dynamic indirection
was meant to be used in symbols. It is possible to use in labels and
comments, however some problems may arise if care is not taken. For example,
duplicate labels can easily be created if dynamic indirection is used in the
specification for a label. It should be quite safe in any comments, however.
Symbols containing dynamic indirection will not be stored in the EQUate or
Xref tables. It is expected that most strings using indirection are symbols,
that refer to labels, and therefore do not require to be EQUated or XREF'd.
In revision 5, a macro fail resulted if an attempt was made to display an
operand as ASCII, if an invalid ascii character was encountered. This
created a problem when macro execution speed was set to "Very fast", as
displaying was disabled at the time the ASCII attribute was set, and the
macro fail did not result until some later time, perhaps when running some
other macro. When invalid ascii characters are encountered in an operand, it
will still show as hex, but a macro fail will no longer result from this.
When the user defines or redefines the data type, the "Uncertain data type"
attribute bit is now cleared. This bit is now also cleared when a label is
removed.
When using "SAVE/Save .asm/Partial" or "SAVE/Calc .asm size/Partial", no
EQUate or Xref table will be created.
When a file with overlays is loaded, only the root node is loaded. When this
happens, the user is now notified of this, and must select "okay" on the
requester before ReSource will continue.
If data type "word", "longword" or "code" is selected at an odd address, a
display beep is now generated.
During the functions "SAVE/Calculate .asm size/" and "SAVE/Save .asm/", for
any lines which create code or data which will not assemble correctly (odd
address, "START+" references, invalid code "????"), an address will be pushed
onto the cursor stack, representing the start of each of these lines. Thus,
after using one of these functions, use "CURSOR/Absolute/Previous location"
to go directly to each of these erroneous lines. This is an excellent way to
quickly ensure that the source code that you create will assemble properly.
ReSource now remembers the presence of any "AFLINE" macros, after saving/
reloading a ".RS" file.
The "CURSOR/Absolute/Forward reference" and "CURSOR/Absolute/Second forward
reference" functions normally allow you to reference a label only. It is now
possible to forward-reference on a symbol, even if the symbol is actually a
combination of two or more labels, and even if it was created using dynamic
indirection.
If the user creates a symbol which is currently also defined as a label, a
display beep will be generated.
When creating labels from forward references, if ReSource detects that a
reference to an odd address is coming from code, a display beep will be
generated, and also a macro fail will result. If using "LABELS/Create
multiple/All", the scan will stop.
When supplying a parameter for the "SPECIAL FUNCTIONS/Zap" function, if the
string you supply starts with ".l", ".w" or ".b", the number following will
be treated as a longword, word, or byte, respectively. In this case, the
accumulator operand size does not matter. The case of the letter "l", "w",
or "b" may be upper or lower.
Several values in the "CIA Resource" symbol base were incorrect. Fixed.
The "LABELS/Create multiple/All" function now uses a different algorithym to
detect when it should stop creating labels. The chance of it mistaking ascii
for code is now much decreased.
The function "LOCAL MACROS/Save local macros" has always saved all macros,
and not just the local ones. It has been renamed "LOCAL MACROS/Save all
macros".
While a macro is executing, if the "CANCEL" gadget is selected for a
requester, the macro will now abort.
To use the "Block fill" function, the start and end addresses must now be
specified by selecting "DISPLAY/Block fill/Set start" and "DISPLAY/Block
fill/Set end" at the appropriate locations in the file. The block-fill start
and end addresses will default to the actual start and end of the file.
The start and end for partial saves now default to the start and end of the
current file. There is two new functions, "SAVE/Partial save/Reset start"
and "SAVE/Partial save/Reset end". Selecting these will reselect the default
values.
The "DISPLAY/Fill-in data types" and "DISPLAY/Fill-in D/T Fwd" functions used
to perform many functions, one of which was to try to guess data type changes
where it seemed appropriate. Because other functions have been greatly
improved, this became less necessary, and even sometimes annoying when it
made the wrong choice. The Fill-in data type functions have been greatly
simplified, and will no longer make any data type changes themselves. As a
result of this, they take around half as much time as they used to. It is
still a good idea to use "DISPLAY/Fill-in data types" before saving to either
a ".asm" or ".RS" file, however these are the only occasions when it should
be required.
A number of "SYMBOL" functions were giving bad symbols when the value for
which a symbol was required, was greater than $FFFFFF. Fixed.
The "OPTIONS 2/Ascii longs/" options have been removed from the menus.
Because any number can now be shown as ascii individually (if within the
valid ascii range) these functions became obsolete. If you press a key which
is bound to these functions, it will give the same result as if the key was
not bound to anything.
The functions "STRINGS/Output buffer/Append accumulator" had problems when
more than 4K or information was put into it. Fixed.
If ReSource's window is selected (activated) when the intuition pointer is on
the far left of the screen, a screen update will now *not* be performed.
This may be necessary after saving to a ".asm" file, when the source profile
information is to be saved to a file.
When using the functions "CURSOR/Absolute/Label" and "CURSOR/Absolute/
Symbol", if required label/symbol was at the start of the file, the function
used to fail. Fixed.
=eof=