Day 21 - The Stack



The Stack


	I hope you know what a stack is. It's exactly what it sounds like, you
put things on top (push) and then you take things off the top (pop). The stack
in the NES starts at $01FF and grows down in memory. To handle where the next 
item pushed or poped from the stack comes from, there a register called S which
is an index in page 1 ($0100 to $01FF). The S register can modified by a TSX or
TXS instruction (Transfer S to X and transfer X to S respectively). The current
location on the stack always is $0100+S.

Push Instructions

There are 2 instructions that explicitly push things on the stack, they are PHA and PHP. PHA pushes the A register onto the stack and then decrements the S register. PHP pushes the flag register (that stores Zero,Carry,Overflow, etc..) onto the stack (and S-=1;). Note that there are no instructions to push the X or Y registers, to accomplish that. You'll have to do something like: ; assuming you don't care about A's value txa ; transfer X to A pha ; push A ; or tya ; transfer Y to A pha ; push A

Pop Instructions

The counter-parts to the push instructions are PLA and PLP. PLA pops A from the stack and PLP pops the flags from the stack (both do S+=1; afterwards). ; example: lda #3 pha lda #4 pha lda #5 pla ; note that this is a POP pla After that is finished A's value will be 3. NOTE: PHP and PLP would be usefull in preserving flag status across subroutine calls (JSR). NOTE2: I don't think JSR saves the flags, does it?

This Day In Review

The stack is a good thing to know and is probably something I should have mentioned earlier. Greetings and Salutations!, - GbaGuy P.S. Could someone email me to tell me if this works or not, please?
Intro - Day 22