home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-09-05 | 181.8 KB | 6,421 lines |
- This file documents Barfly, a development system for AmigaOS V2.04 or
- newer.
-
-
-
- Barfly 1.0
-
- An Intuition controled Debugger and Optimizing Assembler
-
- Copyright (c) 1989-94 Ralph Schmidt
-
- - Shareware -
-
- Basic Informations
- ******************
-
- Copyright and other legal stuff
- ===============================
-
- Copyright (c) 1989-94 Ralph Schmidt
-
- Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
-
- No guarantee of any kind is given that the programs described in
- this document are 100% reliable. You are using this material at your
- own risk. The author *can not* be made responsible for any damage which
- is caused by using these programs.
-
- Permission is granted to include this package in Public-Domain
- collections, especially in Fred Fishs Amiga Disk Library (including
- CD-ROM versions of it). The distribution file may be uploaded to
- Bulletin Board Systems or FTP servers. If you want to distribute this
- program you *must* use the original distribution archive `Barfly.lha'.
-
- *None* of the programs may be included or used in commercial programs
- unless by written permission from the author.
-
- *None* of the programs may be modified in any way. This especially
- includes changing the copyright notices or removing any of the Shareware
- restrictions.
-
- *None* of the programs may be used on any machine which is used for
- the research, development, construction, testing or production of
- weapons or other military applications. This also includes any machine
- which is used for training persons for *any* of the above mentioned
- purposes.
-
- *None* of the programs may be used by more than the registrated
- owner.
-
- Registration
- ============
-
- As you may have noticed in the copyright I'm working for five years
- at Barfly. It has always consumed and will continue to consume a large
- amount of my time.
-
- I cannot afford just working for fun. Thus, I decided to release
- Barfly as Shareware. I had already tried to release Barfly as a
- commercial product but the story behind it is more than sad. To sum
- it...german Amiga software companys aren't worth any time...`they suck'.
- Some people may think the price is too high for a Shareware product but
- i think that BAsm is as powerful as the 2 main available commercial
- Assemblers...if not more powerful if you compare the speed and the
- optimize functions;there's no commercial Debugger available that can
- compete with BDebug. I've used Barfly myself for commercial Amiga
- applications. Cyberstorm 060, Z3-Fastlane device, CDRive,
- SCSIConfig,...
-
- The unregistered version of Barfly pops up the About requester at
- the start and has some functions disabled:
- Assembler:
- o only 8192Bytes large code possible
- o the Section commands aren't available
- Debugger:
- o Only 1 Window per Object
- o Enforcer,CyberGuard Catch not available
- o Task Catch not available
- o Crashed Task Catch not available
- o Limited Step count(about 150-200 Steps)
-
- Registered users will be shipped a disk with the newest public
- release of Barfly, along with a personalized, so-called "keyfile". It
- enables all the missing features and disables the Shareware reminders.
- This keyfile will work with all future releases of Barfly, so you can
- simply download the latest version from your local bulletin board
- without having to wait weeks for your update passing through the slow
- mail channels. The keyfile `must not' be distributed in any way.
-
- The fee for a Barfly registration is
- 70.- DM (D-Mark),
- 70.- SFr (Schweizer Franken),
- 230.- FF (French Francs),
- 50.- US$ (US Dollar)
-
- The fastest, cheapest and easiest way to register is put the money
- together with the filled registration form into a letter and send it to
-
- Please allow 2-8 weeks delivery for the registrated version.
- Currently I am very busy with my civil service and working for Phase5 so
- please be patient.
-
- Ralph Schmidt
- Kleiner Hellweg 4
- 33154 Salzkotten
- FR Germany
- Phone: +49-5258-5637
- E-Mail: laire@mises.uni-paderborn.de
- Irc: Laire on #amiga,#amigager
-
- Introduction
- ************
-
- Purpose
- =======
-
- BDebug is an Intuition controled multi-task system Debugger for OS
- 2.04 and newer.
-
- You can use BDebug to debugging your programs, catching tasks,
- reseach Enforcer and CyberGuard hits, follow Source-Level Informations
- and other advanced functions. The Debugger supports assemblers, SAS C,
- Dice and GCC.
-
- Some of BDebug's features are:
-
- * font-sensitive, resizable and Style Guide compliant GadTools GUI
-
- * Object-Oriented that results in a low learning curve
-
- * Supports 68000...68060 and the FPUs
-
- * Can debug multiple tasks at the same time
-
- * Not limited by the amount of window objects.
-
- * highly configurable
-
- * keyboard support
-
- BAsm is a very fast optimizing Assembler for OS 2.04 and newer.
-
- Some of BAsm's features are:
-
- * 68000-68060, 6888x
-
- * Very Fast
-
- * Include and Incbin Cache
-
- * Strong Optimizer with Multi-Pass Optimizing
-
- * High Level Macros
-
- * ARexx
-
- * Supports OS 2.04 and OS 3.0 Hunks
-
- * SAS D1 Source Level Format
-
- System requirements
- ===================
-
- Barfly requires Amiga operating system version 2.04 or better.
-
- Kickstart 1.3 is *not* supported; this operating system is considered
- obsolete.
-
- Barfly requires at least one megabyte of RAM to run. A hardisk or a
- faster CPU is not required but increase performances and comfort, of
- course.
-
- Installation
- ============
-
- It is really easy to install Barfly:
-
- 1. Copy the the binary and the icon (called "BDebug" and
- "BDebug.info") to any directory.
-
- 2. Copy the the binary and the icon (called "BAsm" and "BAsm.info")
- to any directory.
-
- Then copy the supplied configuration files from "s/Barfly/#?" to "S:"
- directory of your system partition or create env:Barflypath with the
- path to a directory that contains Barfly/#?.
-
- Other topics
- ************
-
- Updates
- =======
-
- Whenever a new release of Barfly gets released, I will post some
- information in the appropriate newsgroups of some electronic networks.
- The new archive will soon be available on many bulletin boards and on
- all `AmiNet' FTP servers. Major releases will also come with some PD
- disks, especially on Fred Fish's collection.
-
- As mentioned above, registered users will neither need a new keyfile
- nor a special personalized program version. They can use all new
- features immediately.
-
- Support
- =======
-
- If you have some questions, comments, suggestions or even flames,
- please feel free to contact me at one of the following addresses. If
- you send your letter via e-mail, there's a good chance for getting a
- quick reply.
-
- Snailmail: Ralph Schmidt
- Kleiner Hellweg 4
- 33154 Salzkotten
- FR Germany
-
- Phone: +49-5258-5637
-
- E-Mail: laire@mises.uni-paderborn.de
- Irc: Laire on #amiga, #amigager
-
- History
- =======
-
- * 0.0 - 1.0
- not released
-
- Future
- ======
-
- Here are some ideas for future versions of BDebug:
-
- * Full Source Level support for GCC and perhaps SAS.
-
- * Better BDebug Arexx support...the current one is a bad excuse.
-
- * Mungwall Trace methods.
-
- * Automatic Refresh of some Windows(Task Window...)
-
- * Amigaguide file mode in the autodocs functions.
-
- * Highlight changed registers
-
- * Better documentation.
-
- * BAsmOption for the easy BAsm options configuration.
-
- * Other things i'm too lazy to mention now.
-
- Important:
- There is absolutely NO guarantee that these features will ever be
- implemented. So don't be disappointed, if they aren't in the next
- version.
-
- Acknowledegments
- ================
-
- Thanks must go to:
-
- - Dirk Leschner, Frank Jakobs
-
- for being my best friends
-
- - Matthias Scheler
-
- for his manual design and Filer.
-
- - S.Schaem, Børge Nøst, Alexis Wilke, Michael B. Smith, Marc Heuler
-
- for their superb betatesting efforts
-
- - Mike Schwartz
-
- for a lot suggestions to improve basm. Sad he has left the Amiga
- community 2 years ago.
-
- - Stefan Becker
-
- for Toolmanager and being a nice guy.
-
- - Christoph Wolf
-
- for DynamiCache and being a nice guy.
-
- - Brian Cerveny(Redwine)
-
- for Grapevine and being a nice guy.
-
- - All my IRC friends.
-
- for many great hours. Thanks!
-
- Andrew Denton(Guardian), Kenneth Dyke(Nyx), Bill Coldwell(Cryo),
- Brian Cerveny(Redwine), Joseph Hillenburg(xterm), Scott
- Ellis(ScottE), Chris Wichura(Caw), John Wiederhirn(John\_W), Mike
- Schwartz(mykes), Markus Illenseer(ill), Petra Zeidler(stargazer),
- Michael van Elst(mlelstv), Holger Lubitz(holgi), Ralph
- Babel(rbabel), Seth Harman(Budha) and a lot guys i haven't
- mentioned here.
-
- - Chris Schneider and Urban D. Mueller
-
- for some suggestions 2-3 years ago and installing Aminet.
-
- - Michael "billy" Böhnisch
-
- for his cleanup on MakeBarflyFD 2-3 years ago.
-
- - Steve Wright
-
- for designing the icons 2 years ago.
-
- And of course to all the other Beta testers and registered users.
-
- The V40 Includes can be ftp'ed from the FTP-Server.
-
- ftp.rz.uni-wuerzburg.de: pub/amiga/frozenfish/bbs/com
-
- A superb Linker "lk" by Alex Wilke should be soon availble on Aminet.
-
- BDebug 1.0
-
- An Intuition controled Debugger
-
- Copyright (c) 1989-94 Ralph Schmidt
-
- - Shareware -
-
- Usage of BDebug
- ***************
-
- The Command Window
- ==================
-
- Debugger Philosophy
- ===================
-
- BDebug is a multitasking Debugger that supports the Motorola
- processors 68000...68060 and 68881...68882. The Debugger allows to
- debug unlimited tasks parallel. Because of the Debugger's complexity
- BDebug was designed in an object-oriented way to allow an easy and
- comfortable way to use it. The register window `REGWindow' is the Root
- class of the task object that can be expanded by several subclass
- windows. Every subclass window has privat menus and inherits the
- public menus of its father object.
-
- Debug Methods
- =============
-
- The Debugger offers a variety of different Debug methods that can be
- activated by menu or gadget.
-
- Debug Task
- ..........
-
- is used to select a task you wann to debug. If you doubleclick on a
- task a `REGWindow' and a couple of information windows opens. Which
- type and how many are opened depends on the current configuration.
- After the task could be stopped the contents of the `REGWindow' and all
- other information windows gets refreshed. If the task is in the `Wait'
- state the task is stopped when it gets a signal.
-
- Task Listview Layout
-
-
- Taskaddress & Priority & Status & Name
-
- Process Listview Layout
-
-
- Taskaddress & Priority & Status & Name[CLI Number,CLI Name]
-
- You should know what task you can stop and what kind of task should
- never be stopped. For example the Input.device should never be stopped.
-
- Debug File
- ..........
-
- is used to load and stop a program. This function is equal to the
- bdebug cli startup with the exception that you can enter the parameter
- in a requester. If no error occur all configurated windows are opened
- and the PC stops at the defined programstart breakpoint that normally
- points to the first command of the program.
-
- Debug Next Task
- ...............
-
- is used to debug the next task that is opened. The Debugger waits
- until another task is created by AddTask and a couple of information
- windows opens. Which type and how many are opened depends on the
- current configuration. After the new task was caught the pc points to
- the beginning of the task and `Catch Next Task' is disactivated. To
- catch a program that is started from the WV you have to use `Debug Next
- Task' to catch the WB Startup Task `WBL' that starts the program. Now
- you have to activate `Debug Next Task' again and let the current task
- run. After a short time the task `WBL' ends and the program's task is
- caught.
-
- You should avoid to start a new task between the 2 `Debug Next
- Task' phases because it's easy to catch the wrong one.
-
-
- You should notice that `AddTask' is patched and points to a new
- routine. Thus you should be careful with programs that also patch
- `AddTask'. Furthermore it's useful to know in what sequences these
- patches have to be removed. The Debugger can only be closed when
- all patched system function that were installed after the Debugger
- was started are removed.
-
-
- If you start a program in the shell without `c:Run' no new task is
- created. Instead the program is run as a subroutine in shell's
- task so you can't catch the task that easy.
-
-
- Debug Crashed Task
- ..................
-
- is used to catch tasks that crash so you track down the bug location
- a lot easier. If the system itself doesn't run anymore you shouldn't
- expect that bdebug still runs because it depends on a working system.
- If a task crashes and the option `Debug Crashed Task' is activated a
- couple of information windows opens. Which type and how many are opened
- depends on the current configuration. `Task Held Requester'.
-
- Catch Enforcer Hit
- ..................
-
- is used to tell the Debugger to stop the task it controls when an
- Enforcer or CyberGuard hit happens. Unfortunately the Debugger can't
- always stop the task at exactly the same location where the hit
- happened. Mostly the hit command is 1-2 instructions above the stopped
- task's PC.
-
- This function needs Enforcer V37.x by M. Sinz or CyberGuard V1.x and
- it must be installed before BDebug is launched. Please read the
- documentation.
-
- Select Display Mode
- ...................
-
- This function allows you to choose Screen Mode for the Debugger.
-
- How to start ?
- ==============
-
- If you only want to debug a program you have to start bdebug with
- the program's name and parameters or by using `Debug Program' in the
- command window. Another method is to move a program's icon on the
- command window or specify BDebug as in the icon as the `DefaultTool'.
-
- `Name:'
-
- BDEBUG - The CLI Startup
-
-
- `Synopnis:'
-
- BDEBUG [?] [<Program> [Argument] ]
-
-
- `Function:'
-
- BDebug activates the Debugger, loads and stops the optionally
- entered program. If it can find a local config file with the
- suffix *.bdebug it loads it.
-
-
- `Inputs'
-
- * ? shows an information message
-
- * program name If no program name is entered BDebug looks for
- env:BDebugProgram and loads the program instead that the env:
- points to.
-
- * argument line of the program. If there are spaces in
- parameters you have to enclose the argument with `""'.
-
-
- Usage of BDebug
- ***************
-
- The Register Window
- ===================
-
- Register Window
- ---------------
-
- The register window is the most important control layer of the
- Debugger and every debugged task has one. You can link unlimited other
- information windows to the `REGWindow' or you can tell the Debugger to
- give up controling the task. In the title line of the window you can
- see the ID number of the task, so you can recognize what information
- window belongs to this task. Furthermore the title line also contains
- the task address, the state, `RUN', `WAIT' or `STOP' and the name of
- the task. The task is in the `RUN' state if the task has the control
- at the moment instead of the traphandler; the task is in the `STOP'
- state when the task waits and the traphandler controls what happens.
- The task is the `WAIT' state only when the Debugger has to wait to
- catch a task by a `Debug Task'. In the upper area of the window you
- see the normal data and address registers where the address register
- also have additional information fields. To change a register or to
- watch memory where the register points to you only need to doubleclick
- on the register or on the register's memory contents. Furthermore you
- may change other usermode registers by this method. Supervisor
- register can't be changed because that doesn't make much sense for a
- system Debugger.
-
- `68000 Registers'
-
- D0=xxxxxxxx yyyy A0=xxxxxxxx Arg1 Arg2 [!]
-
- D1=xxxxxxxx yyyy A1=xxxxxxxx Arg1 Arg2 [!]
-
- D2=xxxxxxxx yyyy A2=xxxxxxxx Arg1 Arg2 [!]
-
- D3=xxxxxxxx yyyy A3=xxxxxxxx Arg1 Arg2 [!]
-
- D4=xxxxxxxx yyyy A4=xxxxxxxx Arg1 Arg2 [!]
-
- D5=xxxxxxxx yyyy A5=xxxxxxxx Arg1 Arg2 [!]
-
- D6=xxxxxxxx yyyy A6=xxxxxxxx Arg1 Arg2 [!]
-
- D7=xxxxxxxx yyyy A7=xxxxxxxx Arg1 Arg2 [!]
-
- USP=xxxxxxxx SSP=xxxxxxxx PC=xxxxxxxx SR=xxxx
-
- * [!] shows if the address register points on an odd address.
-
- * if the address register points on an illegal memory area the char
- `*' is shown in Arg1 and Arg2 to avoid crashes by reading non
- readable io-addresses. You can config the readable memory areas.
-
- * if the address register points on the following system structures
- the name of the Node is shown in Arg1 and the Name of the
- structure in Arg2.
-
- * Library
-
- * Device
-
- * Port
-
- * Task
-
- * Resource
-
- * MemHead
-
- * if the address register points to the custom chip area the name of
- the register is shown in Arg1 and the ID-Word CUSTOM is shown in
- Arg2. Custom register map is $dff000-$dff200.
-
- * if the address register points to a symbol the symbol and the
- contents is shown.
-
- * Otherwise 8Bytes of the memory are shown where the register points
- to. The 8 Bytes are shown hexadecimal in Arg1 and ascii in Arg2.
-
- `68010 Registers'
-
- VBR=xxxxxxxx SFC=xxxxxxxx DFC=xxxxxxxx
-
- `68020 Registers'
-
- VBR=xxxxxxxx SFC=xxxxxxxx DFC=xxxxxxxx
-
- MSP=xxxxxxxx ISP=xxxxxxxx CACR=xxxxxxxx CAAR=xxxxxxxx
-
- `68030 Registers'
-
- VBR=xxxxxxxx SFC=xxxxxxxx DFC=xxxxxxxx
-
- MSP=xxxxxxxx ISP=xxxxxxxx CACR=xxxxxxxx CAAR=xxxxxxxx
-
- CRP=xxxxxxxxxxxxxxxx SRP=xxxxxxxxxxxxxxxx
-
- TT0=xxxxxxxx TT1=xxxxxxxx TC=xxxx PSR=xxxxxxxx
-
- `68040 Registers'
-
- VBR=xxxxxxxx SFC=xxxxxxxx DFC=xxxxxxxx
-
- MSP=xxxxxxxx ISP=xxxxxxxx CACR=xxxxxxxx
-
- URP=xxxxxxxx SRP=xxxxxxxx TC=xxxx PSR=xxxxxxxx
-
- ITT0=xxxxxxxx ITT1=xxxxxxxx DTT0=xxxxxxxx DTT1=xxxxxxxx
-
- `68060 Registers'
-
- VBR=xxxxxxxx SFC=xxxxxxxx DFC=xxxxxxxx
-
- CACR=xxxxxxxx PCR=xxxxxxxx BUSCR=xxxxxxxx
-
- URP=xxxxxxxx SRP=xxxxxxxx TC=xxxx PSR=xxxxxxxx
-
- ITT0=xxxxxxxx ITT1=xxxxxxxx DTT0=xxxxxxxx DTT1=xxxxxxxx
-
- Type Information
-
- xxxxxxxx [Symbol] Mnemonic operand1[,...]]
-
- (EA): [Address1=Contents]...[Address2=Contents]
-
- In the `(EA)' line you can see the addresses and their contents
- the current command accesses. The contents of illegal addresses
- aren't shown.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the `REGWindow', all connected windows and disactivates the
- Debugger for this task. To disactivate the Debugger you have to
- choose if the task should keep running so it's the task's business
- to stop. Furthermore you can end the task by runing the cleanup
- routine of the task or just removing the task from the list but
- this can cause sideeffects you can't always oversee. If the task
- is a process then the Remove option is equal to the Cleanup option.
- If it's only a task the Cleanup option is equal to the Cleanup
- option. Note that the Remove option doesn't free any resources of
- the task.
-
- You should really know what you're doing if you, for example,
- remove a task from the system.
-
-
- * ZOOM Windows
-
- expands all windows of the task.
-
- * Log File
-
- activates or disactivates the loging of the register and PC
- changes.
-
- * Big View
-
- shrinks the `REGWindow' to a 68000 register layout or expands it
- back to the full layout.
-
- * Open DissWindow
-
- opens a DissWindow with the configured dimensions.
-
- * Open MemWindow
-
- opens a MemWindow with the configured dimensions.
-
- * Open FPUWindow
-
- opens a FPUWindow with the configured dimensions. The menu is
- only available if a FPU is installed.
-
- * Open BreakWindow
-
- opens a BreakpointWindow with the configured dimensions.
-
- * Open CoppWindow
-
- opens a CoppWindow with the configured dimensions.
-
- * Open StructWindow
-
- opens a StructWindow with the configured dimensions.
-
- * Open SnoopWindow
-
- opens a SnoopWindow with the configured dimensions.
-
- * Open WatchWindow
-
- opens a WatchpointWindow with the configured dimensions.
-
- * Open ChecksumWindow
-
- opens a ChecksumWindow with the configured dimensions.
-
- * Save Window Settings
-
- saves the positions and count of all window the current task
- controls. The saved file then contains the appropriate commands
- you have to enter yourself into the configuration file. Because
- of the Debugger's window concept it doesn't make sense to save a
- complete configuration file.
-
- Public Menus
- ------------
-
- * Step 1
-
- runs the current command and stops the task afterwords.
-
- * Step X
-
- runs X commands and stops the task afterwards.
-
- * Step Debug Line
-
- runs commands until the PC encounters another source line. If the
- PC is outside the program or if no debug informations are
- available a single step i used. The command enters subroutines.
-
- * Trace Debug Line
-
- is similar to `Step Debug Line' with the exception that it runs
- subroutines.
-
- * Trace over Calls
-
- runs the current command or subroutine and stops the task
- afterwards. Depending on the configuration and the memory area a
- breakpoint or single steps are used. If a crash happens in
- certain program parts you should remove the command `Tracebreak'
- from the configuration.
-
- You should avoid to use `Tracebreak' in Libraries and Devices
- which are located in the ram. If another task accesses the
- routine at the same time you can expect an illegal exception.
-
-
- Some Amiga MMU Setups don't like programs writing to the
- kickstart rom. For example when breakpoints are set.
-
-
- * Trace X over Calls
-
- runs X commands or subroutines and stops the task afterwards.
- Depending on the configuration and the memory area a breakpoint or
- single steps are used.
-
- * Trace Work
-
- is similar to the command `Trace over Calls' with the exception
- that all commands are run. This function is useful to trace loops.
-
-
- Example:
- moveq #10,d0
- 0$:
- dbra d0,0$
-
- If you use the function on the command `dbra' the Debugger
- sets a breakpoint after the dbra and runs the task. It drops
- back to single step when it hits a `Jmp', `bra', `rts'....
-
-
- * Trace over OS-Calls
-
- runs the current command or the OS function and stops the task
- afterwards.
-
- * Trace on Flow
-
- stops the task when a PC direction occurs. This means the PC is
- stopped when it hits a `Jsr', `Jmp', `bcc', `rts'....
-
- * Trace on Address
-
- runs the task until the PC is equal to the entered address. This
- function is not very fast because the task is running in single
- step mode and after each instruction the PC is compared with the
- address.
-
- * Trace out of OS
-
- runs the task until the PC is outside of the kickstart. This
- function is useful when you catch a task inside the OS and you
- want to get as fast as possible back to the program's code. It
- works similar as `Trace on address'.
-
- You shouldn't use this command if your task only runs in the
- kickstart.
-
-
- * (PC)++
-
- jumps over the current command. Useful to jump over `Illegal'
- breakpoints used for debugging purposes in your program.
-
- * PC-2
-
- subtracts 2 Bytes from the PC.
-
- * Write Nop
-
- overwrites the current command with a `Nop'.
-
- * Write Illegal
-
- overwrites the current command with an `Illegal'.
-
- * Run Task
-
- runs the task and stops only on exceptions.
-
- * Run Watched Task
-
- runs the task in trace mode and stops when a WatchPoint condition
- is true. If there are no watchpoints the command behaves like
- `Run Task'.
-
- * Run History Task
-
- runs the task in trace mode and saves the registers each step into
- the history stack.
-
- * Stop Task
-
- stops the task.
-
- * Send Signal
-
- sends a signal to the task. Default Signal is CTRL-C = 12
-
- * Undo Level
-
- sets the undobuffer's depth.
-
- * Undo
-
- undos the last changes in the registerframe.
-
- * View Refresh
-
- activates and disactivates the copperlist refresh after each trace
- operation. This function is help for debugging programs which
- install own copperlists.
-
- * Show (EA)
-
- activates and disactivates the output of the address and address
- contents which are accessed by the current assembler command.
-
- * Symbol
-
- activates and disactivates the use of symbols in the `REGWindow'.
-
- * Delete Symbols
-
- erases all symbols of the task.
-
- * Copy Symbols
-
- can copy a symbol list of the task to a different task. This
- function is helpful if your task is started from another task and
- you want to keep the symbol list.
-
- * Load Symbols
-
- loads the symbols of a program where you can select an alternative
- process's segmentlist for calculating the symbol and debug
- informations. Normally you choose the same process but sometimes
- it's helpful to select a different process. For example, if the
- task you debug is created in a program, you have to choose the
- program's task to get the correct symbol addresses.
-
- * Set Hunklist
-
- sets a new segment list for the SourceWindow and some other hunk
- related functions. Because the position in the SourceWindow
- depends on the segments sometimes help to load new symbols and
- debug informations for this task. If you load an alternative
- Hunklist by selecting a custom task when you use `Load Symbols'.
-
- * Reset Hunklist
-
- removes the alternative hunklist.
-
- * Show Value
-
- shows the value of an argument.
-
- * Show Last Exception
-
- shows the last exception.
-
- * Open Task Window
-
- opens a window showing the task structure of the task.
-
- * Open System Window
-
- opens a window showing the ExecBase structure.
-
- * Open Proces Window
-
- opens a window showing the process structure of the process.
-
- * Open CLI Window
-
- opens a window showing the cli structure of the process.
-
- * Open Hunk Window
-
- opens a window showing the hunks of the process.
-
- * Open Symbol Window
-
- opens a window showing the symbols of the process. If you
- doubleclick on a symbol you get the hunk where the symbol is
- located.
-
- * Open Library Window
-
- opens a window showing the libraries. If you doubleclick on a
- library entry it opens a `FD:' window that shows all functions of
- the library when the library is defined in the `Barfly.FD' file.
- Furthermore if you doublelick on a function you have the choice to
- see the function in a `DissWindow' or the autodocs documentation.
-
- * Open Device Window
-
- opens a window showing the devices.
-
- * Open Resource Window
-
- opens a window showing the resources.
-
- * Open Port Window
-
- opens a window showing the public ports.
-
- * Open Resident Window
-
- opens a window showing the resident modules.
-
- * Open Interrupt Window
-
- opens a window showing the interrupts.
-
- * Open AutoDocs Window
-
- opens a filerequester which lets you choose the needed autodocs
- information of a library. This opens a window which shows all
- functions of the chosen autodoc file. If you now click on a
- function another window is opened showing the function
- documentation.
-
- * Open History Window
-
- opens a HistoryWindow showing the last saved registerframes of the
- undobuffer. The undobuffer is organized in a way to make the first
- entry become the last entry in the HistoryWindow. The
- HistoryWindow isn't updated automaticlly.
-
- * Stack Check
-
- controls the stack check. A warning is displayed if the register
- A7 points out of the stack bounds or points on an odd address.
- The Debugger only checks the task when the task gives back the
- control to the traproutine, so it's not possible to notice every
- stack problem.
-
- You should be aware that this function doesn't work with a
- WShell task because the `WShell' doesn't set the correct
- stack task values.
-
-
- * Find Task of address
-
- tries to find the task which belongs to the entered address. The
- command checks if the address is in the task, process, cli,
- mementry structure and the hunks. It's not safe to assume that
- the function can check all cases.
-
- * Load Binary
-
- loads a file with an optional length into a memory area. If you
- want the Debugger to automaticlly allocate the memory block you
- have to close the memory requester.
-
- * Save Binary
-
- saves a memory area into a file.
-
- * Freeze Task
-
- freezes a selectable task. When bdebug ends the frozen tasks are
- awakened again.
-
- * Warm up Task
-
- warms up a frozen task.
-
- * Kill Task
-
- kills a selectable task.
-
- You should know which task you can kill. For example, don't
- kill the input.device or your filesystem.
-
-
- * Show Task
-
- shows the task structure of a selectable task.
-
- * Show Prozess
-
- shows the process structure of a selectable process.
-
- * Show CLI
-
- shows the cli structure of a selectable process.
-
- * Show Hunk
-
- shows the hunks of a selectable process.
-
- * Send Task Signal
-
- sends a signal to a selectable task.
-
- * Set Task Priority
-
- sets a priority of a selectable task.
-
- * Refresh Code Cache
-
- refreshes the Code Cache.
-
- * Refresh Data Cache
-
- refreshes the Data Cache
-
- Usage of BDebug
- ***************
-
- The FPU Window
- ==============
-
- FPU Window
- ----------
-
- The FPU Window shows the FPU register FP0 to FP7 in the 96Bit
- Extended format and the registers FPCR, FPSR and FPIAR in hexadecimal.
- You can only open this window if a FPU is available.
-
- Register Window Layout
-
- FP0=FloatingPoint
-
- FP1=FloatingPoint
-
- FP2=FloatingPoint
-
- FP3=FloatingPoint
-
- FP4=FloatingPoint
-
- FP5=FloatingPoint
-
- FP6=FloatingPoint
-
- FP7=FloatingPoint
-
- FPCR=xxxxxxxx FPSR=xxxxxxxx
-
- FPIAR=xxxxxxxx
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- Usage of BDebug
- ***************
-
- The Disassembler Window
- =======================
-
- Disassembler window
- -------------------
-
- The `DissWindow' shows the memory contents in assembler mnemonics.
- The address of the window's view can be absolute or relative. In
- absolut mode, the window shows the contents of a fixed address,
- indicated by the window title `No Link'. In relative mode the window
- is connected to a register causing the window to update when the the
- register value changes. This is indicated by the window title which
- reads `Link to *', where * represents the register name. The PC is
- shown by the colour pen 2. If the linked register value is outside of
- the window's view area the whole contents of the window will be
- refreshed. You can change size of the window and scroll through the
- memory area by using the cursors. In the title you see an ID-String
- with the format `\#x.y' where `X' represents the `REGWindow' number and
- `y' the number of the `MemWindow'. Doubleclicking a line of the window
- sets or remove a breakpoint. You can disable this function in the
- configuration.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Link to Register
-
- links the window with a register. If you enter the string `NO' it
- switches to absolute mode.
-
- * Change address
-
- changes the view address of the window.
-
- * Clear address
-
- resets the view address of the window.
-
- * Refresh Window
-
- refreshes the window.
-
- * .W Branches
-
- activates and disactivates the output of the old branch width size.
-
- * Neg. Offsets
-
- activates and disactivates the output of negative values in
- indirect address modes with offset.
-
- * Neg. Data
-
- activates and disactivates the output of negative values in direct
- address mode.
-
- * Opcode Data
-
- activates and disactivates the additional output of the command
- bytes.
-
- * Auto Refresh
-
- activates and disactivates the global refresh of the window after
- each step.
-
- * Symbols
-
- activates and disactivates the symbol output in the window.
-
- * Show Lib Call
-
- activates and disactivates the symbolic output of library
- functions so all library functions that are defined in the
- configuration file `<BarflyPath>/Barfly/BARFLY.FD' are recognized.
-
- * Guess Lib Call
-
- activates and disactivates the guessing of function call names.
- This only works in connection with the option `Show Lib Call'.
- Unfortunately you can't expect that the function names always fit
- because the library base register A6 can change until the program
- counter meets the function.
-
- * Mark Block End
-
- activates and deactivates marking after the instruction `JMP',
- `BRA', `RTS', `RTE', `RTD' and `RTR' to make program blocks more
- visible.
-
- * Set/Clear Breakpoint
-
- sets/removes a breakpoint on the first entry in the window.
- Breakpoints are shown by changing the pen from colour 1 to colour
- 3 and the char `>' at the beginning of a line.
-
- * Pick/Clear Breakpoint
-
- sets/removes a breakpoint through a symbol list.
-
- * Disassemble to File
-
- disassembles a memory area into a file.
-
- Usage of BDebug
- ***************
-
- The Memory Window
- =================
-
- Memory window
- -------------
-
- The `MemWindow' shows the memory contents hexadecimal and in
- ascii.You can change size of the window and scroll through the memory
- area whith the cursor keys. In the title you see an ID-String with the
- format `\#x.y' where `X' represents the `REGWindow' number and `y' the
- number of the `MemWindow'.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Link to Register
-
- links the window with a register. If you enter the string `NO' it
- switches to absolute mode.
-
- * Change address
-
- changes the view address of the window.
-
- * Clear address
-
- resets the view address of the window.
-
- * Refresh Window
-
- refreshes the window.
-
- * Memory Offset Step
-
- defines the data format in the window. The following options can
- be selected: `None', `Byte', `Word' and `Long'.
-
- * Edit
-
- activates edit mode of the `MemWindow'. In edit mode you can
- switch between hex and ascii input by the key `RETURN'. With `ESC'
- you can leave edit mode. Only the cursor right and left are
- changed to the normal. With these both keys you can access each
- Byte. In edit mode you can't change the size of the window.
-
- * Copy
-
- copies a memory area into another memory area. The function uses
- `CopyMem' so it doesn't handle memory areas that overlap.
-
- * Fill
-
- fills a memory area with a value of a certain data-width.
-
- * Compare
-
- compares a memory area with another memory area.
-
- * Search
-
- searches a value of a certain data-width in a memory area. If the
- value is found, the address and the value are displayed and you
- can goon with `Search Next' to find the next address.
-
- * Search Next
-
- Search the next value. Look at `Search'
-
- * Pred
-
- sets the address of the window tn the preceding entry of the list.
- If the node points on an odd, illegal or NULL address the command
- has no effect. The next node is equal to `LN_PRED', the second
- longword of the memory view.
-
- * Succ
-
- sets the address of the window to the next entry of the list. If
- the node points on an odd, illegal or NULL address the command has
- no effect. The next node is equal to `LN_SUCC', the first longword
- of the memory view.
-
- Usage of BDebug
- ***************
-
- The Copper Window
- =================
-
- CopperWindow
- ------------
-
- The `CopperWindow' shows the memory contents as copper commands.
- The window is sizeable, and you can use the cursor keys to scroll
- through the memry area. In the title you see an ID-String with the
- format `\#x.y' where `X' represents the `REGWindow' number and `y' the
- number of the `CoppWindow'.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Link to Register
-
- links the window with a register. If you enter the string `NO' it
- switches to absolute mode.
-
- * Change address
-
- changes the view address of the window.
-
- * Clear address
-
- resets the view address of the window.
-
- * Refresh Window
-
- refreshes the window.
-
- * Goto Into List
-
- sets the window list on the standard copperlist
- `GfxBase->gb_copinit'.
-
- Usage of BDebug
- ***************
-
- The Structure Window
- ====================
-
- StructWindow
- ------------
-
- opens window which can be connected with a structure. You can use
- new structure entries by expanding the the
- `<BarflyPath>/Barfly/Barfly.Include' file or loading a new custom file.
- By a doubleclick on a structure window entry you can cause several
- actions depending on the datatype. Every datatype is connected with an
- action that is normally started automaticlly. With the configuration
- command `NoAutoStructAction' you can change this behaviour so that an
- action type requester is opened.
-
- The following datatypes are available.
-
- * APTR opens a MemWindow.
-
- * CSTR shows a string.
-
- * BPTR opens a MemWindow at the address BPTR*4.
-
- * BSTR shows a string at the address (BPTR*4)+1
-
- * CPTR opens a DissWindow.
-
- * FPTR opens a DissWindow.
-
- * BYTE doesn't cause an action.
-
- * WORD doesn't cause an action.
-
- * LONG doesn't cause an action.
-
- * FLOAT doesn't cause an action.
-
- * DOUBLE doesn't cause an action.
-
- * EXTENDED doesn't cause an action.
-
- * RPTR doesn't cause an action.
-
- The following action types are available.
-
- * MemWindow opens a MemWindow.
-
- * DissWindow opens a DissWindow.
-
- * CoppWindow opens a CoppWindow.
-
- * StructWindow opens a StructWindow.
-
- * NewStruct sets a new structure.
-
- Structure Macro Fileformat
- --------------------------
-
- This section describes the file format of structure macros. In the
- beginning you define the root directory entries with the first Macro
- `Menudir'. The first parameter is the name of the entry, then the
- address of the parent directory and then the address of the
- subdirectory. In the root directory the parent address is obviously
- NULL. The last entry of the directory is defined by the Macro
- `MENUDIREND'.
-
- `Label ListViewMacro Link'
- RootDir:
- .
- .
- MENUDIR exec,0,Exec_Dir
- .
- .
- MYCUSTOMENTRY:
- MENUDIREND CUSTOM,0,0
-
- The design of a subdirectory only differs from the root directory
- entries only by a parent directory address.
-
- `Label ListViewMacro Link'
- Exec_Dir:
- .
- .
- MENUDIR nodes.i,RootDir,Nodes_Dir
- .
- .
- MENUDIREND tasks.i,RootDir,Tasks_Dir
-
- to define the structure directory entries you have to use `MENUITEM'
- and `MENUITEMEND'. The first parameter in the Item Macros is the name
- of the entry and also the name of the structure. The second parameter
- defines the address of the parent directory.
-
- `Label ListViewMacro Link'
- .
- .
- Nodes_Dir:
- MENUITEM LN,Exec_Dir
- .
- .
- MENUITEMEND
-
- To define a structure you can use the normal assembler syntax that
- you probably have to adjust to your custom needs. For example you can
- tell BDebug more informations about the datatype an entry represents.
- By redefining `APTR' to a `CSTR' you can tell the Debugger that the
- entry is a stringpointer. Another example is defining that `APTR'
- points to a structure by `APTR LN_SUCC,Node'.
-
- `Label IncludeTypeMacro Name,Link'
- LN_Struct:
- STRUCTUREB LN,0
- APTR LN_SUCC,LN
- APTR LN_PRED,LN
- UBYTE LN_TYPE
- BYTE LN_PRI
- CCSTR LN_NAME
- LABEL LN_SIZE
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Link to Register
-
- links the window with a register. If you enter the string `NO' it
- switches to absolute mode.
-
- * Change address
-
- changes the view address of the window.
-
- * Clear address
-
- resets the view address of the window.
-
- * Refresh Window
-
- refreshes the window.
-
- * Load Custom Struct
-
- loads additional structure files. The new structure entries are
- placed in the `CUSTOM' directory. The format of custom structure
- files is equal to the file `BARFLY.INCLUDE'.
-
- * Select Structure
-
- opens the structure include directory requester where you can
- select the needed structure. The parent gadget is placed in the
- upper border.
-
- * Goto Sysbase...
-
- sets the window address on the ExecBase.
-
- * Goto Gfxbase...
-
- sets the window address on the GFXBase.
-
- * Save Window....
-
- saves the contents of the window in a file.
-
- * Full Address
-
- this switch decides whether the `StructWindow' also shows the
- address of the entries.
-
- * Offset Address
-
- this switch decides wheather the `StructWindow' also shows the
- offset of the entries.
-
- * Pred
-
- sets the address of the window on the preceding entry of the list.
- If the node points on an odd, illegal or NULL address the command
- has no effect. The next node is equal to `LN_PRED', the second
- longword of the memory view.
-
- * Succ
-
- sets the address of the window on the next entry of the list. If
- the node points on an odd, illegal or NULL address the command has
- no effect. The next node is equal to `LN_SUCC', the first longword
- of the memory view.
-
- Usage of BDebug
- ***************
-
- The Structure Window
- ====================
-
- Source window
- -------------
-
- The `SourceWindow' shows the source line that belongs to the window
- address. If the program file doesn't have the needed debug informations
- the `Source window' can't be opened. If the address points to an area
- with no relevant debug information, for example the Kickstart or beyond
- the program hunks, all you see is a small message.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Link to Register
-
- links the window with a register. If you enter the string `NO' it
- switches to absolute mode.
-
- * Change address
-
- changes the view address of the window.
-
- * Clear address
-
- resets the view address of the window.
-
- * Refresh Window
-
- refreshes the window.
-
- * Set Breakpoint
-
- sets a breakpoint on the active line.
-
- * Show HunkInfo
-
- shows the hunk of the current source line.
-
- Usage of BDebug
- ***************
-
- The Snoop Window
- ================
-
- Snoop Window
- ------------
-
- The `SnoopWindow' snoops the task's allocations.
-
- Local Menus
- -----------
-
- * Close Window
-
- closes the window.
-
- * Shrink Window
-
- shrinks the window.
-
- * Expand Window
-
- expands the window to screen size.
-
- * Refresh Window
-
- refreshes the window.
-
- * Auto Refresh
-
- activates/deactivates display refresh by an allocation.
-
- * Snoop Memory
-
- activates/deactivates snooping.
-
- * Snoop Mask
-
- sets the allocation filter mask. If the Mask is set to , only
- allocations with the size 20 are recorded. Default -1.
-
- * Snoop Max Entries
-
- sets the maximal recordable snoop entries.
-
- Usage of BDebug
- ***************
-
- The Breakpoint Window
- =====================
-
- Breakpoint window
- -----------------
-
- The `BreakWindow' handles all breakpoints and contains the functions
- that are needed with breakpoints. In general, breakpoints are
- addresses in the program where the task should be stopped. The
- breakpoints are handled globally so they aren't deleted when close the
- window.
-
- Local Menus
- -----------
-
- * Toggle
-
- activates and deactivates all breakpoints.
-
- * All
-
- selects all breakpoints.
-
- * Clear
-
- unselects all breakpoints.
-
- * On
-
- activates all selected breakpoints.
-
- * Off
-
- deactivates all selected breakpoints.
-
- * Hit
-
- defines how often a breakpoint must be encountered before the
- program stops. Default is 1.
-
- * ?
-
- shows the hunk where the breakpoint is located and also shows if
- the breakpoint is equal to a symbol.
-
- * Input
-
- sets and removes a breakpoint.
-
- * Pick
-
- sets and removes a breakpoint using the symbol list.
-
- * Delete
-
- removes all selected breakpoint.
-
- * Goto
-
- opens a DissWindow for each selected breakpoint.
-
- * Run
-
- runs the program until the PC encounters a selected breakpoint.
-
- Usage of BDebug
- ***************
-
- The Watchpoint Window
- =====================
-
- Watchpoint window
- -----------------
-
- The `Watchwindow' allows to set breakpoints that aren't depending on
- a certain PC address but on other conditions. Every watchpoint has a
- condition, data width and can have one of 3 different watchpoints
- states. The `Memory' watchpoint compares the saved contents of the
- address with the current contents and dependent on the condition the
- program is stopped or not. The `Register' watchpoint compares the
- saved contents of a register with the current contents and dependent on
- the condition the program is stopped or not. The `Argument' watchpoint
- compares the saved value of an argument with the current contents and
- dependent on the condition the program is stopped or not. The last
- watchpoint type is the most powerful because it can simulate the first
- two types with the cost of a slowdown. The use of watchpoints is very
- time consuming because the whole program is run in single step mode.
- In order to use watchpoi you have to run the task with `Run Watched
- Task'.
-
- If an error occurs in the exception handler during the evaluation
- of a dynamic arugment, the screen flashes.
-
-
- Local Menus
- -----------
-
- * Toggle
-
- activates and deactivates all watchpoints.
-
- * All
-
- selects all watchpoints.
-
- * Clear
-
- unselects all watchpoints.
-
- * On
-
- activates all selected watchpoints.
-
- * Off
-
- deactivates all selected watchpoints.
-
- * Add
-
- opens a requester where the parameters for a watchpoint have to be
- adjusted and adds the new watchpoint to the list. You can change
- the parameters simply by doubeclicking on a watchpoint.
-
- * Refresh
-
- refreshes the watchpoint arguments.
-
- * Check
-
- checks all selected watchpoints.
-
- * Delete
-
- removes all selected watchpoints.
-
- Usage of BDebug
- ***************
-
- The Checksum Window
- ===================
-
- Checksum Window
- ---------------
-
- The `ChecksumWindow' controls all checksum areas that are controlled
- each time the task stops. Helpful to find illegal random writes bugs.
- The checkpoints are controled globally so they aren't deleted when you
- close the window.
-
- Local Menus
- -----------
-
- * Toggle
-
- activates or deactivates all checksum areas.
-
- * All
-
- selects all checksum areas.
-
- * Clear
-
- unselects all checksum areas.
-
- * On
-
- activates all selected checksum areas.
-
- * Off
-
- deactivates all selected checksum areas.
-
- * Address
-
- adds a checksum area into the list.
-
- * Hunk
-
- adds a hunk of the current process into the checksum area list.
-
- * Task
-
- adds a hunk of selectable process into the checksum area list.
-
- * Refresh
-
- calculate a new checksum for all selected areas.
-
- * Delete
-
- removes all selected checksum areas.
-
- * Check
-
- checks all areas for checksum errors.
-
- Usage of BDebug
- ***************
-
- Requester Arguments
- ===================
-
- Argument Structur
- -----------------
-
- An argument can use absolut values, symbols and registers as
- operands and the operators +,-,*,/,|,!,&,<<,>>,~. Additionally to the
- normal symbols, some special symbols are available.
-
- * By {Argument}.[b,w,l] you can read from a memory address, that is
- defined by the argument. An error is indicated if you specify an
- illegal address with isn't defined in the legal memory space.
-
- * \#d? represents the address of the `Disswindows' with the ID ?
-
- * \#m? represents the address of the `Memwindows' with the ID ?
-
- * \#c? represents the address of the `Coppwindows' with the ID ?
-
- * \#h? represents the address of the hunk ?. Helpful for Enforcer
- and CyberGuard Hunk:Offset output
-
- * \#ea? represents the address of the EA with the number ?. Check
- Register Window.
-
- * \#em? represents the contents where the address EA number ?
- points to. Check Register Window. If the address EA is illegal an
- error is shown.
-
- * \#ls represents the start address of a loaded binary file.
-
- * \#le represents the end address of a loaded binary file.
-
- * \#ll represents the length address of a loaded binary file.
-
- * \#p represents the start address of the programs. Only true for
- a loaded program.
-
- If you have the following Enforcer or CyberGuard hit output `Hunk
- 0:$11c' you can calculate the address by entering the argument #h0+$11c.
-
- Usage of BDebug
- ***************
-
- Technical Informations
- ======================
-
- Exceptions
- ----------
-
- The Debugger can catch all exceptions if the system is still working.
- If an exception is caused, the traphandler catches the exception and
- tells the Debugger what went on so it can react on the exception. If
- the exception wasn't caused by the Debugger, the type and the possible
- reason for the exception is shown. The `Return-address' of the
- debugged task points on an internal `ILLEGAL'. If the processor
- encounters this `ILLEGAL' the task is closed and all windows are
- removed. You shouldn't step over this `ILLEGAL' because it increases
- the possibility of a system crash. If a task is caught by `Debug Next
- Task' and notices a custom `finalPC' routine in the `Addtask()'
- function, the `Return-address' isn't set on the internal `ILLEGAL'
- cleanup function because the `finalPC' pointer is sometimes used for
- parsing an argument. In this case the Debugger notices that the task
- ends by using the `RemTask()' function.
-
- If the task changes the `Return-address' the Debugger tries to
- determine the taskend by `RemTask'.
-
-
- Exception Handler
- -----------------
-
- Every task has a pointer in its task structure that points to its
- exception handler, named `TC_TRAPCODE'. When you load a program
- through the Debugger, the Debugger's standard exception handler is
- installed. It works basicly the same for `Catch Next Task' and `Debug
- Task'. The only difference is the `Debug Crashed Task' mode where the
- Debugger sets a special catch exception handler in each task that isn't
- controlled by the Debugger. When an exception occurs and the
- Debugger's exception handler is called the Debugger first checks if it
- knows the task that caused it. If this is not the case something
- seriously is broken and the Deadend Alert 35000000 will be popped up.
- If all goes well the registers are saved, the Debugger task gets a
- message and the exception handler waits for a message by the Debugger
- to go on. When the Debugger gets the message it causes the appropriate
- function. For example refreshing the windows. If the Debugger gets a
- step command it sends the exception handler the appropriate message and
- the handler does a step.
-
- Debug Informations
- ------------------
-
- Currently the following formats are supported.
-
- * BASM Specialformat This format allows the Debugger to decide if
- the code is in the Mainpart, Includes or in a Macro.
-
- * SAS D1 This format only allows a Source-Code connection. It
- doesn't support local variables, Structures and Macros.
-
- * GCC STABS This format is very powerful and offers all a
- source-level Debugger needs. Unfortunately the Debugger only
- supports a simple Source-Code connection at the moment. It's
- planned to support more in the future.
-
- GCC Compiler and BDebug
- -----------------------
-
- Unfortunately you can't debug programs that are using the current
- `ixemul.library' because in Openlibrary() initroutine the Task field
- TC_TRAPCODE is changed. Hopefully there'll be soon an `ixemul.library'
- available that doesn't change the traphandler. If you're using GCC
- with the link lib `gerlib' that is available on Aminet FTP Servers you
- shouldn't experience any problems with BDebug.
-
- Usage of BDebug
- ***************
-
- Configuration
- =============
-
- The default configuration file is named `BDEBUG.Config' and is
- located in the directory `<BarflyPath>/' or `s:Barfly/'. Obviously
- it's not optimal to be forced to use the same config file for different
- programs. Therefore you can also specify a local config file with
- program name and the suffix `.BDebug'.
-
- ToolTypes
- ---------
-
- The following tooltypes are supported to activate the basic
- functions of the commandwindow.
-
- * CatchNextTask
-
- * CatchCrashedTask
-
- * CatchEnforcerHit
-
- Barfly.FD
- ---------
-
- Following steps are necessary to create a new `Barfly.FD' file with
- new library functions. First the assign `FD:' must point to the
- directory containing the FD files that should be included in the new
- `Barfly.FD'. Make sure that every FD file contains the Library,
- Resource and Device name in the first line in following format: `*
- "foobar.libary"'. If necessary, add the name yourself, so that a
- correct FD database can be build up. If you're more experienced with
- FD files, you can yourself add new entries to the `Barfly.FD' file. The
- layout of the `Barfly.FD' file pretty obvious.
-
- Configuration Commands
- ----------------------
-
- Register window
- ---------------
-
- RegWindow=x/y/width/height/register
- ...................................
-
- This command defines the position of a `REGWindow'.
-
- RegFlags=flag[|flags...]
- ........................
-
- This command defines certain flags in the `REGWindows'.
-
- * AUTOVIEWREFRESH
-
- * SYMBOLS
-
- * STACKCHECK
-
- * NOBIGVIEW
-
- FPU Window
- ----------
-
- FpuWindow=x/y/width/height/register
- ...................................
-
- This command defines the position of a `FPUWindow'.
-
- OpenFPUWindows=Count
- ....................
-
- This command tells the Debugger to open a `FPUWindow'.
-
- Disassembler window
- -------------------
-
- DissWindow=x/y/width/height/register
- ....................................
-
- This command defines the position,the dimension and linked register
- of the `DissWindow'.
-
- Example: DISSWINDOW=0/0/300/100/PC
-
- DissFlags=flag[|flags...]
- .........................
-
- This command defines certain flags in the `DISSWindow'.
-
- * AUTOREFRESH
-
- * SHOWLIB
-
- * GUESSLIB
-
- * SHOWEA
-
- * WORDBRANCHES
-
- * NEGOFFSETS
-
- * NEGDI
-
- * OPCODEDATA
-
- * BLANKAFTERJMPBRA
-
- OpenDissWindows=Count
- .....................
-
- This command tells the Debugger to open a number of `DissWindows'.
-
- Memory window
- -------------
-
- MemWindow=x/y/width/height/register
- ...................................
-
- This command defines the position, the dimension and linked register
- of the `MemWindow'.
-
- Example: MEMWINDOW=0/0/300/100/A0
-
- OpenMemWindows=Count
- ....................
-
- This command tells the Debugger to open a number of `MemWindows'.
-
- MemoryOffsetStep=Count
- ......................
-
- This command defines the Offset-Step of the `MemWindows'.
-
- * 0 no Space
-
- * 1 Space after each Byte.
-
- * 2 Space after each Word.
-
- * 4 Space after each Longword.
-
- Copper window
- -------------
-
- CoppWindow=x/y/width/height/register
- ....................................
-
- This command defines the position, the dimension and linked register
- of the `CoppWindow'.
-
- Example: COPPWINDOW=0/0/300/100/A0
-
- OpenCoppWindows=Count
- .....................
-
- This command tells the Debugger to open a number of `CoppWindows'.
-
- StructWindow
- ------------
-
- StructWindow=x/y/width/height/register
- ......................................
-
- This command defines the position, the dimension and linked register
- of the `StructWindow'.
-
- Example: StructWINDOW=0/0/300/100/A0
-
- StructFlags=flag[|flags...]
- ...........................
-
- This command defines certain flags for the `StructWindow'
-
- * AUTOREFRESH
-
- * ADDRESSFORMAT
-
- * OFFSETFORMAT
-
- * NEWWINDOW
-
- OpenStructWindows=Count
- .......................
-
- This command tells the Debugger to open a number of `StructWindows'.
-
- Source window
- -------------
-
- SourceWindow=x/y/width/height/register
- ......................................
-
- This command defines the position, the dimension and linked register
- of the `SourceWindow'.
-
- Example: SOURCEWINDOW=0/0/300/100/A0
-
- OpenSourceWindows=Count
- .......................
-
- This command tells the Debugger to open a number of `SourceWindows'.
-
- Breakpoint window
- -----------------
-
- BreakWindow=x/y/width/height
- ............................
-
- This command defines the position of a `BreakPointWindow'.
-
- OpenBreakWindows=Count
- ......................
-
- This command tells the Debugger to open a `BreakPointWindow'.
-
- Watchpoint window
- -----------------
-
- WatchWindow=x/y/width/height
- ............................
-
- This command defines the position of a `WatchpoinzWindow'.
-
- OpenWatchWindows=Count
- ......................
-
- This command tells the Debugger to open a `WatchPointWindow'.
-
- Checksum window
- ---------------
-
- ChecksumWindow=x/y/width/height
- ...............................
-
- This command defines the position of a `ChecksumWindow'.
-
- ChecksumWindows=Count
- .....................
-
- This command tells the Debugger to open a `ChecksumWindow'.
-
- SnoopMemory window
- ------------------
-
- SnoopMemWindow=x/y/width/height/register
- ........................................
-
- This command defines the position of a `SnoopMemWindow'.
-
- OpenSnoopMemWindow=Count
- ........................
-
- This command tells the Debugger to open a `SnoopMemWindow'.
-
- SnoopMask=Mask
- ..............
-
- This command defines the snoop mask. The mask defines the length of
- memory blocks that should be recorded. Default is -1 so everything is
- recorded.
-
- SnoopMax=Count
- ..............
-
- This command defines the count of snoop entries. Default is 100.
-
- HistoryEntrys=Count
- ...................
-
- This command defines the count of history entries. Default is 5.
-
- Information Windows
- -------------------
-
- GlobalViewWindow=x/y/width/height
- .................................
-
- This command defines the position and dimensions of a standard
- information window. For example the Library Window belongs to this
- group.
-
- Example: GLOBALVIEWWINDOW=0/0/300/100
- GLOBALVIEWWINDOW=0/200/300/100
-
- Other Windows
- -------------
-
- CommandWindow=x/y/width/height
- ..............................
-
- This command defines the position of the small `CommandWindow'.
- This command has no function in local configuration files.
-
- FileShell=<Window Specifikation>
- ................................
-
- This command defines the shell that is opened with the loaded
- program. You should always open the shell on the Debugger's Public
- Screen. The shell parameters are the same you know from the CLI.
-
- Misc
- ----
-
- TaskStack=Count
- ...............
-
- This command defines the stack of the loaded program. Defaullt are
- 4096 Bytes.
-
- Priority=Count
- ..............
-
- This command defines the Debugger's priority.
-
- SetBreak=Argument
- .................
-
- This command can be used to define a list of breakpoints that are
- set before the program is started. This is useful to pass the module
- `Main.c' for example. If no breakpoints are defined or if a parsing
- problem occurs the standard breakpoint ( the first program instruction
- ) is set.
-
- * SETBREAK=_main ; SAS C Main Program Start
-
- * SETBREAK=_main ; GCC C Main Program Start
-
- * SETBREAK=@main ; DICE C Main Program Start
-
- * SETBREAK=! ; Programstart(Default)
-
- ClickBreak=State
- ................
-
- This command can be used to define the action of the DissWindow on a
- doubleclick.
-
- `State=0'
- No Action(Default).
-
- `State=1'
- Set/Clear Breakpoint and pop up a Requester for a Set.
-
- `State=2'
- Set/Clear Breakpoint.
-
- ShowMem=Start:End
- .................
-
- defines the address areas that are legal to the Debugger so you can
- look at address areas that are not in the memorylist or in the rom.
- Illegal address areas are shown with `*' in the windows. You should
- `never' define the custom chip areas as legal because a read access on
- a writeonly register can cause a deadly crash.
-
- Example: SHOWMEM=$e80000:$f00000 defines the Zorro 2 area
- as free.
-
- By this command you can overrule the internal Enforcer or
- CyberGuard legal memory areas so you should be free of hits.
-
-
- DefCommand=Key,Qualifier[|Qualifier...],Function
- ................................................
-
- This commands allows to connect menu functions with key sequences.
- Because of the object-oriented concept of the Debugger that allows
- multiple instances of objects it's not easy to decide what object is
- meant. Therefore if the object is active it's used and if no object of
- this type is active the first entry the object-type list is used. As
- the key parameter every Rawkey can be used with the exception of `TAB'
- and the functionkeys that are used internally. The key is searched
- first in the local and then in the global configuration.
-
- As qualifiers you can use the following keys.
-
- * LSHIFT
-
- * RSHIFT
-
- * CAPSLOCK
-
- * CTRL
-
- * LALT
-
- * RALT
-
- * LCOMMAND
-
- * RCOMMAND
-
- Bespiel: DEFCOMMAND=$15,CTRL,"Step 1 Position"
-
- Defines CTRL-Z as Step 1 Position
-
- AutoDocDir=<Path>
- .................
-
- This command sets the path for the autodocs directory.
-
- AutoDocAlias=Library,File
- .........................
-
- This command sets an alias for Libraries, Devices or Resources to
- define the connected Autodocs file. There's no other way because it's
- impossible to build the autodocs file by knowing the library name.
-
- ArexxPath=<rx-path>
- ...................
-
- This command sets the Arexx-Script Start-Command. In a normal
- system the path should be <sys:Rexxc/rx>.
-
- ArexxInput=<File>
- .................
-
- This command sets the Arexx-Command Input-File. If you don't
- specify the file, NIL: is used.
-
- ArexxOutput=<File>
- ..................
-
- This command sets the Arexx-Command Output-File. If you don't
- specify the file, NIL: is used.
-
- ArexxCommand=[1...10],<Pfad>
- ............................
-
- This command sets the 10 entries in the Arexx-Menu. You specify the
- number and the path of the Arexx-Script.
-
- ArexxCommand=1,"Rexx:Example.rexx"
-
- ExecuteCommand=<File>
- .....................
-
- this command can set up a list of programs that should be run before
- the debugged program's task is started. This parameter only works with
- programs which are loaded by the Debugger. You also have to make sure
- that the loaded programs have to `end' otherwise the task can't be
- started. For example you could use this command to set breakpoints
- with Arexx-Scripts.
-
- LoadInclude
- ...........
-
- tells the Debugger to load the structure information file
- `Barfly.Include'.
-
- AddStructFile=Filename
- ......................
-
- tells the Debugger to load a custom structure information file and
- adds it into the CUSTOM/ subtree.
-
- ClicktoFront
- ............
-
- activates the Debugger's own `ClicktoFront' handler. This function
- should only be used if you don't use an own `Commodity' for this task.
-
- CenterWindow
- ............
-
- activates centering mode for all stringrequester windows.
-
- ScreenInFront
- .............
-
- activates `ScreenToFront' mode that pops the screen to front after
- every trace operation.
-
- OpenScreen[=width,height,depth,mode]
- ....................................
-
- tells the Debugger to open its own screen. If you don't enter
- dimension parameters the wb screen is cloned. For the mode string you
- string you can see in `Prefs/ScreenMode' requester. This command has
- no function in local configuration files.
-
- OPENSCREEN=1448,560,2,PAL:HighRes Interlace
-
- OpenPubScreen=Name
- ..................
-
- tells the Debugger to open on the Pubscreen with the specified name.
- This command has no function in local configuration files.
-
- ScreenFont=fontname/Height
- ..........................
-
- defines a font for a Debugger screen. This command has no function
- in local configuration files.
-
- QuietException=Exception Nummer
- ...............................
-
- masks off certain exceptions for the exception requester so that
- only a `DisplayBeep' is caused instead of a textrequest. With the
- value -1 you can mask off every exception and for example with the
- value 4 you mask off the `Illegal' exception.
-
- DisableXPointer
- ...............
-
- deactivate the Wait-Pointer.
-
- TraceBreak
- ..........
-
- tells the Debugger to use breakpoints in the `Subroutine' Traces
- instead of single steps. The advantage is a speed up and the
- disadvantage is that you can cause crashes while you step through
- resident/reentry code.
-
- CrashedTask
- ...........
-
- activates `CatchCrashedTask' mode.
-
- CatchEnforcerHit
- ................
-
- activates `CatchEnforcerHit' mode.
-
- DoNotCacheFullFile
- ..................
-
- tells the Debugger not to cache program files while reading the
- Symbol/Debug informations to save memory. Obviously the parsing speed
- will decrease.
-
- DoNotPopPathRequest
- ...................
-
- tells the Debugger to ignore errors from opening source files and
- not to open a path requester.
-
- NoAutoStructAction
- ..................
-
- tells the Debugger to open a type-requester by an action in the
- Structure Window.
-
- NoBreakpointErrors
- ..................
-
- tells the Debugger to ignore SETBREAK= errors that cause the
- Debugger to always set an error on the program start.
-
- Usage of BDebug
- ***************
-
- Arexx
- =====
-
- Commands
- --------
-
- SIMPLEREQUEST "
- ...............
-
- * RC: -
-
- * result: 'OK'
-
- TWOGADREQUEST "
- ...............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- TRIGADREQUEST "
- ...............
-
- * RC: -
-
- * result: 'OK','FALSE','RESUME'
-
- NEXT_ROOTWINDOW
- ...............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- NEXT_SUBWINDOW
- ..............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_DISSWINDOW
- ................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_MEMWINDOW
- ...............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_COPPWINDOW
- ................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_FPUWINDOW
- ...............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_BREAKPOINTWINDOW
- ......................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_STRUCTWINDOW
- ..................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_SOURCEWINDOW
- ..................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_SNOOPWINDOW
- .................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- FIRST_WATCHWINDOW
- .................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- ACTIVATE_ROOTWINDOW
- ...................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- ACTIVATE_SUBWINDOW
- ..................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- OPEN_DISSWINDOW '@REG' | 'Argument'
- ...................................
-
- * RC: -
-
- * result: -
-
- OPEN_MEMWINDOW '@REG' | 'Argument'
- ..................................
-
- * RC: -
-
- * result: -
-
- OPEN_COPPWINDOW '@REG' | 'Argument'
- ...................................
-
- * RC: -
-
- * result: -
-
- OPEN_SOURCEWINDOW '@REG' | 'Argument'
- .....................................
-
- * RC: -
-
- * result: -
-
- OPEN_STRUCTWINDOW '@REG' | 'Argument'
- .....................................
-
- * RC: -
-
- * result: -
-
- OPEN_BREAKPOINTWINDOW
- .....................
-
- * RC: -
-
- * result: -
-
- OPEN_FPUWINDOW
- ..............
-
- * RC: -
-
- * result: -
-
- OPEN_SNOOPMEMORYWINDOW
- ......................
-
- * RC: -
-
- * result: -
-
- DOMENU 'Menu-String'
- ....................
-
- * RC: -
-
- * result: -
-
- SET_BREAKPOINT 'Argument'
- .........................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- CLEAR_ICACHE 'Address,Length'
- .............................
-
- * RC: -
-
- * result: 'OK'
-
- CLEAR_ICACHE 'Address,Length'
- .............................
-
- * RC: -
-
- * result: 'OK'
-
- GOTO_ADDRESS 'Address'
- ......................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- CLEAR_ADDRESS
- .............
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- LINK_REGISTER 'Register'
- ........................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- SET_REGISTER 'Register,Value'
- .............................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- Read_Byte 'Address'
- ...................
-
- RC : 0=Ok Result: Result-String
-
- Read_Word 'Address'
- ...................
-
- RC : 0=Ok Result: Result-String
-
- Read_Long 'Address'
- ...................
-
- RC : 0=Ok Result: Result-String
-
- Write_Byte 'Address,Value'
- ..........................
-
- RC : 0=Ok
-
- Write_Word 'Address,Value'
- ..........................
-
- RC : 0=Ok
-
- Write_Long 'Address,Value'
- ..........................
-
- RC : 0=Ok
-
- ASL_FileRequester_Save
- ......................
-
- RC : 0=Ok Result: Filepath-String
-
- ASL_FileRequester_Load
- ......................
-
- RC : 0=Ok Result: Filepath-String
-
- IS_ADDRESS_LEGAL 'Address'
- ..........................
-
- * RC: -
-
- * result: 'OK','FALSE'
-
- LOAD_BINARY 'Name,Destination,Length'
- .....................................
-
- SAVE_BINARY 'Name,Source,Length'
- ................................
-
- Usage of BDebug
- ***************
-
- How to use BDebug ?
- ===================
-
- Trouble Shooting
- ----------------
-
- First you should be sure that all necessary configurations file have
- been installed because without `Barfly.FD' file you don't see any
- function names in the disassembler window; and without `Barfly.Include'
- the `StructWindow' is unusable. Are these preconditions fullfilled you
- should analyse the problem and anticipate how the Debugger can be used.
- Because the debugging of programs depends heavily on the situation i
- can only list some general points. The reality probably looks
- different... as always:-)
-
- Point of departure:
-
- * Program from the CLI
-
- * 1 Task
-
- The program can be started by `bdebug Program [Argument]' or
- can be loaded the command window `Debug File'. By this
- method all symbol and debug files are loaded. If the
- Debugger can't find a source file you can add additional
- paths if you haven't disabled this function. The standard
- breakpoint is the first command in the program. Sometimes
- this is inconvenient, and you may want to set a different
- start breakpoint for example to jump over the CStartup code
- or to set it tn an important program position.
-
- * Creates further Tasks
-
- In this case you should be sure how you want to catch the next
- Task. You could catch the Task by `Next Task' or compile the
- program with an `illegal' in the task and catch it with
- `Crashed Task'. After you caught the task you probably would
- like to use see symbols and debug source. These informations
- can be loaded afterwards by using `Load Symbols'.
-
- * Program from the WB
-
- In this case you should use `Next Task' and then catch the task
- `WBL'. Afterwards you have to activate `Next Task' again and run
- `WBL'. You could also use the `illegal' strategy. After the right
- task was caught you can load the symbols again.
-
- * Is it a Handler, Filesystem or something similar.
-
- In this case you should use the `illegal' strategy and catch the
- task by `Crashed Task'. An alternative method would be to catch
- the waiting task with `Debug Task' and wait as long as the task
- gets woken up by a signal.
-
- After you've taken the first hurdles in taking control over the task,
- you should think about how the problem looks like and where it could be
- located.
-
- Problem Type:
-
- * Enforcer/CyberGuard
-
- If an Enforcer or CyberGuard hit is caused, these programs output
- the hit's program address and most of the time the hunk offset as
- well. You can now directly jump to the address by entering the
- address in the DissWindow by `Change Address' or you open a
- HunkWindow, doubleclick on the hunk where the hit is located and
- then enter the offset returned by Enforcer or CyberGuard. The
- Debugger itself can also automaticlly stop a debugged program if a
- hit happens.
-
- * Mungwall
-
- These hits aren't as easy to find as Enforcer or CyberGuard hits
- because Mungwall hits aren't shown when the problem happened but
- only after a `FreeMem'. In this case you should remember the
- memoryblock where it happened and determine where the responsible
- AllocMem is located in the program, so you get an overview in what
- area the problem is caused. Now you should open a MemWindow that
- points to this certain memory area and step through the program
- and look if something changes the mungwall borders in the
- MemWindow. Mungwall borders are before and after the allocated
- memory area. If you're more experienced you could also use the
- WatchpointWindow and set a watchpoint on the certain memory block.
-
- * Crash
-
- If it's just an ordinary crash the error should be pretty easy to
- find by single stepping through the responsible code area. If
- it's a random crash you should try `Crashed Task' and hope that
- the task can be caught. After the task got caught you should
- check the instructions that caused the crash. If the PC points to
- data fields that don't look like real code the PC is probably set
- wrong by a stack cleanup error. In this case you should check if
- the next addresses on the stack point to legal program code.
-
- * Side effects and mysterious bugs
-
- These bugs are the worst to find and there's no general strategy
- how to find them. In such cases only intuition and patience can
- help.
-
- Problems that can happen
- ------------------------
-
- * Why does the Debugger react so slow on keyboard commands that
- control the tracing ?
-
- This happens if you debug a task with a higher priority than the
- Debugger's priority. For example. DOS-Handler. Workaround is to
- increase the priority of the Debugger.
-
- * Why do filerequesters block the Debugger.
-
- This happens when you debug a handler, because the filerequester
- normally tests every handler with a IsFilesystem(). When you debug
- a handler it can't reply the IsFilesystem packet and therefore the
- filerequester is busy.
-
- * If you debug the following program on a 68040 with 68040.library
- or 68060.library the instruction `rts' is run if you cause a
- Single-Step on the instruction `fetox'. Because this command
- isn't implemented in the 68040 and 68060 it has to be emulated. It
- seems to forget the tracebit.
-
- mc68040
- fmove.x #1.3,fp0
- fmove.x #255,fp1
- fetox.x fp0,fp1
- rts
-
- * If a program doesn't return from a DOS function, check whether you
- accidently entered a char in shell window.
-
- BAsm 1.0
-
- A cli/arexx controled Assembler
-
- Copyright (c) 1989-94 Ralph Schmidt
-
- - Shareware -
-
- The Assembler
- *************
-
- The assembler understands the commands and addressmodes from the
- 68000 through the 68060 and both the Floating-Point Units, 68881 and
- 68882. It supports only the 68851 MMU commands, which are also
- supported by the 68030. The assembler achieves it's speed by
- translating the source in a single pass, followed by a backpatch phase
- which corrects all unresolved references.
-
- Syntax
- ======
-
- Comments
- --------
-
- A comment can start in several different ways. In a pure comment it
- starts either with a ; or *. A comment can only be started after an
- assembler command or symbol with a ; if an assembler command or symbol
- exists within that line.
-
- ;A comment
- *A comment
- move.l a0,a0 ;A comment
-
- Opcode/Instructions arrangement
- -------------------------------
-
- `[label[:]] [opcode] [operand[, operand[, operand...]]]]]'
-
- * Opcodes
-
- An Opcode can be a Motorola Mnemonic, an assembler command, or a
- Macro call.
-
- * Operations
-
- In a Motorola mnemonic operands are based on legal addressmoes; in
- assembler privat instructions the parameters depend on the
- instruction.
-
- Symbol structure
- ----------------
-
- A symbol can represent the following types:
-
- * Value
-
- * Program Counter
-
- * Register
-
- * Register List
-
- * Macro
-
- Symbols can only be defined once. The exceptions are local labels
- and symbols defined by Set.
-
- Structure rules for Symbols.
-
- * The first letter of a symbol can be one of the following: a...z,
- A...Z,_, @,. and \.
-
- * From the second letter on, the symbol can contain the following
- letters: a...z, A...Z, 0...9, _,@ and ..
-
- * If a symbol consists of only numbers and ends with $, then it is a
- numerical local label.
-
- * A symbol is ended by an illegal letter.
-
- * If a symbol begins with a . or \, then it is a local label.
-
- * A macro symbol should not contain a ..
-
- * To avoid a conflict, a symbol should not end with .b, .w or .l.
-
-
- ThisIsALabel ;That is a normal label
- ThisIsALabel1.loop: ;That is a normal label
- This@_Is_@A_@Label
- 1$: ;That is a numerical local label
- .ThisIsALabel ;That is a local label
- .ThisIsALael1: ;That is a local label
- \ThisIsALabel.loop: ;That is a local label
- ThisIsASymbol=10
- ThisIsASymbol = 10
- ThisIsASymbol equ 10
-
- The relative label
- ------------------
-
- This symbol represents an offset to the start of a program.
-
-
- label
- label:
- label nop
- label: nop
-
- The local Label
- ---------------
-
- A local label is only valid between two normal relative labels, thus
- you cannot reference local labels outside of that scope. Otherwise it
- works similar as a normal label. There are 2 different prefixes that
- introduce a local label: . and \ that define 2 different local labels.
- A special case is the Backward Reference Label that is introduced with
- ... It doesn't depend on a certain define area between normal labels
- thus you can only access the symbol if it were defined earlier.
-
-
- ..:
- label_0:
- .local:
- bra.s .local
- label_1:
- .local:
- bra.s \local
- \local:
- nop
- label_end:
- ..:
- dbra d0,..
- ..:
- dbra d1,..
- ..Hello:
- dbra d1,..Hello
-
- The local numerical label
- -------------------------
-
- Addionally to the non-numerical local label there are also the
- numerical labels which are based of 4 digits with the postfix $. BASM
- handles the number as a hash key with the consequence that there's no
- difference between 001$ and 1$.
-
-
-
- label_0:
- 123$: nop
- label_1:
- 123$: nop
-
- The absolute Symbol
- -------------------
-
- The absolute symbol is defined by a direct value initializing that
- is initiated by =, equ or set. If you define a symbol by set you can
- change it as often as needed.
-
-
-
- value1=2
- value2 equ value1*2
- value3 set value2
-
- The Register Symbol
- -------------------
-
- The register symbol is defined by `equr' or `fequr' that is used for
- FPU registers.
-
-
-
- Ptr equr a1
- PI fequr fp2
- move.l (Ptr),d0 ;move.l (a1),d0
- fmove.x PI,fp0 ;fmove.x fp2,fp0
-
- The Register List Symbol
- ------------------------
-
- The register list symbol is defined by `reg' and represents the
- register mask for `Movem' and `fmovem'. You must not mix FPU and
- Integer registers with each other in a register list.
-
-
- mask reg d0/d2/d4-d7/a0-a4/a6-a7
- mask1 reg d0-a6
- mask2 reg d0-6
- fmask reg fp0-fp2/fp4-fp5
-
- The Macro Symbol
- ----------------
-
- By using the command `macro' or `cmacro' after the symbol, the
- symbol is defined as a macro. The macro block is terminated by the
- command endm. The Macro cmacro is case-insensitive and therefore
- useful to emulate commands that are missing from the core.
-
-
-
-
- Symbol[:] macro
- .
- .
- Symbol[:] endm
-
- Datatypes
- ---------
-
- The assembler understands 3 distinct datatypes.
-
- * 32Bit Integer
-
- * 96Bit Extended Floating Point
-
- * 96Bit Packed Binary Floating Point
-
- At the moment only integer datatypes are supported in arithmetic
- arguments so you can only use the FPU datatypes as constants.
-
- +-------------+--------------------+
- | Format | Representation |
- +-------------+--------------------+
- +-------------+--------------------+
- | Decimal | 1024 |
- +-------------+--------------------+
- | Hexadecimal | $400 |
- +-------------+--------------------+
- | Binary | %10000000000 |
- +-------------+--------------------+
- | Ascii | "OK", 'OK' or `OK` |
- +-------------+--------------------+
-
- Furthermore you can use symbols or the character `*' that represents
- the program counter in arguments. There are limitation in the use of
- symbols in arguments. For example you can only add or subtract
- constants from an external label, Floatingpoint Values can only be used
- as simple constants,... By the postfix `k' after decimal value the
- value is multply by $1000.
-
- `Floating Point Format'
-
- +-------------+-------------------------------------+
- | Format | Representation |
- +-------------+-------------------------------------+
- +-------------+-------------------------------------+
- | Extended | '[+,-]3. 145637848298628[e[+,-]123] |
- +-------------+-------------------------------------+
- | Packed | ''[+,-]3. 145637848298628[e[+,-]123]|
- +-------------+-------------------------------------+
-
- Datatype Conversion
- -------------------
-
- All commands are performed with these 3 datatypes and then converted
- into the required datatype. For example a 32Bit integer can be
- converted into 16Bit and 8 Bit; an extended floating point into a
- double or single floating point. Floating point datatypes are rounded
- by a convertation. If a rouding error occurs the parser returns with
- an error.
-
- Datatype Format
- ---------------
-
- Internal Datatype Structure
-
- * Integer
-
- +--------+---------+
- | Bit 31 | 30..0 |
- +--------+---------+
- +--------+---------+
- | S | Integer |
- +--------+---------+
-
- * Single Floating Point
-
- +--------+-----------------+------------+
- | Bit 31 | Bits 30..23 | Bits 22..0 |
- +--------+-----------------+------------+
- +--------+-----------------+------------+
- | Sign | Biased Exponent | Fraction |
- +--------+-----------------+------------+
-
- * Double Floating Point
-
- +--------+-----------------+------------+
- | Bit 63 | Bits 62..52 | Bits 51..0 |
- +--------+-----------------+------------+
- +--------+-----------------+------------+
- | Sign | Biased Exponent | Fraction |
- +--------+-----------------+------------+
-
- * Extended Floating Point
-
- +--------+-----------------+------------+
- | Bit 95 | Bits 94..80 | Bits 62..0 |
- +--------+-----------------+------------+
- +--------+-----------------+------------+
- | Sign | Biased Exponent | Mantisse |
- +--------+-----------------+------------+
-
- * Packed Binary Floating Point
-
- +------+------+------+------+------+------+------+------+
- | MEYY | EXP2 | EXP1 | EXP0 | EXP3 | 0000 | 0000 | M016 |
- +------+------+------+------+------+------+------+------+
- | M015 | M014 | M013 | M012 | M011 | M010 | M009 | M008 |
- +------+------+------+------+------+------+------+------+
- | M007 | M006 | M005 | M004 | M003 | M002 | M001 | M000 |
- +------+------+------+------+------+------+------+------+
-
- * M is the sign (+ or -) of the fraction
-
- * E is the sign (+ or -) of the exponent
-
- * Y are the internal flags for infinity and NAN
-
- * E002-000 are the numbers of the exponent from 2 to 0, EXP3 is used
- internally.
-
- * M016-000 are the numbers of the fraction from 16 to 0. Each number
- lies in the range from 0 to 9..
-
- Operations
- ----------
-
- Operators
- ---------
-
- +----------+-------------------------------+
- | Operator | Function |
- +----------+-------------------------------+
- +----------+-------------------------------+
- | `+' | 32Bit signed Addition |
- +----------+-------------------------------+
- | `-' | 32Bit signed Subtraction |
- +----------+-------------------------------+
- | `*' | 32Bit signed Multiplication |
- +----------+-------------------------------+
- | `/' | 32Bit signed Division |
- +----------+-------------------------------+
- | '|' | 32Bit Or |
- +----------+-------------------------------+
- | `!' | 32Bit Or |
- +----------+-------------------------------+
- | `&' | 32Bit And |
- +----------+-------------------------------+
- | `^' | 32Bit Eor |
- +----------+-------------------------------+
- | `<<' | logic 32Bit Shift to the left |
- +----------+-------------------------------+
- | `>>' | logic 32Bit Shift to the right|
- +----------+-------------------------------+
- | `~' | 32Bit Not |
- +----------+-------------------------------+
-
- Basm cares for the operator priorities but be careful while
- porting Seka Sources because Seka doesn't care for the priorities.
-
- Functions
- ---------
-
- The following functions are supported.
-
- * _bitnum(Argument) calculates the bit number of the argument. If
- this is impossible an error occurs.
-
- * _bitfield(Argument) calculates the bit mask of the argument. If
- this is impossible an error occurs.
-
- * _extb(Argument) equal to the 680xx command extb
-
- * _extw(Argument) equal to the 680xx command extw
-
- * _min(Argument[,Argument,...]) calculate the minimum of the
- argument.
-
- * _max(Argument[,Argument,...]) calculate the maximum of the
- argument.
-
- Assembler Commands
- ==================
-
- Hunk/Link Commands
- ------------------
-
- [Label] section Name[,Typ[,[RelocModus,Memtyp]
- ..............................................
-
- defines a new logical unit so that the DOS-Loader has the
- opportuntity to place smaller hunks into free memory blocks. Another
- use for this command is to set different memory types for the hunk to
- load gfx data into the chipmem. If you don't specify the section type
- it assumes "",Code,Public.
-
- * Name = Hunkname
-
- * Hunk type
-
- `CODE'
- starts a code segment.
-
- `DATA'
- starts a data segment.
-
- `BSS'
- starts an undefined data segment.
-
- `DEBUG'
- starts a custom debug segment.
-
- `CUSTOM'
- starts a Custom-Hunk area.
-
- * Reloc-Mode defines the width of the hunk relocation. Default 32Bit
-
- `RELOC16'
- sets the reloc width to 16bit.(V37)
-
- `RELOC32'
- sets the reloc width to 32bit.(Default)
-
- * Memtype defines the memory attributes of the hunk. If you add a
- `_p', `_c', or `_f' upon the type parameter, you cannot use more
- memtypes.The memtype `DEBUG' does not allow memory attribute
- suffixes.
-
- `PUBLIC'
- loads the hunk into the memory with the highest priority.
- Code Suffix _p.
-
- `CHIP'
- loads the hunk into chip memory. Code Suffix _c.
-
- `FAST'
- loads the hunk into fast memory. Code Suffix _f.
-
- `ADVISORY'
- ignores the hunk if the OS doesn't understand the type. A
- kind of Debug-Hunk that can be used by the OS.(V39)
-
- `ATTR=?'
- loads the hunk into the memory with specified memory
- attributs. (V37)
-
- [Label] code [Name[, Memtyp]]
- .............................
-
- defines a new code hunk and is equivalent to the command `section
- ?,code,?'.
-
- * Name = Hunkname
-
- * Memtype defines the memory attributes for the hunk.
-
- `PUBLIC'
- loads the hunk into the memory with the highest priority.
- Code Suffix _p.
-
- `CHIP'
- loads the hunk into chip memory. Code Suffix _c.
-
- `FAST'
- loads the hunk into fast memory. Code Suffix _f.
-
- `ADVISORY'
- ignores the hunk if the OS doesn't understand the type. A
- kind of Debug-Hunk that can be used by the OS.(V39)
-
- `ATTR=?'
- loads the hunk into the memory with specified memory
- attributs. (V37)
-
- [Label] data [Name[, Memtyp]]
- .............................
-
- defines a new data hunk and is equivalent to the command `section
- ?,data,?'.
-
- * Name = Hunkname
-
- * Memtype defines the memory attributes for the hunk.
-
- `PUBLIC'
- loads the hunk into the memory with the highest priority.
- Code Suffix _p.
-
- `CHIP'
- loads the hunk into chip memory. Code Suffix _c.
-
- `FAST'
- loads the hunk into fast memory. Code Suffix _f.
-
- `ADVISORY'
- ignores the hunk if the OS doesn't understand the type. A
- kind of Debug-Hunk that can be used by the OS.(V39)
-
- `ATTR=?'
- loads the hunk into the memory with specified memory
- attributs. (V37)
-
- [Label] bss [Name[, Memtyp]]
- ............................
-
- defines a new BSS hunk and is equivalent to the command `section
- ?,bss,?'.
-
- * Name = Hunkname
-
- * Memtype defines the memory attributes for the hunk.
-
- `PUBLIC'
- loads the hunk into the memory with the highest priority.
- Code Suffix _p.
-
- `CHIP'
- loads the hunk into chip memory. Code Suffix _c.
-
- `FAST'
- loads the hunk into fast memory. Code Suffix _f.
-
- `ADVISORY'
- ignores the hunk if the OS doesn't understand the type. A
- kind of Debug-Hunk that can be used by the OS.(V39)
-
- `ATTR=?'
- loads the hunk into the memory with specified memory
- attributs. (V37)
-
- [Label] cseg [Name[, Memtyp]]
- .............................
-
- has the same function as the command `code'.
-
- [Label] dseg [Name[, Memtyp]]
- .............................
-
- has the same function as the command `data'.
-
- idnt Name
- .........
-
- defines the name of the `HUNK_UNIT' hunk in the object file.
-
- * Name = Hunkname
-
- identify Name
- .............
-
- defines the name of the actual hunk.
-
- * Name = Hunkname
-
- BDebugArg Argument
- ..................
-
- defines a parameter in env:BDebugProgram. It doesn't active this
- function you have to activate by option "-J" in *Note BOPT: MI_BOPT.
-
- * Argument = Argument Text
-
- smalldata [Register]
- ....................
-
- activates smalldata mode for the hunk. Optionally, you can also
- define the smalldata register. Default register is `A4'. The program
- itself must initialize the smalldata register with the address of the
- smalldata data hunk.
-
-
-
- bopt w2- ;68020 addressmode warnings off
- mc68020 ;68020 mode activated
-
- smalldata a3 ;Default is A4!!!
- xref _LinkerDB ;Special linker symbol
-
- lea.l _LinkerDB,a3 ;Address of the smalldata data segments
- move.l #0,(d_test.l,a3)
- move.l #"TEST",d_test(a3)
- moveq #0,d0
- tst.b array(a3,d0.w)
- rts
-
- section "__MERGED",BSS ;The smalldata data segments are defined
- ;the following way
- d_test:
- ds.l 1
- array:
- ds.b 20
-
- xref Symbol[, Symbol...]
- ........................
-
- imports a symbol so that you can access symbols that were exported
- by XDef. The linker resolves these reference during the link process
- and creates a program file. If the assembler finds a XRef in the source
- it creates an object file. This decision can be overruled.
-
- * Symbol = Name of the importet symbol.
-
- xdef Symbol[, Symbol...]
- ........................
-
- exports a symbol as global so that other object files can import the
- symbol by XRef. There's no need to define a symbol before you mark them
- with XDef. If the assembler finds a XRef in the source it creates an
- object file. This decision can be overruled.
-
- * Symbol = Name of the global symbol
-
- global Symbol[, Symbol...]
- ..........................
-
- has the same function like XDef.
-
- public Symbol[, Symbol...]
- ..........................
-
- has the same function like XDef.
-
- output Name
- ...........
-
- sets an output filename. If you don't specify a filename the
- assembler uses the source filename and adds the appropriate filetype
- suffix.
-
- * Name = Filename
-
- objfile
- .......
-
- has the same function like Output.
-
- exeobj
- ......
-
- writes a program file if you want to overrule the assembler.
-
- linkobj
- .......
-
- writes an object file if you want to overrule the assembler.
-
- org Address
- ...........
-
- activates absolute mode. All command that refer to hunk related
- functions aren't allowed. For example:. section, xdef, xref. The
- parameter address sets the base address of the created code.
-
- * Address = Absolute Address
-
- addsym
- ......
-
- writes a symbol hunk.
-
- debug
- .....
-
- writes a SAS D1 debug hunk to see source level informations while
- debugging the program through bdebug.
-
- Symbol Commands
- ---------------
-
- CArgs [#Offset,]Symbol[,Symbol.w[,Symbol.l]
- ...........................................
-
- defines the symbol offsets for a stack function. The first Symbol
- starts with the offset 4 but if you like to use a different Offset it's
- possible to specify one. Then the offset is increased according to the
- size of the symbol. If the symbol has no size specifier the default size
- is word. Sorry..i would use a longword here but to be compatible with
- Devpac i'm forced to use word.
-
- cargs Test1.w,Test2.l
- move.w Test1(a7),d0 ;Test1=4
- move.l Test2(a7),d0 ;Test2=4+2=6
-
- Symbol rs[.width] Count
- .......................
-
- initializes the Symbol with the value of the counter __RS and
- increases the __RS counter afterwards by Count*Width. You can use this
- command as a replacement for the include exec/types.i macros to
- increase the parsing speed.
-
- * Width
-
- `B'
- 1 Byte Valuearea: -$80 <= x < $100
-
- `W'
- 2 Bytes Valuearea: -$8000 <= x < $10000
-
- `L'
- 4 Bytes Valuearea: -$80000000 <= x < $10000000
-
- `S'
- 4 Bytes (Single IEEE-Float)
-
- `D'
- 8 Bytes (Double IEEE-Float)
-
- `X'
- 12 Bytes (Extended IEEE-Float)
-
- `P'
- 12 Bytes (Packed BCD-Float)
-
- `Q'
- 16 Bytes (Quadword)
-
- Symbol so[.width] Count
- .......................
-
- This command has the same function like rs with the exception that
- the Symbol __SO is used instead of the __RS symbol. Internally both
- symbols are handled equal. Devpac has introduced the symbol __RS and
- Macro68k knows the functionality by the name __SO.
-
- Symbol fo[.width] Count
- .......................
-
- decreases the counter __FO by Count*Width and initializes the Symbol
- with the new value. Useful to create the negative local stackframe
- symbols needed by link.
-
- * Width
-
- `B'
- 1 Byte Valuearea: -$80 <= x < $100
-
- `W'
- 2 Bytes Valuearea: -$8000 <= x < $10000
-
- `L'
- 4 Bytes Valuearea: -$80000000 <= x < $10000000
-
- `S'
- 4 Bytes (Single IEEE-Float)
-
- `D'
- 8 Bytes (Double IEEE-Float)
-
- `X'
- 12 Bytes (Extended IEEE-Float)
-
- `P'
- 12 Bytes (Packed BCD-Float)
-
- `Q'
- 16 Bytes (Quadword)
-
- rsreset
- .......
-
- initializes the counter __RS to 0.
-
- rsset Value
- ...........
-
- initializes the counter __RS with the Value
-
- * Value = New Index
-
- clrso
- .....
-
- has the same function like rsreset
-
- clrfo
- .....
-
- has the same function like foreset.
-
- setso Value
- ...........
-
- has the same function like rsset
-
- setrs Value
- ...........
-
- has the same function like rsset
-
- setfo Value
- ...........
-
- initializes the counter __FO with the Value
-
- * Value = New Index
-
- Symbol rsval
- ............
-
- initializes the Symbol with the value of the __RS counter.
-
- Symbol soval
- ............
-
- has the same function like rsval.
-
- Symbol foval
- ............
-
- initializes the Symbol with the value of the __FO counter.
-
- Data Commands
- -------------
-
- align Value
- ...........
-
- aligns the program counter to an address that can be devided by the
- value. Useful because certain DOS structures have to be aligned on 4
- Byte boundaries. For example FileInfoBlock. Furthermore it's also
- useful to align subroutines on longword boundaries that they fit better
- into the cache structure.
-
- * Value = Align Mask
-
- cnop Offset,Align
- .................
-
- aligns the program counter to an address that can be devided by the
- Align value and adds the value onto the address. Internally only Align
- values < 16 are supported.
-
- pad.Width Align[,Value]
- .......................
-
- aligns the program counter to an address that can be devided by the
- Align*Width and fills the aligned area by the optional mask value.
-
- quad
- ....
-
- aligns the program counter to a 16 Byte address.
-
- even
- ....
-
- aligns the program counter to an even address. This function is
- useful if you define an odd sized data area and you need a word aligned
- for OS data structures or assembler instructions.
-
- odd
- ...
-
- aligns the program counter to an odd address.
-
- dc[.width] Value[,Value...]
- ...........................
-
- inserts data of the Width into the code.
-
- * Width
-
- `B'
- 1 Byte Valuearea: -$80 <= x < $100
-
- `W'
- 2 Bytes Valuearea: -$8000 <= x < $10000
-
- `L'
- 4 Bytes Valuearea: -$80000000 <= x < $10000000
-
- `S'
- 4 Bytes (Single IEEE-Float)
-
- `D'
- 8 Bytes (Double IEEE-Float)
-
- `X'
- 12 Bytes (Extended IEEE-Float)
-
- `P'
- 12 Bytes (Packed BCD-Float)
-
- db Value[,Value,...]
- ....................
-
- inserts a byte with a value in the valuearea -$80 <= x < $100.
-
- dw Value[,Value,...]
- ....................
-
- inserts a word with a value in the valuearea -$8000 <= x < $10000.
-
- dl Value[,Value,...]
- ....................
-
- inserts a longword with a value in the valuearea -$80000000 <= x <
- $100000000.
-
- ub Value[,Value,...]
- ....................
-
- inserts a byte with a value in the valuearea -$80 <= x < $80.
-
- uw Value[,Value,...]
- ....................
-
- inserts a word with a value in the valuearea -$8000 <= x < $8000.
-
- ul Value[,Value,...]
- ....................
-
- inserts a longword with a value in the valuearea -$80000000 <= x <
- $80000000.
-
- sb Value[,Value,...]
- ....................
-
- inserts a byte with a value in the valuearea -$80 <= x < $100.
-
- sw Value[,Value,...]
- ....................
-
- inserts a word with a value in the valuearea -$8000 <= x < $10000.
-
- sl Value[,Value,...]
- ....................
-
- inserts a longword with a value in the valuearea -$80000000 <= x <
- $100000000.
-
- pb Value[,Value,...]
- ....................
-
- inserts a byte with a value in the valuearea 0 <= x < $80.
-
- pw Value[,Value,...]
- ....................
-
- inserts a word with a value in the valuearea 0 <= x < $8000.
-
- pl Value[,Value,...]
- ....................
-
- inserts a longword with a value in the valuearea 0 <= x < $80000000.
-
- nb Value[,Value,...]
- ....................
-
- inserts a byte with a value in the valuearea -$80 <= x < 0.
-
- nw Value[,Value,...]
- ....................
-
- inserts a word with a value in the valuearea -$8000 <= x < 0.
-
- nl Value[,Value,...]
- ....................
-
- inserts a longword with a value in the valuearea -$80000000 <= x < 0.
-
- ds[.width] Count[,Value]
- ........................
-
- defines a memory area with the length Count * Width and fills the
- area with an optional Value. Default fill value is 0. Is the Count 0
- a cnop 0,Width is run.
-
- * Width
-
- `B'
- 1 Byte Valuearea: -$80 <= x < $100
-
- `W'
- 2 Bytes Valuearea: -$8000 <= x < $10000
-
- `L'
- 4 Bytes Valuearea: -$80000000 <= x < $10000000
-
- `S'
- 4 Bytes (Single IEEE-Float)
-
- `D'
- 8 Bytes (Double IEEE-Float)
-
- `X'
- 12 Bytes (Extended IEEE-Float)
-
- `P'
- 12 Bytes (Packed BCD-Float)
-
- * Count = Length of the memory area.
-
- * Value = optional Fill Value.
-
- dsb[.width] Count[,Value]
- .........................
-
- has the same function like ds
-
- dsb[.width] Count[,Value]
- .........................
-
- has the same function like ds
-
- blk[.width] Count[,Value...]
- ............................
-
- has the same function like ds
-
- ascii String1[,String2,...]
- ...........................
-
- inserts Strings.
-
- cstring String1[,String2,...]
- .............................
-
- inserts C-Strings.
-
- dstring dtype1,dtype2,dtype3
- ............................
-
- inserts the current date string.
-
- Datentypen
-
- * "w" WeekDay
-
- * "d" Date
-
- * "t" Time
-
-
- dc.b " ("
- dstring w,d,t
- dc.b ")"
- dc.b $a,$d,0
- ;=> (Thursday 14-Okt-93 15:32:06)
-
- pstring String[,String,...]
- ...........................
-
- inserts a BCPL string.
-
- istring String[,String,...]
- ...........................
-
- inserts strings that terminate with a char that has Bit 7 set.
-
- bitstream Mask
- ..............
-
- inserts a bitmask for an image object for example. The bits are
- aligned to bytes.
-
- * Mask = Mask is a string that is based only of 0 and 1.
-
-
- bitstream "01001000001"
-
- sprintx "Formatstring"[,Value[,...]]
- ....................................
-
- inserts the resulting string into the code. The string isn't
- terminated by a 0 so that you can add other strings rather easy.
-
- * FormatString - is a string in C-Notation so you can
- use the known C char types n,t,...
- The following options are allowed.
-
- * FormatSyntax - %[flags][width][.limit][length]type
-
- * flags - '-' deactivates left side layout.
-
- * width - Field Length. If the first char is '0' the field is
- filled by '0' on the left side.
-
- * limit - defines the maximal count of char that can be inserted
- from a string. Only legal for %s and %b.
-
- * length - The size of the datatype. Default is 16-bit for the
- typs %d,%u and %x. %l is long (32Bit). Attention! The
- Assembler always pushes a longword on the stack so always use
- %l if you don't know what you're doing.
-
- * type - The following types are supported.
-
- b - BSTR, a 32-bit BPTR Pointer on a bytelength string.
- A NULL BPTR is handled like an empty string. d - signed
- decimal u - unsigned decimal x - hexadezimal in lower case.
- X - hexadecimal in upper case. s - String, a 32-bit Pointer
- on a NULL-terminated Byte-String. A NULL BPTR is
- handled like an empty string. c - Char
-
- * Value - is an argument that has to be resolvable.
-
- Listing I/O Commands
- --------------------
-
- list
- ....
-
- activates the listing output. Has no function if the global listing
- output wasn't activated.
-
- Listing Format:
-
- LINE ADDRESS[Flag1] COMMAND-BYTES[Flag2] SOURCE
-
- * Flag1
-
- * + shows that the line was created by a macro.
-
- * > shows that the Assembler searches the closing ENDC.
-
- * < shows that the Assembler searches the closing ENDM.
-
- * Flag2
-
- * + shows a line overflow and that Bytes are ignored. Can
- often happen during data definitions.
-
- nolist
- ......
-
- deactivates the listing output. Has no function if the global
- listing output wasn't activated.
-
- printx "Formatstring"[,Value[,...]]
- ...................................
-
- outputs the string to the current Stdout and works similar as the
- known C-Printf function. Look at SPRINTF
-
- errfile Name
- ............
-
- defines the filename for the error output.
-
- * Name = Filename
-
- lisfile Name
- ............
-
- defines the filename for the listing output. If no error file was
- defined the error output is also written into the listing file.
-
- * Name = Filename
-
- Structuring
- -----------
-
- symbol[:] macro
- ...............
-
- starts a Macro block.
-
- endm
- ....
-
- ends a macroblock.
-
- mexit
- .....
-
- ends a macro call.
-
- fail
- ....
-
- creates an error.
-
- end
- ...
-
- ends the assembling.
-
- if Symbol
- .........
-
- checks if the symbol value is not NULL and assembles the block
- depending on the success.
-
- ifd Symbol
- ..........
-
- checks if the Symbol exists and assembles the block depending on the
- success.
-
- ifnd Symbol
- ...........
-
- checks if the Symbol doesn't exist and assembles the block depending
- on the success.
-
- ifv String
- ..........
-
- This is a privat command that is used for internal functionality and
- subject to change. Touch an burn!
-
- ifnv String
- ...........
-
- This is a privat command that is used for internal functionality and
- subject to change. Touch an burn!
-
- ifmacrod Macro
- ..............
-
- checks if the Macro exists and assembles the block depending on the
- success.
-
- ifmacrond Macro
- ...............
-
- checks if the Macro doesn't exist and assembles the block depending
- on the success.
-
- ifcmacrod CMacro
- ................
-
- checks if the CMacro exists and assembles the block depending on the
- success.
-
- ifcmacrond CMacro
- .................
-
- checks if the CMacro doesn't exist and assembles the block depending
- on the success.
-
- ifc Symbol,Symbol
- .................
-
- compares the first string with the second string and if they are
- equal the block is assembled.
-
- ifnc 'String','String'
- ......................
-
- compares the first string with the second string and if they differ
- the block is assembled.
-
- if[condition] Symbol=Symbol
- ...........................
-
- compares the first symbol with the second symbol and decides
- according to the condition if the block is assembled.
-
- * Condition = Normal Bcc-Condition Syntax
-
- * Symbol = Normal Symbol
-
- else
- ....
-
- activates the condition block if the block above wasn't assembled.
-
- elseif
- ......
-
- activates the condition block if the block above wasn't assembled.
-
- endc
- ....
-
- defines the end of a condition block.
-
- endif
- .....
-
- defines the end of a condition block.
-
- repeat Count
- ............
-
- repeats the blocks that is located between repeat and endr by the
- number Count.
-
- rept Count
- ..........
-
- has the same function like Repeat
-
- procstart
- .........
-
- defines a function in a Dice-C assembler output and is used to
- optimize Link and Unlk. This optimize method isn't working yet.
-
- procend
- .......
-
- defines a function in a Dice-C assembler output and is used to
- optimize Link and Unlk. This optimize method isn't working yet.
-
- File I/O Commands
- -----------------
-
- incdir Dir[,Dir[,...]]
- ......................
-
- adds directories to the include path list. BASM uses 2 internal
- path lists and the current directory to find the include and incbin
- files. First BASM checks for a : character in the filename and if it
- finds a volume the file is loaded direct instead of searching it
- through the pathlists. The first path list contains the paths that
- were defined in the commandline or *Note BOPT: MI_BOPT by the option -i
- or through incdir. The second path list contains the paths that were
- defined in global configuration file ENV:BASMOption. The entries of
- the second list will be removed when the assembler is closed so that
- the paths are still correct in ARexx-Mode. The first list is removed
- every pass.
-
- * Dir = Name of the Include-Path.
-
- Incpath
- .......
-
- has the same function like incdir.
-
- include Name
- ............
-
- loads the external include file, for example the OS-Includes. If
- the file is a precompiled include file it's detected automaticlly.
- Includes are loaded from the editor or cachefile.library.
-
- * Name = Filename
-
- include2 Name
- .............
-
- has the same function like include with the exception that the
- cachefile.library isn't ignored.
-
- * Name = Filename
-
- incbin Name[,size]
- ..................
-
- inserts the file with the optional length at the current address
- into the code. Normally used for sounds and graphics.
-
- incbin2 Name[,size]
- ...................
-
- has the same function like incbin with the exception that the
- cachefile.library isn't used.
-
- * Name = Name of the data file.
-
- ibytes Name[,Length]
- ....................
-
- has the same function like incbin
-
- dsbin Name[,Length]
- ...................
-
- defines a memory area with the length of the file specified by the
- file. Optinally you can defined the maximal file length.
-
- * Name = Filename
-
- * Length = maximal file length
-
- doscmd Name
- ...........
-
- runs the program Name.
-
- dc.b 0,"$VER: Fubar 1.0 by Joe User"
- doscmd "c:date >ram:Temp"
- incbin ram:Temp
- doscmd "c:delete ram:Temp"
-
- filecom Name
- ............
-
- sets the file comment of output file.
-
- filecom "This is a file comment"
-
- pure
- ....
-
- sets the Pure Bit while writing a program file.
-
- Miscellaneous
- -------------
-
- trashreg Reglist
- ................
-
- defines the registers that are available to the optimizer.
-
- * RegList = A normal Registerlist known by Movem.
-
- super
- .....
-
- deactivates Supervisor warnings.
-
- mc[Type]
- ........
-
- defines the processor type to allow certain commands and
- addressmodes.
-
- Processor-Type
-
- * 68000 default mode
-
- * 68010
-
- * 68020
-
- * 68030
-
- * 68040
-
- * 68060
-
- * 68881
-
- * 68882
-
- bopt [opt[,...],...]
- ....................
-
- sets the assembler options.
-
- Options
-
- `m1[+,-]'
- activates/deactivates 68010 mode.
-
- `m2[+,-]'
- activates/deactivates 68020 mode.
-
- `m3[+,-]'
- activates/deactivates 68030 mode.
-
- `m4[+,-]'
- activates/deactivates 68040 mode.
-
- `m6[+,-]'
- activates/deactivates 68060 mode.
-
- `mf[+,-]'
- activates/deactivates 68881/2 mode.
-
- `ue[+,-]'
- activates/deactivates writing an executable file.
-
- `uo[+,-]'
- activates/deactivates writing an object file.
-
- `ua[+,-]'
- activates/deactivates writing an absolut file.
-
- `un[+,-]'
- activates/deactivates writing file.
-
- `p[+,-]'
- activates/deactivates writing a preassembled Include file.
-
- `g[+,-]'
- activates/deactivates adding the prefix _ to each exported symbol.
- Default is off.
-
- `sx[+,-]'
- activates/deactivates writing all XRef/XDef symbols to a symbol
- hunk. Default is off.
-
- `sl[+,-]'
- activates/deactivates writing all normal symbols to a symbol hunk.
- Default is off.
-
- `sa[+,-]'
- activates/deactivates writing all symbols to a symbol hunk.
- Default is off.
-
- `sd[+,-]'
- activates/deactivates writing a BASM custom format Debug Hunk.
- Makes only sense as a program file and it needs a lot hd space
- because it includes all sources. Default is off.
-
- `s1[+,-]'
- activates/deactivates writing a SAS D1 compatible Debug Hunk.
- Default is off.
-
- `sf[+,-]'
- activates/deactivates writing the full sourcefile path into the
- debug hunk. You should only use this for your own development
- system because other users may have different HD layouts. This
- option has only a meaning with in a SAS D1 Debug Hunk. Default is
- off.
-
- `j[+,-]'
- activates/deactivates setting the PURE Bit for a program file.
- The PURE Bit tells the Shell that this program can be loaded
- resident. Default is off.
-
- `J[+,-]'
- activates/deactivates creating the file ENV:BDebugProgram that
- contains the assembled filename for BDebug. Default is off.
-
- `a[+,-]'
- activates/deactivates creating of an .info file for each program.
- Useful if you use the assembler through the WB. Default is off.
-
- `A[+,-]'
- activates/deactivates Arexxmode. Only allowed in the commandline.
- Default is off.
-
- `i<DirName>'
- defines the include path.
-
- `o<FileName>'
- defines the object filename. If not specified the assembler uses
- the source file name without the source suffix as the output name.
- For object files it adds the suffix `.o'.
-
- `P<Priority>'
- sets the task priority.
-
- `c[+,-]'
- activates/deactivates that the assembler interpretes Upper and
- Lower case as 2 different chars. Default is on.
-
- `f[+,-]'
- activates/deactivates a faster mode that resolves all references
- in the 2nd pass. Fortunately this mode needs more memory and has
- some disadvantages like uncorrect values during the listing. This
- option has no effect during optimizing. Default is off.
-
- `F[+,-]'
- activates/deactivates a faster IO mode that keeps include paths as
- locks instead of strings. The older basm versions used locks to
- store paths but as this isn't compatible with multi-assigns I
- changed that.
-
- `M<Bytes>'
- defines the max macro expansion size. If you get a macromemerror
- you should increase the size. Default 1000 Bytes.
-
- `Z<Address>'
- tells the assembler that the source is starts in the memory at the
- defined address. Useful for ARexx scripts. Option is only
- available in the commandline.
-
- `x[+,-]'
- uses the `cachefile.library' to load resident Includes/Incbins or
- add unknown files to the cachefile.library database. Default is
- off.
-
- `X[+,-]'
- erases all files that are controled by the cachefile.library.
- Default is off.
-
- `y[+,-]'
- shows all files that are controled by the cachefile.library.
- Default is off.
-
- `l[+,-]'
- activates/deactivates the listing output. Default is off.
-
- `l0[+,-]'
- activates/deactivates the listing macro expansion. Default is on.
-
- `L<Listingfile>'
- defines the Listing filename.
-
- `h[+,-]'
- activates/deactivates the symbol listing output. Default is off.
-
- `H[+,-]'
- activates/deactivates the unused symbol output. Default is off.
-
- `v[+,-]'
- outputs a statistic after assembling. Default is off.
-
- `V[+,-]'
- as little status output as possible Default is off.
-
- `e[+,-]'
- creates an error list. Default is on.
-
- `es[+,-]'
- outputs the error list in the Barfly shell. This option has no
- meaning in BASM.
-
- `wo[+,-]'
- activates/deactivates Optimizing warnings. Default is on.
-
- `ws[+,-]'
- activates/deactivates Supervisor warnings. Default is on.
-
- `wm[+,-]'
- activates/deactivates Move16 warnings because the use of the
- move16 command is dangerous if you don't know the problems.
- Default is on.
-
- `wp[+,-]'
- activates/deactivates pc-relative access to different section
- warnings. The linker is needed to resolve such files. Default is
- on.
-
- `w2[+,-]'
- activates/deactivates 68020 addressmode warnings. Default is on.
-
- `w4[+,-]'
- activates/deactivates 64k-Access warnings. It's useful if you
- accidently avoid to forget the address register. Example: move.l
- 8,d0 instead of move.l 8(an),d0 Default is on.
-
- `b0'
- sets the Default Branch Length to 8-Bit. .b Default is off.
-
- `b1'
- sets the Default Branch Length to 16-Bit. .w Default is on.
-
- `b2'
- sets the Default Branch Length to 32-Bit. .l Default is off.
-
- `B0'
- sets the Default BaseDisplacement-Width to 8 Bit. .b Default is on.
-
- `B1'
- sets the Default BaseDisplacement-Width to 16 Bit. .w Default is
- off.
-
- `B2'
- sets the Default BaseDisplacement-Width to 32 Bit. .l Default is
- off.
-
- `n0'
- sets the Default OuterDisplacement-Width to 16 Bit. .w Default is
- off.
-
- `n1'
- sets the Default OuterDisplacement-Width to 32 Bit. .l Default is
- on.
-
- `q[+,-]'
- activates/deactivates align long after each rts, bra or jmp to
- align blocks to the cache structure. Default is off.
-
- `O[+,-]'
- activates/deactivates the Optimizer. Without this option no
- optimizing will happen besides addressmode converting. Default is
- off.
-
- `OG[+,-]'
- activates/deactivates Forward Reference Optimizing to use every
- possibility. In this mode the source is assembled until no further
- optimizing method is found. First the source is assembled
- normally. This is shown by the Output Pass 1. Afterwards the
- optimize passes are started and continued until no further symbol
- changes and length errors occur. This can take a while and
- depends on the source size. Default is off.
-
- `OT[+,-]'
- activates/deactivates Time Optimizing. Default is off.
-
- Addressmode Converting
-
- `OC0[+,-]'
- *Note bdwan: OP_DIRECT
-
- `OC1[+,-]'
- *Note bdwpc: OP_DIRECT
-
- `OC2[+,-]'
- *Note anxn: OP_DIRECT
-
- `OC3[+,-]'
- *Note pcxn: OP_DIRECT
-
- `OC4[+,-]'
- *Note bdw: OP_DIRECT
-
- `OC5[+,-]'
- *Note bdl: OP_DIRECT
-
- `OC6[+,-]'
- *Note an: OP_DIRECT
-
- `OC7[+,-]'
- *Note pc: OP_DIRECT
-
- `ODD[+,-]'
- activates Direct Addressmode Optimizing
-
- Direct Optimizing
-
- `OD0[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD00[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD01[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD02[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD03[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD04[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD05[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD06[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD07[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD08[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD09[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD0a[+,-]'
- *Note move: OP_OPTIMIZE
-
- `OD1[+,-]'
- *Note clr: OP_OPTIMIZE
-
- `OD2[+,-]'
- *Note add: OP_OPTIMIZE
-
- `OD3[+,-]'
- *Note sub: OP_OPTIMIZE
-
- `OD4[+,-]'
- *Note lea: OP_OPTIMIZE
-
- `OD5[+,-]'
- *Note cmp: OP_OPTIMIZE
-
- `OD6[+,-]'
- *Note bcc: OP_OPTIMIZE
-
- `OD7[+,-]'
- *Note jsr: OP_OPTIMIZE
-
- `OD8[+,-]'
- *Note jmp: OP_OPTIMIZE
-
- `OD9[+,-]'
- *Note asl: OP_OPTIMIZE
-
- `ODa[+,-]'
- *Note or: OP_OPTIMIZE ( This Optimizing is deactivated internal )
-
- `ODb[+,-]'
- *Note eor: OP_OPTIMIZE ( This Optimizing is deactivated internal )
-
- `ODc[+,-]'
- *Note and: OP_OPTIMIZE
-
- `ODd[+,-]'
- *Note mulu: OP_OPTIMIZE
-
- `ODe[+,-]'
- *Note muls: OP_OPTIMIZE
-
- `ODf[+,-]'
- *Note jsr+rts: OP_OPTIMIZE
-
- `ODg[+,-]'
- *Note jmp+rts: OP_OPTIMIZE
-
- `ODh[+,-]'
- *Note MovemNoRegister: OP_OPTIMIZE
-
- `ODi[+,-]'
- *Note MovemOneRegister: OP_OPTIMIZE
-
- `ODj[+,-]'
- *Note Link: OP_OPTIMIZE
-
- `OAP[+,-]'
- activates *Note PC-Relative: OP_ADDRESS Optimizing
-
- `OAS[+,-]'
- activates *Note Smalldata: OP_ADDRESS Optimizing
-
- `OAL[+,-]'
- activates *Note long to word: OP_ADDRESS Optimizing
-
- `OAX[+,-]'
- activates *Note x(An) to (An): OP_ADDRESS Optimizing
-
- `OAY[+,-]'
- activates *Note 68020 An-EA: OP_ADDRESS Optimizing
-
- `OAZ[+,-]'
- activates *Note 68020 PC-EA: OP_ADDRESS Optimizing
-
- `OAR[+,-]'
- activates *Note Register: OP_REGISTER Optimizing
-
- You should be careful with the command *Note BOPT: MI_BOPT when you
- activate Global-Optimize. In every parse the default config is set and
- therefore you should define all global options in the commandline or in
- the configuration file.
-
- 680xx Meta Commands
- -------------------
-
- mb Operand1,Operand2
- ....................
-
- has the same function as move.b.
-
- mw Operand1,Operand2
- ....................
-
- has the same function as move.w.
-
- ml Operand1,Operand2
- ....................
-
- has the same function as move.l.
-
- mq Operand1,Operand2
- ....................
-
- has the same function as moveq.
-
- xor.? Operand1,Operand2
- .......................
-
- has the same function as eor.?.
-
- xori.? Operand1,Operand2
- ........................
-
- has the same function as eori.?.
-
- bhs.? Label
- ...........
-
- has the same function as bcc.?.
-
- blo.? Label
- ...........
-
- has the same function as bcs.?.
-
- Assembler Macros
- ================
-
- Macros are meta commands that can be based of many assembler
- instructions to achieve an abstracter source layout. In a macro you
- can use several different pattern that are replaced by appropriate
- parameters when the macro is called. The parameter that are passed
- during a macro call are represented by the following patterns:
- \0,...,\9, \a,...,\z, \A,...,\Z. The pattern ids are using the
- hexadecimal format. If a pattern is used with no related parameter an
- empty string is inserted. Furthermore if a parameter contains
- tabulators or spaces it has to be placed between <...>. When a macro
- needs relative labels and is should be called more than one time you
- should use the special pattern @. This pattern is replaced by a number
- that is based of 4 digits and that is increased after each call. The
- pattern \# is replaced by the value of the symbol narg that represents
- the count of macro parameters. Besides the standard patterns there are
- some more advanced pattern functions supported that look like
- \*Function-Name. These functions don't belong to the motorola standard
- thus they aren't supported by every assembler. Another important point
- is that you can also call macros from from macros but you can't define
- macros in macros.
-
- The standard macro pattern
-
- Label & [. string] & [, string] & [, string] & [,...] & [\\0]
- & [\\1|] & [\\2|] & [\\3|]...[\\n|]
-
- The advanced macro pattern functions
-
- * ` \(Argument)' inserts the string of the macroparameter with the
- number the argument defines.
-
-
- \(1) = \1
- \(1+3+4) = \8
-
- * `\*upper(String)' inserts the string in upper case.
-
- * `\*lower(String)' inserts the string in lower case.
-
- * `\*valof(Argument)' inserts the decimal value of the argument as a
- string.
-
- * `\*strlen(Symbol)' inserts the length of a symbol as a string.
-
- * `\*right(String,n)' inserts n chars of the right side of the
- string. If the string contains less than n chars the whole string
- is inserted.
-
- * `\*left(String,n)' inserts n chars of the left side of the string.
- If the string contains less than n chars the whole string is
- inserted.
-
- * `\*mid(String,n,m)' inserts chars from position n to m from the
- string. If the position is outside of the string length the chars
- till the end of the string is inserted.
-
-
- openwind MACRO
- move.l intbase,a6
- lea.l \1,a0
- jsr OpenWindow(a6)
- ENDM
-
- start:
- openwind newwindow
-
-
-
- movewind MACRO
- move.l intbase,a6
- move.l \1,a0
- moveq #0,d0
- move.\0 \2,d1
- IFC `\0',`b'
- ext.w d1
- ENDC
- jsr MoveWindow(a6)
- ENDM
-
- start:
- move.b #10,d2
- 1$:
- movewind.b newwindow,d2
- addq.b #1,d2
- cmp.b #100,d2
- bne.s 1$
-
-
- wait MACRO
- moveq #-1,d0
- wait\
- dbra d0,wait\
- ENDM
-
- start:
- wait
- wait
- wait
-
-
- test MACRO
- move.l #\*upper(Hello),d0
- move.l #\*lower(Hello),d0
- move.l #\*strlen(1234567890123456),d0
- move.l #\*valof(value),d0
- rts
-
- cstring "\*left(abcdefgh,4)"
- even
- cstring "\*left(abcdefgh,10)"
- even
- cstring "\*right(abcdefgh,4)"
- even
- cstring "\*right(abcdefgh,10)"
- even
- cstring "\*mid(abcdefgh,2,4)"
- even
- cstring "\*mid(abcdefgh,2,8)"
- even
-
- ENDM
-
- value = 123456789
- hello:
- test
-
-
- value = 123456789
-
-
- hello:
- move.l #HELLO,d0
- move.l #hello,d0
- move.l #16,d0
- move.l #123456789,d0
- rts
- cstring "abcd"
- even
- cstring "abcdefgh"
- even
- cstring "efgh"
- even
- cstring "abcdefgh"
- even
- cstring "cdef"
- even
- cstring "cdefgh"
- even
-
-
- PUTTAG MACRO
- IFC "\2",""
- PUTTAG_COUNT set 0
- ENDC
-
- IFNC "\2",""
- move.l \2,-(a7)
- PUTTAG_COUNT SET PUTTAG_COUNT+4
- ENDC
-
- move.l \1,-(a7)
- PUTTAG_COUNT SET PUTTAG_COUNT+4
-
- IFC "\1","#TAG_END"
- PUTTAG_COUNT SET 4
- ENDC
-
- ENDM
-
- CLEARTAG MACRO
- lea.l PUTTAG_COUNT(a7),a7
- ENDM
-
-
-
- PUTTAG #TAG_END
- PUTTAG #WA_Width,#100
- PUTTAG #WA_ScreenTitle,#Title
- .
- .
- move.l a7,a1
- sub.l a0,a0
- jsr OpenWindowTagList(a6)
- CLEARTAG
-
- Highlevel Macros
- ================
-
- In highlevel macros the operands are based of legal addressmodes.
- Arguments are based of operands and the operators +,-,<<,>>. Conditions
- are based of !,=, <,>,<=,>=,<>. By using highlevel macros you can make
- the programming of non critical source areas easier and more abstract.
- Blame Mike Schwartz for this idea...he forced me to do it:-B
-
- .REG
- ....
-
- sets the accumulator register that is used to calculate arguments.
- Default register is D0.
-
- .BRANCH b|w|l
- .............
-
- sets the length of branch commands that are used in the highlevel
- macros. Standard length is .b.
-
- .FOR Operand[.b|w|l] = Operand TO Operand STEP Operand
- ......................................................
-
- creates code for a for loop. The optional width you define after
- the first operand sets the width for all operations in the for loop.
-
-
- .FOR d0.w = #1 to STEP #2
- addq.w #1,d1
- .NEXT
-
- ;Compiled Code
-
- move.w #1,d0
- __for1:
- addq.w #1,d1
- add.w #2,d0
- cmp.w ,d0
- blt.b __for1
-
- .NEXT
- .....
-
- closes the outer .FOR loop.
-
- .IF [Argument] =,!, < , > , <> Operand
- ......................................
-
- creates code for an IF-Operation. You can remove the first argument
- if you want to test the operand. For example .IF <>
-
-
- .IF (a0) + #0 <> d1
- moveq #0,d0
- .ELSE
- moveq #1,d0
- .ENDIF
-
- ;Compiled Code
-
- move.l (a0),d7
- add.l #0,d7
- cmp.l d1,d7
- beq.b __else1
- moveq #0,d0
- bra.b __endif1
- __else1:
- moveq #1,d0
- __endif1:
-
- .ELSE
- .....
-
- starts an alternative IF-Block.
-
- .ENDIF
- ......
-
- closes the outer .IF block.
-
- .WHILE [Argument] =,!, < , > , <> Operand
- .........................................
-
- creates code for a while loop The optional width you define after
- the first operand sets the width for all operations in the while loop.
-
-
- .WHILE d0 <> #0
- addq.w #1,d1
- .ENDWHILE
-
- ;Compiled Code
-
- __while1:
- cmp.l #0,d0
- beq.s __endwhile1
- addq.w #1,d1
- bra.s __while1
- __endwhile1:
-
- .ENDWHILE
- .........
-
- closes the outer while loop.
-
- .CALL Function [, Argument [, Argument [,...]]]
- ...............................................
-
- calls a C-Function by parsing the arguments through the stack.
- Arguments are calculated in the accumulator register.
-
-
-
- .CALL func , test + 0 - #20 , #test
-
- ;Compiled Code
-
- move.l test,d7
- add.l 0,d7
- sub.l #20,d7
- move.l d7,-(a7)
- move.l #test,-(a7)
- jsr func
- ifnc "8","0" ;Were there any parameters ?
- lea.l __CALLSize(a7),a7
- endc
-
- .RETURN Argument
- ................
-
- returns a result value in the accumulator register.
-
-
- .return d1 + d2 + #$100
-
- ;Compiled Code
-
-
- move.l d1,d7
- add.l d2,d7
- add.l #$100,d7
-
- .DEF func [, Operand [, Operand [,...]]]
- ........................................
-
- defines a C-Stack function and loads the defined parameters into the
- operands.
-
-
- .DEF func , d0.w , d1 , (a0)
- .ENDDEF
-
- ;Compiled Code
-
- XDEF func
- link a5,#0
- move.w $0a(a5),d0
- move.l $0c(a5),d1
- move.l $10(a5),(a0)
- unlk a5 ;.ENDDEF
- rts
-
- .ENDDEF
- .......
-
- closes a function that was started by .DEF
-
- .LET [ Operand =] Argument
- ..........................
-
- calculates an argument in an accumulator or moves the value to a
- defined operand.
-
-
- .LET + 4 - #LN_SIZE << #7
- .LET d1 = (a1) - (a0)
-
- ;Compiled Code
-
- add.l 4,d7
- sub.l #LN_SIZE,d7
- lsl.l #7,d7
-
- move.l (a1),d7
- sub.l (a0),d7
- move.l d7,d1
-
- Predefined Symbols
- ==================
-
- NARG
- ....
-
- represents the macro parameter count in a macro.
-
- BARFLY
- ......
-
- represents the assembler version.
-
- 680xx
- .....
-
- represents the CPU processor type.
-
- 6888x
- .....
-
- represents the FPU processor type.
-
- _MOVEMBYTES
- ...........
-
- represents the byte count the last movem transfer used.
-
-
- lea _MOVEMBYTES(a7),a7 ;frees the stack
-
- _MOVEMREGS
- ..........
-
- represents the last movem register mask.
-
-
- movem (a7)+,_MOVEMREGS
-
- __RS
- ....
-
- represents the RS-Counter.
-
- __SO
- ....
-
- represents the RS-Counter.
-
- __FO
- ....
-
- represents the FO-Counter.
-
- Optimizing
- ==========
-
- Optimize Methods...
-
- Direct Addressmode Optimizing
- -----------------------------
-
- The assembler can direct optimize certain 68020...60 Addressmodes if
- a faster 68000 addressmode exists. This optimizing method should
- always be activated because of compatibility reasons.
-
- * `(bd.w,an)' can be optimized to `x(an)' that removes 1 word and
- some cycles.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (1000.w,an),dn | move.l 1000(an),dn | -OC0 |
- +------------------------+--------------------+--------+
-
- * `(bd.w,pc)' can be optimized to `x(pc)' that removes 1 word and
- some cycles.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (1000.w,pc),dn | move.l 1000(pc),dn | -OC1 |
- +------------------------+--------------------+--------+
-
- * `(bd.w)' can be optimized to `bd.w' that removes 1 word and some
- cycles.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (bd.w),dn | move.l bd.w,dn | -OC4 |
- +------------------------+--------------------+--------+
-
- * `(bd.l)' can be optimized to `bd.l' that removes 1 word and some
- cycles.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (bd.l),dn | move.l bd.l,dn | -OC5 |
- +------------------------+--------------------+--------+
-
- * `(an)' can be optimized to `(an)' that removes 1 word and some
- cycles. The addressmode `(an)' can be interpreted as a subgroup
- of `(bd,an,xn)'. Because `(an)' is a normal 68000 addressmode you
- should never switch off this optimizing method.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (an),dn | move.l (an),dn | -OC6 |
- +------------------------+--------------------+--------+
-
- * `(pc)' can be optimized to `(pc)' that removes 1 word and some
- cycles. The addressmode `(pc)' can be interpreted as a subgroup
- of `(bd,pc,xn)'. Because `(pc)' is a normal 68000 addressmode you
- should never switch off this optimizing method.
-
- +------------------------+--------------------+--------+
- | Addressmode | Optimizing | Option |
- +------------------------+--------------------+--------+
- +------------------------+--------------------+--------+
- | move. l (pc),dn | move.l (pc),dn | -OC7 |
- +------------------------+--------------------+--------+
-
- Address Optimizing
- ------------------
-
- * `Long'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | x.l,EA | x.w,EA | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+ -OAL |
- | EA,x.l | EA,x.l | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+--------+
-
- * `x(an)'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | x(an),EA | (an),EA | x=0 | |
- +---------------+----------------+---------------------+ -OAX |
- | EA,x(an) | EA,(an) | x=0 | |
- +---------------+----------------+---------------------+--------+
-
- * `PC-Relative'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | label,EA | label(pc),EA | $ffff8000<=x<=$7fff | -OAP |
- +---------------+----------------+---------------------+--------+
-
- * `A4-Smalldata'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | x.l,EA | x(a4),EA | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+ -OAS |
- | EA,x.l | EA,x(a4) | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+--------+
-
- * `68020-An'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | (x.l,an) | (an) | x=0 | -OAY |
- +---------------+----------------+---------------------+ |
- | (x.l,an) | x(an) | $ffffff80<=x<=$7f | |
- +---------------+----------------+---------------------+ |
- | (x,an,xn) | 0(an,xn) | x=0 | |
- +---------------+----------------+---------------------+ |
- | (x,an,xn) | (x.b,an,xn) | $ffffff80<=x<=$7f | |
- +---------------+----------------+---------------------+ |
- | (x,an,xn) | (x.w,an,xn) | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+ |
- | ([?],x) | ([?]) | x=0 | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],x) | ([?],x.w) | $ffff8000<=x<=$7fff | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],xn,x) | ([?],xn) | x=0 | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],xn,x) | ([?],xn,x.w)| $ffff8000<=x<=$7fff | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+--------+
-
- * `68020-PC'
-
- +---------------+----------------+---------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+---------------------+--------+
- +---------------+----------------+---------------------+--------+
- | (x.l,pc) | (pc) | x=0 | -OAZ |
- +---------------+----------------+---------------------+ |
- | (x.l,pc) | x(pc) | $ffffff80<=x<=$7f | |
- +---------------+----------------+---------------------+ |
- | (x,pc,xn) | 0(pc,xn) | x=0 | |
- +---------------+----------------+---------------------+ |
- | (x,pc,xn) | (x.b,pc,xn) | $ffffff80<=x<=$7f | |
- +---------------+----------------+---------------------+ |
- | (x,pc,xn) | (x.w,pc,xn) | $ffff8000<=x<=$7fff | |
- +---------------+----------------+---------------------+ |
- | ([?],x) | ([?]) | x=0 | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],x) | ([?],x.w) | $ffff8000<=x<=$7fff | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],xn,x) | ([?],xn) | x=0 | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+ |
- | ([?],xn,x) | ([?],xn,x.w)| $ffff8000<=x<=$7fff | |
- | | | ? is also optimized | |
- +---------------+----------------+---------------------+--------+
-
- #x Optimizing
- -------------
-
- * `Move'
-
- +-------------------+------------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +-------------------+------------------+-------------------------+--------+
- | | | | -OD0 |
- +-------------------+------------------+-------------------------+--------+
- | move.l #x,dn | moveq #x,dn | $ffffff80<=$7f | -OD00 |
- +-------------------+------------------+-------------------------+ |
- | move.? #0,an | suba.l an,an | ? = w or l | -OD01 |
- +-------------------+------------------+-------------------------+ |
- | move.l #x,dn | moveq #y,dn | $10000<=x<=$7f0000 | -OD02 |
- | | swap dn | | |
- +-------------------+------------------+-------------------------+ |
- | move.l #x,dn | moveq #y,dn | $ff80ffff<=x<=$fffEffff | -OD03 |
- | | swap dn | | |
- +-------------------+------------------+-------------------------+ |
- | move.l #x,dn | moveq #y,dn | $80<=x<=$ff | -OD04 |
- | | not.b dn | | |
- +-------------------+------------------+-------------------------+ |
- | move.l #x,dn | moveq #y,dn | $ffff<=x<=$ff81 | -OD05 |
- | | neg.w dn | | |
- +-------------------+------------------+-------------------------+ |
- | move.l #x,dn | moveq #y,dn | $ffff0080<=x<=$ffff0001 | -OD06 |
- | | neg.w dn | | |
- +-------------------+------------------+-------------------------+ |
- | move.? #0,EA | clr.? EA | ? = w or l.See Trashreg | -OD07 |
- | | | optimizing. I also check| |
- | | | if it accesses the HW | |
- +-------------------+------------------+-------------------------+ |
- | move.b #$ff,EA | st EA | | -OD08 |
- +-------------------+------------------+-------------------------+ |
- | movea.l -4(an),an | movea.l -(an),an | | -OD09 |
- +-------------------+------------------+-------------------------+ |
- | movea.w -2(an),an | movea.w -(an),an | | -OD0a |
- +-------------------+------------------+-------------------------+--------+
-
- * `Clr'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | clr.l dn | moveq #0,dn | | -OD1 |
- +---------------+----------------+-------------------------+--------+
-
- * `Add'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | add.? #x,EA | addq.? #x,EA | 1<=x<=8 | -OD2 |
- +---------------+----------------+-------------------------+ |
- | add.? #x,EA | subq.? #x,EA | -8<=x<=-1 | |
- +---------------+----------------+-------------------------+ |
- | add.? #x,an | lea.l x(an),an | $ffff8000<=x<=$7fff | |
- +---------------+----------------+-------------------------+ |
- | add.? #0,EA | tst.? EA | legal EA | |
- +---------------+----------------+-------------------------+ |
- | add.? #0,an | removed | | |
- +---------------+----------------+-------------------------+--------+
-
- * `Sub'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | sub.? #x,EA | subq.? #x,EA | 1<=x<=8 | -OD3 |
- +---------------+----------------+-------------------------+ |
- | sub.? #x,EA | addq.? #x,EA | -8<=x<=-1 | |
- +---------------+----------------+-------------------------+ |
- | sub.? #x,an |lea.l -x(an),an | $ffff8000<=x<=$7fff | |
- +---------------+----------------+-------------------------+ |
- | sub.? #0,EA | tst.? EA | legal EA | |
- +---------------+----------------+-------------------------+ |
- | sub.? #0,an | removed | | |
- +---------------+----------------+-------------------------+--------+
-
- * `Lea'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | lea x(an),an | addq.w #x,an | 1<=x<=8 | |
- +---------------+----------------+-------------------------+ -OD4 |
- | lea x(an),an | subq.w #x,an | -8<=x<=-1 | |
- +---------------+----------------+-------------------------+--------+
-
- * `Cmp'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | cmp.? #0,EA | tst.? EA | | -OD5 |
- +---------------+----------------+-------------------------+--------+
-
- * `Bcc'
-
- The assembler tries to optimize the branch on the smallest
- possible length so that can win max 2 words and some cycles.
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | Bcc.l label | Bcc.w label | $8000<=label<=$7fff | -OD6 |
- +---------------+----------------+-------------------------+ |
- | Bcc.l label | Bcc.s label | $80<=label<=$7f | |
- +---------------+----------------+-------------------------+ |
- | Bcc.w label | Bcc.s label | $80<=label<=$7f | |
- +---------------+----------------+-------------------------+--------+
-
- Attention! This optimizing methid is unsafe when you use
- BRANCH-Tables. You should switch off the optimize method over
- this area.
-
-
- * `Jsr'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | jsr label | bsr.w label | $8000<=Offset<=$7fff | |
- +---------------+----------------+-------------------------+ -OD7 |
- | jsr label | bsr.s label | $80<=Offset<=$7f | |
- +---------------+----------------+-------------------------+--------+
-
- Attention! This optimizing methid is unsafe when you use
- JSR-Tables. You should switch off the optimize method over this
- area.
-
-
- * `Jmp'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | jmp label | bra.w label |$ffff8000<=Offset<=$7fff | |
- +---------------+----------------+-------------------------+ -OD8 |
- | jmp label | bra.s label |$ffffff80<=Offset<=$7f | |
- +---------------+----------------+-------------------------+--------+
-
- * `Asl'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | asl.? #1,dn | add.? dn,dn | | -OD9 |
- +---------------+----------------+-------------------------+--------+
-
- * `Or' This optimizing method isn't safe because of the changed
- condition flags.
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | or.? #x,dn | bset #y,dn | x=y^2 | -ODa |
- +---------------+----------------+-------------------------+--------+
-
- * `Eor' This optimizing method isn't safe because of the changed
- condition flags.
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | eor.? #x,dn | bchg #y,dn | x=y^2 | -ODb |
- +---------------+----------------+-------------------------+--------+
-
- * `Mulu'
-
- Be very careful with this optimizing.
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | mulu.w #x,dn | swap dn | x=2^y | -ODc |
- | | clr.w dn | y=y1+y2 | |
- | | swap dn | y=1,add.l dn,dn | |
- | | lsl.l #y1,dn | | |
- | | lsl.l #y2,dn | | |
- +---------------+----------------+-------------------------+ |
- | mulu.l #x,dn | lsl.l #y1,dn | x=2^y | |
- | | lsl.l #y2,dn | y=y1+y2 | |
- | | | y >= 16 | |
- | | | swap dn , y-16 | |
- +---------------+----------------+-------------------------+--------+
-
- * `Muls'
-
- Be very careful with this optimizing.
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | muls.w #x,dn | ext.l dn | x=2^y | -ODd |
- | | asl.l #y1,dn | y=y1+y2 | |
- | | asl.l #y2,dn | y=1 , add.l dn,dn | |
- +---------------+----------------+-------------------------+ |
- | muls.l #x,dn | asl.l #y1,dn | x=2^y | |
- | | asl.l #y2,dn | y=y1+y2 | |
- | | | y >= 16 | |
- | | | swap dn ,y-16 | |
- +---------------+----------------+-------------------------+--------+
-
- * `Jsr+Rts'
-
- +--------------+---------------+------------------------+-------+
- | Addressmode | Optimizing | Note |
- Option |
- +--------------+---------------+------------------------+-------+
- +--------------+---------------+------------------------+-------+
- | jsr EA | jmp EA | No optimizing if there's| -ODe
- | | rts | | a label before RTS |
- |
- +--------------+---------------+------------------------+-------+
-
- * `Bsr+Rts'
-
- +--------------+---------------+------------------------+-------+
- | Addressmode | Optimizing | Note |
- Option |
- +--------------+---------------+------------------------+-------+
- +--------------+---------------+------------------------+-------+
- | jmp EA | jmp EA | No optimizing if there's| -ODf
- | | rts | | a label before RTS |
- |
- +--------------+---------------+------------------------+-------+
-
- * `MovemNoRegister'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | movem.l ,EA | Removed | | |
- +---------------+----------------+-------------------------+ -ODh |
- | movem.l EA, | Removed | | |
- +---------------+----------------+-------------------------+--------+
-
- * `MovemOneRegister'
-
- +---------------+----------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+----------------+-------------------------+--------+
- +---------------+----------------+-------------------------+--------+
- | movem.l Xn,EA | Move.l Xn,EA | Alter the status flags! | |
- +---------------+----------------+-------------------------+ -ODi |
- | movem.l EA,Xn | Move.l EA,Xn | Alter the status flags! | |
- +---------------+----------------+-------------------------+--------+
-
- Register Optimizing
- -------------------
-
- * `#xxx' is switched off.
-
- * An address register is set free by `trashreg'.
-
- +---------------+--------------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+--------------------+-------------------------+--------+
- +---------------+--------------------+-------------------------+--------+
- |move.? EA,label| lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | move.? EA,(an) | | -OAR |
- +---------------+--------------------+-------------------------+ |
- | tst.? label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | tst.? (an) | | |
- +---------------+--------------------+-------------------------+ |
- | not.? label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | not.? (an) | | |
- +---------------+--------------------+-------------------------+ |
- | neg.? label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | neg.? (an) | | |
- +---------------+--------------------+-------------------------+ |
- | negx.? label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | negx.? (an) | | |
- +---------------+--------------------+-------------------------+ |
- | nbcd label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | nbcd (an) | | |
- +---------------+--------------------+-------------------------+ |
- | scc label | lea.l label(pc),an | $ffff8000<=label<=$7fff | |
- | | scc (an) | | |
- +---------------+--------------------+-------------------------+--------+
-
- * `#x' Optimizing on.
-
- * A data register is set free by `trashreg'.
-
- +---------------+--------------------+-------------------------+--------+
- | Addressmode | Optimizing | Note | Option |
- +---------------+--------------------+-------------------------+--------+
- +---------------+--------------------+-------------------------+--------+
- | move.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | move.l dn,EA | | -OAR |
- +---------------+--------------------+-------------------------+ |
- | ori.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | or.l dn,EA | | |
- +---------------+--------------------+-------------------------+ |
- | eori.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | eor.l dn,EA | | |
- +---------------+--------------------+-------------------------+ |
- | andi.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | and.l dn,EA | | |
- +---------------+--------------------+-------------------------+ |
- | addi.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | add.l dn,EA | | |
- +---------------+--------------------+-------------------------+ |
- | subi.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | sub.l dn,EA | | |
- +---------------+--------------------+-------------------------+ |
- | cmpi.l #x,EA | moveq #x,dn | $ffffff80<=x<=$7f | |
- | | cmp.l EA,dn | | |
- +---------------+--------------------+-------------------------+ |
- | move.? #0,EA | moveq #0,dn | Time optimizing | |
- | | move.l dn,EA | must be on | |
- +---------------+--------------------+-------------------------+--------+
-
- How does Optimizing work ?
- --------------------------
-
- In single-pass Optimizing the assembler can only optimize commands
- where it can resolve the reference in the first pass. This means the
- label or symbol has to be known before. In multi-pass Optimizing it
- can optimize every command without bothering where the label is defined.
- The Assembler keeps all labels each pass but increases a change counter
- if the old contents differs with the new contents. The exception is
- that the assembler can't optimize commands that depend on symbols that
- are defined after the command. The reason is that the Assembler has to
- remove each pass every symbol to avoid problems with `IFD' and `IFND'
- that can cause that certain areas aren't assembled in multi-pass mode.
- You probably noticed that i assume that nobody used `IFD' or `IFND'
- with labels because that would also break multi-pass.
-
- An example for a construct that can't be optimized.
-
- move.l #1,NULL(a0)
- NULL=0
-
- Problems...
- -----------
-
- You should always be careful with optimizing because it can cause
- bugs in certain source areas. Branch optimizing for example has to be
- switched off if you use JMP-Towers.
-
-
- lsl.w #1,d0
- jmp Tower(pc,d0.w)
-
- Tower:
- bra.w func1
- bra.w func2
- bra.w func3
-
- could be be optimized to
-
- Tower:
- bra.w func1
- bra.s func2
- bra.s func3
-
- that leads to program bugs.
-
- Solution:
-
- bopt OD6-
-
- Tower:
- bra.w func1
- bra.w func2
- bra.w func3
-
- bopt OD6+
-
- Preassembled Includes
- =====================
-
- If you want to assemble a program that needs to load a lot includes
- it's useful to preassemble the includes and load one file because the
- real slowdown factor is the need loading time. You can only use
- absolut symbols and macros in a preassembled file. All relative and
- symbols defined by `set' aren't written into a preassembled file.
- The created file isn't compress to avoid any slowdown but if the file
- size is critical you can compress the file by xpk and load it through
- the xfh filesystem.
-
- basm -p Source.S creates the preassembled file Source.p
-
-
- An error location could be absolut symbols that are calculated by
- relative symbols. You should avoid these symbols.
-
- Symbol=Label1-Label2
-
-
- Resident includes
- =================
-
- `BASM' can control an Include and Incbin database by the library
- `cachefile.library' to get rid of the loading delays. The files in the
- database can be shown and deleted.
-
- Basm Assembler System
- =====================
-
- Cli Calling Convention
- ----------------------
-
- `Format:'
-
- BASM [-Option] Name
-
-
- This is the commandline version of the assembler and can be easy
- integrated in own development system, for example `Make' and `CED'. An
- assembler error is indicated by the result 20 and the result 10 is used
- if no source file were specified.
-
- * `Option'
-
- The same options are accepted that are described in the assembler
- command *Note BOPT: MI_BOPT. The following options are accepted
- additionally.
-
- * A[+,-] Turns ARexx mode on/off
-
- * C <Configuration> loads a configuration file
-
- * d <Symbol=Value> defines a symbol
-
- * `Standard-Optionen'
-
-
- ;All other options are deactivated.
-
- c+,e+,m1000,wo+,ws+,wm+,w2+,w4+,wp+
- b1+,B0+,n1+
- OC0+,OC1+,OC2+,OC3+,OC4+,OC5+,OC6+,OC7+,
- ODD+,OD0+,OD1+,OD2+,OD3+,OD4+,OD5+,OD6+,OD7+,OD8+,
- OD9+,ODc+,ODe+,ODf+,ODg+
- OAP+,OAL+,OAX+,OAY+,OAZ+,OAR+
-
- Configuration
- -------------
-
- Global
- ......
-
- You can define the global configuration through the file
- `ENV:BASMOption'. The internal standard configuration is not replaced
- but can only be changed.
-
- File `ENV:BASMOption'
-
-
- -v
- -f
- -c-
- -iASM:
-
- If a line doesn't start with - it's ignored.
-
-
- WB Tooltypes
- ............
-
- Additionally you can also define the above described configuration
- options in the tooltypes of the source file icon. Furthermore `BASM'
- allows a special tooltype to define an output window.
-
- o Window= <Window Defintion>
-
- ARexx
- =====
-
- The `BASM' ARexx Port Name is `rexx_BASM' and the ARexx Script
- suffix `.basm'. To activate the `BASM' ARexx mode you have to start
- `BASM' with the option -A.
-
- BASM
- ....
-
- `BASM [-Option] Name'
-
- This ARexx command starts the assembler and coincides with the
- CLI-syntax structure.
-
- BEND
- ....
-
- `BEND'
-
- This ARexx command closes the ARexx port and shuts down the
- assembler.
-
- BGETERROR
- .........
-
- `BGETERROR'
-
- With this ARexx command you will receive an explanation of the actual
- errors. If no errors exist it will return a status code 20.
-
- Error Format String
-
- OFFSET|FILE|<Error Description>
-
- BNEXTERROR
- ..........
-
- `BNEXTERROR'
-
- This ARexx command will cause a jump to the next error in the list.
- If there are no further errors in the list it will return a status
- code 20.
-
- BINITERROR
- ..........
-
- `BINITERROR'
-
- This ARexx command will cause a jump to the first entry in the error
- list. If no error exists it will return a status code 20.
-
- BGETWARNING
- ...........
-
- `BGETWARNING'
-
- works like `BGETERROR' only for Warnings.
-
- BNEXTWARNING
- ............
-
- `BNEXTWARNING'
-
- works like `BNEXTERROR' only for Warnings.
-
- BINITWARNING
- ............
-
- `BINITWARNING'
-
- works like `BINITERROR' only for Warnings.
-
- Compatibility
- =============
-
- to other assemblers...
- ----------------------
-
-
- Fortunately `BASM' can't be 100% compatible to every assembler on
- the amiga market. Thus you can expect problems with different
- sources. In general you can expect problems with commands that
- don't belong to a standard like option commands. Furthermore you
- should also be careful with sources that directly depend on the
- assembler implementation. Because `BASM' is a 1-Pass Assembler in
- the normal mode with an additional backpatch phase you shouldn't
- define symbols that can't be resolved at once. An ideal example
- for this practice is the `Xoper2.2' Source that was developed with
- the PD Assembler A68k. While assembling with `BASM' the assembler
- detects that a not defined symbols is accessed through the `SET'
- command. Generally this should cause an error at once but
- unfortunately `A68k' doesn't show anything and uses the last value
- of `cmdnum'.
-
-
-
- ADDCMD MACRO
- cmdnum set cmdnum+1
- dc.b \1,0
- ENDM
- .
- .
- .
- ;Here it's using `cmdnum' although
- ;the symbol wasn't defined yet
- addq #1,d2
- cmp.w #cmdnum,d2
- bne.s 1$
- .
- .
- .
-
- ;Here the cmdnum is first defined
- cmdnum set 0
- commds ADDCMD 'time'
- ADDCMD 'taskpri'
- ADDCMD 'info'
- ADDCMD 'pri'
- ADDCMD 'flush'
-
- Because the A68k is a 2-Pass Assembler he can assemble this Source
- without problems.
-
-
- Another Problem is that the assembler argument parser doesn't
- detect Overflow because of speed reasons. I don't think it's worth
- it...if you differ tell me your opinion.
-
-
- The assembler doesn't support the following motorola syntax bugs
- because of the internal structure of the parser it would cause
- major problems in the multi-pass mode.
-
-
- symbol: equ 0
- symbol: equr d0
-
- C-Compiler Assembler
- --------------------
-
- Dice
- ....
-
- If you use Basm as a `DASM' replacement you have to run `Basm' with
- the option -OAS to activate the Smalldata mode. If you want to emulate
- the advanced `Link', `UnLink', `Movem' optimizing `DASM' supports you
- have to use the options -O, -OG, -ODh, -ODi and -ODj. The option -OG
- is needed because the link stackframe register list symbols are defined
- after the commands so the assembler doesn't know them in 1 pass mode.
- Sorry...i had to disable this mode because i later detected that i have
- to keep track of the used registers. I'll try to fix this in a later
- version
-
- Literature
- **********
-
- * [Addison Wesley] RKM Libraries 2.04,CATS
-
- * [Addison Wesley] RKM Devices 2.04,CATS
-
- * [Addison Wesley] RKM Autodocs\&Includes 2.04,CATS
-
- * [Addison Wesley] RKM Hardware 2.04,CATS
-
- * [Addison Wesley] RKM Styleguide,CATS
-
- * [Addison Wesley] RKM Libraries 1.1,CATS
-
- * [Addison Wesley] RKM Intuition 1.1,CATS
-
- * [Addison Wesley] RKM Exec 1.1,CATS
-
- * [Addison Wesley] RKM Hardware 1.1,CATS
-
- * [Edotronik] Kommentiertes Rom-Listing 1,Dr. Ruprecht
-
- * [Edotronik] Kommentiertes Rom-Listing 2,Dr. Ruprecht
-
- * [Edotronik] Kommentiertes Rom-Listing 3,Dr. Ruprecht
-
- * [Ralph Babel] Guru Book,Selbstvertrieb
-
- Software
- ********
-
- For the development of Barfly the following programs were used:
-
- * [CATS] Developer CD V2.0
-
- * [B.Hawes] WShell V2.0
-
- * [M.Sinz] Enforcer
-
- * [R.Schmidt] CyberGuard
-
- * [C.Scheppner] Mungwall
-
- * [SAS Institute] SAS/C
-
- * [GNU] GCC
-
- * [ASDG] CED
-
- * [Georg Hessmann] PasTex
-
- * [Stefan Stuntz] MFR 2.0d
-
- * [Mathias Scheler] Filer
-
- * [Matthew Dillon] DNet
-
- * [Brian Cerveny] Grapevine
-
- * [Ezy] MLink
-
- Assembler Addressmodes
- **********************
-
- +--------------+------------------------+
- | Notation | Description |
- +--------------+------------------------+
- +--------------+------------------------+
- | EA | Effective Address |
- | Dn | D0...D7 |
- | An | A0...A7 |
- | Xn | D0...D7, A0...A7 |
- | .b | Operand Width 8Bit |
- | .w | Operand Width 16Bit |
- | .l | Operand Width 32Bit |
- | size | w,l |
- | Size | b,w,l |
- | Scale | 1,2,4 or 8 |
- | Xn.size*Scale| 68000-10 only Scale 1. |
- +---------------------------------------+
-
- `Data register direct'
- Syntax: Dn
-
- `Address register direct'
- Syntax: An
-
- `Address register indirect'
- Syntax: (An)
-
- `Address register indirect with postincrement'
- Syntax: (An)+
-
- `Address register indirect with predecrement'
- Syntax: -(An)
-
- `Address register indirect with offset'
- Syntax: bd.w(An)
-
- `Address register indirect with index and offset'
- Syntax: bd.b(An,Xn{.Size*Scale})
-
- `Address register indirect with index and offset'
- Syntax: (bd,An,Xn{.Size*Scale})
-
- `Address register indirect with index and offset'
- Syntax: (bd.b,An,Xn{.Size*Scale})
-
- `Address register indirect with index and base displacement'
- Syntax: ({bd.size{,An{,Xn{.Size{*Scale}}}}})
-
- `Indirect Memory Addressierung mit postindex'
- Syntax: ({[{bd.size{,An}}]}{Xn{.Size{*Scale}{,od.size}}})
-
- `Indirect Memory Addressierung mit preindex'
- Syntax: ({[{bd.size{,An}}{,Xn{.Size{*Scale}]}{,od.size}}})
-
- `PC Indirect'
- Syntax: (PC)
-
- `PC Indirect with offset'
- Syntax: bd.w(PC)
-
- `PC Indirect with index and offset'
- Syntax: bd.b(PC,Xn{.Size*Scale})
-
- `PC Indirect with index and offset'
- Syntax: bd.b(ZPC,Xn{.Size*Scale})
-
- `PC Indirect with index and base displacement'
- Syntax: ({bd.size{,PC{,Xn{.Size{*Scale}}}}})
-
- `PC Indirect with index and base displacement'
- Syntax: ({bd.size{,ZPC{,Xn{.Size{*Scale}}}}})
-
- `PC Indirect memory Addressing with post-index'
- Syntax: ({[{bd.size{,PC}}]}{,Xn{.Size{*Scale}{,od.size}}})
-
- `PC Indirect memory Addressing with post-index'
- Syntax: ({[{bd.size{,ZPC}}]}{,Xn{.Size{*Scale}{,od.size}}})
-
- `PC Indirect memory Addressing with pre-index'
- Syntax: ({[{bd.size{,PC}}{,Xn{.Size{*Scale}]}{,od.size}}})
-
- `PC Indirect memory addressing with pre-index'
- Syntax: ({[{bd.size{,ZPC}}{,Xn{.Size{*Scale}]}{,od.size}}})
-
- `Absolut short'
- Syntax: bd.w
-
- `Absolut long'
- Syntax: bd[.l]
-
- `Immediate Data'
- Syntax: #xxx
-
- Addressmode Examples
- ====================
-
- To avoid some problems here are some small examples how addressmode
- have to build up.
-
-
- x=$40
- y=$400
- move.b (x,A0,D2.W),D0
- move.b x(A0,D2.W),D0
-
- ;Both lines are correct
- ;(x,a0,d2.w) is optimized internal to (x,a0,d2.w).
- ;For more information please check the chapter about
- ;Optimizing Direct Addressmodes.
-
- move.b (y,A0,D2.W),D0
- move.b y(A0,D2.W),D0
-
- ;Now you get 2 errors, because y is not an 8bit word.
- ;These 2 lines shows the correct version.
-
- move.b (y.w,A0,D2.W),D0
- move.b (y.w,A0,D2.W),D0
-
- ;or
-
- move.b (y.l,A0,D2.W),D0
- move.b (y.l,A0,D2.W),D0
-
- 680xx Opcode Overview
- *********************
-
- +----------+---------+-------------------------------------------+
- | Opcode | Size | 68000 68010 68020 68030 68040 68060 6888x |
- +----------+---------+-------------------------------------------+
- +----------+---------+-------------------------------------------+
- | abcd | b | x x x x x x |
- | add | b,w,l | x x x x x x |
- | addq | b,w,l | x x x x x x |
- | adda | w,l | x x x x x x |
- | addi | b,w,l | x x x x x x |
- | addx | b,w,l | x x x x x x |
- | and | b,w,l | x x x x x x |
- | andi | b,w,l | x x x x x x |
- | asr | b,w,l | x x x x x x |
- | asl | b,w,l | x x x x x x |
- | bcc | b,w,l | x x x x x x |
- | bchg | b,l | x x x x x x |
- | bclr | b,l | x x x x x x |
- | bfchg | unsized | x x x x |
- | bfclr | unsized | x x x x |
- | bfext | unsized | x x x x |
- | bfffo | unsized | x x x x |
- | bfins | unsized | x x x x |
- | bfset | unsized | x x x x |
- | bftst | unsized | x x x x |
- | bkpt | unsized | x x x x x |
- | bset | b,l | x x x x x x |
- | btst | b,l | x x x x x x |
- | callm | unsized | x |
- | cas | b,w,l | x x x x x x,2 |
- | cas2 | b,w,l | x x x x x x,2 |
- | chk | b,w,l | x x x x x x |
- | chk2 | b,w,l | x x x 2 |
- | cinv¹ | unsized | x x |
- | clr | b,w,l | x x x x x x |
- | cmp | b,w,l | x x x x x x |
- | cmpa | w,l | x x x x x x |
- | cmpi | b,w,l | x x x x x x |
- | cmpm | b,w,l | x x x x x x |
- | cmp2 | b,w,l | x x x 2 |
- | cpush¹ | unsized | x x |
- | dbcc | w | x x x x x x |
- | divs | w,l | x x x x x x,2 |
- | divsl | l | x x x x |
- | divu | w,l | x x x x x x,2 |
- | divul | l | x x x x |
- | eor | b,w,l | x x x x x x |
- | eori | b,w,l | x x x x x x |
- | eori/ccr | b | x x x x x x |
- | eori/sr¹ | w | x x x x x x |
- | exg | l | x x x x x x |
- | ext | w,l | x x x x x x |
- | extb | l | x x x x |
- | fabs | | x x x |
- | fsabs | | x x |
- | fdabs | | x x |
- | facos | | 2 2 x |
- | fadd | | x x x |
- | fsadd | | x x |
- | fdadd | | x x |
- | fasin | | 2 2 x |
- | fatan | | 2 2 x |
- | fatanh | | 2 2 x |
- | fbcc | | x x x |
- | fcmp | | x x x |
- | fcos | | 2 2 x |
- | fcosh | | 2 2 x |
- | fdbcc | | x 2 x |
- | fdiv | | x x x |
- | fsdiv | | x x |
- | fddiv | | x x |
- | fetox | | 2 2 x |
- | fetoxm1 | | 2 2 x |
- | fgetexp | | 2 2 x |
- | fgetman | | 2 2 x |
- | fint | | 2 x x |
- | fintrz | | 2 x x |
- | flogn | | 2 2 x |
- | flognp1 | | 2 2 x |
- | flog2 | | 2 2 x |
- | flog10 | | 2 2 x |
- | fmod | | 2 2 x |
- | fmove | | x x x |
- | fsmove | | x x |
- | fdmove | | x x |
- | fmovecr | | 2 2 x |
- | fmovem | | x x,2 x |
- | fmul | | x x x |
- | fsmul | | x x |
- | fdmul | | x x |
- | fneg | | x x x |
- | fsneg | | x x |
- | fdneg | | x x |
- | fnop | | x x x |
- | frem | | 2 2 x |
- | frestore¹| | x x x |
- | fscc | | 2 2 x |
- | fsub | | x x x |
- | fssub | | x x |
- | fdsub | | x x |
- | fsave¹ | | x x x |
- | fscale | | 2 2 x |
- | fsglmul | | 2 2 x |
- | fsgldiv | | 2 2 x |
- | fsin | | 2 2 x |
- | fsinh | | 2 2 x |
- | fsincos | | 2 2 x |
- | fsqrt | | x x x |
- | fssqrt | | x x |
- | fdsqrt | | x x |
- | ftan | | 2 2 x |
- | ftanh | | 2 2 x |
- | ftentox | | 2 2 x |
- | ftrap | | x 2 x |
- | ftst | | x x x |
- | ftwotox | | 2 2 x |
- | illegal | unsized | x x x x x x |
- | jmp | unsized | x x x x x x |
- | jsr | unsized | x x x x x x |
- | lea | l | x x x x x x |
- | link | w,l | x x x x x x |
- | lpstop | | x |
- | lsl | b,w,l | x x x x x x |
- | lsr | b,w,l | x x x x x x |
- | move | b,w,l | x x x x x x |
- | movea | w,l | x x x x x x |
- | moveq | l | x x x x x x |
- | movec¹ | l | x x x x x |
- | movem | w,l | x x x x x x |
- | movep | w,l | x x x x x |
- | moves¹ | b,w,l | x x x x x |
- | move16 | | x x |
- | muls | w,l | x x x x x x |
- | mulu | w,l | x x x x x x |
- | nbcd | b | x x x x x x |
- | neg | b,w,l | x x x x x x |
- | negx | b,w,l | x x x x x x |
- | nop | unsized | x x x x x x |
- | not | b,w,l | x x x x x x |
- | or | b,w,l | x x x x x x |
- | ori | b,w,l | x x x x x x |
- | pack | unsized | x x x x |
- | pea | l | x x x x x x |
- | pflush¹ | unsized | x x x |
- | pflusha¹ | unsized | x |
- | plpa¹ | unsized | x |
- | pload¹ | unsized | x |
- | pmove¹ | w,l,q | x |
- | ptest¹ | unsized | x x |
- | reset¹ | unsized | x x x x x x |
- | rol | b,w,l | x x x x x x |
- | ror | b,w,l | x x x x x x |
- | roxl | b,w,l | x x x x x x |
- | roxr | b,w,l | x x x x x x |
- | rtd | unsized | x x x x x |
- | rte¹ | unsized | x x x x x x |
- | rtr | unsized | x x x x x x |
- | rts | unsized | x x x x x x |
- | rtm | unsized | x |
- | sbcd | b | x x x x x x |
- | scc | b | x x x x x x |
- | stop¹ | unsized | x x x x x x |
- | sub | b,w,l | x x x x x x |
- | subq | b,w,l | x x x x x x |
- | suba | w,l | x x x x x x |
- | subi | b,w,l | x x x x x x |
- | subx | b,w,l | x x x x x x |
- | swap | w | x x x x x x |
- | tas | b | x x x x x x |
- | trap | unsized | x x x x x x |
- | trapcc | ? ,w,l | x x x x |
- | trapv | unsized | x x x x x x |
- | tst | b,w,l | x x x x x x |
- | unlk | unsized | x x x x x x |
- | unpk | unsized | x x x x |
- +----------+---------+-------------------------------------------+
-
- ¹ Supervisor instruction
- 2 These are software-supported instructions on the 68040 and 68060
-
-