home *** CD-ROM | disk | FTP | other *** search
/ ZZZ-UNK Drezyna / ZZZ_UNK_Drezyna_19xx.atr / n65816.txt < prev    next >
Text File  |  2023-02-26  |  8KB  |  1 lines

  1. Preface¢¢Fifteen years after the introduction of the Atari 8-bit computer,¢virtually the entire base of machines is still using the same CPU,¢and thus has the same basic processing power as when the machine was¢first shipped.  Not that we need to be like other platforms -- which¢seem to get CPU upgrades before you've had enough time to pay off¢the credit card bill on the last system -- but we have missed out on¢a great amount of satisfaction that comes when you find out that you¢can do tasks faster, easier, and better than before.  Or when you find¢that the machine is now capable of feats that it previously could not¢achieve.¢¢When I met the 65816 processor for the first time, I was immediately¢captivated by the range of enhancements that it provided.  It was a¢feeling surpassed only by the still cherished memory of my first¢successful Assembly language program.  Some of these enhancements are¢brilliant, and are implemented in very clever ways.  For the designers¢to have achieved this much, and yet remain completely compatible with¢the 6502 at the same time, is truly a work of art.  It is a processor¢that plain and simply _belongs_ inside the Atari computer; for the Atari¢is unquestionably in my mind the best 8-bit computer that has ever been¢created, or will ever be created.  It is itself a work of art, that more¢than anything else, is responsible for the attachment I have to computers,¢and to programming in particular.  There is no other machine more deserving,¢or more able to utilize the extra power of the 65816.  As an Atari enthusiast¢since 1979, it gives me great pleasure to be a part of this new upgrade for¢the machine.¢¢John Harris¢Ahwahnee, California¢¢¢Programming notes for the 65816.¢¢The 65816 is a wonderful improvement over the 6502, containing 78 new¢opcodes, 9 new addressing modes, block memory moves, 16-bit registers,¢relocatable stack and zero-page, and a 16 megabyte linear address space.¢This is intended to be an introduction to the many new features and¢techniques provided by the 65816 processor.¢ ¢- Native Mode -¢¢The 816 powers-up in a state known as "6502 emulation mode".  This is its¢default state, where it remains virtually 100% compatible with the 6502.¢Most of the 816's enhancements are still available in emulation mode,¢including 24-bit addressing, and the new opcodes and addressing modes.¢The primary missing ingredient is 16-bit registers.  These are not available¢until the processor is switched into a different state, known as¢"native mode".  This mode switching was necessary so that enhancements¢could be provided for the CPU, while still maintaining a way to provide¢complete 6502 compatibility.  As such, there are a number of operational¢differences when the 816 is in native mode, and these will be noted in the¢upcoming sections.¢¢Switching between native and emulation modes is accomplished with a new¢instruction, called XCE, for eXchange Carry and Emulation bits.  The¢emulation bit is like a shadow of the carry flag, and so to change modes,¢you set the carry for emulation mode, or clear the carry for native mode,¢and then do an XCE.  The previous state of the emulation flag will be in¢the carry after the exchange has been made.¢¢; Change to Native Mode¢CLC¢XCE¢¢; Change to Emulation Mode¢SEC¢XCE¢¢Running the 816 in native mode requires changes to the interrupt processing¢system in the OS.  A new OS is being worked on, but until this is available,¢the Atari will crash if you attempt to enter native mode without completely¢disabling interrupts.  You will find that there is still a considerable¢amount of power available even in emulation mode, and you still have the¢option of entering native mode with all interrupts disabled.¢¢The wait for an 816-aware version of the OS won't be too much longer, and¢in the meantime, you can create a macro which enters native mode and disables¢interrupts at the same time.  Later on, when the OS supports native mode¢with the interrupts still active, you can just remove the interrupt disable¢from the macro, and reassemble your code.  Here's an example of the native¢and emulation mode macros supplied with the MAE assembler as part of the¢MACROS include file.¢¢!!!NAT  .MD              ;Macro definition for NATive¢STZ $D40E¢SEI¢CLC¢XCE¢.ME¢¢!!!EMU  .MD              ;Macro definition for EMUlation¢SEC¢XCE¢LDA #$C0         ;Change this to #$40 if you aren't using DLIs¢STA $D40E¢CLI¢.ME¢¢- B accumulator -¢¢The 816 has a second "hidden" accumulator known as the B accumulator.¢Though there are no operations that work directly with it, there is an¢instruction called XBA to exchange the A and B accumulators.  Thus, B makes¢a great temporary holding spot.  The B accumulator is actually the upper¢8 bits of a 16-bit wide accumulator.  When A and B are used together as a¢16-bit register, it is referred to as the C accumulator.  The B accumulator¢and XBA instruction are accessible in emulation mode.  Only the 16-bit wide¢C accumulator requires the native mode before it can be accessed.  Later on,¢we will learn how to configure the CPU for 16-bit register use, but it can¢also be useful to load 16 bit values into both accumulators while still in¢8-bit register mode.  These three instructions perform this operation.¢¢LDA #>address    ;The high byte of the address is loaded first,¢XBA              ; then swapped into the upper accumulator,¢LDA #<address    ; and then the low byte is loaded.¢¢There are some instructions that work with the C accumulator, even when not¢in 16-bit register mode, so it helps to know how to set up 16-bit values in¢the 8-bit mode.  There are also conditions where the programmer might not¢want to be in 16-bit register mode, and the A+B accumulators can still make¢16-bit calculations easier.  For example, once a 16-bit value has been loaded¢as in the above routine, here are some sample operations.¢¢ASL              ;16-bit shift¢XBA¢ROL¢XBA¢¢CLC              ;16-bit add¢ADC #<value¢XBA¢ADC #>value¢XBA¢¢The A+B accumulator is also a great place for passing a 16-bit value to a¢subroutine.  ¢¢- Changing Register Sizes -¢¢Register size is controlled by two new bits in the native mode processor¢status register.  The new "M" bit controls the size of the accumulator and¢all memory accesses, and the "X" bit controls the size of the X and Y index¢registers.  The native mode status register looks like this:¢¢bit  7  6  5  4  3  2  1  0¢     N  V  M  X  D  I  Z  C¢   |  |¢   |   Index register size¢   |¢    Accumulator and memory size¢¢These bits are set to 1 when the register size is 8 bits.  To enable 16-bit¢registers, set the desired bit to 0.  It is possible to have one bit set to¢1, and the other bit set to 0.  When transferring between registers of¢unequal size, a general rule is that the size of the destination register¢controls the width of the data moved.  The following table will summarize¢this.¢¢      A=8-bit,X=16-bit                   A=16-bit,X=8-bit¢      ----------------                   ----------------¢TAX - Moves A and B into X               Moves 8-bit A into X¢¢TXA - Moves lower 8 bits of X into A.    Moves 8 bit X into A,¢      B remains unchanged.               and 0 into B.¢¢Two new instructions are provided for setting and resetting bits in the¢status register.  Use the instruction SEP to set processor status bits.¢The operand should be an immediate quantity, containing binary 1's for each¢of the bits you wish to set.  Consider this like an ORA instruction into the¢status register.  Use the instruction REP to reset or clear processor status¢bits.  The operand should be an immediate quantity, containing binary 1's¢for each of the bits you wish to clear.¢¢REP #$30    ;Set to all 16-bit registers¢REP #$20    ;Set 16-bit accumulator and memory¢REP #$10    ;Set 16-bit index registers¢SEP #$30    ;Set to all 8-bit registers¢SEP #$20    ;Set 8-bit accumulator and memory¢SEP #$10    ;Set 8-bit index registers¢¢Note that the SEP and REP instructions can set or reset any of the status¢register bits, so their use is not restricted to only changing register¢sizes.  Other uses could include:¢¢SEP #$09    ;Setting or resetting multiple bits at a time.¢SEP #$40    ;Set the V flag.¢SEP #$80    ;Setting or clearing N or Z flags...¢REP #$02    ;...without changing register values.¢¢There are