The 6502 is an 8-bit processor with a 16-bit address bus. It is therefore able to access 64 kilobytes (216 bytes). Since each 16-bit address is comprised of two 8-bit bytes, memory can be viewed as 256 pages of 256 bytes each.
Each pointer in memory is stored in two consecutive memory locations, with the lowest-value byte stored first; this is known as Little Endian order. Thus, a pointer at memory location $0010, which points to memory location $ABCD, would be stored like this:
Memory $0010: $CD Memory $0011: $AB
Some pages have special, pre-defined purposes:
|Page||Name||Starting address||Ending address||Purpose|
|00||Zero Page||$0000||$00FF||Variables requiring fast access|
|01||Stack||$0100||$01FF||Values are pushed to, and pulled (popped) from, this region in first-in last-out (FIFO) order. The stack descends as it is used - more recently-pushed values are stored at lower addresses than older values. The stack wraps around, so if more than 256 bytes are pushed, the oldest values will be overwritten.|
|FF||Vector Table||$FF00||$FFFF||The last 6 bytes of this page contain the three 2-byte addresses. $FE contains a pointer to code which is run when an interrupt request is received; $FC contains a pointer to code which is run when the CPU is reset (including when it is first started); and $FA contains a pointer to code which is run when a non-maskable interrupt (NMI) is received.|
In addition, each system built using the 6502 would have hardware devices, such as the video system, keyboard, and communication interfaces, occupying a portion of the address space.
There are three general-purpose registers:
- Accumulator (A) - the main register for math operations.
- X Index (X) - a register which can be used for limited math operations as well as indexed addressing modes, where an index value is added to a base address for memory operations.
- Y Index (Y) - a register similar to the X register. Some index operations may only be performed with a specific index register (X or Y, but not interchangeably).
There are also three special-purpose registers:
- Program Counter (PC) - a pointer to the currently-executing instruction in memory.
- Stack Pointer (S or SP) - a pointer to the current position in the stack
- Processor Status (P) - a collection of bits which indicate or control aspects of the processor mode and status:
- C - Carry - Used to indicate a carry or borrow during addition/subtraction
- Z - Zero flag - indicates that an operation produced a zero or equal result
- I - Interrupt disable
- D - Decimal mode - bytes are interpreted as two-digit decimal values instead of 8-bit binary values when doing math
- B - Break - Indicates a software interrupt rather than a hardware interrupt has occurred
- V - Overflow - Set when a math operation overflows a one-byte result
- S - Negative Sign - set when an operation produces a negative result
The 6502 instruction set consist of a number of single-byte opcodes, each of which is followed by 0, 1, or 2 bytes of arguments. Each opcode corresponded to an instruction, which consists of an operation and an addressing mode. 6502 Assembly Language uses 3-letter menomics to specify the operation, and argument syntax to specify the addressing mode. For example:
LDA #$05 ; load the accumulator with the number 5 LDA $05 ; load the accumulator with the contents of memory location 5 (in the zero page) LDA $f005 ; load the accumulator with the contents of memory location $f005
See the references (below) for the full details of the 6502 instruction set.
Since 6502 systems are no longer very common, a web-based 6502 Emulator is available for assembling, testing, and debugging 6502 Assembly code.
- Wikipedia entry for 6502
- Visual 6502 - a project to physically disassemble and analyze the 6502 chip, including photographs of the chip die and a visual simulation of voltages on the chip
- Easy 6502
- 6502 Opcodes with Register Definitions
- 6502 Opcodes with Detailed Operation Information
- MOnSter 6502 - a large-scale, transistor-level implementation of the 6502, with lots of LEDs!