Subroutines and Stacks Lecture L3.1
Subroutine and Stacks The System Stack Subroutines A Data Stack
The System Stack
Pushing D on the stack
1: ; System stack 2: = ORG $4000 3: 4000 CF 08FF LDS #$08FF 4: 4003 CC 1234 LDD #$1234 5: 4006 CD 5678 LDY #$5678 6: B PSHD 7: 400A 35 PSHY 8: 400B 30 PULX 9: 400C 31 PULY 10: 400D 3F SWI What values end up in X and Y?
Subroutine and Stacks The System Stack Subroutines A Data Stack
1: ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS
1: ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS Stack 4006 D 1234
Stack : ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 68AC
Stack : ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 79BD
Stack : ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 79BD
Stack 1: ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 79BD
Stack : ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 79BD
Stack : ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 8ACE
Stack 1: ; Subroutine example 2: 3: 4: = ORG $4000 5: 4000 EX2 6: 4000 CC 1234 LDD #$1234 7: A JSR SUB1 8: JSR SUB2 9: F SWI 10: 11: 400A SUB1 12: 400A C ADDD #$ : 400D JSR SUB2 14: D RTS 15: 16: 4011 SUB2 17: 4011 C ADDD #$ : D RTS D 8ACE
Saving and restoring registers in a subroutine ;subroutine example subname pshb;save B pshx;save X ;instructions that ----;change B and X ---- pulx;restore X pulb;restore B rts Note that you MUST pull ALL registers that you pushed on the stack
Subroutine and Stacks The System Stack Subroutines A Data Stack
Using X as a stack pointer for a data stack LDY 2,X+ will pop $1234 into Y
Subroutine to add two numbers on the data stack
Subroutine to subtract two numbers on the data stack