***********************************************************************
***********************************************************************

		    (Part II of Hacking Doc)

                        MONAM2 HELP FILE
      This is a copy of a monam2 help file I wrote ages ago

***********************************************************************
***********************************************************************

                        Devpac  2

Devpac 2 is the best Monitor program I have ever used. It has some very
nice break points that you can place conditions on. You can do nice things
like tell the monitor to trace the program for 10000 instructions and then
jump back to the monitor. Ok in the list below the Am = the right Amiga
button.

Window Commands
TAB     Mo
ve to the next window
Am A    Set address
            sets the starting address of a memory or disassembly window
Am B    Set Breakpoint
            Sets various break point (see later)
Am E    Edit Window
            On the memory window this lets you edit memory. You can
            edit in hex (delfault) or press the TAB key and jump to
            the Ascii part of the window and edit in Ascii
Am L    Lock Window
            With this command you can lock the disassembly window or
            memory win
dow to a particular register. The disassembly
            window is lock by default to the PC. You can lock the
            disassembly window and the memory window together by
            locking the memory window to M2. (M2 is a memory registor
            see later)
Am O    Show Other
            This does convertions and mathmatcis for you. It prompts
            for a number but you can use symbols from your program
            as well as complex maths
Am P    Printer Dump
            Dumps the current
 window to the printer, it can be aborted
            by pressing ESC
Am R    Register Set
            Alter a register. You can just feed in a number or define it
            by a maths equation ex  A3=A2+4 or you can even use the
            symbols from the A3=A2+START
Am S    Split Windows
            Splits window 2 into window 2 and window 4 or window 3 into
            window 3 and window 4
Am T    Change Type
            This only works on window 4 (created either by splitting
            window 2 o
r by loading a source file). It changes the type
            of the window between disassembly, memory and source-code
            (if a file has been loaded).
Am Z    Zoom Window
            Zooms the current window to full size or back again. Zooming
            the register window shows the values of M0-M9 (Devpac internal
            memory registers... see later)

SCREEN SWITCHING

Monam uses its own screen display and will always make itself the front
and active window whenever an exception (including
 breakpoint) occurs

V       View other Screen

BREAKPOINTS

Am B    Set Breakpoint
            With this command you can set a variaty of kinds of break
            points. After pressing B just enter one of the following

            address
               will set a simple break point

            address,expression
               will set a stop breakpoint at the given address,after
               it has executed expression times

            address,=
               will set a count breakpoint. The ini
tial value of the
               count will be zero

            address,*
               will set a permanent breakpoint

            address,? expression
               will set a conditional breakpoint, using the given
expression
               such as the value of a registor etc

            address,-
               will clear any breakpoint at the given address

You can't set a break point in ROM

Help    Show Help and Breakpoints
            This displays the current breakpoints, task status, its
    
        seqment list (showing where your program is), free memory
            and the system memory list. Am commands are available within
            this display

Ctrl B  Set Breakpoints
            Sets a breakpoint at the start address of the disassembly
            window (you have to be in it). If there is one already there
            it will clear it

U       Go Until
            Prompts for an address at which a simple breakpoint will be
            placed then program execution resumed

Ctrl K  Ki
ll Breakpoints
            Clears all break points

Ctrl A  Set Breakpoint then Execute
            A real great command. It places a simple breakpoint at the
            instruction after the Program counter and then runs the
            program. This is really great for single stepping through
            conditional loops, you just single step down to the command
            that does the test and loop and press Ctrl A and it places a
            breakpoint after the loop and then runs program (goes arou
nd
            the loop until it falls through on to your break point). The
            only thing to watch is the program exiting at another point
            and never getting to your break point

 Ctrl X Stop program executing
            Stops your task running. It does this by setting the trace bit
            so you will get a trace exception. While this does work, be
            careful if you stop it in the middle of some AmigaDOS ROM
            routines, particularly signal handling and message pa
ssing


 OTHER STUFF

 Monam has a history buffer showing the condition of the registors and
 program counter.

 H      Show History buffer
            Shows the history buffer (for the last 5 instructions)

Ctrl C  Terminate
            Leave Monam

Ctrl Q  Quit a program
            Stops a program running. This can be hazardous to use, and
            should only be done as a last resort. If your program is
            terminated in this way it will not clean up, and thus not
            de-allocate any 
memory it was using or close windows etc

Ctrl L  Loading Executable Program
            This will prompt for a filename and then a command line
            and will attempt to load the file ready for execution.
            If MonAm has already loaded a program it is not possible to
            load another until the former has terminated

