1.1 --- a/macros.oph Sun Jun 28 15:45:29 2015 +0200
1.2 +++ b/macros.oph Sun Jun 28 19:23:06 2015 +0200
1.3 @@ -144,6 +144,8 @@
1.4 ;
1.5 ; _1: valueW
1.6 ; _2: {valueL, valueH} -> {valueL', valueH'}
1.7 +;
1.8 +; affects: A, C
1.9
1.10 .macro sub16
1.11 sec
1.12 @@ -165,52 +167,81 @@
1.13 adc #1
1.14 .macend
1.15
1.16 -; push PC onto a "user space" stack and jump to subroutine
1.17 +; push A onto the "user space" stack, adding an empty byte for compatibility
1.18 +; with PC storage
1.19 ;
1.20 -; _1: target
1.21 -
1.22 -.macro call
1.23 - sei ; prevent CPU stack disturbance
1.24 - jsr copy_to_user_stack
1.25 - cli ; permit CPU stack access again
1.26 - jmp _1
1.27 - nop
1.28 -.macend
1.29 -
1.30 -; pull PC from a "user space" stack and return from subroutine
1.31 -
1.32 -.macro return
1.33 - jmp copy_from_user_stack
1.34 -.macend
1.35 -
1.36 -; push A onto the "user space" stack
1.37 -;
1.38 -; affects: USER (gains A), TEMP
1.39 +; affects: USER (gains empty, A), TEMP
1.40
1.41 .macro pushA
1.42 sei
1.43 + php
1.44 pha
1.45 sty TEMP
1.46 ldy #0
1.47 sta (USER), y
1.48 - .invoke sub16 1, USER
1.49 + .invoke sub16 2, USER
1.50 ldy TEMP
1.51 pla
1.52 + plp
1.53 cli
1.54 .macend
1.55
1.56 ; pull A from the "user space" stack
1.57 ;
1.58 -; affects: A, USER (loses A), TEMP
1.59 +; affects: A, USER (loses empty, A), TEMP
1.60
1.61 .macro pullA
1.62 sei
1.63 + php
1.64 sty TEMP
1.65 - .invoke add16 1, USER
1.66 + .invoke add16 2, USER
1.67 ldy #0
1.68 lda (USER), y
1.69 ldy TEMP
1.70 + plp
1.71 cli
1.72 .macend
1.73
1.74 +; push a return address onto the "user space" stack and jump to a subroutine
1.75 +;
1.76 +; _1: subroutine address
1.77 +; _2: return address
1.78 +;
1.79 +; affects: USER (gains LSB, MSB), TEMP
1.80 +
1.81 +.macro call
1.82 + sei
1.83 + php
1.84 + pha
1.85 + sty TEMP
1.86 + ldy #0
1.87 + lda #<_2
1.88 + sta (USER), y
1.89 + iny
1.90 + lda #>_2
1.91 + sta (USER), y
1.92 + .invoke sub16 2, USER
1.93 + ldy TEMP
1.94 + pla
1.95 + plp
1.96 + cli
1.97 + jmp _1
1.98 +.macend
1.99 +
1.100 +; pull an address from the "user space" stack and return to it
1.101 +;
1.102 +; affects: USER (loses LSB, MSB), ABSTEMP
1.103 +
1.104 +.macro return
1.105 + sei
1.106 + php
1.107 + pha
1.108 + .invoke add16 2, USER
1.109 + .invoke mov16_from_ref USER, ABSTEMP
1.110 + pla
1.111 + plp
1.112 + cli
1.113 + jmp (ABSTEMP)
1.114 +.macend
1.115 +
1.116 ; vim: tabstop=4 expandtab shiftwidth=4