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