
;  cooperative process
;     demo  two co-operative processes

.symbol
  continuationA    1100
  continuationB    1101
  rads             27

.code 0
:main
  mov r1 #0
  trap r1 #15            ; di(0)
  mov r1 #A
  st r1 continuationA    ; initially at beginning of A
  mov r1 #B
  st r1 continuationB    ; initially at beginning of B
  jmp A                  ; start co-routine

:saveConA
  add r0 rads #2
  st r0 continuationA
  ret rads

:saveConB
  add r0 rads #2
  st r0 continuationB
  ret rads

:A
  mov r1 #1
  trap r1 #1             ; print 1
  ; co-call B
  jal rads saveConA
  ld rads continuationB
  ret rads
  mov r1 #2              ; print 2
  trap r1 #1
  ; co-call B
  jal rads saveConA
  ld rads continuationB
  ret rads
  mov r1 #3      
  trap r1 #1             ; print 3
  ; co-call B
  jal rads saveConA
  ld rads continuationB
  ret rads
  
:B
  mov r2 #97
  trap r2 #2             ; print a
  ; co-call A
  jal rads saveConB
  ld rads continuationA
  ret rads
  mov r2 #98             ; print b
  trap r2 #2
  ; co-call A
  jal rads saveConB
  ld rads continuationA
  ret rads
  mov r1 #99      
  trap r1 #2             ; print c
  trap r0 #0		 ; stop

.data 200
.end
