Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

278 lines
10 KiB

  1. DEBUG equ 1
  2. No_DOSX_Bimodal_Services = 1
  3. IFDEF No_DOSX_Bimodal_Services
  4. %OUT generating code to handle ints without Bimodal Interrupt Services for DOSX
  5. ENDIF
  6. wo equ word ptr
  7. by equ byte ptr
  8. MAXLPT equ 2 ;3 LPTs supported (LPT1,2,3)
  9. ifdef NEC_98
  10. MAXCOM equ 4 ;5 COMs supported (COM1,2,3,4,5) ;ins 95.03.25 KBNES
  11. else ; NEC_98
  12. MAXCOM equ 3 ;4 COMs supported (COM1,2,3,4)
  13. endif ; NEC_98
  14. RS232B equ 0h ;RS232 Card(s) I/O addr 40:Save area.
  15. LPTB equ 8h ;LPT Card(s) I/O addr 40:Save area.
  16. IRQ3 equ 0bh ; Int vector for Com card @ 2xxh
  17. IRQ4 equ 0ch ; Int vector for Com card @ 3xxh
  18. INTA0 equ 20h ;X'20' 8259 Interrupt Control Port
  19. INTA1 equ 21h ;X'21' 8259 Interrupt Mask Port
  20. EOI equ 20h ;X'20' 8259 End-of-Interrupt ack
  21. Open equ 0201h ;Int 2F open request
  22. Close equ 0202h ;Int 2F close request
  23. Lock2F equ 0203h ;Int 2F lock request
  24. Unlock2F equ 0204h ;Int 2F unlock request
  25. ; COMDEB - Communications Device Equipment Block.
  26. ;
  27. ; This is essentially a superset of the DCB used outside of this
  28. ; module. The DCB is contained within the DEB as the first fields.
  29. ; The fields which follow are data and status fields which
  30. ; are unique to this implementation.
  31. ;
  32. ; AltQInAddr and AltQOutAddr are alternate queue pointers which are used when
  33. ; in "supervisor" mode. Supervisor mode is a processor mode other than the
  34. ; one which Windows normally runs in. In standard mode Windows, supervisor
  35. ; mode is REAL mode. In enhanced mode Windows, supervisor mode is RING 0
  36. ; protected mode. For more details see comments in IBMINT.ASM.
  37. ComDEB struc ;RS232 Data Equip Block
  38. ComDCB db ((DCBSize+1) and 0FFFEh) DUP (0)
  39. ComErr dw 0 ;Non-zero if I/O error
  40. Port dw 0 ;Base I/O Address
  41. NotifyHandle dw 0
  42. NotifyFlags dw 0
  43. RecvTrigger dw -1 ; char count threshold for calling
  44. SendTrigger dw 0 ; char count threshold for calling
  45. ; The following fields are specific to com ports only
  46. IRQhook dw 0 ; ptr to IRQ_Hook_Struc
  47. NextDEB dw 0 ; ptr to next DEB that is sharing IRQ
  48. XOffPoint dw 0 ;Q count where XOff is sent
  49. EvtMask dw 0 ;Mask of events to check for
  50. EvtWord dw 0 ;Event flags
  51. QInAddr dd 0 ;Address of the queue
  52. AltQInAddr dd 0 ; Addr of queue in "supervisor" mode
  53. QInSize dw 0 ;Length of queue in bytes
  54. QOutAddr dd 0 ;Address of the queue
  55. AltQOutAddr dd 0 ; Addr of queue in "supervisor" mode
  56. QOutSize dw 0 ;Length of queue in bytes
  57. QInCount dw 0 ;Number of bytes currently in queue
  58. QInGet dw 0 ;Offset into queue to get bytes from
  59. QInPut dw 0 ;Offset into queue to put bytes in
  60. QOutCount dw 0 ;Number of bytes currently in queue
  61. QOutGet dw 0 ;Offset into queue to get bytes from
  62. QOutPut dw 0 ;Offset into queue to put bytes in
  63. EFlags db 0 ;Extended flags
  64. MSRShadow db 0 ;Modem Status Register Shadow
  65. ErrorMask db 0 ;Default error-checking mask
  66. RxMask db 0 ;Character mask
  67. ImmedChar db 0 ;Char to be transmitted immediately
  68. HSFlag db 0 ;Handshake flag
  69. HHSLines db 0 ;8250 DTR/RTS bits for handshaking
  70. OutHHSLines db 0 ;Lines that must be high to output
  71. MSRMask db 0 ;Mask of Modem Lines to check
  72. MSRInfinite db 0 ;Mask of MSR lines that must be high
  73. IntVecNum db 0 ;Interrupt vector number
  74. LSRShadow db 0 ;Line Status Register shadow
  75. QOutMod dw 0 ;characters sent mod xOnLim ENQ/ETX [rkh]
  76. VCD_data dd 0
  77. VCDflags db 0
  78. MiscFlags db 0 ;still more flags
  79. ifdef NEC_98
  80. TimerProcAdr dw 0 ; System Timer Procesor Ins 940923 KBNES
  81. TimerHandle dw 0 ; System Timer Handle Ins 940923 KBNES
  82. hTimer dw 0 ;Timer Handle Flag Ins 940923 KBNES
  83. endif ; NEC_98
  84. ComDEB ends
  85. .errnz (SIZE ComDEB) and 1
  86. .errnz MSRShadow - EvtWord - 35
  87. ; In 3.0 MSRShadow had this relationship to EvtWord and major COM apps all
  88. ; use this offset of 35 to get to MSRShadow so that they can determine the
  89. ; current status of the Modem Status bits. We need to maintain this offset
  90. ; so that these apps will continue to run.
  91. ; The LptDEB is identical to the ComDEB structure, except
  92. ; all the COM port specific stuff has been removed (which
  93. ; convientiently was stored at the end so offsets would
  94. ; be correct). This allows the code to act indifferently
  95. ; when accessing the strucutres for things like the port.
  96. LptDEB struc
  97. xComDCB db ((DCBSize+1) AND 0FFFEh) dup (0)
  98. xComErr dw 0 ;Non-zero if I/O error
  99. xPort dw 0 ;Base I/O Address
  100. xNotifyHandle dw 0
  101. xNotifyFlags dw 0
  102. xRecvTrigger dw -1 ; char count threshold for calling
  103. xSendTrigger dw 0 ; char count threshold for calling
  104. BIOSPortLoc dw 0 ;Offset to port location (i.e. 40:0)
  105. LptDEB ends
  106. .errnz xComDCB-ComDCB
  107. .errnz xComErr-ComErr
  108. .errnz xPort-Port
  109. .errnz xNotifyHandle-NotifyHandle
  110. .errnz xNotifyFlags-NotifyFlags
  111. .errnz xRecvTrigger-RecvTrigger
  112. .errnz xSendTrigger-SendTrigger
  113. ; flag equates in EFlags
  114. fUseDSR equ 00000001b ; set, if DSR is significant
  115. fNoFIFO equ 00000010b ; set, if no FIFO on port
  116. fFIFOchkd equ 00000100b ; set, if FIFO has been checked
  117. fFIFOpre equ 00001000b ; FIFO enabled when port opened
  118. ;fEOF equ 00100000b ; defined in comdev.inc
  119. ;fTxImmed equ 01000000b ; defined in comdev.inc
  120. fEFlagsMask equ fUseDSR OR fFIFOpre OR fFIFOchkd OR fNoFIFO ; flags which shouldn't be cleared
  121. .errnz fEFlagsMask AND (fEOF OR fTxImmed) ;can't overlap with either of the bits
  122. ; that are folded into COMS_BitMask1
  123. ; Values for NotifyFlags
  124. ;
  125. CN_RecvSent equ CN_RECEIVE SHL 8
  126. CN_TransSent equ CN_TRANSMIT SHL 8
  127. CN_Idle equ 10000000b
  128. CN_Notify equ 01000000b
  129. NotifyFlagsLO equ byte ptr NotifyFlags
  130. NotifyFlagsHI equ byte ptr NotifyFlags+1
  131. ; Values for the handshake flag
  132. ;
  133. ; BreakSet - True if break was set - stops transmission
  134. ; XOffSent - True if we have sent the XOff character
  135. ; XOffPending - True if XOff character needs to be sent
  136. ; XOnPending - True if XOn character needs to be sent
  137. ; HHSDown - True if host dropped required hardware lines
  138. ; HHSDropped - True if we dropped our hardware handshake lines
  139. ; XOffReceived - True if XOff received from host
  140. ; HSPending - Mask to return non-zero if XOn or Xoff must be sent
  141. ; HSReceived - Mask to return non-zero if handshake has been
  142. ; received from host stopping transmission
  143. ; CannotXmit - Mask to return non-zero if any condition
  144. ; exists which prevents us from tranmitting.
  145. ; HSSent - Mask to return non-zero if we sent a handshake
  146. XOffPending equ 00000001b ;XOff needs to be sent
  147. EnqPending equ 00000001b ;Enq needs to be sent [rkh]
  148. EtxPending equ 00000001b ;Etx needs to be sent
  149. HHSDropped equ 00000010b ;Our hardware handshake lines are down
  150. XOnPending equ 00000100b ;XOn needs to be sent
  151. AckPending equ 00000100b ;Ack needs to be sent (ENQ/ACK & ETX/ACK)
  152. XOffReceived equ 00001000b ;XOff character received
  153. EnqSent equ 00001000b ;Enq has been sent
  154. EtxSent equ 00001000b ;Etx has been sent
  155. XOffSent equ 00010000b ;XOff has been sent
  156. EnqReceived equ 00010000b ;Enq character received (ENQ/ACK)
  157. EtxReceived equ 00010000b ;Etx character received (ETX/ACK)
  158. HHSDown equ 00100000b ;Host hardware handshake lines are down
  159. BreakSet equ 01000000b ;Break has been set
  160. HHSAlwaysDown equ 10000000b ;set if host handshake lines were never
  161. ; detected high
  162. HSPending equ XOffPending+XOnPending
  163. HSReceived equ XOffReceived+HHSDown
  164. HSSent equ XOffSent+HHSDropped
  165. CannotXmit equ HSPending+HSReceived+BreakSet
  166. ; values for MiscFlags
  167. Discard equ 00000001b ;Discard recevied data
  168. iodelay macro ;;macro to insure that an instruction
  169. ifdef NEC_98
  170. out 05fh,al ;PC-98 IO rec.
  171. else ; NEC_98
  172. jmp $+2 ;; fetch occurs between IN and/or OUT
  173. jmp $+2 ;; instructions on the PC-AT machine
  174. endif ; NEC_98
  175. endm
  176. TimeoutError equ -2 ;Timeout error code for $TRMCOM
  177. Timeout equ 30 ;30 second timeout
  178. DELAY_TIME equ 200 ;Delay at least 200 milliseconds
  179. ; Status bits returned from the BIOS for LPT ports
  180. PS_NotBusy equ 10000000b ;Printer not busy
  181. PS_Ack equ 01000000b ;Data acknowledged
  182. PS_PaperOut equ 00100000b ;Out of paper
  183. PS_Select equ 00010000b ;Device is selected
  184. PS_IOError equ 00001000b ;IO error
  185. PS_Timeout equ 00000001b ;Timeout occured
  186. ; status bit defines for LPT
  187. L_BITS equ 0F8h ; the status bits we want
  188. L_BITS_INVERT equ 048h ; must invert to match BIOS
  189. L_DEVBUSY equ 080h ; device busy bit
  190. L_TIMEOUT equ 001h ; timeout bit
  191. ; control bit defines for LPT
  192. L_NORMAL equ 00Ch ; normal state: selected, no reset
  193. L_RESET equ 008h ; reset state
  194. L_STROBE equ 00Dh ; tell printer we have char
  195. IRQ_Hook_Struc struc
  196. IRQn db 0
  197. HookCnt db 0
  198. OldMask db 0
  199. VecN db 0FFh
  200. HandlerOff dw 0
  201. First_DEB dw 0
  202. OldIntVec dd 0
  203. IFDEF No_DOSX_Bimodal_Services
  204. RM_OldIntVec dd 0
  205. RM_HandlerOff dw 0
  206. ENDIF
  207. IRQ_Hook_Struc ends
  208. IFDEF No_DOSX_Bimodal_Services
  209. include int31.inc
  210. Get_RM_IntVector equ (Int31_Int_Serv SHL 8) + Int_Get_Real_Vec
  211. Set_RM_IntVector equ (Int31_Int_Serv SHL 8) + Int_Set_Real_Vec
  212. ENDIF
  213. ;
  214. ; flag bits for VCDflags
  215. ;
  216. fCOM_ignore_ints equ 00000001b