B       Load Binary File
            Prompts you for a file name and optional load address
(separated
            by a commma) and will then load the file where specified
. If
            no load address is given then memory will be allocated from the
            system. M0 will be set to the start address and M1 to the end
            address (see below for a discription of the M registers)
 A      Load Ascii file
            A great command that allows you to load a ascii file (such as
the
            sorce coad) into window four of Monam, if window 4 isn't
already
            open then it will open it automaticly

 EXECUTING PROGRAMS

 Ctrl R Return to program/Run
       
     Runs the current program from the PC position at full spead the
            history buffer will not be updated while running.

Ctrl Z  Single-Step
            This single-steps the instruction at the PC with the current
            register values. Single-stepping a trap, Line-A or Line-F
opcode
            will, by default, be treated as a single instruction. This can
be
            charged using Prefrences (Ctrl P)

Ctrl Y  Single-Step
            as above but included for the convenience of German u
sers

Ctrl T  Interpret an Instruction (Trace)
            A great command. It is the same as Ctrl Z but skips over BSR's,
            JSR's, Traps, Line-A and Line-F calls, re-entering the debugger
            on return from them to save stepping all the way through the
            routine or trap. It works on instructions in ROM and RAM

Ctrl S  Skip and Instruction
            Ctrl S increments the PC register by the size of the current
            instruction thus causing it to be skipped. Use this inst
ead
            of Ctrl Z when you know this instruction is going to do
something
            you dont want

R       Run (various)
            Prompts for the style of run you want just press it and you
will
            be prompted for

                G   Go
                Identicial to Ctrl R just runs the program at full speed

                I   Instruction
                This is a great command that executes the entered number of
                enstructions remembering the infomation in the history

buffer
                and then returning to Monam. Traps are executed as single
                insturctions

SEARCHING MEMORY
G       Search memory (get a sequence)
        Will prompt for B/W/L/T standing for Bytes, Words, Longs, Text and
        Instructions (Intructions and Texzt are case sensitive). The SP is
        not called SP in the searches it is called A7

N       Find Next
        Having found one with the G command (see above) you can find
another
        occurence of it by pressing N

OTHER
 STUFF

Ctrl P  Preferences
        Alows you to alter various options in Monam by answering Y/N to the
        questions

I       Intellegent Copy
            Copies a block of memory to another area. The addresses should
            be entered in the form

            START,INCLUSIVE_END,DESTINATION

            No checks are made on the validity of the move. It will let you
            quite happily crash the system

L       List Lables
            Lists all the lables in the program. Lables are displaye
d in
            the order they where found on the disk

W       Fill Memory With
            START,INCLUSIVE_END,FILLBYTE

P       Disassemble to Printer/Disk
            Disassembles Area of memory to printer or disk with lables
            the first lines should be entered in the form

            START_ADDRESS,END_ADDRESS

            The next line prompts for an Area of memory to use to build
            the cross-reference list, which should be left blank if no
            automatic labels are require
d else should be of the form

            BUFFER_START,BUFFER_END

            Next is the prompt for data areas which will be disassembled as
            DC instructions, of the form

            DATA_START,DATA_END,SIZE

            The optional size field shoudl be B, W, L, defaulting to L,
            determining the size of the data. When all data areas have
            been defined, a blank line should be entered

            Finally a filename prompt will appear, if this is blank all
            outp
