BACKGRND.ASM
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  1. PAGE 66,132
  2. ;
  3. ;
  4. ;
  5. ;
  6. ;
  7. ;
  8. ;
  9. ;
  10. ;  backgrnd.asm
  11. ;
  12. ;  usage:
  13. ;     extern init_bkg( int (*routine)(), char *stack, int stacklen)
  14. ;     extern swap_bkg()
  15. ;     extern kill_bkg()
  16. ;
  17. ;  (c) 1990 Erick Engelke
  18. ;
  19. ;
  20. include masmdefs.hsm
  21. include model.hsm
  22. codedef BACKGRND
  23. SETVEC equ 25h ; function to set interrupt vector
  24. GETVEC equ 35h
  25. TICKER equ 1ch
  26. DOS equ 21h
  27. datadef
  28. cstart  BACKGRND
  29. oldint dq 0
  30. inside db 0
  31. stkbase dw 0 ; used to check stack depth
  32. stkptr dw 0
  33. stkseg dw 0
  34. retstk dw 0,0
  35. bkgptr dw 0, 0
  36. swapstk macro
  37. cli
  38. mov AX, SS
  39. xchg CS:stkseg, AX
  40. mov SS, AX
  41. xchg CS:stkptr, SP
  42. sti
  43. endm
  44. ; note, we do not push AX!!!!!!, assembly routine must
  45. push_em macro
  46. push BX
  47. push CX
  48. push DX
  49. push BP
  50. push SI
  51. push DI
  52. push DS
  53. push ES
  54. endm
  55. pop_em macro
  56. pop ES
  57. pop DS
  58. pop DI
  59. pop SI
  60. pop BP
  61. pop DX
  62. pop CX
  63. pop BX
  64. pop AX
  65. endm
  66. ; bkg_int - the interrupt function called by the timer tick
  67. bkg_int proc far
  68. ; first chain
  69. pushf
  70. call dword ptr CS:[oldint]
  71. ; establish if we are active
  72. push AX
  73. mov AL, 1
  74. xchg CS:inside, AL
  75. or AL, AL
  76. jz @1 ; not busy, go ahead
  77. ; must be already active
  78. pop AX
  79. iret
  80. @1: push_em
  81. ; switch over to the new stack
  82. swapstk
  83. pop_em
  84. IF PTR_L
  85. retf
  86. ELSE
  87. retn
  88. ENDIF
  89. bkg_int endp
  90. ; use cproc, does not use BP
  91. cproc swap_bkg
  92. push AX
  93. push_em    ; save them on
  94. swapstk
  95. pop_em
  96. xor AL, AL ; clear flag
  97. mov CS:inside, AL
  98. iret
  99. creturn swap_bkg
  100. IF FUNC_L
  101. OFSSTK equ 4
  102. OFSLEN equ OFSSTK + 4
  103. ELSE
  104. OFSSTK equ 2
  105. OFSLEN equ OFSSTK + 2
  106. ENDIF
  107. cpublic init_bkg ; int (*routine)(), char *stack, int stacklen
  108. ; get pointer to routine
  109. mov DX, +@AB [BP]
  110. mov CS:bkgptr, DX
  111. IF FUNC_L
  112. mov     CX, +@AB + 2 [BP]
  113. ELSE
  114. mov CX, CS
  115. ENDIF
  116. mov CS:bkgptr+2, CX
  117. ; get stack area
  118. mov AX, +@AB + OFSSTK [BP]
  119. mov CS:stkbase, AX
  120. IF PTR_L
  121. mov BX, +@AB + OFSSTK + 2 [BP]
  122. mov CS:stkseg, BX
  123. ELSE
  124. mov CS:stkseg, DS
  125. ENDIF
  126. ; get length
  127. add AX, +@AB + OFSLEN [BP]
  128. sub AX, 2
  129. mov CS:stkptr, AX
  130. ; get the stack area and set up the first call
  131. swapstk
  132. push CX
  133. push DX
  134. push AX
  135. push_em
  136. ; done with that stack
  137. swapstk
  138. ; set up the interrupt
  139. push ES
  140. push DS
  141. mov  AH, GETVEC
  142. mov AL, TICKER
  143. int DOS
  144. mov word ptr CS:oldint, BX
  145. mov word ptr CS:oldint+2, ES
  146. push CS
  147. pop DS
  148. mov DX, offset bkg_int
  149. mov AH, SETVEC
  150. mov AL, TICKER
  151. int DOS
  152. mov DS, DX
  153. pop DS
  154. pop ES
  155. xor  AX, AX
  156. creturn init_bkg
  157. cpublic kill_bkg
  158. push DS
  159. xor AX, AX
  160. mov DS, AX
  161. mov BX, TICKER * 4
  162. cli
  163. mov CX, word ptr CS:oldint
  164. mov DX, word ptr CS:oldint+2
  165. mov DS:[BX], CX
  166. mov DS:[BX+2], DX
  167. sti
  168. pop DS
  169. creturn kill_bkg
  170. cend    BACKGRND
  171.         end