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

操作系统开发

开发平台:

DOS

  1. ; File:
  2. ;                         irqstack.asm
  3. ; Description:
  4. ;     Assembly support routines for hardware stack support
  5. ;
  6. ;                       Copyright (c) 1997
  7. ;                          Svante Frey
  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/irqstack.asv  $
  28. ;
  29. ; $Header:   C:/dos-c/src/kernel/irqstack.asv   1.1   22 Jan 1997 13:15:34   patv  $
  30. ;
  31. ; $Log:   C:/dos-c/src/kernel/irqstack.asv  $
  32. ;  
  33. ;     Rev 1.1   22 Jan 1997 13:15:34   patv
  34. ;  pre-0.92 Svante Frey bug fixes
  35. ;  
  36. ;     Rev 1.0   16 Jan 1997 21:43:44   patv
  37. ;  Initial revision.
  38. ;
  39. page    60,132
  40. title   Assembly support routines for hardware stack support
  41. ;       Code for stack switching during hardware interrupts.
  42. _TEXT           segment WORD PUBLIC 'CODE'
  43. assume  cs:_TEXT
  44. old_vectors     dd      16 dup(?)
  45. stack_size      dw      ?
  46. stack_top       dw      ?
  47. stack_offs      dw      ?
  48. stack_seg       dw      ?
  49. irq_0:          push    bx
  50. mov     bx, 0 * 4
  51. jmp     short general_irq_service
  52. irq_1:          push    bx
  53. mov     bx, 1 * 4
  54. jmp     short general_irq_service
  55. irq_2:          push    bx
  56. mov     bx, 2 * 4
  57. jmp     short general_irq_service
  58. irq_3:          push    bx
  59. mov     bx, 3 * 4
  60. jmp     short general_irq_service
  61. irq_4:          push    bx
  62. mov     bx, 4 * 4
  63. jmp     short general_irq_service
  64. irq_5:          push    bx
  65. mov     bx, 5 * 4
  66. jmp     short general_irq_service
  67. irq_6:          push    bx
  68. mov     bx, 6 * 4
  69. jmp     short general_irq_service
  70. irq_7:          push    bx
  71. mov     bx, 7 * 4
  72. jmp     short general_irq_service
  73. irq_08:         push    bx
  74. mov     bx, 8 * 4
  75. jmp     short general_irq_service
  76. irq_09:         push    bx
  77. mov     bx, 9 * 4
  78. jmp     short general_irq_service
  79. irq_0a:         push    bx
  80. mov     bx, 0ah * 4
  81. jmp     short general_irq_service
  82. irq_0b:         push    bx
  83. mov     bx, 0bh * 4
  84. jmp     short general_irq_service
  85. irq_0c:         push    bx
  86. mov     bx, 0ch * 4
  87. jmp     short general_irq_service
  88. irq_0d:         push    bx
  89. mov     bx, 0dh * 4
  90. jmp     short general_irq_service
  91. irq_0e:         push    bx
  92. mov     bx, 0eh * 4
  93. jmp     short general_irq_service
  94. irq_0f:         push    bx
  95. mov     bx, 0fh * 4
  96. ;                jmp     short general_irq_service
  97. General_irq_service:
  98. push    dx
  99. push    ax
  100. push    ds
  101. mov     ax, cs
  102. mov     ds, ax
  103. mov     ax, stack_top
  104. cmp     ax, stack_offs
  105. jbe     dont_switch
  106. mov     dx, ss          
  107. mov     ax, sp
  108. mov     ss, stack_seg
  109. mov     sp, stack_top
  110. push    dx              ; save old SS:SP on new stack
  111. push    ax
  112. mov     ax, stack_size
  113. sub     stack_top, ax
  114. pushf
  115. call    old_vectors[bx]
  116. cli
  117. add     stack_top, ax
  118. pop     ax              ; get stored SS:SP
  119. pop     dx
  120. mov     ss, dx          ; switch back to old stack
  121. mov     sp, ax
  122. pop     ds              ; restore registers and return
  123. pop     ax              
  124. pop     dx          
  125. pop     bx
  126. iret
  127. dont_switch:    pushf
  128. call    dword ptr old_vectors[bx]
  129. pop     ds
  130. pop     ax
  131. pop     dx
  132. pop     bx
  133. iret
  134. public  _init_stacks
  135. ; VOID    init_stacks(VOID FAR *stack_base, COUNT nStacks, WORD stackSize);
  136. _init_stacks    proc    near
  137. push    bp
  138. mov     bp, sp
  139. push    ds
  140. push    di
  141. push    si
  142. push    cs
  143. pop     ds
  144. mov     bx, [bp+4]
  145. mov     dx, [bp+6]
  146. mov     ax, [bp+8]
  147. mov     cx, [bp+0ah]
  148. mov     stack_size, cx
  149. mov     stack_offs, bx
  150. mov     stack_seg, dx
  151. mul     cx
  152. add     ax, bx
  153. mov     stack_top, ax
  154. xor     ax, ax
  155. mov     ds, ax
  156. push    cs
  157. pop     es
  158. mov     di, offset old_vectors
  159. mov     si, 8 * 4
  160. mov     cx, 10h
  161. rep     movsw
  162. mov     si, 70h * 4
  163. mov     cx, 10h
  164. rep     movsw
  165. push    ds
  166. pop     es
  167.        
  168. mov     di, 8 * 4
  169. mov     dx, offset irq_0
  170. call    set_vect
  171. mov     di, 70h * 4
  172. call    set_vect
  173. pop     si
  174. pop     di
  175. pop     ds
  176. pop     bp
  177. ret
  178. _init_stacks    endp
  179. set_vect        proc
  180. mov     cx, 8
  181. set_next:       mov     ax, dx
  182. cli
  183. stosw
  184. mov     ax, cs
  185. stosw
  186. sti
  187. add     dx, offset irq_1 - offset irq_0
  188. loop    set_next
  189. ret
  190. set_vect        endp
  191. _TEXT           ENDS
  192. end