ut will be to the printer, else it will be assumed to be a
            disk file
        **** Special Note **** I will be stuffed if I can get this to
            work... I can get it to just disassemble the code but I can't
            get it to put in lables. (it worked on the ST what happend
            guy's). We hope for a fix in an upgrade.


M       Modify Address
            Same as Am A

O       Show Other Bases
            Same as Am O

D       Change Drive and Directory
            Change current
 Drive and Directory

THE M REGISTERS (In the bits above where I said see later well here it is)

The Devpac manual is shy and doesn't blow it's own horn enough about some
of
it's features. The M registers are one of the things, Devpac has internal
registors numberred M0-M9 some of them are used by the program such as
M2 and M3 which control the start of the disembly window and the start of
the
Memory window. You can alter the value of the M registers and the windows
will reflect the change. You can use som
e of the registers for your own use
such as setting M7 to a memory address you want to look back at latter and
the go away and look at another memory address then when you want to go
back
you just go

M .... for Modify memory
       and
M7

and you will jump back to the address you stored just by going MM7

when you load a binary file M0 and M1 are set to the start and end of
file you loaded. This makes it really easy to load a binary file change
a character and save it back again. You don't even have to en
ter in the
start and end addresses when you save it you just use M0 and M1 in the
save statement

M2, M3, M4 and M5 are the start addresses of windows 2,3,4,5

Another thing Devpac doesn't make to much about it the use of symbols
in your statements such as alterring a register

A5=A2+A3+START_PRG - SUM_OTHER_NUMBER

So why work it out let Devpac do it for you

Fuck that took me a long time to type in and I dearsay there are
heeps of spelling mistacks in it so if you find one all you have to
do is write it o
n a piece of paper and flush it down the loo. Or correct
the file and reload it up to the board.

            Bye Fun_to_hack



***********************************************************************
***********************************************************************

                             MONAM2 METHODS
This is a copy of a file I wrote ages ago showing you how to get the
                          most out of monam

***********************************************************************
********
***************************************************************

HANDY THINGS TO KNOW ABOUT DEVPAC'S MONAM
I really like using Devpac's machine code monitor (called Monam or Monam2
from here on). Most people don't really use it to it's potential because
the manual dosn't emphasize some of the better features so I thought I
would write about some of the handy features and methods of using them that
I have found helpful in debugging programs. Everything I mention here is in
the manual but some it is in very o
bscure places or just mentioned in
passing. This is not an Help file of the commands but a help file showing
better ways to use the commands. For a list of the commands see the file
Monam2_help.txt

Monam2 will debug programs and tell you what the machine code calls are as
it comes to them so instead of looking at code that says JSR -$1E(A6) when
you are single stepping the program you will see JSR Open. This is great
and stops you looking up endless calls in the manual. The way to get it to
do it is to put
 the file Libfile.Monam into the libs directory on your
systems disk. You will find the file in the Libs directory on the original
distribution disk. Monam2 will debug programs that have been saved with the
labels in them and display them in the program when you are single stepping
it. Ok that is obvious but what isn't so obvious is you can use the labels
yourself. This is great if you are like me and hate keying in 6 didget Hex
numbers all the time. When ever you have to  key in a hex address you can
just
 type in the label instead. You can set the program counter to point to
a label just by using the Set register command (Right_Amiga_Key R PC=label)
that goes for setting the address of the current window as well (M label)
you can even use the names of the Registers to save you key in the values
in them. For example if A0=$123456 and you think it is pointing to a file
name and want to see what it is you can set the Data window to it by making
it the current window and going M A0 this will set the current win
dow to
the value in AO you can do this for all the Registers A0-A7, D0-D7, PC. All
these labels and short cuts really come into there own when you are doing a
calculation you can use the O command (Other) for doing calculations you
can do things like O A0+D0 and it will work out what the values in A0 plus
D0 equal. You can use all the Registers A0-A7, D0-D7 the PC and even use
the SR register (you can do it with the SR reg I didn't say you could do
anything useful with it). You can even use the operators {}
 for the number
