APISUPT.ASM
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:5k
源码类别:

操作系统开发

开发平台:

DOS

  1. ; File:
  2. ;                         apisupt.asm
  3. ; Description:
  4. ;     Assembly support routines for stack manipulation, etc.
  5. ;
  6. ;                       Copyright (c) 1995
  7. ;                       Pasquale J. Villani
  8. ;                       All Rights Reserved
  9. ;
  10. ; This file is part of DOS-C.
  11. ;
  12. ; DOS-C is free software; you can redistribute it and/or
  13. ; modify it under the terms of the GNU General Public License
  14. ; as published by the Free Software Foundation; either version
  15. ; 2, or (at your option) any later version.
  16. ;
  17. ; DOS-C is distributed in the hope that it will be useful, but
  18. ; WITHOUT ANY WARRANTY; without even the implied warranty of
  19. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  20. ; the GNU General Public License for more details.
  21. ;
  22. ; You should have received a copy of the GNU General Public
  23. ; License along with DOS-C; see the file COPYING.  If not,
  24. ; write to the Free Software Foundation, 675 Mass Ave,
  25. ; Cambridge, MA 02139, USA.
  26. ;
  27. ; $Logfile:   C:/dos-c/src/kernel/apisupt.asv  $
  28. ;
  29. ; $Header:   C:/dos-c/src/kernel/apisupt.asv   1.3   16 Jan 1997 12:46:44   patv  $
  30. ;
  31. ; $Log:   C:/dos-c/src/kernel/apisupt.asv  $
  32. ;
  33. ;   Rev 1.3   16 Jan 1997 12:46:44   patv
  34. ;pre-Release 0.92 feature additions
  35. ;
  36. ;   Rev 1.2   29 May 1996 21:03:38   patv
  37. ;bug fixes for v0.91a
  38. ;
  39. ;   Rev 1.1   01 Sep 1995 17:54:26   patv
  40. ;First GPL release.
  41. ;
  42. ;   Rev 1.0   02 Jul 1995  9:04:50   patv
  43. ;Initial revision.
  44. ;
  45. page    60,132
  46. title   Assembly support routines for stack manipulation, etc.
  47. IFDEF ??version
  48. _TEXT           segment byte public 'CODE'
  49. DGROUP          group   _DATA,_BSS,_BSSEND              ; small model
  50. assume  cs:_TEXT,ds:DGROUP,ss:DGROUP
  51. _TEXT           ends
  52. _DATA           segment word public 'DATA'
  53. _DATA           ends
  54. _BSS            segment word public 'BSS'
  55. _BSS            ends
  56. _BSSEND         segment byte public 'STACK'
  57. _BSSEND         ends
  58. ELSE
  59. _TEXT           segment byte public 'CODE'
  60. _TEXT           ends
  61. _DATA           segment word public 'DATA'
  62. _DATA           ends
  63. CONST           segment word public 'CONST'
  64. CONST           ends
  65. _BSS            segment word public 'BSS'
  66. _BSS            ends
  67. _BSSEND         segment byte public 'STACK'
  68. _BSSEND         ends
  69. DGROUP          group   CONST,_DATA,_BSS,_BSSEND        ; small/tiny model
  70. assume  ds:DGROUP, ss:DGROUP
  71. ENDIF
  72. extrn   _api_sp:word            ; api stacks - for context
  73. extrn   _api_ss:word            ; switching
  74. extrn   _usr_sp:word            ; user stacks
  75. extrn   _usr_ss:word
  76. _TEXT           segment
  77. assume  cs: _TEXT
  78. public  _set_stack
  79. ;
  80. ; void far set_stack(void) - 
  81. ;       save current stack and setup our local stack
  82. ;
  83. _set_stack      proc    far
  84. ; save foreground stack
  85. ; we need to get the return values from the stack 
  86. ; since the current stack will change
  87. pop     ax                      ;get return offset
  88. pop     bx                      ;get return segment
  89. ; Save the flags so that we can restore correct interrupt
  90. ; state later. We need to disable interrupts so that we
  91. ; don't trash memory with new sp-old ss combination
  92. pushf
  93. pop     dx
  94. cli
  95. ; save bp
  96. push    bp
  97. mov     cx, sp
  98. neg     cx
  99. ; save away foreground process' stack
  100. push    word ptr DGROUP:_usr_ss
  101. push    word ptr DGROUP:_usr_sp
  102. mov     word ptr DGROUP:_usr_ss,ss
  103. mov     word ptr DGROUP:_usr_sp,sp
  104. ; setup our local stack
  105. mov     ss,word ptr DGROUP:_api_ss
  106. mov     sp,word ptr DGROUP:_api_sp
  107. add     cx, sp
  108. add     bp, cx
  109. ; setup for ret
  110. push    bx  
  111. push    ax
  112. ; now restore interrupt state
  113. push    dx
  114. popf
  115. ret
  116. _set_stack      endp
  117. ;
  118. ; void far restore_stack(void) - 
  119. ;       restore foreground stack, throw ours away 
  120. ;
  121. public  _restore_stack
  122. _restore_stack  proc    far
  123. ; we need to get the return values from the stack 
  124. ; since the current stack will change
  125. pop     cx                      ;get return offset
  126. pop     bx                      ;get return segment
  127. ; Save the flags so that we can restore correct interrupt
  128. ; state later. We need to disable interrupts so that we
  129. ; don't trash memory with new sp-old ss combination
  130. pushf
  131. pop     dx
  132. cli
  133. ; save background stack
  134. mov     word ptr DGROUP:_api_ss,ss
  135. mov     word ptr DGROUP:_api_sp,sp
  136. ; restore foreground stack here
  137. mov     ss,word ptr DGROUP:_usr_ss
  138. mov     sp,word ptr DGROUP:_usr_sp
  139. pop     word ptr DGROUP:_usr_sp
  140. pop     word ptr DGROUP:_usr_ss
  141. ; make bp relative to our stack frame
  142. pop     bp
  143. ;mov     bp,sp   
  144. ; setup for ret
  145. push    bx 
  146. push    cx
  147.     
  148. ; now restore interrupt state
  149. push    dx
  150. popf
  151. ret
  152. _restore_stack  endp
  153. _TEXT           ends
  154. end