I'm using the ca65 assembler (https://cc65.github.io/doc/ca65) to run my project. I know 6502 has SP register points to low byte of stack position ($01SP).
But I don't know how actually (sp) works in code.
In ca65's runtime it has func to push A into a stack:
pusha: ldy sp ;
beq @L1 ;
dec sp ;
ldy #0 ;
sta (sp),y ;
rts ;
But why doesn't it push value into the stack? Why does it save value into a memory from 0?
For example, if I do this code:
ldx #$ff
txs
lda #$cc
jsr pusha
I expected to see $cc
in stack's memory location, but it saved $cc
into memory under stack.
Result I had from logs of emulator where A,X,Y,SP - registers, OP - current opcode, PC - program counter, SPData - stack's data, and MemData, it's RAM:
;Load stack pointer into X
LDX 8001, A=0, X=0, Y=0, SP=0, addr=ff, op=a2, PC=8002, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Save stack pointer from X to SP
TXS 0, A=0, X=ff, Y=0, SP=0, addr=0, op=9a, PC=8003, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Load $CC into A
LDA 8004, A=0, X=ff, Y=0, SP=ff, addr=cc, op=a9, PC=8005, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Jump to ca65's runtime func "pusha" to save A into stack
JSR 810c, A=cc, X=ff, Y=0, SP=ff, addr=a4, op=20, PC=8008, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
LDY 0, A=cc, X=ff, Y=0, SP=fd, addr=0, op=a4, PC=810e, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
BEQ 8117, A=cc, X=ff, Y=0, SP=fd, addr=c6, op=f0, PC=8110, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
DEC 1, A=cc, X=ff, Y=0, SP=fd, addr=0, op=c6, PC=8119, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
DEC 0, A=cc, X=ff, Y=0, SP=fd, addr=0, op=c6, PC=811b, SPData=0,7,80,0,0,0,0,0,0, MemData=0,ff,0,0,0,0,0,0,0
STA 0, A=cc, X=ff, Y=0, SP=fd, addr=ff, op=91, PC=811d, SPData=0,7,80,0,0,0,0,0,0, MemData=ff,ff,0,0,0,0,0,0,0
;here I want to see $cc into SPData, but it was pushed into MemData
RTS 0, A=cc, X=ff, Y=0, SP=fd, addr=cc, op=60, PC=811e, SPData=0,7,80,0,0,0,0,0,0, MemData=cc,ff,0,0,0,0,0,0,0
Console command to build is:
ca65 --cpu 6502 -I ${HOME}/cc65/asminc -U arch/boot.s -o arch/boot.o