;; s30 dual core ;; show two cores run different program ;; use two semaphores to sync two cores .symbol stop 0 print1 17 print2 18 cpuid 5 wfi 23 intx 24 newsem 20 wait 21 signal 22 sem1 1600 sem2 1601 ;; global registers sp 28 ;; system stack pointer retval 27 link 15 ;; must be r1..r15 .code 0 mv sp #1700 ;; sp = &1700 trap cpuid eq r2 retval #0 jt r2 p1 jmp p2 ;; ------------- user program ----------- ;; p1() ;; i = 0 ;; while i < 5 ;; wait(sem1) ;; signal(sem2) ;; print i ;; i++ :p1 ;; count 1..4 trap newsem st retval sem1 ;; sem1 = newsem() trap newsem st retval sem2 ;; sem2 = newsem() mv r2 r0 ;; r2 : i :loop3 ld r1 sem1 ;; sync trap wait ld r1 sem2 trap signal lt r3 r2 #5 ;; i < 5 ? jf r3 exit3 mv r1 r2 trap print1 add r2 r2 #1 jmp loop3 :exit3 trap stop ;; p2() ;; i = 10 ;; while i < 15 ;; wait(sem2) ;; signal(sem1) ;; print i ;; i++ :p2 ;; count 10..14 add r2 r0 r0 add r2 r0 r0 add r2 r0 r0 add r2 r0 r0 ;; padding mv r2 #10 ;; r2 : i :loop4 ld r1 sem2 ;; sync trap wait ld r1 sem1 trap signal lt r3 r2 #15 ;; i < 15 ? jf r3 exit4 mv r1 r2 trap print2 add r2 r2 #1 jmp loop4 :exit4 trap stop .end