sccvec.s
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. ; Modified from the PE1CHL version to work with NOS.
  2. ; This file cannot be used with the PE1CHL sources.
  3. ; 1/21/90
  4. ; Ken Mitchum, KY3B   km@speedy.cs.pitt.edu km@cadre.dsl.pitt.edu
  5. ; SCC interrupt handler for IBM-PC
  6. include asmglobal.h
  7. extrn Stktop,Spsave,Sssave,doret:proc,scctim:proc,eoi:proc
  8. extrn porg:proc
  9. extrn Sccvecloc,Sccpolltab,Sccmaxvec:byte
  10. ifdef LARGEDATA
  11. extrn Sccchan:dword
  12. else
  13. extrn Sccchan:word
  14. endif
  15. .CODE
  16. dbase dw @Data ; save loc for ds (must be in code segment)
  17. ; sccvec is the interrupt handler for SCC interrupts using INTACK
  18. public sccvec
  19. label sccvec far
  20. cli ; this code is not re-entrant, so make sure it
  21. ; is not interrupted. some multi-taskers
  22. ; intercept interrupt handlers, so be careful!
  23. cld
  24. push ds ; save on user stack
  25. mov ds,cs:dbase
  26. mov Sssave,ss ; stash user stack context
  27. mov Spsave,sp
  28. mov ss,cs:dbase ; set up interrupt stack
  29. lea sp,Stktop
  30. PUSHALL
  31. push es
  32. call eoi
  33. ifndef LARGEDATA
  34. mov es,ax ; small data assumes ES == DS
  35. endif
  36. cld ; in case "movsb" or "movsw" is used
  37. ; Read SCC interrupt vector and check it
  38. sccint: mov dx,Sccvecloc
  39. out dx,al ; Generate INTACK
  40. jmp short d1 ; Delay
  41. d1: jmp short d2
  42. d2: jmp short d3
  43. d3: in al,dx ; Read the vector
  44. cmp al,Sccmaxvec ; Check for a legal vector
  45. jnc clrret ; It should not be >= the maximum
  46. ; If it is, ignore the interrupt
  47. ; Extract channel number and status from vector. Determine handler address.
  48. mov bl,al ; Copy vector (need it later for status)
  49. shr bl,1 ; Discard least significant bit
  50. jc clrret ; It should not be a 1
  51. and bx,7ch ; Isolate channel number (and make word)
  52. xor bl,04h ; Toggle A/B channel bit
  53. ifdef LARGEDATA
  54. les si,Sccchan[bx] ; Read address of channel structure
  55. else
  56. shr bl,1 ; Discard another bit
  57. mov si,Sccchan[bx] ; Read address of channel structure
  58. endif
  59. ifdef LARGEDATA ; Test for NULL
  60. push ax
  61. mov ax,es
  62. test ax,ax
  63. pop ax
  64. jne nn0
  65. endif
  66. test si,si ; Test for NULL
  67. je clrret ; No channel struct, ignore it
  68. nn0:
  69. and ax,06h ; Isolate status info from vector
  70. add ax,ax ; Make index in FAR PTR array
  71. mov bx,ax ; It must be in BX
  72. ; Call the handler (defined in C), with Sccchan struct as a parameter
  73. push es
  74. push si ; Put channel struct as a parameter
  75. ifdef LARGEDATA
  76. call dword ptr es:[bx+si] ; Call the handler
  77. else
  78. call dword ptr [bx+si] ; Call the handler
  79. endif
  80. pop si ; Get channel struct back
  81. pop es
  82. ; Reset highest priority interrupt
  83. ifdef LARGEDATA
  84. mov dx,es:16[si] ; Get control register address
  85. else
  86. mov dx,16[si] ; Get control register address
  87. endif
  88. mov al,38h ; "Reset Highest IUS" opcode
  89. out dx,al ; to WR0
  90. jmp short d4 ; settling delay
  91. d4: jmp short d5
  92. d5:
  93. ; Determine if more interrupt requests are coming in from the SCCs
  94. jmp sccint ; keep trying until no vector returned
  95. ; Clear the ISR bit in the PIC and return from interrupt
  96. clrret:
  97. mov ax,0 ; clear chain vector value (4/92 KA9Q)
  98. mov dx,0
  99. jmp doret ; execute code in pcint.asm
  100. ; sccvec endproc
  101. ; sccnovec is the interrupt handler for SCC interrupts using polling
  102. public sccnovec
  103. label sccnovec far
  104. cli ; this code is not re-entrant, so make sure it
  105. ; is not interrupted. some multi-taskers
  106. ; intercept interrupt handlers, so be careful!
  107. push ds ; save on user stack
  108. mov ds,cs:dbase
  109. mov Sssave,ss ; stash user stack context
  110. mov Spsave,sp
  111. mov ss,cs:dbase ; set up interrupt stack
  112. lea sp,Stktop
  113. PUSHALL
  114. push es
  115. call eoi
  116. ifndef LARGEDATA
  117. mov es,ax ; small data assumes ES == DS
  118. endif
  119. cld ; in case "movsb" or "movsw" is used
  120. ; Find the SCC generating the interrupt by polling all attached SCCs
  121. ; reading RR3A (the interrupt pending register)
  122. sccintnv:
  123. lea si,Sccpolltab ; Point to polling table
  124. sccpoll:
  125. mov dx,[si] ; Get chan A CTRL address
  126. inc si
  127. inc si
  128. test dx,dx ; End of table without finding it
  129. je clrret ; Then return from interrupt
  130. mov al,3 ; Select RR3A
  131. out dx,al
  132. jmp short d6 ; Delay
  133. d6: jmp short d7
  134. d7: jmp short d8
  135. d8: in al,dx
  136. test al,al ; Test if a nonzero IP here
  137. jnz sccip ; Yes, handle it
  138. inc si ; No, next A CTRL
  139. inc si
  140. jmp sccpoll
  141. ; Read SCC interrupt vector from RR2B, it should always be correct
  142. ; Extract channel number and status from vector. Determine handler address.
  143. sccip: mov dx,[si] ; Read B CTRL address
  144. mov al,2 ; Select RR2B
  145. out dx,al
  146. jmp short d9 ; Delay
  147. d9: jmp short d10
  148. d10: jmp short d11
  149. d11: in al,dx ; Read the vector
  150. mov bl,al ; Copy vector (need it later for status)
  151. shr bl,1 ; Discard least significant bit
  152. and bx,7ch ; Isolate channel number (and make word)
  153. xor bl,04h ; Toggle A/B channel bit
  154. ifdef LARGEDATA
  155. les si,Sccchan[bx]
  156. else
  157. shr bl,1 ; Discard another bit (Sccchan=words)
  158. mov si,Sccchan[bx] ; Read address of channel structure
  159. endif
  160. ifdef LARGEDATA ; Test for NULL
  161. push ax
  162. mov ax,es
  163. test ax,ax
  164. pop ax
  165. jne nn1
  166. endif
  167. test si,si ; Test for NULL
  168. je clrret ; No channel struct, ignore it
  169. nn1:
  170. and ax,06h ; Isolate status info from vector
  171. add ax,ax ; Make index in FAR PTR array
  172. mov bx,ax ; It must be in BX
  173. ; Call the handler (defined in C), with Sccchan struct as a parameter
  174. push es
  175. push si ; Put channel struct as a parameter
  176. ifdef LARGEDATA
  177. call dword ptr es:[bx+si] ; Call the handler
  178. else
  179. call dword ptr [bx+si] ; Call the handler
  180. endif
  181. pop si ; Remove parameter from stack
  182. pop es
  183. ; Check for more interrupt pending bits
  184. jmp sccintnv
  185. ; sccnovec endproc
  186. end