home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MISC / NETWORK / TEL23SRC.ZIP / INT14 / INT14.ASM next >
Encoding:
Assembly Source File  |  1991-07-01  |  32.2 KB  |  1,043 lines

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