6502 stack
play

6502 Stack Philipp Koehn 20 September 2019 Philipp Koehn Computer - PowerPoint PPT Presentation

6502 Stack Philipp Koehn 20 September 2019 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019 1 c64 emulator Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019 PEEK and POKE 2 POKE:


  1. 6502 Stack Philipp Koehn 20 September 2019 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  2. 1 c64 emulator Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  3. PEEK and POKE 2 • POKE: directly write into memory • PEEK: directly read memory value • Example: write into screen memory – POKE 1024,1 writes letter A into top left corner – PRINT PEEK(1024) returns 1 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  4. Character Encoding in Screen Memory 3 • What is the character encoding in screen memory? • Let’s write a program Address Bytes Command 4200 A2 00 LDX #00 4202 8A TXA 4203 9D 00 04 STA 0400,X 4206 E8 INX 4207 D0 F9 BNE 4202 4209 60 RTS • Run from BASIC: SYS 16896 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  5. Screenshot 4 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  6. 5 stack Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  7. Stack 6 • Useful data structure • LIFO: Last in, first out – PUSH 5 – PUSH 2 – PULL → 2 – PULL → 5 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  8. 6502 Stack in Memory 7 01FF ⇒ 01FE 01FD 01FC • 2nd page in memory reserved 01FB ("page" = 256 bytes) 01FA 01F9 01F8 • Stack pointer 01F7 – current free position 01F6 – an address, e.g., 01FF 01F5 01F4 – register in CPU 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  9. Example 8 01FF ⇒ • PUSH 0A 01FE 01FD 01FC 01FB 01FA 01F9 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  10. Example 9 01FF 0A • PUSH 0A 01FE ⇒ – store 0A to 01FF 01FD – decrease stack pointer to 01FE 01FC 01FB 01FA 01F9 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  11. Example 10 01FF 0A • PUSH 0A 01FE ⇒ – store 0A to 01FF 01FD – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA 01F9 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  12. Example 11 01FF 0A • PUSH 0A 01FE 55 – store 0A to 01FF 01FD ⇒ – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA – store 55 to 01FE 01F9 – decrease stack pointer to 01FD 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  13. Example 12 01FF 0A • PUSH 0A 01FE 55 – store 0A to 01FF 01FD ⇒ – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA – store 55 to 01FE 01F9 – decrease stack pointer to 01FD 01F8 01F7 • PULL 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  14. Example 13 01FF 0A • PUSH 0A 01FE 55 ⇒ – store 0A to 01FF 01FD – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA – store 55 to 01FE 01F9 – decrease stack pointer to 01FD 01F8 01F7 • PULL 01F6 – increase stack pointer to 01FE 01F5 – retrieve 55 from 01FE 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  15. Example 14 01FF 0A • PUSH 0A 01FE 55 ⇒ – store 0A to 01FF 01FD – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA – store 55 to 01FE 01F9 – decrease stack pointer to 01FD 01F8 01F7 • PULL 01F6 – increase stack pointer to 01FE 01F5 – retrieve 55 from 01FE 01F4 01F3 • PUSH 42 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  16. Example 15 01FF 0A • PUSH 0A 01FE 42 – store 0A to 01FF 01FD ⇒ – decrease stack pointer to 01FE 01FC 01FB • PUSH 55 01FA – store 55 to 01FE 01F9 – decrease stack pointer to 01FD 01F8 01F7 • PULL 01F6 – increase stack pointer to 01FE 01F5 – retrieve 55 from 01FE 01F4 01F3 • PUSH 42 01F2 – store 42 to 01FE ... ... – decrease stack pointer to 01FD 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  17. 16 6502 stack instructions Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  18. Basic Stack Manipulation 17 • Accumulator – PHA: push accumulator to stack – PLA: pull accumulator from stack • Processor status (flags) – PHP: push processor status to stack – PLP: pull processor status from stack Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  19. Example 18 • Stack is a good place to safely store register values • Example PHA TXA PHA TYA PHA (some code that changes registers) PLA TAY PLA TAX PLA (all registers back to original state) Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  20. Stack Pointer Instructions 19 • Read out stack pointer • TSX: transfer stack pointer to X register • TXS: transfer X register to stack pointer Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  21. Warning 20 • Stack is not very big (256 bytes) • Too heavy use may lead to stack overflow Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  22. 21 sub routines Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  23. Subroutines 22 • Subroutines are small programs that do common things – for instance: write a character at current cursor position – this is in the C64 kernel at address FFD2 • Naive usage LDA #41 JMP FFD2 • Why won’t that work? Subroutine does not know where to return to Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  24. Solution 23 • Use the stack! • Jump to subroutine – store current program counter to stack – jump to subroutine address • Return from subroutine – retrieve return address from stack – jump to retrieved address Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  25. 6502 Subroutine Instructions 24 • JSR: Jump to subroutine • RTS: Return from subroutine Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  26. Example 25 01FF 0A • 4400 LDA #41 01FE 55 01FD ⇒ • 4402 JSR FFD2 01FC 01FB 01FA 01F9 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  27. Example 26 01FF 0A • 4400 LDA #41 01FE 55 01FD 44 • 4402 JSR FFD2 01FC 05 01FB – program counter is 4405 ⇒ 01FA – store program counter 01F9 01F8 01F7 01F6 01F5 01F4 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  28. Example 27 01FF 0A • 4400 LDA #41 01FE 55 01FD 44 • 4402 JSR FFD2 01FC 05 01FB – program counter is 4405 ⇒ 01FA – store programm counter 01F9 01F8 • FFD2 JMP (0326) 01F7 01F6 • F1CA ... 01F5 01F4 • F207 RTS 01F3 01F2 ... ... 0100 Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  29. Example 28 01FF 0A • 4400 LDA #41 01FE 55 01FD 44 ⇒ • 4402 JSR FFD2 01FC 05 – program counter is 4405 01FB – store programm counter 01FA 01F9 • FFD2 JMP (0326) 01F8 01F7 • F1CA ... 01F6 01F5 • F207 RTS 01F4 01F3 – retrieve program counter from stack 01F2 – jump to retrieved address ... ... 0100 • 4405 ... Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  30. 29 example Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  31. Recursion 30 • Recursively calling subroutines • Canonical example: Fibonacci numbers f(x) = f(x-1) + f(x-2) 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ... f ( x + 1 ) is Golden Ratio • lim x →∞ f ( x ) Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  32. Code 31 START TXA BNE M01 ; f(0) = 0? no, continue RTS ; yes M01 DEX ; prepare for f(x-1) call BNE M02 ; f(1) = 1? no, continue RTS ; yes M02 TXA ; save X on stack PHA JSR START ; result of f(x-1) in accumulator TAY ; let’s put f(x-1) aside PLA ; get X back from stack TAX TYA ; get f(x-1) back PHA ; save that for now on stack DEX ; prepare f(x-2) JSR START STA TEMP ; store f(x-2) for addition PLA ; f(x-1) from stack CLC ADC TEMP ; f(x-1) + f(x-2) RTS Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  33. 32 some more instructions Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  34. Logic 33 • Standard Boolean operations – AND: bitwise AND – ORA: bitwise OR – EOR: bitwise XOR • Operations impact negative and zero flag • BIT: bitwise AND, but do not store result Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  35. Compare 34 • Compare register value – CMP: compare accumulator – CPX: compare X register – CPY: compare Y register • Does not change register value • Sets flags as in a subtraction (e.g., if values match, set zero flag) Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

  36. 35 some quirky things Philipp Koehn Computer Systems Fundamentals: 6502 Stack 20 September 2019

Recommend


More recommend