SuperCPU rayed - Episode 6

 In the previous part of the course we have besides a few interesting new commands
 some new addressing modes met.  But here's the very same
 thick: We focus our attention on the stack relative addressing!  What
 should be and how to use them, you will learn now ...

 Short and brought almost to the point: The stack-relative and
 Stack relative indirect indexed (what a word) treat the stack
 as a field that is indicated.  As in Basic in a signal generated with DIM
 Field is now treated the stack!  The stack pointer will be as
 Taken starting address of the array.  The always points to the next-FREE
 Address on the stack, which is an index of zero would be pointless.  Data and
 Addresses that have been pushed onto the stack, thus can be from index 1
 appeal.  How do you want everything comes right - at the moment it is enough
 first, if you like it you imagine a field in Basic.  The stack-relative
 Addressing allows now to any byte is pushed onto the stack
 was to access.  But the hammer is the stack relative indirect
 Addressing: This is possible to access an address on the stack
 is!  In plain English: You slide with PHA for example, an address (16 bits)
 on the stack, and the contents of this address you can then about the
 Stack relative indirect addressing access - in other words, how to
 an address which is a pointer to the zero (direct) Page.  Both new
 Addressing modes allow parameters cleanly and efficiently over the
 Stack, to pass.  The developers of 65816 certainly thought also thinking of
 C compiler - the language used like many others the stack to
 Parameter transfer to subroutines.  But more importantly: this
 Addressing is possible to write code that runs everywhere in the memory and
 has access to data located anywhere in memory.


 These new addressing modes belong certainly to the
 most interesting of 65816, on the other hand you have to use their
 just superior to so that it is effective.  In any case you can by
 this type of addressing is now on any data onto the stack
 were pushed to access - and not, as usual, only on the
 last value stored there! 

 Let's go first to the stack-relative addressing (without
 indirectly-indexed) a.  It is so stacked in each of the last $ FF
 Bytes (it can at 65816 yes more than 255 bytes on the stack land, because
 the stack pointer 16-bit, as we have seen in a previous part of the course
 have).  Commands, the stack-relative addressing are two bytes long.  After
 the opcode is one byte, and is the index into the stack.  As I said
 the stack pointer is used as the basis for this "box".  The index is
 dazugezaehlt to the stack pointer, and the CPU already has the address within
 out of the stack is accessed.
 This can be especially useful when a part of a program data
 want to send it to another part.  Of course you can this data somewhere
 store, and the other routine she has to pick up from there.  The method
 over the stack but is somewhat flexible.  Suppose a
 Multiplication routine expects two 16 bit values.  Any part of the
 Main program pushes it on the stack.  Later then fetches the
 Multiplication routine a value from the stack, but it is possible the other
 Value as well as the stack pointer completely untouched:

 LDA 3, S;  Get first operand


 LDA 1, S;  Get second operand

 As you can see clearly, is on the last hyped value with the
 Index 1 to access, not about 0 The stack pointer points even as mentioned,
 always on the next free byte on the stack whose address exactly one
 is less than the most recently pushed onto the stack bytes.  An index of 0 would be
 So therefore pointless unless you want to access the last byte
 has already been brought to a pull-command!  However, this would be not just
 particularly stable, since between an interrupt may have occurred,
 who long ago wrote about the byte with its own values.

 Indirect access

 While the stack-relative addressing is there to directly access data on
 the stack access, you can take the stack relative indirect-indexed
 Addressing to access data that reside in ADDRESSES, which on
 the stack are!  (Please read that sentence again and digest thoroughly!)
 Let's take our example of just and amend it from something like this: Now we accept
 that not the numbers to be multiplied, but their addresses (ie
 where they were available) in memory on the stack pushed!  As the following routine
 shows both values ??can about the present on the stack address
 be loaded indirectly:

 LDY # 0
 LDA (1 S) Y;  first 16-bit fetch Multiplikationsoperand 
 TAX;  and remember in X
 LDY # 2
 LDA (1 S) Y;  second 16-bit fetch Multiplikationsoperand

 The 1, S gives the address of the last hyped value, ie the
 Pointer to the second multiplication value.  (More even: 1, S indicates
 the low byte of the address, the high byte is located at 2, S, ie on the
 next higher stack address.) is now attached to this indirect address the
 Y-register is added, the indirect address + 0 contains the first, the
 indirect address + 2 contains the second value.  And with the contents of this
 indirectly-indexed address the battery is charged.  Well, it is - and
 hears like getting more complicated than it is.

 Known relative

 To clear the fog any thing: This type of addressing is
 As already briefly mentioned, related to the indirect familiar to us all
 Addressing over the Zero Page.  There is for example an address in $ FE / $ FF, on
 which you can then still using Y to access.  Nothing else going on here, just
 that the location of the pointer is not always in the same place (fixed address
 is in the zero page), but rather on the stack, seen as a field
 is that starting at the address of the stack pointer.  In both
 Addressing modes, an index is added to a pointer, and this must
 are both in the Y-register.

 That's not all

 In order to be able to also use these new addressing modes well implemented
 The developer of the processor in the SuperCPU some commands to specifically
 Push address on the stack.  These are the commands PEA, PEI and
 PER, which we, in the course section in which it came to various stack commands
 have already touched - perhaps a few have asked what
 these commands at all should.  Now it's time to shed light on the matter
 bring.  Incidentally, the only commands that data directly from one
 bring to a different memory location can, without any
 Register to use!

 The PEA is the easiest of the three new push commands.  The operand is
 a 16-bit value, which is an address, or a data value
 can act.  This is the command no matter he brings these 16 bits to each
 Case on the stack.  An example:

 PEA $ 2,134;  $ 2,134 pushes onto the stack

 This command transfers $ 2,134 on the stack, it may be the address
 Act $ 2134, but it may also be the value of $ 2134, it is the encoder
 about blank how he interpreted it.  If you want to work with values, but
 Note that there is no "#" character, as usual with constants used
 is!  The value that is put on the stack, by the way is always 16 bit,
 regardless of whether the M or X flag is now just 8 or 16 bits.

 Interestingly it is the PEI - which stands for Push effective indirect
 address.  The operand is an address in the Direct (Zero) Page.  The 16
 Bit value, which is at this address, will land on the stack.  Thus one can
 either push a pointer to the stack, or a 16-bit value in the
 Zero Page is.  Do we, for example, the value or the address $ 5678
 stored from $ FE / $ FF, then one would

 PEI ($ FE);  pushes two bytes are the from $ FE in the Direct Page

 Get the $ 5,678 from the Zero Page and put on the stack.  Just like PEA
 will also push PEI always a 16-bit value, regardless of whether the battery or
 Index registers are placed just 8 or 16 bits.

 Even more relative

 The PER command (push effective relative) pushes one to the Program Counter
 relative address on the stack.  This is incredibly useful when writing
 relokatierbarem code.  The operand, the one that tells the assembler is,
 any point in the program, for example, a data area.  The operand,
 the assembler generates is a 16-bit relative value: the difference
 between the address of the next instruction and the address as an operand
 is specified.  Is now carried out in the order, this value is added to the
 Address of the next instruction is added - this is done at runtime!
 This results in any case, the address at which the data are,
 no matter where the program is loading or where it is straight.  And
 exactly this address is pushed onto the stack, where you then take the
 Can access stack relative indirect-indexed addressing it.
 If the address before the PER command, the assembler generates a very
 large 16-bit number that when added to the Program Counter an overflow
 leads over $ FFFF and thus automatically return to the correct address
 executed.  The PER command works similarly to the BRL (Branch long), address,
 one of charge, which is also an address of somewhere in the program, the
 Assembler here forms a 16-bit value corresponding to the distance from this
 Address corresponds, and when the command is executed, the value is
 added to the program counter, which results in the address where the
 Program it continue.

 To understand how to calculate the PER command together with relative jumps,
 used, let's look a little routine (Listing 6.1) , which at ANY
 can run arbitrary address.  Suppose we assemble them into $ C000.
 Somewhere in there is then the address of the value DATA0.  The program aims to
 now have access to this value.  Sure, a simple LDA DATA0 would
 work - but only if the program really at $ C000
 lies.  However, if the routine is to be relokatierbar, you have it
 For example, even after $ 8000 can load.  Thus, the LDA would DATA0 a
 Get completely wrong information in the battery.  Instead, we now use
 a PER DATA 0.  The assembly calculates the distance between the command and
 the address of DATA0 from.  If the program is executed later, counts the
 65816 when it hits the PER command, the distance back to - and comes
 Thus, to the address of DATA 0, no matter where the program is loaded!
 This address is put on the stack.  Now you can with the stack-relative
 indirectly-indexed addressing to the value in DATA0 access.  And from that
 from it's off even further: If the address of DATA0 namely first on
 the stack is then carried hochzaehlen the Y register on DATA1
 DATA2 and DATA 3 you!  In Listing 6-2 you can see another example of how
 can be written with PER relocateable code, even here, only the
 Stack-relative addressing used.  Both routines can after
 Assemble everywhere in the memory run-a lot of fun even when

(w) Malte Mundt
©1999 Go64 Redax! & Count Zero/SCS*TRC for all HTML Stuff

[ Zum 5. Teil ][ Zum Index ][ Zum 7. Teil ]