context.asm 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "macdefs.inc"
  2. name OS_Core
  3. COMMON INTVEC:CODE
  4. ;********************************************************************
  5. ;
  6. ; function:
  7. ; description: Trap 0x10 vector used for context switch
  8. ; Right now, all TRAPs to $1x are trated the same way
  9. ;
  10. org 50h
  11. jr OSCtxSW
  12. ;********************************************************************
  13. ;
  14. ; function:
  15. ; description: Timer 40 compare match interrupt used for system
  16. ; tick interrupt
  17. ;
  18. org 0x220
  19. jr OSTickIntr
  20. org 0x0520
  21. jr uarta1_int_r
  22. RSEG CODE(1)
  23. EXTERN rt_thread_switch_interrput_flag
  24. EXTERN rt_interrupt_from_thread
  25. EXTERN rt_interrupt_to_thread
  26. EXTERN rt_interrupt_enter
  27. EXTERN rt_interrupt_leave
  28. EXTERN rt_tick_increase
  29. EXTERN uarta1_receive_handler
  30. PUBLIC rt_hw_interrupt_disable
  31. PUBLIC rt_hw_interrupt_enable
  32. PUBLIC rt_hw_context_switch_to
  33. PUBLIC rt_hw_context_switch
  34. PUBLIC rt_hw_context_switch_interrupt
  35. PUBLIC OSCtxSW
  36. PUBLIC OS_Restore_CPU_Context
  37. rt_hw_interrupt_disable:
  38. stsr psw, r1
  39. di
  40. jmp [lp]
  41. rt_hw_interrupt_enable:
  42. ldsr r1, psw
  43. jmp [lp]
  44. OS_Restore_CPU_Context:
  45. mov sp, ep
  46. sld.w 4[ep], r2
  47. sld.w 8[ep], r5
  48. sld.w 12[ep],r6
  49. sld.w 16[ep],r7
  50. sld.w 20[ep],r8
  51. sld.w 24[ep],r9
  52. sld.w 28[ep],r10
  53. sld.w 32[ep],r11
  54. sld.w 36[ep],r12
  55. sld.w 40[ep],r13
  56. sld.w 44[ep],r14
  57. sld.w 48[ep],r15
  58. sld.w 52[ep],r16
  59. ;See what was the latest interruption (trap or interrupt)
  60. stsr ecr, r17 ;Move ecr to r17
  61. mov 0x050,r1
  62. cmp r1, r17 ;If latest break was due to TRAP, set EP
  63. be _SetEP
  64. _ClrEP:
  65. mov 0x20, r17 ;Set only ID
  66. ldsr r17, psw
  67. ;Restore caller address
  68. sld.w 56[ep], r1
  69. ldsr r1, EIPC
  70. ;Restore PSW
  71. sld.w 60[ep], r1
  72. andi 0xffdf,r1,r1
  73. ldsr r1, EIPSW
  74. sld.w 0[ep], r1
  75. dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31}
  76. ;Return from interrupt starts new task!
  77. reti
  78. _SetEP:
  79. mov 0x60, r17 ;Set both EIPC and ID bits
  80. ldsr r17, psw
  81. ;Restore caller address
  82. sld.w 56[ep], r1
  83. ldsr r1, EIPC
  84. ;Restore PSW
  85. sld.w 60[ep], r1
  86. andi 0xffdf,r1,r1
  87. ldsr r1, EIPSW
  88. sld.w 0[ep], r1
  89. dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31}
  90. ;Return from interrupt starts new task!
  91. reti
  92. //rseg CODE:CODE
  93. //public rt_hw_context_switch_to
  94. rt_hw_context_switch_to:
  95. ;Load stack pointer of the task to run
  96. ld.w 0[r1], sp ;load sp from struct
  97. ;Restore all Processor registers from stack and return from interrupt
  98. jr OS_Restore_CPU_Context
  99. OSCtxSW:
  100. SAVE_CPU_CTX ;Save all CPU registers
  101. mov rt_thread_switch_interrput_flag, r1
  102. ld.w 0[r1],r5
  103. cmp 0, r5
  104. be exit
  105. mov 0, r5
  106. st.b r5, 0[r1]
  107. mov rt_interrupt_from_thread, r21
  108. ld.w 0[r21], r21
  109. st.w sp, 0[r21]
  110. mov rt_interrupt_to_thread, r1
  111. ld.w 0[r1], r1
  112. ld.w 0[r1], sp
  113. exit:
  114. ;Restore all Processor registers from stack and return from interrupt
  115. jr OS_Restore_CPU_Context
  116. ;R1 -> rt_interrupt_from_thread
  117. ;R5 -> rt_interrupt_to_thread
  118. rt_hw_context_switch:
  119. mov rt_thread_switch_interrput_flag, r8
  120. ld.w 0[r8],r9
  121. cmp 1, r9
  122. be jump1
  123. ;mov rt_thread_switch_interrput_flag, r1
  124. mov 1, r9
  125. st.b r9, 0[r8]
  126. mov rt_interrupt_from_thread, r10
  127. st.w r1, 0[r10]
  128. jump1
  129. mov rt_interrupt_to_thread, r11
  130. st.w r5, 0[r11]
  131. trap 0x10
  132. jmp [lp]
  133. rt_hw_context_switch_interrupt:
  134. mov rt_thread_switch_interrput_flag, r8
  135. ld.w 0[r8],r9
  136. cmp 1, r9
  137. be jump2
  138. ;mov rt_thread_switch_interrput_flag, r1
  139. mov 1, r9
  140. st.b r9, 0[r8]
  141. mov rt_interrupt_from_thread, r10
  142. st.w r1, 0[r10]
  143. jump2
  144. mov rt_interrupt_to_thread, r11
  145. st.w r5, 0[r11]
  146. jmp [lp]
  147. rt_hw_context_switch_interrupt_do
  148. mov rt_thread_switch_interrput_flag, r8
  149. mov 0, r9
  150. st.b r9, 0[r8]
  151. mov rt_interrupt_from_thread, r21
  152. ld.w 0[r21], r21
  153. st.w sp, 0[r21]
  154. mov rt_interrupt_to_thread, r1
  155. ld.w 0[r1], r1
  156. ld.w 0[r1], sp
  157. jr OS_Restore_CPU_Context
  158. OSTickIntr:
  159. SAVE_CPU_CTX ;Save current task's registers
  160. jarl rt_interrupt_enter,lp
  161. jarl rt_tick_increase,lp
  162. jarl rt_interrupt_leave,lp
  163. mov rt_thread_switch_interrput_flag, r8
  164. ld.w 0[r8],r9
  165. cmp 1, r9
  166. be rt_hw_context_switch_interrupt_do
  167. jr OS_Restore_CPU_Context
  168. uarta1_int_r:
  169. SAVE_CPU_CTX ;Save current task's registers
  170. jarl rt_interrupt_enter,lp
  171. jarl uarta1_receive_handler,lp
  172. jarl rt_interrupt_leave,lp
  173. mov rt_thread_switch_interrput_flag, r8
  174. ld.w 0[r8],r9
  175. cmp 1, r9
  176. be rt_hw_context_switch_interrupt_do
  177. jr OS_Restore_CPU_Context
  178. END