at an address instead of the address itself for example if A0 is pointing
at number $12345678 you can go M {A0} and it will set the current window to
address $12345678 this could be useful for looking up a table. If you want
to actually do something with the address A0 or the number A0 then all you
have to do is put a $ in front of it. Apart from using labels and Registers
as short cuts Monam2 has some built in reserve words they are CODE which is
set to the start address of any program you 
load up and HUNK1 HUNK2 etc
which are set to the start of the Hunks. CODE is very handy for when you
are single steeping and want to nip back to the start to see what where you
started. Hunk can be handy for jumping around the code. There is no end off
HUNK or ENDOFCODE reserved words. The flexibly of the maths bits of Monam2
is extreamly good and you will find you can use it from any part of the
program so when ever you want to go to an address or set a register to a
value you have to work out you don't ha
ve to work it out and then set the
register or tell Monam2 to go to that address just include the equation in
the command to tell monam to go to the address or set the register to the
value. With out a doubt my feature of Monam2 is it's Memories there are 10
memories M0 to M9. M0, M1, M2 and M3 are used by Monam itself. M2 is set to
the top of the disassembly window and M3 is set to the top of the Hex
window when ever you move these windows then the values change to the top
of it's window. We can use these 
for our own use. If you are in the
Disassembly window and come across a bit of code that looks a bit funny and
could be data so you nip over to the Data window and want to set it to the
same address as the disassemble window. Just go to the Data window (M3) and
press MM2 then hit RETURN (M for memory and M2 for the address of M2 which
is the disassemble window). Although this involves four keystrokes which is
in most cases only going to be a few less than going M and the address you
want to go anyway since 
two of them are the same and the other one is
Return and you don't have to hunt and peck around the keyboard to type in a
hex number you get a great increase in speed and you are much more sure of
getting it right than keying in the number. You actually have two more
windows than are not obvious, if you go to the disassembly window and press
Right Amiga button and S at the same time then you split the window into
two windows both which are disassemble windows you can jump over to the
Data window and split i
t in two the same way and you can jump around them
with the TAB key just as you can do with the two normal windows and you can
Zoom each of the windows with Amiga Z. I will talk more about windows and
the M variables in the Section on Tracing techniques and Stuff. You can
also lock a window to an window to a Memory variable or a register. By
default the disassembly window is locked to the PC but you can lock any of
the windows to any register or Memory value. To lock the Data window to A0
you just move to t
he Data window and press the right Amiga key and L
simultaneously and then then type A0 and press return and from then on the
Data window will always be set to the value of A0 and if it should change
then the top of the window will change. You can also lock windows together
for example to lock M3 to M2 you go to the Data window (M3) and go Amiga L
M2 return and everytime the the disassembly window changes the Data window
will change to match. To unlock a window you just lock it to it's Memory
value example 
move to the disassembly window and go Right Amiga L M2 and
the window will not change when PC goes off the screen. The values M0 and
M1 are automatically set to the start and end of a file that is loaded in
with the binary function (B) this is very handy when you want to save a
file back again you just use M0 for the start and M1 as the end.

The values of M are set to
M0   Start of the last binary file loaded
M1   The end of the Last binary file loaded
M2   The start of the Disassembly window
M3   The sta
rt of the Data window
M4   The start of the second disassembly window if it exists otherwise free
M5   The start of the second Data window if it exists otherwise free
M6   A free variable to be used by you
M7   A free variable to be used by you
M8   A free variable to be used by you
M9   A free variable to be used by you

To get a list of all the M variables as well as the usual A0-A7, D0-D7, PC
and SR just keep pressing TAB key until you get to the register window and
press Right Amiga key and Z (for Zoom)
 and you get a dump of all the
Registers. While you are in the Zoom mode you can't use the O command for
preforming calculations but you can use right Amiga O to do the same thing.
The O without an Amiga key is supposed to be there only to be compatible
with Monam 1 but I don't know anyone who uses the Amiga O version so you
tend to think Monam2 wont let you do calculations but it will, this is very
handy because so often the thing you want to calculate on is something you
have seen in Zoom mode the same go
es for the screen that displays the hunks
and break points (got to by pressing Help). You can also set Registers in
Zoom mode and in the help key screen just go Right Amiga R and set the
register as per normal. You can get a dump of the current window you are in
by going Right Amiga P this also works in Zoom mode giving you a bigger
dump. The disassemble to printer or drive option of monam2 (version 2.0)
has a floor in it... it won't put labels in even though it ask you for an
area to store the labels in. T
he only way to fix this is to get a latter
version of Monam there is a version of Monam2.05 that has been converted
from German to English (thanks Sigfried) have a look on the disk you got
this with if it is there it will be called Monam2.05 (my name not anyone
elses). The only problem we have found with this version is it wont save
Preferences (hopefully we will fix this). I found the easiest way around
this is to save the preferences from an earlier version of Monam2 (real men
change the file by hand).

