home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / MSDOS / NCSA / TEL2307S.ZIP / NET14 / INT14.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-11-19  |  33.5 KB  |  1,045 lines

  1.         page 60,132
  2. ;
  3. ;  Int 14h support routines
  4. ;****************************************************************************
  5. ;*                                                                          *
  6. ;*                                                                          *
  7. ;*      part of NCSA Telnet                                                 *
  8. ;*      by Tim Krauskopf, VT100 by Gaige Paulsen, Tek by Aaron Contorer     *
  9. ;*          Kurt Mahan, Heeren Pathak, Quincey Koziol, & Chris Wilson       *
  10. ;*                                                                          *
  11. ;*      National Center for Supercomputing Applications                     *
  12. ;*      152 Computing Applications Building                                 *
  13. ;*      605 E. Springfield Ave.                                             *
  14. ;*      Champaign, IL  61820                                                *
  15. ;*                                                                          *
  16. ;****************************************************************************
  17. ;*                                                                *
  18. ;* DATE                   REASON                      DEVELOPER   *
  19. ;* ----                   ------                      ---------   *
  20. ;* 01/03/92   Update the timer ISR to prevent lock ups    LJD     *
  21. ;*                                                                *
  22. ;******************************************************************
  23.  
  24. ;
  25.     NAME    INT14
  26. ;Microsoft EQU 1
  27. ;Lattice EQU 1
  28.     ifndef Microsoft
  29.         ifndef Lattice
  30.             if2
  31.                 %out
  32.                 %out ERROR: You have to specify "/DMicrosoft" or "/DLattice" on the
  33.                 %out         MASM command line to determine the type of assembly.
  34.                 %out
  35.             endif
  36.             end
  37.         endif
  38.     endif
  39. ;
  40. ;******************************************************************
  41. ;*
  42. ;*    We need to set up a stack for netsleep when we exit to DOS.
  43.  
  44. X   EQU     6
  45. PORT    EQU 1
  46.  
  47. ifdef Microsoft
  48. .8086
  49. .MODEL    LARGE
  50. .DATA
  51. else
  52.     INCLUDE    DOS.MAC
  53.     SETX
  54.     DSEG
  55. endif
  56.     even
  57. TIM_OLDSS           dw ?
  58. TIM_OLDSP           dw ?
  59. ifndef Watcom
  60. TIM_OLDSTKHQQ       dw 0
  61. endif
  62.  
  63. SER_OLDSS           dw ?
  64. SER_OLDSP           dw ?
  65. ifndef Watcom
  66. SER_OLDSTKHQQ       dw 0
  67. endif
  68.  
  69.     even            ; Align the stack on an even boundary
  70. SER_NEWSTACK dw 1024 dup(?)     ; define a stack for netsleep when we shell to DOS
  71. SER_STCK label word
  72.  
  73. ;/* rmg  Added TIMstack.  Having both interrupts use the same stack didn't
  74. ;                         look completely safe.  I could be wrong.  931100
  75.     even            ; Align the stack on an even boundary
  76. TIM_NEWSTACK dw 1024 dup(?)     ; define a stack for netsleep when we shell to DOS
  77. TIM_STCK label word
  78.  
  79. ifndef Watcom
  80. extrn _STKHQQ:word           ; Microsoft heap/stack bound
  81. endif
  82.  
  83. NUM_COMM_PORTS  EQU     4
  84.  
  85. ifdef Microsoft
  86. ifdef QAK
  87. PUBLIC  _INITIALIZED_FLAGS
  88. endif
  89. PUBLIC  _CONNECTED_FLAGS
  90. PUBLIC  _PORT_BUFFER
  91. ifdef QAK
  92. PUBLIC  _OPENING_FLAGS       ; FOR DEBUGGING
  93. PUBLIC  _BUFFER_OFFSET       ; FOR DEBUGGING
  94. endif
  95. PUBLIC  _PNUM,_DATA_BEGIN,_DATA_MAX,_DATA_END,_DATA_START
  96. EXTRN   _PRINT_INT:PROC         ; FOR DEBUGGING
  97. EXTRN   _PRINT_INT2:PROC        ; FOR DEBUGGING
  98. EXTRN   _GET_COMM_CHAR:PROC     ; GET A CHARACTER FROM A COMM BUFFER
  99. EXTRN   _NETCLOSE:PROC          ; EXTERNAL PROCEDURE TO CLOSE A CONNECTION
  100. EXTRN   _NETWRITE:PROC          ; EXTERNAL PROCEDURE TO WRITE TO A CONNECTION
  101. EXTRN   _INT14OPEN:PROC         ; EXTERNAL PROCEDURE TO OPEN A CONNECTION
  102. EXTRN   _SPEEDUP:WORD           ; EXTERNAL TIMER SPEEDUP FACTOR
  103.  
  104. _PNUM   DW NUM_COMM_PORTS DUP(0)    ; PORT WE ARE CONNECTED TO
  105.  
  106. ifdef QAK
  107. _INITIALIZED_FLAGS DB 0         ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  108.                                 ; COMM. PORT IS INITIALIZED (BIT 0 IS COMM PORT
  109.                                 ; 0, BIT 1 IF COMM. PORT 1, ETC..)
  110. endif
  111. _CONNECTED_FLAGS DB 0           ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  112.                                 ; COMM. PORT IS CONNECTED (BIT 0 IS COMM PORT
  113.                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  114. _OPENING_FLAGS DB 0             ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  115.                                 ; COMM. PORT IS OPENING (BIT 0 IS COMM PORT
  116.                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  117. _PORT_BUFFER    DB  NUM_COMM_PORTS DUP (64 DUP (0)) ; SPECIFY THE FOUR BUFFERS FOR THE CONNECTION NAMES
  118. _BUFFER_OFFSET  DB  NUM_COMM_PORTS DUP (0)   ; THE OFFSETS INTO THE FOUR PORT BUFFERS
  119. _CHAR_TO_SEND   DB 0            ; SPACE TO STORE THE CHARACTER TO SEND ON THE NET
  120. _DATA_BEGIN     DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE BEGINNING OF
  121.                                 ;   THE DATA BUFFER FOR EACH COMM. PORT
  122. _DATA_END       DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE END OF
  123.                                 ;   THE DATA BUFFER FOR EACH COMM. PORT
  124. _DATA_MAX       DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE MAX OF
  125.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  126. _DATA_START     DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE START OF
  127.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  128. _CLOCK_TICK     DW  0           ;   The number of clock ticks which have elapsed
  129. else
  130. PUBLIC  CONNECTED_FLAGS
  131. PUBLIC  PORT_BUFFER
  132. ifdef QAK
  133. PUBLIC  INITIALIZED_FLAGS
  134. PUBLIC  OPENING_FLAGS       ; FOR DEBUGGING
  135. PUBLIC  BUFFER_OFFSET       ; FOR DEBUGGING
  136. endif
  137. PUBLIC  PNUM,DATA_BEGIN,DATA_MAX,DATA_END,DATA_START
  138. EXTRN   PRINT_INT:PROC          ; FOR DEBUGGING
  139. EXTRN   PRINT_INT2:PROC         ; FOR DEBUGGING
  140. EXTRN   GET_COMM_CHAR:PROC      ; GET A CHARACTER FROM A COMM BUFFER
  141. EXTRN   NETCLOSE:PROC           ; EXTERNAL PROCEDURE TO CLOSE A CONNECTION
  142. EXTRN   NETWRITE:PROC           ; EXTERNAL PROCEDURE TO WRITE TO A CONNECTION
  143. EXTRN   INT14OPEN:PROC          ; EXTERNAL PROCEDURE TO OPEN A CONNECTION
  144. EXTRN   SPEEDUP:WORD            ; EXTERNAL TIMER SPEEDUP FACTOR
  145. PNUM   DW NUM_COMM_PORTS DUP(0)             ; PORT WE ARE CONNECTED TO
  146.  
  147. ifdef QAK
  148. INITIALIZED_FLAGS DB 0          ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  149.                                 ; COMM. PORT IS INITIALIZED (BIT 0 IS COMM PORT
  150.                                 ; 0, BIT 1 IF COMM. PORT 1, ETC..)
  151. endif
  152. CONNECTED_FLAGS DB 0            ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  153.                                 ; COMM. PORT IS CONNECTED (BIT 0 IS COMM PORT
  154.                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  155. OPENING_FLAGS DB 0              ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  156.                                 ; COMM. PORT IS OPENING (BIT 0 IS COMM PORT
  157.                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  158. PORT_BUFFER     DB  NUM_COMM_PORTS DUP (64 DUP (0)) ; SPECIFY THE FOUR BUFFERS FOR THE CONNECTION NAMES
  159. BUFFER_OFFSET   DB  NUM_COMM_PORTS DUP (0)   ; THE OFFSETS INTO THE FOUR PORT BUFFERS
  160. CHAR_TO_SEND    DB 0             ; SPACE TO STORE THE CHARACTER TO SEND ON THE NET
  161. DATA_BEGIN      DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE BEGINNING OF
  162.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  163. DATA_END        DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE END OF
  164.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  165. DATA_MAX        DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE MAX OF
  166.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  167. DATA_START      DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE START OF
  168.                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  169. CLOCK_TICK      DW  0           ;   The number of clock ticks which have elapsed
  170. endif
  171.  
  172. ifdef Microsoft
  173. .CODE
  174. else
  175.     ENDDS
  176.     PSEG
  177. endif    
  178. ;
  179. ;**************************************************************************
  180. ;
  181. ;  Routines to install and deinstall a routine which manages the
  182. ;       serial port
  183. ;
  184. ;
  185. SERIALINT     EQU 4*14H       ; User hook to timer int
  186.  
  187. ifdef Microsoft
  188.     PUBLIC  _INT14INST,_INT14DEINST
  189. ifdef DEBUG
  190.     PUBLIC  _INT14CHECK,_INT14RECEIVE
  191. endif
  192.     EXTRN   _int14netsleep:FAR   ; C routine which gets called from handler
  193.     PUBLIC  _TIMEINST,_TIMEDEINST
  194. else    
  195.     PUBLIC  INT14INST,INT14DEINST
  196. ifdef DEBUG
  197.     PUBLIC  INT14CHECK,INT14RECEIVE
  198. endif
  199.     EXTRN   int14netsleep:FAR   ; C routine which gets called from handler
  200.     PUBLIC  TIMEINST,TIMEDEINST
  201. endif   
  202. ;
  203. ;**************************************************************************
  204. ;
  205. ;  Routines to install and deinstall a timer routine which calls
  206. ;  netsleep(0);
  207. ;  The timer is set to go off every 1/18 second to check for packets
  208. ;  in the incoming packet buffer.  We use the user-hook into the system 
  209. ;  timer which occurs every 1/18th of a second.
  210. ;
  211. ;
  212. TIMEINT        EQU    4*1CH        ; User hook to timer int
  213.  
  214. ;*************************************************************************
  215. ;
  216. ;  Take out the timer interrupt handler, restore previous value
  217. ;
  218. ifdef Microsoft
  219. _TIMEDEINST    PROC    FAR
  220. else
  221. TIMEDEINST PROC    FAR
  222. endif
  223. ;
  224. ;$$$ 01-05-1992 LJD + Stop using the timer routine. !!! THIS NEEDS FURTHER TESTING. !!!!
  225. ;
  226.     pushf
  227.     cli
  228.     mov    CS:INTENTER,-1        ; Prevent use of the timer routine while removing it from the system
  229.     popf
  230. ;
  231. ;$$$ 01-05-1992 LJD -
  232. ;
  233.  
  234.     MOV        CX,CS:TIP        ; GET OLD IP FROM SAVE SPOT
  235.     MOV        DX,CS:TCS        ; GET OLD CS FROM SAVE SPOT
  236.     MOV        BX,TIMEINT        ; INTERRUPT IN TABLE FOR TIMER
  237.  
  238.     PUSH    DS
  239.     XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  240.     MOV        DS,AX        
  241.  
  242.     PUSHF                    ; $$$ 01-03-92 LJD +-
  243.     CLI
  244.  
  245.     MOV        [BX],CX            ; STORE OLD IP INTO THE TABLE
  246. ;
  247. ;$$$ 01-03-1992 ljd +
  248. ;
  249. ;    INC        BX
  250. ;    INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  251. ;    MOV        [BX],DX            ; STORE OLD CS INTO THE TABLE
  252.     MOV        [BX+2],DX            ; STORE OLD CS INTO THE TABLE
  253.  
  254.     POPF
  255. ;    STI
  256. ;
  257. ;$$$ 01-03-1992 LJD -
  258. ;
  259.     POP        DS
  260.     RET
  261. ifdef Microsoft
  262. _TIMEDEINST    ENDP
  263. else
  264. TIMEDEINST ENDP
  265. endif
  266.  
  267. ;
  268. ;
  269. ;  install the timer interrupt handler, the handler is technically
  270. ;  part of this procedure.
  271. ;
  272. ifdef Microsoft
  273. _TIMEINST  PROC    FAR
  274. else
  275. TIMEINST   PROC    FAR
  276. endif
  277.     XOR        AX,AX
  278.     MOV     CS:INTENTER,AL    ; CLEAR THIS FLAG
  279.     MOV     CS:_TMYDS,DS    ; STORE FOR USE BY HANDLER
  280.     MOV        BX,TIMEINT        ; INTERRUPT IN TABLE FOR TIMER (1c)
  281.  
  282.     PUSH    DS
  283.     XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  284.     MOV        DS,AX        
  285.     MOV        AX,OFFSET THAND    ; WHERE THE HANDLER IS
  286. ;
  287. ;$$$ 01-03-1992 ljd +
  288. ;    
  289.     PUSHF                    ; save the current flag states
  290.     CLI
  291.  
  292.     MOV        DX,[BX]            ; KEEP COPY OF THE IP
  293.     MOV        [BX],AX            ; STORE IP INTO THE TABLE
  294. ;    INC        BX
  295. ;    INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  296. ;    MOV        CX,[BX]            ; KEEP COPY OF THE CS, TOO
  297.     MOV        CX,[BX+2]            ; KEEP COPY OF THE CS, TOO
  298.  
  299.     MOV        AX,CS
  300.     MOV        [BX+2],AX            ; STORE NEW CS INTO THE TABLE
  301.  
  302.     POPF                    ; restore the int. flag to what it was originally
  303. ;    STI
  304. ;
  305. ;$$$ 01-03-1992 LJD -
  306. ;
  307.     POP    DS
  308.     MOV    CS:TIP,DX            ; STORE THEM AWAY
  309.     MOV    CS:TCS,CX
  310.     RET
  311. ;
  312. ;  Code segment addressable data for keeping track of the interrupt handler
  313. ;  stuff
  314. ;
  315. ;PUBLIC  _TMYDS
  316. _TMYDS      DW  00H         ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
  317. TICNT        DB    0            ; COUNTER OF 1/18THS SEC
  318. INTENTER    DB  00
  319. TIP          DW  00
  320. TCS          DW  00
  321. ;
  322. ;   The handler itself.
  323. ;
  324. ;$$$ 01-03-1992 ljd + Serious modifications made!
  325. ;
  326. THAND:                           ; not a public name, only handles ints
  327.     cli                ; make sure interrupts are off!
  328.     push    ax
  329.     push    ds
  330.     push    es
  331.  
  332. ;
  333. ; Call the routine we replaced  to proceed with chaining process.
  334. ; (Properly simulate the INT instruction.)
  335. ;
  336.     pushf
  337.     cli
  338.     call    dword ptr cs:tip
  339.  
  340.     cli                    ; disable interrupts
  341.  
  342.     CLD                        ; SET THE DIRECTION FLAG FORWARD
  343.  
  344.     cmp    cs:intenter,0
  345.     jnz    time2                ; leave if already active
  346.  
  347.     inc    cs:intenter
  348.     
  349. ifdef SLOW
  350.     INC     CS:TICNT
  351.     MOV     AL,CS:TICNT     ; COUNTER FOR US
  352.     AND        AL,7            ; SEE IF # MOD 8 = 0
  353.     JNZ        TSKIP            ; SKIP 7 OUT OF 8 TIMES
  354. endif
  355. ;
  356. ifdef OLD_WAY
  357.     MOV        AL,60H            ; EOI FOR TIMER INT
  358.     OUT        20H,AL            ; LET LOWER INTERRUPTS IN
  359. endif
  360. ;
  361. ;  SET UP CORRECT DS & ES
  362. ;
  363.     MOV     DS,CS:_TMYDS     ; GET CORRECT DS
  364.     MOV     ES,CS:_TMYDS     ; GET CORRECT ES
  365. ;
  366. ;  do we have to set up our own stack here?
  367. ;
  368.     MOV        AX,SS
  369.     MOV     TIM_OLDSS,AX            ; save the stack segment set upon entry
  370.     MOV     TIM_OLDSP,SP            ; save the stack pointer set upon entry
  371. ;
  372. ;                                /* (was SER_STCK)  rmg 931100 */
  373.     MOV     AX,seg DGROUP:TIM_STCK
  374.     MOV     SS,AX                          ; set a new stack segment
  375.     MOV     SP,OFFSET DGROUP:TIM_STCK      ; set a new stack pointer
  376. ;    MOV     AX,seg DGROUP:SER_STCK
  377. ;        MOV     SS,AX                           ; set a new stack segment
  378. ;    MOV     SP,OFFSET DGROUP:SER_STCK   ; set a new stack pointer
  379.  
  380. ifndef Watcom
  381.     mov     ax,_STKHQQ                   ; save old end of stack
  382.     mov     TIM_OLDSTKHQQ,ax
  383.     mov     ax,offset DGROUP:SER_NEWSTACK          ; load new end of stack
  384.     mov     _STKHQQ,ax
  385. endif
  386.     STI                        ; enable interrupts
  387.  
  388.     PUSH    DS
  389.     PUSH     ES
  390.     PUSH    AX
  391.     PUSH    BX
  392.     PUSH    CX
  393.     PUSH    DX
  394.     PUSH    DI
  395.     PUSH    SI
  396.  
  397. ifdef Microsoft
  398.     CALL _int14netsleep
  399. else    
  400.     CALL int14netsleep
  401. endif
  402.  
  403.     POP         SI
  404.     POP        DI
  405.     POP        DX
  406.     POP        CX
  407.     POP        BX
  408.     POP        AX
  409.     POP        ES
  410.     POP        DS
  411.  
  412.  
  413.     cli
  414.     dec    cs:intenter
  415.     jnz    time2
  416.  
  417.     MOV     DS,CS:_TMYDS     ; GET CORRECT DS
  418.  
  419.     MOV     AX,TIM_OLDSS
  420.     MOV    SS,AX            ; RESTORE STACK SEGMENT
  421.     MOV     SP,TIM_OLDSP        ; RESTORE STACK POINTER
  422.  
  423. ifndef Watcom
  424.     mov     ax,TIM_OLDSTKHQQ                ; restore end of stack
  425.     mov     _STKHQQ,ax
  426. endif
  427.  
  428. comment #
  429. TSKIP:
  430.     XOR        AL,AL
  431.     MOV     CS:INTENTER,AL    ; REENTER FLAG, DONE NOW
  432. #
  433.  
  434. TIME2:
  435. ;
  436. ;   forward to any other existing routines
  437. ;
  438.     pop    es
  439.     pop    ds
  440.     pop    ax
  441.     IRET
  442. ;
  443. ;$$$ 01-03-1992 ljd -
  444. ;
  445. ifdef Microsoft
  446. _TIMEINST      ENDP
  447. else
  448. TIMEINST       ENDP
  449. endif
  450.  
  451. ifdef DEBUG
  452. ;*************************************************************************
  453. ;
  454. ;  Check the int14 receive status
  455. ;
  456. ifdef Microsoft
  457. _INT14CHECK    PROC    FAR
  458. else
  459. INT14CHECK PROC    FAR
  460. endif
  461.     MOV     AH,3
  462.     MOV     DX,PORT
  463.     INT     14H
  464.     XOR     AL,AL
  465.     RET
  466. ifdef Microsoft
  467. _INT14CHECK    ENDP
  468. else
  469. INT14CHECK ENDP
  470. endif
  471.  
  472. ;*************************************************************************
  473. ;
  474. ;  Get a character from int14
  475. ;
  476. ifdef Microsoft
  477. _INT14RECEIVE    PROC    FAR
  478. else
  479. INT14RECEIVE PROC    FAR
  480. endif
  481.     MOV     AH,2
  482.     MOV     DX,PORT
  483.     INT     14H
  484.     RET
  485. ifdef Microsoft
  486. _INT14RECEIVE   ENDP
  487. else
  488. INT14RECEIVE ENDP
  489. endif
  490. endif
  491.  
  492. ;*************************************************************************
  493. ;
  494. ;  Take out the serial interrupt handler, restore previous value
  495. ;
  496. ifdef Microsoft
  497. _INT14DEINST    PROC    FAR
  498. else
  499. INT14DEINST PROC    FAR
  500. endif
  501.     MOV     CX,CS:SIP       ; GET OLD IP FROM SAVE SPOT
  502.     MOV     DX,CS:SCS       ; GET OLD CS FROM SAVE SPOT
  503.     MOV     BX,SERIALINT    ; INTERRUPT IN TABLE FOR TIMER
  504.     PUSH    DS
  505.     XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  506.     MOV        DS,AX        
  507.     CLI
  508.     MOV        [BX],CX            ; STORE OLD IP INTO THE TABLE
  509.     INC        BX
  510.     INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  511.     MOV        [BX],DX            ; STORE OLD CS INTO THE TABLE
  512.     STI
  513.     POP        DS
  514.     RET
  515. ifdef Microsoft
  516. _INT14DEINST    ENDP
  517. else
  518. INT14DEINST ENDP
  519. endif
  520. ;
  521. ;
  522. ;  install the serial interrupt handler, the handler is technically
  523. ;  part of this procedure.
  524. ;
  525. ifdef Microsoft
  526. _INT14INST  PROC    FAR
  527. else
  528. INT14INST   PROC    FAR
  529. endif
  530.  
  531. ;
  532. ;$$$ 01-05-1992 LJD + Don't do this twice!
  533. ;    XOR        AX,AX
  534. ;    MOV     CS:INTENTER,AL    ; CLEAR THIS FLAG
  535. ;
  536. ;$$$ 01-05-1992 LJD -
  537. ;
  538.     MOV     CS:_SMYDS,DS     ; STORE FOR USE BY HANDLER
  539.     MOV     BX,SERIALINT    ; INTERRUPT IN TABLE FOR TIMER (1c)
  540.     PUSH    DS
  541.     XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  542.     MOV        DS,AX        
  543.     MOV     AX,OFFSET SHAND ; WHERE THE HANDLER IS
  544.     CLI
  545.     MOV        DX,[BX]            ; KEEP COPY OF THE IP
  546.     MOV        [BX],AX            ; STORE IP INTO THE TABLE
  547.     INC        BX
  548.     INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  549.     MOV        CX,[BX]            ; KEEP COPY OF THE CS, TOO
  550.     MOV        AX,CS
  551.     MOV        [BX],AX            ; STORE NEW CS INTO THE TABLE
  552.     STI
  553.     POP    DS
  554.     MOV CS:SIP,DX           ; STORE THEM AWAY
  555.     MOV CS:SCS,CX
  556.     RET
  557. ;
  558. ;  Code segment addressable data for keeping track of the interrupt handler
  559. ;  stuff
  560. ;
  561. ;PUBLIC  _SMYDS
  562. _SMYDS       DW  00H         ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
  563. SICNT       DB  0           ; COUNTER OF 1/18THS SEC
  564. ;SENTER      DB  00
  565. SIP         DW  00
  566. SCS         DW  00
  567. ;
  568. ;   The handler itself.
  569. ;
  570. ;$$$ 01-05-1992 LJD + Modify to protect protocol layer from reentrancy problems
  571. ;
  572. ;
  573. SHAND:                      ; not a public name, only handles ints
  574.     cli            ; make sure interrupts are off
  575.     PUSH    DS
  576.     PUSH     ES
  577.     PUSH    AX
  578.     PUSH    BX
  579.     PUSH    CX
  580.     PUSH    DX
  581.     PUSH    DI
  582.     PUSH    SI
  583.  
  584.     CLD            ; ALL MOVES WILL BE FORWARD
  585. TRYAGAIN:
  586.     cmp    cs:intenter,0
  587.     jz    no_re_entry
  588.     sti            ; enable interrupts
  589.     nop
  590.     nop    
  591.     cli
  592.     jmp    tryagain
  593.  
  594. NO_RE_ENTRY:
  595.     inc    cs:intenter    ; increment the flags (lock out the timer interrupt)
  596. ;
  597. ;    Now it is safe to enable interrupts!
  598. ;
  599.     STI
  600. ;
  601. ;
  602. ;
  603. ;  SET UP CORRECT DS and ES
  604. ;
  605.     MOV     DS,CS:_SMYDS     ; GET CORRECT DS
  606.     MOV     ES,CS:_SMYDS     ; GET CORRECT ES
  607.  
  608. ;
  609. ;  do we have to set up our own stack here?
  610. ;
  611.     MOV     BX,SS
  612.     MOV     SER_OLDSS,BX
  613.     MOV     SER_OLDSP,SP
  614.     CLI
  615.     MOV     BX,seg DGROUP:SER_STCK
  616.     MOV     SS,BX
  617.     MOV     SP,OFFSET DGROUP:SER_STCK
  618. ifndef Watcom
  619.     mov     bx,_STKHQQ                   ; save old end of stack
  620.     mov     SER_OLDSTKHQQ,bx
  621.     mov     bx,offset DGROUP:SER_NEWSTACK          ; load new end of stack
  622.     mov     _STKHQQ,bx
  623. endif
  624.     STI
  625.  
  626.     MOV     CX,DX           ; MOVE THE COMM. PORT INTO THE CX REGISTER
  627.     MOV     BL,1            ; MOVE A FLAG INTO THE BL REGISTER
  628.     SHL     BL,CL           ; SHIFT THE FLAG TO LINE UP WITH THE CORRECT INITIALIZATION FLAG
  629.  
  630.  
  631.     CMP     AH,03           ; CHECK FOR READ STATUS
  632.     JNE     NOT_STATUS_CHECK; A COMMUNICATION REQUEST WHICH WE DON'T HANDLE
  633.  
  634.  
  635. READ_STATUS:                ; CHECK FOR A CHARACTER
  636. ifdef Microsoft
  637.     TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IS CONNECTED
  638. else
  639.     TEST    BL,CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  640. endif
  641.     JNE     GET_PORT_STATUS         ; GET THE PORT STATUS
  642.     MOV     AX,2000H                ; REPORT ERROR CONDITION
  643.     JMP     SHORT STATUS_FINISHED   ;
  644.  
  645. GET_PORT_STATUS:
  646. ifdef Microsoft
  647.     MOV     SI,OFFSET _DATA_BEGIN   ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
  648.     MOV     DI,OFFSET _DATA_END     ; GET THE POINTER TO THE END OF THE DATA BUFFER
  649. else
  650.     MOV     SI,OFFSET DATA_BEGIN    ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
  651.     MOV     DI,OFFSET DATA_END      ; GET THE POINTER TO THE END OF THE DATA BUFFER
  652. endif
  653.     SHL     DX,1                    ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
  654.     SHL     DX,1                    ;   OFFSET TO THE CORRECT ARRAY ELEMENT
  655.     ADD     SI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  656.     ADD     DI,DX
  657.  
  658.     MOV     AX,DS:[SI]              ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
  659.     CMP     AX,DS:[DI]              ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
  660.     JE      CHARACTER_NOT_READY     ; IF THE TWO POINTERS ARE THE SAME, THEN THERE IS NO DATA
  661.  
  662.     MOV     AX,2100h                ; SET THE DATA READY FLAG
  663.  
  664. ;    JMP     STATUS_FINISHED
  665.     JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  666. CHARACTER_NOT_READY:
  667.     MOV     AX,2000H                ; RESET THE DATA READY FLAG
  668.  
  669. STATUS_FINISHED:
  670.     JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  671.  
  672. NOT_STATUS_CHECK:
  673.     CMP     AH,02           ; CHECK FOR RECEIVING CHARACTER
  674.     JNE     NOT_RECEIVE_CHARACTER;  JUMP AROUND RECEIVING A CHARACTER
  675.  
  676. RECEIVE_CHARACTER:          ; GET A CHARACTER
  677. ifdef Microsoft
  678.     TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  679. else
  680.     TEST    BL,CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  681. endif
  682.     JNE     GET_PORT_CHARACTER; GET A CHARACTER FROM THE PORT
  683.     MOV     AH,80H          ; REPORT ERROR CONDITION
  684.     JMP     SHORT RECEIVE_FINISHED   ;
  685.  
  686. GET_PORT_CHARACTER:
  687. ifdef Microsoft
  688.     MOV     SI,OFFSET _DATA_BEGIN   ; GET THE POINTER TO THE array of the BEGINNING OF THE DATA BUFFERs
  689.     MOV     DI,OFFSET _DATA_END     ; GET THE POINTER TO THE END OF THE DATA BUFFER
  690. else
  691.     MOV     SI,OFFSET DATA_BEGIN    ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
  692.     MOV     DI,OFFSET DATA_END      ; GET THE POINTER TO THE END OF THE DATA BUFFER
  693. endif
  694.     SHL     DX,1                    ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
  695.     SHL     DX,1                    ;   OFFSET TO THE CORRECT ARRAY ELEMENT
  696.     ADD     SI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  697.     ADD     DI,DX
  698. WAIT_FOR_CHARACTER:
  699.     MOV     AX,DS:[SI]              ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
  700.     CMP     AX,DS:[DI]              ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
  701.     JE      WAIT_FOR_CHARACTER      ; IF THE TWO POINTERS ARE THE SAME, THEN WAIT FOR DATA
  702.  
  703.     PUSH    DS
  704.     MOV     DI,AX                   ; SAVE THE OFFSET OF THE BEGINING POINTER
  705.     MOV     AX,DS:[SI+2]            ; GET THE SEGMENT OF THE BEGINNING POINTER
  706.     MOV     DS,AX
  707.     MOV     AL,BYTE PTR DS:[DI]     ; GET THE CHARACTER FROM THE BEGINNING OF THE QUEUE
  708.     POP     DS                      ; RECOVER THE DATA SEGMENT
  709. ifdef Microsoft
  710.     MOV     DI,OFFSET _DATA_MAX     ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  711. else
  712.     MOV     DI,OFFSET DATA_MAX      ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  713. endif
  714.     ADD     DI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  715.     INC     WORD PTR DS:[SI]        ; INCREMENT THE BEGINNING OF THE QUEUE
  716.     MOV     CX,DS:[SI]              ; GET THE BEGINNING OF THE QUEUE
  717.     CMP     CX,DS:[DI]              ; CHECK FOR WRAPPING AROUND
  718.     JL      NOT_WRAPPED             ; JUMP AROUND WRAP-AROUND FIX
  719. ifdef Microsoft
  720.     MOV     DI,OFFSET _DATA_START   ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  721. else
  722.     MOV     DI,OFFSET DATA_START    ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  723. endif
  724.     ADD     DI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  725.     MOV     CX,DS:[DI]              ; GET THE START OF THE QUEUE
  726.     MOV     DS:[SI],CX              ; MOVE THE BEGINNING OF THE QUEUE AROUND
  727.  
  728. NOT_WRAPPED:
  729. ;    MOV     AH,21                   ; REPORT SUCCESS
  730.         xor     ah,ah
  731.  
  732. RECEIVE_FINISHED:
  733.     JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  734.  
  735. NOT_RECEIVE_CHARACTER:
  736.     CMP     AH,01           ; CHECK FOR SEND CHARACTER
  737.     JE      SEND_CHARACTER  ; JUMP TO SENDING THE CHARACTER
  738.     JMP     NOT_SEND_CHARACTER; JUMP AROUND SENDING THE CHARACTER
  739.  
  740. SEND_CHARACTER:             ; SEND A CHARACTER
  741. ifdef Microsoft
  742.     TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  743.     JE      DONT_NET_SEND   ; CONNECTION NOT OPEN YET, DON'T SEND THE CHARACTER
  744.     JMP     NET_SEND        ; OK, THE CONNECTION IS INITIALIZED, SEND THE CHARACTER
  745. DONT_NET_SEND:
  746.     TEST    BL,_OPENING_FLAGS; IF THE OPENING FLAG IS SET FOR THE PORT, CACHE THE CHARACTER IN A BUFFER
  747. else
  748.     TEST    BL,CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  749.     JE      DONT_NET_SEND   ; CONNECTION NOT OPEN YET, DON'T SEND THE CHARACTER
  750.     JMP     NET_SEND        ; OK, THE CONNECTION IS INITIALIZED, SEND THE CHARACTER
  751. DONT_NET_SEND:
  752.     TEST    BL,OPENING_FLAGS; IF THE OPENING FLAG IS SET FOR THE PORT, CACHE THE CHARACTER IN A BUFFER
  753. endif
  754.     JNE     CACHE_PORT_NAME ; GO CACHE THE CHARACTER
  755.               ; /* RMG */ Location of Hardcoded ^B
  756.     CMP     AL,02           ; CHECK WHETHER THIS IS THE BEGINNING OF A PORT NAME
  757.     JE      START_PORT_NAME ; START CACHING THE PORT NAME
  758.     MOV     AH,80H          ; REPORT ERROR CONDITION
  759.     JMP     SEND_FINISHED   ;
  760.  
  761. START_PORT_NAME:            ; INITIALIZE THE PORT NAME CACHING
  762. ifdef Microsoft
  763.     OR      _OPENING_FLAGS,BL; SET THE OPENING FLAG
  764. else
  765.     OR      OPENING_FLAGS,BL; SET THE OPENING FLAG
  766. endif
  767.     JMP     SEND_DONE       ; INDICATE A SUCCESSFUL CHARACTER SEND, BUT DON'T REALLY
  768.  
  769. CACHE_PORT_NAME:            ; STUFF THE CHARACTER INTO A BUFFER, OR OPEN A CONNECTION
  770.     CMP     AL,03H          ; CHECK WHETHER THIS IS THE TERMINATING CHARACTER IN A PORT NAME
  771.     JE      NET_OPEN        ; GO, OPEN THE CONNECTION
  772. ifdef Microsoft
  773.     MOV     DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  774. else
  775.     MOV     DI,OFFSET BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  776. endif
  777.     ADD     DI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  778.     MOV     CL,AL           ; SAVE THE CHARACTER TEMPORARILY
  779.     MOV     AL,64           ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
  780.     MUL     DL              ; GET THE OFFSET OF THE PORT BUFFER TO USE
  781.     ADD     AX,DS:[DI]      ; GET THE OFFSET TO STORE THE CHARACTER AT
  782.     INC     BYTE PTR DS:[DI]    ; INCREMENT THE BUFFER OFFSET FOR THE COMM. PORT
  783.     CMP     BYTE PTR DS:[DI],64 ; CHECK WHETHER WE HAVE TOO LONG OF A NAME
  784.     JE      NAME_TOO_LONG   ; JUMP FOR TOO LONG OF A NAME
  785. ifdef Microsoft
  786.     MOV     SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  787. else
  788.     MOV     SI,OFFSET PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  789. endif
  790.     ADD     SI,AX           ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
  791.     MOV     AL,CL           ; RESTORE THE CHARACTER TO STORE
  792.     MOV     [SI],AL         ; APPEND THE CHARACTER TO THE PORT NAME
  793.     JMP     SHORT SEND_DONE       ; INDICATE A GOOD TRANSFER
  794.  
  795. NAME_TOO_LONG:              ; THE PORT NAME WAS TOO LONG
  796.     MOV     BYTE PTR DS:[DI],0  ; RESET THE LENGTH OF THE PORT NAME
  797.     NOT     BL              ;
  798. ifdef Microsoft
  799.     AND     _OPENING_FLAGS,BL; RESET THE OPENING FLAG
  800. else
  801.     AND     OPENING_FLAGS,BL; RESET THE OPENING FLAG
  802. endif
  803.     MOV     AL,CL           ; RESTORE THE CHARACTER TO SEND
  804.     MOV     AH,80H          ; INDICATE ERROR CONDITION
  805.     JMP     SHORT SEND_FINISHED   ; JUMP TO THE END OF THE ROUTINE
  806.  
  807. NET_OPEN:                   ; OPEN THE CONNECTION TO THE NETWORK
  808.     NOT     BL              ;
  809. ifdef Microsoft
  810.     AND     _OPENING_FLAGS,BL; RESET THE OPENING FLAG
  811.     MOV     DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  812. else
  813.     AND     OPENING_FLAGS,BL; RESET THE OPENING FLAG
  814.     MOV     DI,OFFSET BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  815. endif
  816.     ADD     DI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  817.     MOV     CL,AL           ; SAVE THE CHARACTER TEMPORARILY
  818.     MOV     AL,64           ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
  819.     MUL     DL              ; GET THE OFFSET OF THE PORT BUFFER TO USE
  820.     ADD     AX,DS:[DI]      ; GET THE OFFSET TO STORE THE CHARACTER AT
  821. ifdef Microsoft
  822.     MOV     SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  823. else
  824.     MOV     SI,OFFSET PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  825. endif
  826.     PUSH    BX              ; SAVE THE COMM. PORT FLAGS
  827.     ADD     SI,AX           ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
  828.     MOV     AL,CL           ; RESTORE THE CHARACTER TO STORE
  829.     MOV     BYTE PTR [SI],0 ; APPEND THE TERMINATING ZERO
  830.  
  831.     PUSH    DX              ; PUSH THE COMM. PORT WE ARE OPENING
  832.  
  833. ifdef Microsoft
  834.     CALL    _INT14OPEN      ; OPEN THE CONNECTION
  835. else
  836.     CALL    INT14OPEN       ; OPEN THE CONNECTION
  837. endif
  838.     POP     DX              ; RECOVER THE COMM. PORT WE USED
  839.     POP     BX              ; RECOVER THE COMM. PORT FLAGS
  840.     CMP     AX,1            ; CHECK FOR GOOD OPENING
  841.     JNE     BAD_NET_OPEN    ; CONNECTION DIDN'T OPEN
  842.  
  843.     NOT     BL              ;
  844. ifdef Microsoft
  845.     OR      _CONNECTED_FLAGS,BL; SET THE CONNECTED FLAG
  846.     MOV     SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  847. else
  848.     OR      CONNECTED_FLAGS,BL; SET THE CONNECTED FLAG
  849.     MOV     SI,OFFSET BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  850. endif
  851.  
  852.     ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  853.     MOV     BYTE PTR [SI],0     ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
  854.     JMP     SHORT SEND_DONE       ; INDICATE A SUCCESSFUL CONNECTION OPENING
  855.  
  856. BAD_NET_OPEN:
  857.     MOV     AX,80           ; INDICATE A BAD NETWORK OPEN
  858.     JMP     SHORT SEND_FINISHED   ; RETURN FROM THE INTERRUPT
  859.  
  860. NET_SEND:                   ; SEND THE CHARACTER IN AL ONTO THE NET
  861. ifdef Microsoft
  862.     MOV     _CHAR_TO_SEND,AL ; STORE THE CHARACTER TO SEND ON THE NET
  863. else
  864.     MOV     CHAR_TO_SEND,AL ; STORE THE CHARACTER TO SEND ON THE NET
  865. endif
  866.  
  867.     MOV     AX,1            ; THE NUMBER OF CHARACTERS TO DROP ONTO THE NET
  868.     PUSH    AX
  869.     PUSH    DS              ; PUSH THE SEGMENT ADDRESS OF THE CHARACTER TO SEND
  870.     MOV     AX,OFFSET _CHAR_TO_SEND ; PUSH THE ADDRESS OF THE CHARACTER TO SEND
  871.     PUSH    AX
  872. ifdef Microsoft
  873.     MOV     SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  874. else
  875.     MOV     SI,OFFSET PNUM  ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  876. endif
  877.     ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  878.     ADD     SI,DX           ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
  879.     PUSH    [SI]            ; PUSH THE NETWORK PORT NUMBER
  880. ifdef Microsoft
  881.     CALL    _NETWRITE       ; CLOSE THE CONNECTION
  882. else
  883.     CALL    NETWRITE        ; CLOSE THE CONNECTION
  884. endif
  885.     ADD     SP,8            ; RESTORE THE STACK FRAME
  886. ;   JMP     SEND_DONE       ; INDICATE A SUCCESSFUL DATA SEND
  887.  
  888. SEND_DONE:                  ; INDICATE A SUCCESSFUL CHARACTER SEND
  889. ;    MOV     AH,060h         ; INDICATE A HAPPY CHARACTER SEND
  890.         xor     ah,ah
  891. SEND_FINISHED:
  892.     JMP     SHORT SSKIP2          ; JUMP TO THE END OF THE ROUTINE
  893.  
  894. NOT_SEND_CHARACTER:
  895.     CMP     AH,00           ; CHECK FOR PORT INITIALIZATION
  896.     JNE     SSKIP           ; A COMMUNICATIONS REQUEST WHICH WE DON'T HANDLE
  897.  
  898.  
  899. INIT_COM_PORT:              ; INITIALIZE THE COMM. PORT
  900. ifdef QAK
  901. ifdef Microsoft
  902.     TEST    BL,_INITIALIZED_FLAGS; CHECK WHETHER THIS CONNECTION HAS BEEN INITIALIZED
  903.     JNE     PORT_ALREADY_INIT   ; JUMP TO THE CHECK FOR CLOSING THE PORT
  904.     OR      _INITIALIZED_FLAGS,BL; SET THE INITIALIZED FLAG FOR THIS PORT
  905. else
  906.     TEST    BL,INITIALIZED_FLAGS; CHECK WHETHER THIS CONNECTION HAS BEEN INITIALIZED
  907.     JNE     PORT_ALREADY_INIT   ; JUMP TO THE CHECK FOR CLOSING THE PORT
  908.     OR      INITIALIZED_FLAGS,BL; SET THE INITIALIZED FLAG FOR THIS PORT
  909. endif
  910.     JMP     SHORT RESET_INIT      ; JUMP TO RESETING THE COMM. PORT BUFFER
  911. endif
  912.  
  913. PORT_ALREADY_INIT:          ; THE PORT HAS ALREADY BEEN INITIALIZED
  914. ifdef Microsoft
  915.     TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER WE WERE CONNECTED
  916. else
  917.     TEST    BL,CONNECTED_FLAGS; CHECK WHETHER WE WERE CONNECTED
  918. endif
  919.     JE      RESET_INIT      ; IGNORE RE-INITIALIZATION IF NOT CONNECTED
  920.     NOT     BL              ; INVERT AL IN PREPERATION FOR TURNING OFF THE FLAGS
  921. ifdef Microsoft
  922. ifdef QAK
  923.     AND     _INITIALIZED_FLAGS,BL; RESET THE INITIALIZATION FLAG FOR THIS PORT
  924. endif
  925.     AND     _CONNECTED_FLAGS,BL  ; RESET THE CONNECTED FLAG FOR THIS PORT
  926. else
  927. ifdef QAK
  928.     AND     INITIALIZED_FLAGS,BL; RESET THE INITIALIZATION FLAG FOR THIS PORT
  929. endif
  930.     AND     CONNECTED_FLAGS,BL  ; RESET THE CONNECTED FLAG FOR THIS PORT
  931. endif
  932.  
  933. ifdef Microsoft
  934.     MOV     SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  935. else
  936.     MOV     SI,OFFSET PNUM  ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  937. endif
  938.     ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  939.     ADD     SI,DX           ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
  940.     PUSH    DX
  941.     PUSH    [SI]            ; PUSH THE NETWORK PORT NUMBER
  942. ifdef Microsoft
  943.     CALL    _NETCLOSE       ; CLOSE THE CONNECTION
  944. else
  945.     CALL    NETCLOSE        ; CLOSE THE CONNECTION
  946. endif
  947.     ADD     SP,2            ; GET RID OF THE PARAMETER WE PASSED
  948.     POP     DX
  949.  
  950. RESET_INIT:
  951. ifdef Microsoft
  952.     MOV     SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  953. else
  954.     MOV     SI,OFFSET BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  955. endif
  956.     ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  957.     MOV     BYTE PTR [SI],0     ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
  958.  
  959. INIT_FINISHED:
  960.     MOV     AX,61B0H        ; MOVE THE RS-232 CONNECTED FLAGS INTO THE RETURN VALUE
  961.     JMP     SHORT SSKIP2          ; JUMP TO THE END OF THE ROUTINE
  962.  
  963. SSKIP:
  964. ;
  965. ;$$$ 01-05-1992 LJD +
  966. ;
  967. ;    XOR     BL,BL
  968. ;    MOV     CS:INTENTER,BL    ; REENTER FLAG, DONE NOW
  969.  
  970.  
  971.     CLI            ; disable interrupts
  972.     dec    cs:intenter    ; reset the flag (unlock for the timer interrupt)
  973. ;
  974. ;$$$ 01-03-1992 LJD -
  975. ;
  976.     MOV     BX,SER_OLDSS        ; restore the old stack
  977.     MOV     SS,BX
  978.     MOV     SP,SER_OLDSP
  979. ifndef Watcom
  980.     mov     bx,SER_OLDSTKHQQ                ; restore end of stack
  981.     mov     _STKHQQ,bx
  982. endif
  983.     STI
  984. SERIAL2:
  985.     POP     SI
  986.     POP        DI
  987.     POP        DX
  988.     POP        CX
  989.     POP        BX
  990.     POP        AX
  991.     POP        ES
  992.     POP        DS
  993.     JMP     SHORT LEAVE_SERIAL    ; JUMP TO THE END OF THE SERIAL ROUTINES
  994.  
  995. SSKIP2:
  996. ;
  997. ;$$$ 01-05-1992 LJD +
  998. ;
  999. ;    XOR     BL,BL
  1000. ;    MOV     CS:INTENTER,BL    ; REENTER FLAG, DONE NOW
  1001.  
  1002.     CLI            ; disable interrupts
  1003.     dec    cs:intenter
  1004.  
  1005.     MOV     BX,SER_OLDSS        ; restore the old stack
  1006.     MOV     SS,BX
  1007.     MOV     SP,SER_OLDSP
  1008. ifndef Watcom
  1009.     mov     bx,SER_OLDSTKHQQ                ; restore end of stack
  1010.     mov     _STKHQQ,bx
  1011. endif
  1012.     STI
  1013. SERIAL3:
  1014.     POP     SI
  1015.     POP        DI
  1016.     POP        DX
  1017.     POP        CX
  1018.     POP        BX
  1019.     POP     ES              ; POP AX INTO ES TO PRESERVE THE RETURN VALUE IN AX
  1020.     POP        ES
  1021.     POP        DS
  1022. ;
  1023. ;
  1024. ;   forward to any other existing routines
  1025. ;
  1026. LEAVE_SERIAL:
  1027. ifdef QAK
  1028.     JMP     DWORD PTR CS:SIP
  1029. else
  1030.     IRET
  1031. endif
  1032. ifdef Microsoft
  1033. _INT14INST      ENDP
  1034. else
  1035. INT14INST       ENDP
  1036. endif
  1037.  
  1038. ifdef Microsoft
  1039. ;_TEXT ends
  1040. else
  1041.     ENDPS
  1042. endif
  1043.     END
  1044.  
  1045.