mtask.asm 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. $mod851
  2. state EQU 7fh
  3. tmp EQU 7eh
  4. org 0000h
  5. ljmp start
  6. org 000bh
  7. t0int: ljmp task_switch
  8. org 0060h
  9. start: mov A,TMOD
  10. anl A,#11111000b
  11. orl A,#1
  12. mov TMOD,A ; T0 mode = 1
  13. mov TL0,#0
  14. mov TH0,#0ffh
  15. mov state,#00h
  16. setb TR0 ; T0 enable
  17. setb ET0 ; T0 int enable
  18. setb EA ; enable int
  19. task1: xrl P1,#0fh
  20. mov A,#080h
  21. lcall delay
  22. sjmp task1
  23. task2: xrl P1,#0f0h
  24. mov A,#0ffh
  25. lcall delay
  26. sjmp task2
  27. delay: djnz Acc,delay
  28. ret
  29. ;========================================
  30. task_switch:
  31. push DPH
  32. push DPL
  33. push Acc
  34. mov A,state
  35. jz ts_go
  36. ljmp rev
  37. ts_go: pop Acc ; Acc
  38. mov DPTR,#t1inf
  39. movx @DPTR,A
  40. pop Acc ; DPL
  41. inc DPTR
  42. movx @DPTR,A
  43. pop Acc ; DPH
  44. inc DPTR
  45. movx @DPTR,A
  46. inc DPTR ; B
  47. mov A,B
  48. movx @DPTR,A
  49. inc DPTR ; PSW
  50. mov A,PSW
  51. movx @DPTR,A
  52. pop Acc ; PC
  53. inc DPTR
  54. movx @DPTR,A
  55. pop Acc
  56. inc DPTR
  57. movx @DPTR,A
  58. inc DPTR ; SP
  59. mov A,SP
  60. movx @DPTR,A
  61. inc DPTR ; adr: 00h
  62. mov A,R0
  63. movx @DPTR,A
  64. mov B,#6fh ; adr: 01h-6fh
  65. mov R0,#01h
  66. ts_l1: inc DPTR
  67. mov A,@R0
  68. movx @DPTR,A
  69. inc R0
  70. djnz B,ts_l1
  71. ;------------
  72. mov DPTR,#(t2inf_end-1)
  73. mov B,#6fh ; adr: 01-6f
  74. mov R0,#6fh
  75. ts_l2: movx A,@DPTR
  76. mov @R0,A
  77. dec R0
  78. mov tmp,A
  79. lcall dec_dptr
  80. mov A,tmp
  81. djnz B,ts_l2
  82. movx A,@DPTR
  83. mov R0,A ; adr: 00
  84. lcall dec_dptr ; SP
  85. movx A,@DPTR
  86. mov SP,A
  87. lcall dec_dptr ; PC
  88. movx A,@DPTR
  89. push Acc
  90. lcall dec_dptr
  91. movx A,@DPTR
  92. push Acc
  93. lcall dec_dptr ; PSW
  94. movx A,@DPTR
  95. mov PSW,A
  96. lcall dec_dptr ; B
  97. movx A,@DPTR
  98. mov B,A
  99. lcall dec_dptr ; DPH
  100. movx A,@DPTR
  101. push Acc
  102. lcall dec_dptr ; DPL
  103. movx A,@DPTR
  104. push Acc
  105. lcall dec_dptr ; Acc
  106. movx A,@DPTR
  107. pop DPL
  108. pop DPH
  109. mov state,#0ffh
  110. mov TL0,#0
  111. mov TH0,#0ffh
  112. reti
  113. ;-=-=-=-=-=-=-=-=-
  114. rev:
  115. pop Acc ; Acc
  116. mov DPTR,#t2inf
  117. movx @DPTR,A
  118. pop Acc ; DPL
  119. inc DPTR
  120. movx @DPTR,A
  121. pop Acc ; DPH
  122. inc DPTR
  123. movx @DPTR,A
  124. inc DPTR ; B
  125. mov A,B
  126. movx @DPTR,A
  127. inc DPTR ; PSW
  128. mov A,PSW
  129. movx @DPTR,A
  130. pop Acc ; PC
  131. inc DPTR
  132. movx @DPTR,A
  133. pop Acc
  134. inc DPTR
  135. movx @DPTR,A
  136. inc DPTR ; SP
  137. mov A,SP
  138. movx @DPTR,A
  139. inc DPTR ; adr: 00h
  140. mov A,R0
  141. movx @DPTR,A
  142. mov B,#6fh ; adr: 01h-6fh
  143. mov R0,#01h
  144. ts_l3: inc DPTR
  145. mov A,@R0
  146. movx @DPTR,A
  147. inc R0
  148. djnz B,ts_l3
  149. ;------------
  150. mov DPTR,#(t1inf_end-1)
  151. mov B,#6fh ; adr: 01-6f
  152. mov R0,#6fh
  153. ts_l4: movx A,@DPTR
  154. mov @R0,A
  155. dec R0
  156. mov tmp,A
  157. lcall dec_dptr
  158. mov A,tmp
  159. djnz B,ts_l4
  160. movx A,@DPTR
  161. mov R0,A ; adr: 00
  162. lcall dec_dptr ; SP
  163. movx A,@DPTR
  164. mov SP,A
  165. lcall dec_dptr ; PC
  166. movx A,@DPTR
  167. push Acc
  168. lcall dec_dptr
  169. movx A,@DPTR
  170. push Acc
  171. lcall dec_dptr ; PSW
  172. movx A,@DPTR
  173. mov PSW,A
  174. lcall dec_dptr ; B
  175. movx A,@DPTR
  176. mov B,A
  177. lcall dec_dptr ; DPH
  178. movx A,@DPTR
  179. push Acc
  180. lcall dec_dptr ; DPL
  181. movx A,@DPTR
  182. push Acc
  183. lcall dec_dptr ; Acc
  184. movx A,@DPTR
  185. pop DPL
  186. pop DPH
  187. mov state,#00h
  188. mov TL0,#0
  189. mov TH0,#0ffh
  190. reti
  191. ;========================================
  192. dec_dptr:
  193. dec DPL
  194. mov A,DPL
  195. cjne A,#0ffh,decdp_lab1
  196. dec DPH
  197. decdp_lab1:
  198. ret
  199. ;========================================
  200. org 8000h
  201. t1inf:
  202. db 00 ; Acc
  203. db 00 ; DPL
  204. db 00 ; DPH
  205. db 00 ; B
  206. db 00 ; PSW
  207. dw 00 ; PC
  208. db 07 ; SP
  209. db 0,0,0,0,0,0,0,0 ; R0-R7 (from adress: 00h)
  210. db 0,0,0,0,0,0,0,0 ; Stack
  211. db 0,0,0,0,0,0,0,0
  212. db 0,0,0,0,0,0,0,0
  213. db 0,0,0,0,0,0,0,0
  214. db 0,0,0,0,0,0,0,0
  215. db 0,0,0,0,0,0,0,0
  216. db 0,0,0,0,0,0,0,0
  217. db 0,0,0,0,0,0,0,0
  218. db 0,0,0,0,0,0,0,0
  219. db 0,0,0,0,0,0,0,0
  220. db 0,0,0,0,0,0,0,0
  221. db 0,0,0,0,0,0,0,0
  222. db 0,0,0,0,0,0,0,0 ; (to adress: 6fh)
  223. t1inf_end:
  224. t2inf:
  225. db 00 ; Acc
  226. db 00 ; DPL
  227. db 00 ; DPH
  228. db 00 ; B
  229. db 00 ; PSW
  230. dw task2 ; PC
  231. db 07 ; SP
  232. db 0,0,0,0,0,0,0,0 ; R0-R7 (from adress: 00h)
  233. db 0,0,0,0,0,0,0,0 ; Stack
  234. db 0,0,0,0,0,0,0,0
  235. db 0,0,0,0,0,0,0,0
  236. db 0,0,0,0,0,0,0,0
  237. db 0,0,0,0,0,0,0,0
  238. db 0,0,0,0,0,0,0,0
  239. db 0,0,0,0,0,0,0,0
  240. db 0,0,0,0,0,0,0,0
  241. db 0,0,0,0,0,0,0,0
  242. db 0,0,0,0,0,0,0,0
  243. db 0,0,0,0,0,0,0,0
  244. db 0,0,0,0,0,0,0,0
  245. db 0,0,0,0,0,0,0,0 ; (to adress: 6fh)
  246. t2inf_end:
  247. END