T
racing techniques and stuff
When you are single stepping a program and stop half way through and go
into Zoom mode you are able to jump up and down the program and have a good
look around then when you press Escape to go back you where you where when
you went into Zoom mode this is great if you wanted to go back to there but
if you have just found something interesting and would rather have that at
the top of the window when you got back to the normal screen this is an
absolute pain. The way around this is 
to set the window Memory variable
from Zoom mode if you are in the Disassembly window and you go into Zoom
mode then advance four or five pages all you have to do is go Amiga R
M2=address to set the memory variable M2 (top of disassembly window) to the
address that you want to be at and when you press escape the top of the
window will be the address you put into the register M2. When you are
tracing a program and you come to something of interest you can flag it by
setting a memory value to the PC (Amiga R 
M3=PC) and if you find another
thing then set M4=Pc and M5 etc up to M9 then if you want to come back you
just go MM3 (Memory M3) and later MM4 etc. I use this quite alot to keep
track of the flow of a program that I am tracing if you get to a suspicious
part that calls a subroutine and you set M3=PC if that subroutine calls
another one you can set M4=PC etc. You can then conveniently jump around
the bits of the program without having to write a single address down. A
thing I use this for alot is working ba
ckwards. You find a bit of code in
the program that look of interest and you Set M9=Address then trace the
program using the Instruction search and when if you find the call to it
you set M8=address then search again for a call to that address and set M7
to it's address. With all these memory variables set to different parts of
the program you can then go MM6 or MM7 or MM8 to jump around the different
parts of the program of course this is very limited in the amount of code
you can do this with and there i
s a good chance that you wont be able to
find the address call you are searching for but anytime you find you are
about to write a Memory address down set a Memory variable to equal it
instead. I find moving the address to the top of the window and using the
Memory variable for that window to define the new variable the best way to
do it.. for example want to set M5 to an address in M2 you just keep
pressing the down arrow until the address lines up with the top of its
window and go Right Amiga R M5=M2. Thi
s sounds very involved but you will
find your self doing it very quickly after a few times and it doesn't
involve keying in a number which is the thing that really slows you down
and is most likely to be got wrong. Saving and loading a binary file can be
very handy for changing a program you don't have the source code for
(Hacking who me?). If you load an executable program with the binary load
function (B) it loads the whole program including the program header and
file relocation table. The program looks 
just as it would on the disk not
as it would look in memory if you had loaded it as an executable file
(Control L) because when a program is loaded by the operating system it is
relocated to run at that place in memory. If you load a program with the B
option you can save it with the S option and it will still run in the usual
fashion the trick is to save it with a correct start and end. If you were
to try and find out the start and end by looking in memory you would
without a doubt fail but since the varia
ble M0 and M1 are assigned to the
start and end of the binary file loaded all you have to do is to save it
using M0 for the start and M1 as the end. After you have loaded a program
you can then alter bits of it. But you have to be careful what you are
doing, you can't alter anything that has absolute address because this will
be altered by the relocation table when it is loaded but you can alter
things that are PC relative or change commands into Nop's or change a
conditional branch to another condition suc
h as make a BNE to BRA just by
changing one byte. I can not over emphasize the need to make sure you are
not changing something that will be altered by the relocation table when
the program is loaded. When you are looking at a program you have loaded as
a program (the normal way with Control L or when starting monam) have a
look the data window and see if the address that a call is talking about is
there in hex if it is then it was put there by the relocation table and is
to be left alone. The other thing t
o watch out for is making sure you don't
save the program down on top of something else on the disk. Normally the
file system makes sure you don't do that but if it is a protected disk then
they may be loading sectors directly from the disk and not have allocated
them as already used and the operating system will think there fair game
and save your file down over some other code on the disk. The way to be
sure this dosn't happen is to use Newzap or one of the other excellent file
zapers available on the ami
ga and change it directly on the disk. Loading
the file up as binary is still handy in this case as it will show you
exactly what the code looks like on the disk so you will have lots to code
surrounding the code you want to change to confirm you are in fact changing
the right bit of code.

UPDATE ON MONAM2_METHODS

SNAP & OSNAP
There are two programs that I have started using in conjunction with Monam2
and I dont know what I would do without them. They are both the same kind
of program. I started using sna
p and have now retired it in favour of OSNAP
but if you cant get OSNAP then snap will do fine. The programs allows you
to click on some text anywhere on the screen and copy it into a buffer and
then paste it somewhere else as if you had keyed it in by hand. The
programs have many uses including using them from inside a modem package to
quote other messages back at people. But from monam I use it for enterring
in hex numbers for me. You will have noticed I have a reel hatrid with hex
numbers and will do anyt
hing to get away from keying them in includeing
using the memories as much as posible to store them. With both SNAP and
OSNAP you can do things like see a BSR $12345 instruction and move the
mouse pointer to the line hold down the Amiga key and drag the pointer
accross the number and copy it into a buffer then you just go M (for change
window address) and press Amiga I to insert it into the line. You can grab
the numbers from anywhere. OSNAP is the same as snap with more features the
main feature I like is
 the fact it has a history buffer on the strings it
is grabing. I use this to follow the flow of a program. You come to a BSR
so you grab the whole line with the BSR instruction in it and then single
step to the address it is going to then the next time you get another BSR
you grab it again and you carry on doing this until you decide you went the
wrong way and then you just list the lines you have been grabing and to go
back one call you just change to the address at the start of the line.


            
                  FunToHack