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.LST < prev    next >
File List  |  1992-04-13  |  42KB  |  1,087 lines

  1. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  2. int14.asm                             Page 1 - 1
  3.  
  4.  
  5.                         page 60,132
  6.                 ;
  7.                 ;  Int 14h support routines
  8.                 ;****************************************************************************
  9.                 ;*                                                                          *
  10.                 ;*                                                                          *
  11.                 ;*      part of NCSA Telnet                                                 *
  12.                 ;*      by Tim Krauskopf, VT100 by Gaige Paulsen, Tek by Aaron Contorer     *
  13.                 ;*          Kurt Mahan, Heeren Pathak, Quincey Koziol, & Chris Wilson       *
  14.                 ;*                                                                          *
  15.                 ;*      National Center for Supercomputing Applications                     *
  16.                 ;*      152 Computing Applications Building                                 *
  17.                 ;*      605 E. Springfield Ave.                                             *
  18.                 ;*      Champaign, IL  61820                                                *
  19.                 ;*                                                                          *
  20.                 ;****************************************************************************
  21.                 ;*                                                                *
  22.                 ;* DATE                   REASON                      DEVELOPER   *
  23.                 ;* ----                   ------                      ---------   *
  24.                 ;* 01/03/92   Update the timer ISR to prevent lock ups    LJD     *
  25.                 ;*                                                                *
  26.                 ;******************************************************************
  27.  
  28.                 ;
  29.                     NAME    INT14
  30.                 ;Microsoft EQU 1
  31.                 ;Lattice EQU 1
  32.                     ifndef Microsoft
  33.                     endif
  34.                 ;
  35.                 ;******************************************************************
  36.                 ;*
  37.                 ;*    We need to set up a stack for netsleep when we exit to DOS.
  38.  
  39.  = 0006                X   EQU     6
  40.  = 0001                PORT    EQU 1
  41.  
  42.                 ifdef Microsoft
  43.                 .8086
  44.                 .MODEL    LARGE
  45.  0000                .DATA
  46.                 else
  47.                 endif
  48.                     even
  49.  0000 0000            TIM_OLDSS           dw ?
  50.  0002 0000            TIM_OLDSP           dw ?
  51.                 ifndef Watcom
  52.  0004 0000            TIM_OLDSTKHQQ       dw 0
  53.                 endif
  54.  
  55.  0006 0000            SER_OLDSS           dw ?
  56.  0008 0000            SER_OLDSP           dw ?
  57.                 ifndef Watcom
  58.  000A 0000            SER_OLDSTKHQQ       dw 0
  59.                 endif
  60.  
  61.                     even            ; Align the stack on an even boundary
  62.  000C  0400 [            SER_NEWSTACK dw 1024 dup(?)     ; define a stack for netsleep when we shell to DOS
  63.         0000
  64.        ]
  65. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  66. int14.asm                             Page 2 - 1
  67.  
  68.  
  69.  080C                SER_STCK label word
  70.  
  71.                 ifndef Watcom
  72.                 extrn STKHQQ:word           ; Microsoft heap/stack bound
  73.                 endif
  74.  
  75.  = 0004                NUM_COMM_PORTS  EQU     4
  76.  
  77.                 ifdef Microsoft
  78.                 ifdef QAK
  79.                 endif
  80.                 PUBLIC  _CONNECTED_FLAGS
  81.                 PUBLIC  _PORT_BUFFER
  82.                 ifdef QAK
  83.                 endif
  84.                 PUBLIC  _PNUM,_DATA_BEGIN,_DATA_MAX,_DATA_END,_DATA_START
  85.                 EXTRN   _PRINT_INT:PROC         ; FOR DEBUGGING
  86.                 EXTRN   _PRINT_INT2:PROC        ; FOR DEBUGGING
  87.                 EXTRN   _GET_COMM_CHAR:PROC     ; GET A CHARACTER FROM A COMM BUFFER
  88.                 EXTRN   _NETCLOSE:PROC          ; EXTERNAL PROCEDURE TO CLOSE A CONNECTION
  89.                 EXTRN   _NETWRITE:PROC          ; EXTERNAL PROCEDURE TO WRITE TO A CONNECTION
  90.                 EXTRN   _INT14OPEN:PROC         ; EXTERNAL PROCEDURE TO OPEN A CONNECTION
  91.                 EXTRN   _SPEEDUP:WORD           ; EXTERNAL TIMER SPEEDUP FACTOR
  92.  080C  0004 [            _PNUM   DW NUM_COMM_PORTS DUP(0)    ; PORT WE ARE CONNECTED TO
  93.         0000
  94.        ]
  95.  
  96.                 ifdef QAK
  97.                 endif
  98.  0814 00            _CONNECTED_FLAGS DB 0           ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  99.                                                 ; COMM. PORT IS CONNECTED (BIT 0 IS COMM PORT
  100.                                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  101.  0815 00            _OPENING_FLAGS DB 0             ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
  102.                                                 ; COMM. PORT IS OPENING (BIT 0 IS COMM PORT
  103.                                                 ; 0, BIT 1 IS COMM. PORT 1, ETC..)
  104.  0816  0004 [            _PORT_BUFFER    DB  NUM_COMM_PORTS DUP (64 DUP (0)) ; SPECIFY THE FOUR BUFFERS FOR THE CONNECTION NA
  105.         0040 [            MES
  106.      00
  107.     ]
  108.        ]
  109.  0916  0004 [            _BUFFER_OFFSET  DB  NUM_COMM_PORTS DUP (0)   ; THE OFFSETS INTO THE FOUR PORT BUFFERS
  110.         00
  111.        ]
  112.  091A 00            _CHAR_TO_SEND   DB 0            ; SPACE TO STORE THE CHARACTER TO SEND ON THE NET
  113.  091B  0004 [            _DATA_BEGIN     DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE BEGINNING OF
  114.         00000000
  115.        ]
  116.                                                 ;   THE DATA BUFFER FOR EACH COMM. PORT
  117.  092B  0004 [            _DATA_END       DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE END OF
  118.         00000000
  119.        ]
  120.                                                 ;   THE DATA BUFFER FOR EACH COMM. PORT
  121.  093B  0004 [            _DATA_MAX       DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE MAX OF
  122.         00000000
  123.        ]
  124.                                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  125. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  126. int14.asm                             Page 3 - 1
  127.  
  128.  
  129.  094B  0004 [            _DATA_START     DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE START OF
  130.         00000000
  131.        ]
  132.                                                 ;   THE DATA BUFFERS FOR EACH COMM. PORT
  133.  095B 0000            _CLOCK_TICK     DW  0           ;   The number of clock ticks which have elapsed
  134.                 else
  135.                 endif
  136.  
  137.                 ifdef Microsoft
  138.  0000                .CODE
  139.                 else
  140.                 endif    
  141.                 ;
  142.                 ;**************************************************************************
  143.                 ;
  144.                 ;  Routines to install and deinstall a routine which manages the
  145.                 ;       serial port
  146.                 ;
  147.                 ;
  148.  = 0050                SERIALINT     EQU 4*14H       ; User hook to timer int
  149.  
  150.                 ifdef Microsoft
  151.                     PUBLIC  _INT14INST,_INT14DEINST
  152.                 ifdef DEBUG
  153.                 endif
  154.                     EXTRN   _int14netsleep:FAR   ; C routine which gets called from handler
  155.                     PUBLIC  _TIMEINST,_TIMEDEINST
  156.                 else    
  157.                 endif   
  158.                 ;
  159.                 ;**************************************************************************
  160.                 ;
  161.                 ;  Routines to install and deinstall a timer routine which calls
  162.                 ;  netsleep(0);
  163.                 ;  The timer is set to go off every 1/18 second to check for packets
  164.                 ;  in the incoming packet buffer.  We use the user-hook into the system 
  165.                 ;  timer which occurs every 1/18th of a second.
  166.                 ;
  167.                 ;
  168.  = 0070                TIMEINT        EQU    4*1CH        ; User hook to timer int
  169.  
  170.                 ;*************************************************************************
  171.                 ;
  172.                 ;  Take out the timer interrupt handler, restore previous value
  173.                 ;
  174.                 ifdef Microsoft
  175.  0000                _TIMEDEINST    PROC    FAR
  176.                 else
  177.                 endif
  178.                 ;
  179.                 ;$$$ 01-05-1992 LJD + Stop using the timer routine. !!! THIS NEEDS FURTHER TESTING. !!!!
  180.                 ;
  181.  0000  9C                pushf
  182.  0001  FA                cli
  183.  0002  2E: C6 06 0059 R            mov    CS:INTENTER,-1        ; Prevent use of the timer routine while removing it from th
  184.        FF            e system
  185. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  186. int14.asm                             Page 4 - 1
  187.  
  188.  
  189.  0008  9D                popf
  190.                 ;
  191.                 ;$$$ 01-05-1992 LJD -
  192.                 ;
  193.  
  194.  0009  2E: 8B 0E 005A R            MOV        CX,CS:TIP        ; GET OLD IP FROM SAVE SPOT
  195.  000E  2E: 8B 16 005C R            MOV        DX,CS:TCS        ; GET OLD CS FROM SAVE SPOT
  196.  0013  BB 0070                MOV        BX,TIMEINT        ; INTERRUPT IN TABLE FOR TIMER
  197.  
  198.  0016  1E                PUSH    DS
  199.  0017  33 C0                XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  200.  0019  8E D8                MOV        DS,AX        
  201.  
  202.  001B  9C                PUSHF                    ; $$$ 01-03-92 LJD +-
  203.  001C  FA                CLI
  204.  
  205.  001D  89 0F                MOV        [BX],CX            ; STORE OLD IP INTO THE TABLE
  206.                 ;
  207.                 ;$$$ 01-03-1992 ljd +
  208.                 ;
  209.                 ;    INC        BX
  210.                 ;    INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  211.                 ;    MOV        [BX],DX            ; STORE OLD CS INTO THE TABLE
  212.  001F  89 57 02                MOV        [BX+2],DX            ; STORE OLD CS INTO THE TABLE
  213.  
  214.  0022  9D                POPF
  215.                 ;    STI
  216.                 ;
  217.                 ;$$$ 01-03-1992 LJD -
  218.                 ;
  219.  0023  1F                POP        DS
  220.  0024  CB                RET
  221.                 ifdef Microsoft
  222.  0025                _TIMEDEINST    ENDP
  223.                 else
  224.                 endif
  225.  
  226.                 ;
  227.                 ;
  228.                 ;  install the timer interrupt handler, the handler is technically
  229.                 ;  part of this procedure.
  230.                 ;
  231.                 ifdef Microsoft
  232.  0025                _TIMEINST  PROC    FAR
  233.                 else
  234.                 endif
  235.  0025  33 C0                XOR        AX,AX
  236.  0027  2E: A2 0059 R            MOV     CS:INTENTER,AL    ; CLEAR THIS FLAG
  237.  002B  2E: 8C 1E 0056 R            MOV     CS:_TMYDS,DS    ; STORE FOR USE BY HANDLER
  238.  0030  BB 0070                MOV        BX,TIMEINT        ; INTERRUPT IN TABLE FOR TIMER (1c)
  239.  
  240.  0033  1E                PUSH    DS
  241.  0034  33 C0                XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  242.  0036  8E D8                MOV        DS,AX        
  243.  0038  B8 005E R            MOV        AX,OFFSET THAND    ; WHERE THE HANDLER IS
  244.                 ;
  245. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  246. int14.asm                             Page 5 - 1
  247.  
  248.  
  249.                 ;$$$ 01-03-1992 ljd +
  250.                 ;    
  251.  003B  9C                PUSHF                    ; save the current flag states
  252.  003C  FA                CLI
  253.  
  254.  003D  8B 17                MOV        DX,[BX]            ; KEEP COPY OF THE IP
  255.  003F  89 07                MOV        [BX],AX            ; STORE IP INTO THE TABLE
  256.                 ;    INC        BX
  257.                 ;    INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  258.                 ;    MOV        CX,[BX]            ; KEEP COPY OF THE CS, TOO
  259.  0041  8B 4F 02                MOV        CX,[BX+2]            ; KEEP COPY OF THE CS, TOO
  260.  
  261.  0044  8C C8                MOV        AX,CS
  262.  0046  89 47 02                MOV        [BX+2],AX            ; STORE NEW CS INTO THE TABLE
  263.  
  264.  0049  9D                POPF                    ; restore the int. flag to what it was originally
  265.                 ;    STI
  266.                 ;
  267.                 ;$$$ 01-03-1992 LJD -
  268.                 ;
  269.  004A  1F                POP    DS
  270.  004B  2E: 89 16 005A R            MOV    CS:TIP,DX            ; STORE THEM AWAY
  271.  0050  2E: 89 0E 005C R            MOV    CS:TCS,CX
  272.  0055  CB                RET
  273.                 ;
  274.                 ;  Code segment addressable data for keeping track of the interrupt handler
  275.                 ;  stuff
  276.                 ;
  277.                 ;PUBLIC  _TMYDS
  278.  0056 0000            _TMYDS      DW  00H         ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
  279.  0058 00            TICNT        DB    0            ; COUNTER OF 1/18THS SEC
  280.  0059 00            INTENTER    DB  00
  281.  005A 0000            TIP          DW  00
  282.  005C 0000            TCS          DW  00
  283.                 ;
  284.                 ;   The handler itself.
  285.                 ;
  286.                 ;$$$ 01-03-1992 ljd + Serious modifications made!
  287.                 ;
  288.  005E                THAND:                           ; not a public name, only handles ints
  289.  005E  FA                cli                ; make sure interrupts are off!
  290.  005F  50                push    ax
  291.  0060  1E                push    ds
  292.  0061  06                push    es
  293.  
  294.                 ;
  295.                 ; Call the routine we replaced  to proceed with chaining process.
  296.                 ; (Properly simulate the INT instruction.)
  297.                 ;
  298.  0062  9C                pushf
  299.  0063  FA                cli
  300.  0064  2E: FF 1E 005A R            call    dword ptr cs:tip
  301.  
  302.  0069  FA                cli                    ; disable interrupts
  303.  
  304.  006A  FC                CLD                        ; SET THE DIRECTION FLAG FORWARD
  305. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  306. int14.asm                             Page 6 - 1
  307.  
  308.  
  309.  
  310.  006B  2E: 80 3E 0059 R            cmp    cs:intenter,0
  311.        00
  312.  0071  75 5E                jnz    time2                ; leave if already active
  313.  
  314.  0073  2E: FE 06 0059 R            inc    cs:intenter
  315.                     
  316.                 ifdef SLOW
  317.                 endif
  318.                 ;
  319.                 ifdef OLD_WAY
  320.                 endif
  321.                 ;
  322.                 ;  SET UP CORRECT DS & ES
  323.                 ;
  324.  0078  2E: 8E 1E 0056 R            MOV     DS,CS:_TMYDS     ; GET CORRECT DS
  325.  007D  2E: 8E 06 0056 R            MOV     ES,CS:_TMYDS     ; GET CORRECT ES
  326.                 ;
  327.                 ;  do we have to set up our own stack here?
  328.                 ;
  329.  0082  8C D0                MOV        AX,SS
  330.  0084  A3 0000 R            MOV     TIM_OLDSS,AX            ; save the stack segment set upon entry
  331.  0087  89 26 0002 R            MOV     TIM_OLDSP,SP            ; save the stack pointer set upon entry
  332.                 ;
  333.  008B  B8 ---- R            MOV     AX,seg DGROUP:SER_STCK
  334.  008E  8E D0                MOV    SS,AX                ; set a new stack segment
  335.  0090  BC 080C R            MOV     SP,OFFSET DGROUP:SER_STCK   ; set a new stack pointer
  336.  
  337.                 ifndef Watcom
  338.  0093  A1 0000 E            mov     ax,STKHQQ                   ; save old end of stack
  339.  0096  A3 0004 R            mov     TIM_OLDSTKHQQ,ax
  340.  0099  B8 000C R            mov     ax,offset DGROUP:SER_NEWSTACK          ; load new end of stack
  341.  009C  A3 0000 E            mov     STKHQQ,ax
  342.                 endif
  343.  009F  FB                STI                        ; enable interrupts
  344.  
  345.  00A0  1E                PUSH    DS
  346.  00A1  06                PUSH     ES
  347.  00A2  50                PUSH    AX
  348.  00A3  53                PUSH    BX
  349.  00A4  51                PUSH    CX
  350.  00A5  52                PUSH    DX
  351.  00A6  57                PUSH    DI
  352.  00A7  56                PUSH    SI
  353.  
  354.                 ifdef Microsoft
  355.  00A8  9A ---- 0000 E            CALL _int14netsleep
  356.                 else    
  357.                 endif
  358.  
  359.  00AD  5E                POP         SI
  360.  00AE  5F                POP        DI
  361.  00AF  5A                POP        DX
  362.  00B0  59                POP        CX
  363.  00B1  5B                POP        BX
  364.  00B2  58                POP        AX
  365. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  366. int14.asm                             Page 7 - 1
  367.  
  368.  
  369.  00B3  07                POP        ES
  370.  00B4  1F                POP        DS
  371.  
  372.  
  373.  00B5  FA                cli
  374.  00B6  2E: FE 0E 0059 R            dec    cs:intenter
  375.  00BB  75 14                jnz    time2
  376.  
  377.  00BD  2E: 8E 1E 0056 R            MOV     DS,CS:_TMYDS     ; GET CORRECT DS
  378.  
  379.  00C2  A1 0000 R            MOV     AX,TIM_OLDSS
  380.  00C5  8E D0                MOV    SS,AX            ; RESTORE STACK SEGMENT
  381.  00C7  8B 26 0002 R            MOV     SP,TIM_OLDSP        ; RESTORE STACK POINTER
  382.  
  383.                 ifndef Watcom
  384.  00CB  A1 0004 R            mov     ax,TIM_OLDSTKHQQ                ; restore end of stack
  385.  00CE  A3 0000 E            mov     STKHQQ,ax
  386.                 endif
  387.  
  388.                 comment #
  389.                 TSKIP:
  390.                     XOR        AL,AL
  391.                     MOV     CS:INTENTER,AL    ; REENTER FLAG, DONE NOW
  392.                 #
  393.  
  394.  00D1                TIME2:
  395.                 ;
  396.                 ;   forward to any other existing routines
  397.                 ;
  398.  00D1  07                pop    es
  399.  00D2  1F                pop    ds
  400.  00D3  58                pop    ax
  401.  00D4  CF                IRET
  402.                 ;
  403.                 ;$$$ 01-03-1992 ljd -
  404.                 ;
  405.                 ifdef Microsoft
  406.  00D5                _TIMEINST      ENDP
  407.                 else
  408.                 endif
  409.  
  410.                 ifdef DEBUG
  411.                 endif
  412.  
  413.                 ;*************************************************************************
  414.                 ;
  415.                 ;  Take out the serial interrupt handler, restore previous value
  416.                 ;
  417.                 ifdef Microsoft
  418.  00D5                _INT14DEINST    PROC    FAR
  419.                 else
  420.                 endif
  421.  00D5  2E: 8B 0E 011E R            MOV     CX,CS:SIP       ; GET OLD IP FROM SAVE SPOT
  422.  00DA  2E: 8B 16 0120 R            MOV     DX,CS:SCS       ; GET OLD CS FROM SAVE SPOT
  423.  00DF  BB 0050                MOV     BX,SERIALINT    ; INTERRUPT IN TABLE FOR TIMER
  424.  00E2  1E                PUSH    DS
  425. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  426. int14.asm                             Page 8 - 1
  427.  
  428.  
  429.  00E3  33 C0                XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  430.  00E5  8E D8                MOV        DS,AX        
  431.  00E7  FA                CLI
  432.  00E8  89 0F                MOV        [BX],CX            ; STORE OLD IP INTO THE TABLE
  433.  00EA  43                INC        BX
  434.  00EB  43                INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  435.  00EC  89 17                MOV        [BX],DX            ; STORE OLD CS INTO THE TABLE
  436.  00EE  FB                STI
  437.  00EF  1F                POP        DS
  438.  00F0  CB                RET
  439.                 ifdef Microsoft
  440.  00F1                _INT14DEINST    ENDP
  441.                 else
  442.                 endif
  443.                 ;
  444.                 ;
  445.                 ;  install the serial interrupt handler, the handler is technically
  446.                 ;  part of this procedure.
  447.                 ;
  448.                 ifdef Microsoft
  449.  00F1                _INT14INST  PROC    FAR
  450.                 else
  451.                 endif
  452.  
  453.                 ;
  454.                 ;$$$ 01-05-1992 LJD + Don't do this twice!
  455.                 ;    XOR        AX,AX
  456.                 ;    MOV     CS:INTENTER,AL    ; CLEAR THIS FLAG
  457.                 ;
  458.                 ;$$$ 01-05-1992 LJD -
  459.                 ;
  460.  00F1  2E: 8C 1E 011B R            MOV     CS:_SMYDS,DS     ; STORE FOR USE BY HANDLER
  461.  00F6  BB 0050                MOV     BX,SERIALINT    ; INTERRUPT IN TABLE FOR TIMER (1c)
  462.  00F9  1E                PUSH    DS
  463.  00FA  33 C0                XOR        AX,AX            ; SYSTEM INTERRUPT TABLE
  464.  00FC  8E D8                MOV        DS,AX        
  465.  00FE  B8 0122 R            MOV     AX,OFFSET SHAND ; WHERE THE HANDLER IS
  466.  0101  FA                CLI
  467.  0102  8B 17                MOV        DX,[BX]            ; KEEP COPY OF THE IP
  468.  0104  89 07                MOV        [BX],AX            ; STORE IP INTO THE TABLE
  469.  0106  43                INC        BX
  470.  0107  43                INC        BX                ; MOVE POINTER IN INTERRUPT TABLE
  471.  0108  8B 0F                MOV        CX,[BX]            ; KEEP COPY OF THE CS, TOO
  472.  010A  8C C8                MOV        AX,CS
  473.  010C  89 07                MOV        [BX],AX            ; STORE NEW CS INTO THE TABLE
  474.  010E  FB                STI
  475.  010F  1F                POP    DS
  476.  0110  2E: 89 16 011E R            MOV CS:SIP,DX           ; STORE THEM AWAY
  477.  0115  2E: 89 0E 0120 R            MOV CS:SCS,CX
  478.  011A  CB                RET
  479.                 ;
  480.                 ;  Code segment addressable data for keeping track of the interrupt handler
  481.                 ;  stuff
  482.                 ;
  483.                 ;PUBLIC  _SMYDS
  484.  011B 0000            _SMYDS       DW  00H         ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
  485. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  486. int14.asm                             Page 9 - 1
  487.  
  488.  
  489.  011D 00            SICNT       DB  0           ; COUNTER OF 1/18THS SEC
  490.                 ;SENTER      DB  00
  491.  011E 0000            SIP         DW  00
  492.  0120 0000            SCS         DW  00
  493.                 ;
  494.                 ;   The handler itself.
  495.                 ;
  496.                 ;$$$ 01-05-1992 LJD + Modify to protect protocol layer from reentrancy problems
  497.                 ;
  498.                 ;
  499.  0122                SHAND:                      ; not a public name, only handles ints
  500.  0122  FA                cli            ; make sure interrupts are off
  501.  0123  1E                PUSH    DS
  502.  0124  06                PUSH     ES
  503.  0125  50                PUSH    AX
  504.  0126  53                PUSH    BX
  505.  0127  51                PUSH    CX
  506.  0128  52                PUSH    DX
  507.  0129  57                PUSH    DI
  508.  012A  56                PUSH    SI
  509.  
  510.  012B  FC                CLD            ; ALL MOVES WILL BE FORWARD
  511.  012C                TRYAGAIN:
  512.  012C  2E: 80 3E 0059 R            cmp    cs:intenter,0
  513.        00
  514.  0132  74 06                jz    no_re_entry
  515.  0134  FB                sti            ; enable interrupts
  516.  0135  90                nop
  517.  0136  90                nop    
  518.  0137  FA                cli
  519.  0138  EB F2                jmp    tryagain
  520.  
  521.  013A                NO_RE_ENTRY:
  522.  013A  2E: FE 06 0059 R            inc    cs:intenter    ; increment the flags (lock out the timer interrupt)
  523.                 ;
  524.                 ;    Now it is safe to enable interrupts!
  525.                 ;
  526.  013F  FB                STI
  527.                 ;
  528.                 ;
  529.                 ;
  530.                 ;  SET UP CORRECT DS and ES
  531.                 ;
  532.  0140  2E: 8E 1E 011B R            MOV     DS,CS:_SMYDS     ; GET CORRECT DS
  533.  0145  2E: 8E 06 011B R            MOV     ES,CS:_SMYDS     ; GET CORRECT ES
  534.  
  535.                 ;
  536.                 ;  do we have to set up our own stack here?
  537.                 ;
  538.  014A  8C D3                MOV     BX,SS
  539.  014C  89 1E 0006 R            MOV     SER_OLDSS,BX
  540.  0150  89 26 0008 R            MOV     SER_OLDSP,SP
  541.  0154  FA                CLI
  542.  0155  BB ---- R            MOV     BX,seg DGROUP:SER_STCK
  543.  0158  8E D3                MOV     SS,BX
  544.  015A  BC 080C R            MOV     SP,OFFSET DGROUP:SER_STCK
  545. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  546. int14.asm                             Page 10 - 1
  547.  
  548.  
  549.                 ifndef Watcom
  550.  015D  8B 1E 0000 E            mov     bx,STKHQQ                   ; save old end of stack
  551.  0161  89 1E 000A R            mov     SER_OLDSTKHQQ,bx
  552.  0165  BB 000C R            mov     bx,offset DGROUP:SER_NEWSTACK          ; load new end of stack
  553.  0168  89 1E 0000 E            mov     STKHQQ,bx
  554.                 endif
  555.  016C  FB                STI
  556.  
  557.  016D  8B CA                MOV     CX,DX           ; MOVE THE COMM. PORT INTO THE CX REGISTER
  558.  016F  B3 01                MOV     BL,1            ; MOVE A FLAG INTO THE BL REGISTER
  559.  0171  D2 E3                SHL     BL,CL           ; SHIFT THE FLAG TO LINE UP WITH THE CORRECT INITIALIZATION FLAG
  560.  
  561.  0173  80 FC 03                CMP     AH,03           ; CHECK FOR READ STATUS
  562.  0176  75 2B                JNE     NOT_STATUS_CHECK; A COMMUNICATION REQUEST WHICH WE DON'T HANDLE
  563.  
  564.  
  565.  0178                READ_STATUS:                ; CHECK FOR A CHARACTER
  566.                 ifdef Microsoft
  567.  0178  84 1E 0814 R            TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IS CONNECTED
  568.                 else
  569.                 endif
  570.  017C  75 05                JNE     GET_PORT_STATUS         ; GET THE PORT STATUS
  571.  017E  B8 2000                MOV     AX,2000H                ; REPORT ERROR CONDITION
  572.  0181  EB 1D                JMP     SHORT STATUS_FINISHED   ;
  573.  
  574.  0183                GET_PORT_STATUS:
  575.                 ifdef Microsoft
  576.  0183  BE 091B R            MOV     SI,OFFSET _DATA_BEGIN   ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
  577.  0186  BF 092B R            MOV     DI,OFFSET _DATA_END     ; GET THE POINTER TO THE END OF THE DATA BUFFER
  578.                 else
  579.                 endif
  580.  0189  D1 E2                SHL     DX,1                    ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
  581.  018B  D1 E2                SHL     DX,1                    ;   OFFSET TO THE CORRECT ARRAY ELEMENT
  582.  018D  03 F2                ADD     SI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  583.  018F  03 FA                ADD     DI,DX
  584.  
  585.  0191  8B 04                MOV     AX,DS:[SI]              ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
  586.  0193  3B 05                CMP     AX,DS:[DI]              ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
  587.  0195  74 06                JE      CHARACTER_NOT_READY     ; IF THE TWO POINTERS ARE THE SAME, THEN THERE IS NO DATA
  588.  0197  B8 2100                MOV     AX,2100h                ; SET THE DATA READY FLAG
  589.  
  590.                 ;    JMP     STATUS_FINISHED
  591.  019A  E9 015D                JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  592.  019D                CHARACTER_NOT_READY:
  593.  019D  B8 2000                MOV     AX,2000H                ; RESET THE DATA READY FLAG
  594.  
  595.  01A0                STATUS_FINISHED:
  596.  01A0  E9 0157                JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  597.  
  598.  01A3                NOT_STATUS_CHECK:
  599.  01A3  80 FC 02                CMP     AH,02           ; CHECK FOR RECEIVING CHARACTER
  600.  01A6  75 44                JNE     NOT_RECEIVE_CHARACTER;  JUMP AROUND RECEIVING A CHARACTER
  601.  
  602.  01A8                RECEIVE_CHARACTER:          ; GET A CHARACTER
  603.                 ifdef Microsoft
  604.  01A8  84 1E 0814 R            TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  605. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  606. int14.asm                             Page 11 - 1
  607.  
  608.  
  609.                 else
  610.                 endif
  611.  01AC  75 04                JNE     GET_PORT_CHARACTER; GET A CHARACTER FROM THE PORT
  612.  01AE  B4 80                MOV     AH,80H          ; REPORT ERROR CONDITION
  613.  01B0  EB 37                JMP     SHORT RECEIVE_FINISHED   ;
  614.  
  615.  01B2                GET_PORT_CHARACTER:
  616.                 ifdef Microsoft
  617.  01B2  BE 091B R            MOV     SI,OFFSET _DATA_BEGIN   ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
  618.  01B5  BF 092B R            MOV     DI,OFFSET _DATA_END     ; GET THE POINTER TO THE END OF THE DATA BUFFER
  619.                 else
  620.                 endif
  621.  01B8  D1 E2                SHL     DX,1                    ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
  622.  01BA  D1 E2                SHL     DX,1                    ;   OFFSET TO THE CORRECT ARRAY ELEMENT
  623.  01BC  03 F2                ADD     SI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  624.  01BE  03 FA                ADD     DI,DX
  625.  01C0                WAIT_FOR_CHARACTER:
  626.  01C0  8B 04                MOV     AX,DS:[SI]              ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
  627.  01C2  3B 05                CMP     AX,DS:[DI]              ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
  628.  01C4  74 FA                JE      WAIT_FOR_CHARACTER      ; IF THE TWO POINTERS ARE THE SAME, THEN WAIT FOR DATA
  629.  
  630.  01C6  1E                PUSH    DS
  631.  01C7  8B F8                MOV     DI,AX                   ; SAVE THE OFFSET OF THE BEGINING POINTER
  632.  01C9  8B 44 02                MOV     AX,DS:[SI+2]            ; GET THE SEGMENT OF THE BEGINNING POINTER
  633.  01CC  8E D8                MOV     DS,AX
  634.  01CE  8A 05                MOV     AL,BYTE PTR DS:[DI]     ; GET THE CHARACTER FROM THE BEGINNING OF THE QUEUE
  635.  01D0  1F                POP     DS                      ; RECOVER THE DATA SEGMENT
  636.                 ifdef Microsoft
  637.  01D1  BF 093B R            MOV     DI,OFFSET _DATA_MAX     ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  638.                 else
  639.                 endif
  640.  01D4  03 FA                ADD     DI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  641.  01D6  FF 04                INC     WORD PTR DS:[SI]        ; INCREMENT THE BEGINNING OF THE QUEUE
  642.  01D8  8B 0C                MOV     CX,DS:[SI]              ; GET THE BEGINNING OF THE QUEUE
  643.  01DA  3B 0D                CMP     CX,DS:[DI]              ; CHECK FOR WRAPPING AROUND
  644.  01DC  7C 09                JL      NOT_WRAPPED             ; JUMP AROUND WRAP-AROUND FIX
  645.                 ifdef Microsoft
  646.  01DE  BF 094B R            MOV     DI,OFFSET _DATA_START   ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
  647.                 else
  648.                 endif
  649.  01E1  03 FA                ADD     DI,DX                   ; INCREMENT TO THE CORRECT ARRAY ELEMENT
  650.  01E3  8B 0D                MOV     CX,DS:[DI]              ; GET THE START OF THE QUEUE
  651.  01E5  89 0C                MOV     DS:[SI],CX              ; MOVE THE BEGINNING OF THE QUEUE AROUND
  652.  
  653.  01E7                NOT_WRAPPED:
  654.  01E7  B4 15                MOV     AH,21                   ; REPORT SUCCESS
  655.  
  656.  01E9                RECEIVE_FINISHED:
  657.  01E9  E9 010E                JMP     SSKIP2                  ; JUMP TO THE END OF THE ROUTINE
  658.  
  659.  01EC                NOT_RECEIVE_CHARACTER:
  660.  01EC  80 FC 01                CMP     AH,01           ; CHECK FOR SEND CHARACTER
  661.  01EF  74 03                JE      SEND_CHARACTER  ; JUMP TO SENDING THE CHARACTER
  662.  01F1  E9 00B2                JMP     NOT_SEND_CHARACTER; JUMP AROUND SENDING THE CHARACTER
  663.  
  664.  01F4                SEND_CHARACTER:             ; SEND A CHARACTER
  665. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  666. int14.asm                             Page 12 - 1
  667.  
  668.  
  669.                 ifdef Microsoft
  670.  01F4  84 1E 0814 R            TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
  671.  01F8  74 03                JE      DONT_NET_SEND   ; CONNECTION NOT OPEN YET, DON'T SEND THE CHARACTER
  672.  01FA  E9 0088                JMP     NET_SEND        ; OK, THE CONNECTION IS INITIALIZED, SEND THE CHARACTER
  673.  01FD                DONT_NET_SEND:
  674.  01FD  84 1E 0815 R            TEST    BL,_OPENING_FLAGS; IF THE OPENING FLAG IS SET FOR THE PORT, CACHE THE CHARACTER IN A BUF
  675.                 FER
  676.                 else
  677.                 endif
  678.  0201  75 10                JNE     CACHE_PORT_NAME ; GO CACHE THE CHARACTER
  679.  0203  3C 02                CMP     AL,02           ; CHECK WHETHER THIS IS THE BEGINNING OF A PORT NAME
  680.  0205  74 05                JE      START_PORT_NAME ; START CACHING THE PORT NAME
  681.  0207  B4 80                MOV     AH,80H          ; REPORT ERROR CONDITION
  682.  0209  E9 0098                JMP     SEND_FINISHED   ;
  683.  
  684.  020C                START_PORT_NAME:            ; INITIALIZE THE PORT NAME CACHING
  685.                 ifdef Microsoft
  686.  020C  08 1E 0815 R            OR      _OPENING_FLAGS,BL; SET THE OPENING FLAG
  687.                 else
  688.                 endif
  689.  0210  E9 008F                JMP     SEND_DONE       ; INDICATE A SUCCESSFUL CHARACTER SEND, BUT DON'T REALLY
  690.  
  691.  0213                CACHE_PORT_NAME:            ; STUFF THE CHARACTER INTO A BUFFER, OR OPEN A CONNECTION
  692.  0213  3C 03                CMP     AL,03H          ; CHECK WHETHER THIS IS THE TERMINATING CHARACTER IN A PORT NAME
  693.  0215  74 2E                JE      NET_OPEN        ; GO, OPEN THE CONNECTION
  694.                 ifdef Microsoft
  695.  0217  BF 0916 R            MOV     DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  696.                 else
  697.                 endif
  698.  021A  03 FA                ADD     DI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  699.  021C  8A C8                MOV     CL,AL           ; SAVE THE CHARACTER TEMPORARILY
  700.  021E  B0 40                MOV     AL,64           ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
  701.  0220  F6 E2                MUL     DL              ; GET THE OFFSET OF THE PORT BUFFER TO USE
  702.  0222  03 05                ADD     AX,DS:[DI]      ; GET THE OFFSET TO STORE THE CHARACTER AT
  703.  0224  FE 05                INC     BYTE PTR DS:[DI]    ; INCREMENT THE BUFFER OFFSET FOR THE COMM. PORT
  704.  0226  80 3D 40                CMP     BYTE PTR DS:[DI],64 ; CHECK WHETHER WE HAVE TOO LONG OF A NAME
  705.  0229  74 0B                JE      NAME_TOO_LONG   ; JUMP FOR TOO LONG OF A NAME
  706.                 ifdef Microsoft
  707.  022B  BE 0816 R            MOV     SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  708.                 else
  709.                 endif
  710.  022E  03 F0                ADD     SI,AX           ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
  711.  0230  8A C1                MOV     AL,CL           ; RESTORE THE CHARACTER TO STORE
  712.  0232  88 04                MOV     [SI],AL         ; APPEND THE CHARACTER TO THE PORT NAME
  713.  0234  EB 6C                JMP     SHORT SEND_DONE       ; INDICATE A GOOD TRANSFER
  714.  
  715.  0236                NAME_TOO_LONG:              ; THE PORT NAME WAS TOO LONG
  716.  0236  C6 05 00                MOV     BYTE PTR DS:[DI],0  ; RESET THE LENGTH OF THE PORT NAME
  717.  0239  F6 D3                NOT     BL              ;
  718.                 ifdef Microsoft
  719.  023B  20 1E 0815 R            AND     _OPENING_FLAGS,BL; RESET THE OPENING FLAG
  720.                 else
  721.                 endif
  722.  023F  8A C1                MOV     AL,CL           ; RESTORE THE CHARACTER TO SEND
  723.  0241  B4 80                MOV     AH,80H          ; INDICATE ERROR CONDITION
  724.  0243  EB 5F                JMP     SHORT SEND_FINISHED   ; JUMP TO THE END OF THE ROUTINE
  725. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  726. int14.asm                             Page 13 - 1
  727.  
  728.  
  729.  
  730.  0245                NET_OPEN:                   ; OPEN THE CONNECTION TO THE NETWORK
  731.  0245  F6 D3                NOT     BL              ;
  732.                 ifdef Microsoft
  733.  0247  20 1E 0815 R            AND     _OPENING_FLAGS,BL; RESET THE OPENING FLAG
  734.  024B  BF 0916 R            MOV     DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  735.                 else
  736.                 endif
  737.  024E  03 FA                ADD     DI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  738.  0250  8A C8                MOV     CL,AL           ; SAVE THE CHARACTER TEMPORARILY
  739.  0252  B0 40                MOV     AL,64           ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
  740.  0254  F6 E2                MUL     DL              ; GET THE OFFSET OF THE PORT BUFFER TO USE
  741.  0256  03 05                ADD     AX,DS:[DI]      ; GET THE OFFSET TO STORE THE CHARACTER AT
  742.                 ifdef Microsoft
  743.  0258  BE 0816 R            MOV     SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
  744.                 else
  745.                 endif
  746.  025B  53                PUSH    BX              ; SAVE THE COMM. PORT FLAGS
  747.  025C  03 F0                ADD     SI,AX           ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
  748.  025E  8A C1                MOV     AL,CL           ; RESTORE THE CHARACTER TO STORE
  749.  0260  C6 04 00                MOV     BYTE PTR [SI],0 ; APPEND THE TERMINATING ZERO
  750.  
  751.  0263  52                PUSH    DX              ; PUSH THE COMM. PORT WE ARE OPENING
  752.  
  753.                 ifdef Microsoft
  754.  0264  9A ---- 0000 E            CALL    _INT14OPEN      ; OPEN THE CONNECTION
  755.                 else
  756.                 endif
  757.  0269  5A                POP     DX              ; RECOVER THE COMM. PORT WE USED
  758.  026A  5B                POP     BX              ; RECOVER THE COMM. PORT FLAGS
  759.  026B  83 F8 01                CMP     AX,1            ; CHECK FOR GOOD OPENING
  760.  026E  75 10                JNE     BAD_NET_OPEN    ; CONNECTION DIDN'T OPEN
  761.  
  762.  0270  F6 D3                NOT     BL              ;
  763.                 ifdef Microsoft
  764.  0272  08 1E 0814 R            OR      _CONNECTED_FLAGS,BL; SET THE CONNECTED FLAG
  765.  0276  BE 0916 R            MOV     SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  766.                 else
  767.                 endif
  768.  0279  03 F2                ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  769.  027B  C6 04 00                MOV     BYTE PTR [SI],0     ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
  770.  027E  EB 22                JMP     SHORT SEND_DONE       ; INDICATE A SUCCESSFUL CONNECTION OPENING
  771.  
  772.  0280                BAD_NET_OPEN:
  773.  0280  B8 0050                MOV     AX,80           ; INDICATE A BAD NETWORK OPEN
  774.  0283  EB 1F                JMP     SHORT SEND_FINISHED   ; RETURN FROM THE INTERRUPT
  775.  
  776.  0285                NET_SEND:                   ; SEND THE CHARACTER IN AL ONTO THE NET
  777.                 ifdef Microsoft
  778.  0285  A2 091A R            MOV     _CHAR_TO_SEND,AL ; STORE THE CHARACTER TO SEND ON THE NET
  779.                 else
  780.                 endif
  781.  
  782.  0288  B8 0001                MOV     AX,1            ; THE NUMBER OF CHARACTERS TO DROP ONTO THE NET
  783.  028B  50                PUSH    AX
  784.  028C  1E                PUSH    DS              ; PUSH THE SEGMENT ADDRESS OF THE CHARACTER TO SEND
  785. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  786. int14.asm                             Page 14 - 1
  787.  
  788.  
  789.  028D  B8 091A R            MOV     AX,OFFSET _CHAR_TO_SEND ; PUSH THE ADDRESS OF THE CHARACTER TO SEND
  790.  0290  50                PUSH    AX
  791.                 ifdef Microsoft
  792.  0291  BE 080C R            MOV     SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  793.                 else
  794.                 endif
  795.  0294  03 F2                ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  796.  0296  03 F2                ADD     SI,DX           ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
  797.  0298  FF 34                PUSH    [SI]            ; PUSH THE NETWORK PORT NUMBER
  798.                 ifdef Microsoft
  799.  029A  9A ---- 0000 E            CALL    _NETWRITE       ; CLOSE THE CONNECTION
  800.                 else
  801.                 endif
  802.  029F  83 C4 08                ADD     SP,8            ; RESTORE THE STACK FRAME
  803.                 ;   JMP     SEND_DONE       ; INDICATE A SUCCESSFUL DATA SEND
  804.  
  805.  02A2                SEND_DONE:                  ; INDICATE A SUCCESSFUL CHARACTER SEND
  806.  02A2  B4 60                MOV     AH,060h         ; INDICATE A HAPPY CHARACTER SEND
  807.  02A4                SEND_FINISHED:
  808.  02A4  EB 54                JMP     SHORT SSKIP2          ; JUMP TO THE END OF THE ROUTINE
  809.  
  810.  02A6                NOT_SEND_CHARACTER:
  811.  02A6  80 FC 00                CMP     AH,00           ; CHECK FOR PORT INITIALIZATION
  812.  02A9  75 2C                JNE     SSKIP           ; A COMMUNICATIONS REQUEST WHICH WE DON'T HANDLE
  813.  
  814.  
  815.  02AB                INIT_COM_PORT:              ; INITIALIZE THE COMM. PORT
  816.                 ifdef QAK
  817.                 endif
  818.  
  819.  02AB                PORT_ALREADY_INIT:          ; THE PORT HAS ALREADY BEEN INITIALIZED
  820.                 ifdef Microsoft
  821.  02AB  84 1E 0814 R            TEST    BL,_CONNECTED_FLAGS; CHECK WHETHER WE WERE CONNECTED
  822.                 else
  823.                 endif
  824.  02AF  74 19                JE      RESET_INIT      ; IGNORE RE-INITIALIZATION IF NOT CONNECTED
  825.  02B1  F6 D3                NOT     BL              ; INVERT AL IN PREPERATION FOR TURNING OFF THE FLAGS
  826.                 ifdef Microsoft
  827.                 ifdef QAK
  828.                 endif
  829.  02B3  20 1E 0814 R            AND     _CONNECTED_FLAGS,BL  ; RESET THE CONNECTED FLAG FOR THIS PORT
  830.                 else
  831.                 endif
  832.  
  833.                 ifdef Microsoft
  834.  02B7  BE 080C R            MOV     SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
  835.                 else
  836.                 endif
  837.  02BA  03 F2                ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  838.  02BC  03 F2                ADD     SI,DX           ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
  839.  02BE  52                PUSH    DX
  840.  02BF  FF 34                PUSH    [SI]            ; PUSH THE NETWORK PORT NUMBER
  841.                 ifdef Microsoft
  842.  02C1  9A ---- 0000 E            CALL    _NETCLOSE       ; CLOSE THE CONNECTION
  843.                 else
  844.                 endif
  845. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  846. int14.asm                             Page 15 - 1
  847.  
  848.  
  849.  02C6  83 C4 02                ADD     SP,2            ; GET RID OF THE PARAMETER WE PASSED
  850.  02C9  5A                POP     DX
  851.  
  852.  02CA                RESET_INIT:
  853.                 ifdef Microsoft
  854.  02CA  BE 0916 R            MOV     SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
  855.                 else
  856.                 endif
  857.  02CD  03 F2                ADD     SI,DX           ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
  858.  02CF  C6 04 00                MOV     BYTE PTR [SI],0     ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
  859.  
  860.  02D2                INIT_FINISHED:
  861.  02D2  B8 61B0                MOV     AX,61B0H        ; MOVE THE RS-232 CONNECTED FLAGS INTO THE RETURN VALUE
  862.  02D5  EB 23                JMP     SHORT SSKIP2          ; JUMP TO THE END OF THE ROUTINE
  863.  
  864.  02D7                SSKIP:
  865.                 ;
  866.                 ;$$$ 01-05-1992 LJD +
  867.                 ;
  868.                 ;    XOR     BL,BL
  869.                 ;    MOV     CS:INTENTER,BL    ; REENTER FLAG, DONE NOW
  870.  
  871.  
  872.  02D7  FA                CLI            ; disable interrupts
  873.  02D8  2E: FE 0E 0059 R            dec    cs:intenter    ; reset the flag (unlock for the timer interrupt)
  874.                 ;
  875.                 ;$$$ 01-03-1992 LJD -
  876.                 ;
  877.  02DD  8B 1E 0006 R            MOV     BX,SER_OLDSS        ; restore the old stack
  878.  02E1  8E D3                MOV     SS,BX
  879.  02E3  8B 26 0008 R            MOV     SP,SER_OLDSP
  880.                 ifndef Watcom
  881.  02E7  8B 1E 000A R            mov     bx,SER_OLDSTKHQQ                ; restore end of stack
  882.  02EB  89 1E 0000 E            mov     STKHQQ,bx
  883.                 endif
  884.  02EF  FB                STI
  885.  02F0                SERIAL2:
  886.  02F0  5E                POP     SI
  887.  02F1  5F                POP        DI
  888.  02F2  5A                POP        DX
  889.  02F3  59                POP        CX
  890.  02F4  5B                POP        BX
  891.  02F5  58                POP        AX
  892.  02F6  07                POP        ES
  893.  02F7  1F                POP        DS
  894.  02F8  EB 21                JMP     SHORT LEAVE_SERIAL    ; JUMP TO THE END OF THE SERIAL ROUTINES
  895.  
  896.  02FA                SSKIP2:
  897.                 ;
  898.                 ;$$$ 01-05-1992 LJD +
  899.                 ;
  900.                 ;    XOR     BL,BL
  901.                 ;    MOV     CS:INTENTER,BL    ; REENTER FLAG, DONE NOW
  902.  
  903.  02FA  FA                CLI            ; disable interrupts
  904.  02FB  2E: FE 0E 0059 R            dec    cs:intenter
  905. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  906. int14.asm                             Page 16 - 1
  907.  
  908.  
  909.  
  910.  0300  8B 1E 0006 R            MOV     BX,SER_OLDSS        ; restore the old stack
  911.  0304  8E D3                MOV     SS,BX
  912.  0306  8B 26 0008 R            MOV     SP,SER_OLDSP
  913.                 ifndef Watcom
  914.  030A  8B 1E 000A R            mov     bx,SER_OLDSTKHQQ                ; restore end of stack
  915.  030E  89 1E 0000 E            mov     STKHQQ,bx
  916.                 endif
  917.  0312  FB                STI
  918.  0313                SERIAL3:
  919.  0313  5E                POP     SI
  920.  0314  5F                POP        DI
  921.  0315  5A                POP        DX
  922.  0316  59                POP        CX
  923.  0317  5B                POP        BX
  924.  0318  07                POP     ES              ; POP AX INTO ES TO PRESERVE THE RETURN VALUE IN AX
  925.  0319  07                POP        ES
  926.  031A  1F                POP        DS
  927.                 ;
  928.                 ;
  929.                 ;   forward to any other existing routines
  930.                 ;
  931.  031B                LEAVE_SERIAL:
  932.                 ifdef QAK
  933.                 else
  934.  031B  CF                IRET
  935.                 endif
  936.                 ifdef Microsoft
  937.  031C                _INT14INST      ENDP
  938.                 else
  939.                 endif
  940.  
  941.                 ifdef Microsoft
  942.                 ;_TEXT ends
  943.                 else
  944.                 endif
  945.                     END
  946.  
  947. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  948. int14.asm                             Symbols 17 - 1
  949.  
  950.  
  951.  
  952.  
  953. Segments and Groups:
  954.  
  955.                 N a m e                 Size     Length   Align   Combine Class
  956.  
  957. DGROUP . . . . . . . . . . . . .    GROUP
  958. _DATA  . . . . . . . . . . . . .    16 Bit     095D      Word      Public  'DATA'    
  959. INT14_TEXT . . . . . . . . . . .    16 Bit     031C      Word      Public  'CODE'    
  960. _TEXT  . . . . . . . . . . . . .    16 Bit     0000      Word      Public  'CODE'    
  961. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  962. int14.asm                             Symbols 18 - 1
  963.  
  964.  
  965.  
  966.  
  967. Procedures,  parameters and locals:
  968.  
  969.                 N a m e                 Type     Value    Attr
  970.  
  971. _INT14DEINST . . . . . . . . . .    P Far     00D5      INT14_TEXT    Length= 001C Public
  972. _INT14INST . . . . . . . . . . .    P Far     00F1      INT14_TEXT    Length= 022B Public
  973. _TIMEDEINST  . . . . . . . . . .    P Far     0000      INT14_TEXT    Length= 0025 Public
  974. _TIMEINST  . . . . . . . . . . .    P Far     0025      INT14_TEXT    Length= 00B0 Public
  975. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  976. int14.asm                             Symbols 19 - 1
  977.  
  978.  
  979.  
  980.  
  981. Symbols:
  982.  
  983.                 N a m e                 Type     Value    Attr
  984.  
  985. @CodeSize  . . . . . . . . . . .    Number     0001h     
  986. @DataSize  . . . . . . . . . . .    Number     0001h     
  987. @Interface . . . . . . . . . . .    Number     0000h     
  988. @Model . . . . . . . . . . . . .    Number     0005h     
  989. @code  . . . . . . . . . . . . .    Text        INT14_TEXT
  990. @data  . . . . . . . . . . . . .    Text        DGROUP
  991. @fardata?  . . . . . . . . . . .    Text        FAR_BSS
  992. @fardata . . . . . . . . . . . .    Text        FAR_DATA
  993. @stack . . . . . . . . . . . . .    Text        DGROUP
  994. BAD_NET_OPEN . . . . . . . . . .    L Near     0280      INT14_TEXT    
  995. CACHE_PORT_NAME  . . . . . . . .    L Near     0213      INT14_TEXT    
  996. CHARACTER_NOT_READY  . . . . . .    L Near     019D      INT14_TEXT    
  997. DONT_NET_SEND  . . . . . . . . .    L Near     01FD      INT14_TEXT    
  998. GET_PORT_CHARACTER . . . . . . .    L Near     01B2      INT14_TEXT    
  999. GET_PORT_STATUS  . . . . . . . .    L Near     0183      INT14_TEXT    
  1000. INIT_COM_PORT  . . . . . . . . .    L Near     02AB      INT14_TEXT    
  1001. INIT_FINISHED  . . . . . . . . .    L Near     02D2      INT14_TEXT    
  1002. INTENTER . . . . . . . . . . . .    Byte     0059      INT14_TEXT    
  1003. LEAVE_SERIAL . . . . . . . . . .    L Near     031B      INT14_TEXT    
  1004. Microsoft  . . . . . . . . . . .    Text        
  1005. NAME_TOO_LONG  . . . . . . . . .    L Near     0236      INT14_TEXT    
  1006. NET14  . . . . . . . . . . . . .    Text        
  1007. NET_OPEN . . . . . . . . . . . .    L Near     0245      INT14_TEXT    
  1008. NET_SEND . . . . . . . . . . . .    L Near     0285      INT14_TEXT    
  1009. NOT_RECEIVE_CHARACTER  . . . . .    L Near     01EC      INT14_TEXT    
  1010. NOT_SEND_CHARACTER . . . . . . .    L Near     02A6      INT14_TEXT    
  1011. NOT_STATUS_CHECK . . . . . . . .    L Near     01A3      INT14_TEXT    
  1012. NOT_WRAPPED  . . . . . . . . . .    L Near     01E7      INT14_TEXT    
  1013. NO_RE_ENTRY  . . . . . . . . . .    L Near     013A      INT14_TEXT    
  1014. NUM_COMM_PORTS . . . . . . . . .    Number     0004h     
  1015. PORT_ALREADY_INIT  . . . . . . .    L Near     02AB      INT14_TEXT    
  1016. PORT . . . . . . . . . . . . . .    Number     0001h     
  1017. READ_STATUS  . . . . . . . . . .    L Near     0178      INT14_TEXT    
  1018. RECEIVE_CHARACTER  . . . . . . .    L Near     01A8      INT14_TEXT    
  1019. RECEIVE_FINISHED . . . . . . . .    L Near     01E9      INT14_TEXT    
  1020. RESET_INIT . . . . . . . . . . .    L Near     02CA      INT14_TEXT    
  1021. SCS  . . . . . . . . . . . . . .    Word     0120      INT14_TEXT    
  1022. SEND_CHARACTER . . . . . . . . .    L Near     01F4      INT14_TEXT    
  1023. SEND_DONE  . . . . . . . . . . .    L Near     02A2      INT14_TEXT    
  1024. SEND_FINISHED  . . . . . . . . .    L Near     02A4      INT14_TEXT    
  1025. SERIAL2  . . . . . . . . . . . .    L Near     02F0      INT14_TEXT    
  1026. SERIAL3  . . . . . . . . . . . .    L Near     0313      INT14_TEXT    
  1027. SERIALINT  . . . . . . . . . . .    Number     0050h     
  1028. SER_NEWSTACK . . . . . . . . . .    Word     000C      _DATA    
  1029. SER_OLDSP  . . . . . . . . . . .    Word     0008      _DATA    
  1030. SER_OLDSS  . . . . . . . . . . .    Word     0006      _DATA    
  1031. SER_OLDSTKHQQ  . . . . . . . . .    Word     000A      _DATA    
  1032. SER_STCK . . . . . . . . . . . .    Word     080C      _DATA    
  1033. SHAND  . . . . . . . . . . . . .    L Near     0122      INT14_TEXT    
  1034. SICNT  . . . . . . . . . . . . .    Byte     011D      INT14_TEXT    
  1035. Microsoft (R) Macro Assembler Version 6.00                 04/13/92 00:06:46
  1036. int14.asm                             Symbols 20 - 1
  1037.  
  1038.  
  1039.  
  1040.  
  1041. Symbols:
  1042.  
  1043.                 N a m e                 Type     Value    Attr
  1044.  
  1045. SIP  . . . . . . . . . . . . . .    Word     011E      INT14_TEXT    
  1046. SSKIP2 . . . . . . . . . . . . .    L Near     02FA      INT14_TEXT    
  1047. SSKIP  . . . . . . . . . . . . .    L Near     02D7      INT14_TEXT    
  1048. START_PORT_NAME  . . . . . . . .    L Near     020C      INT14_TEXT    
  1049. STATUS_FINISHED  . . . . . . . .    L Near     01A0      INT14_TEXT    
  1050. STKHQQ . . . . . . . . . . . . .    Word     0000      _DATA    External
  1051. TCS  . . . . . . . . . . . . . .    Word     005C      INT14_TEXT    
  1052. THAND  . . . . . . . . . . . . .    L Near     005E      INT14_TEXT    
  1053. TICNT  . . . . . . . . . . . . .    Byte     0058      INT14_TEXT    
  1054. TIME2  . . . . . . . . . . . . .    L Near     00D1      INT14_TEXT    
  1055. TIMEINT  . . . . . . . . . . . .    Number     0070h     
  1056. TIM_OLDSP  . . . . . . . . . . .    Word     0002      _DATA    
  1057. TIM_OLDSS  . . . . . . . . . . .    Word     0000      _DATA    
  1058. TIM_OLDSTKHQQ  . . . . . . . . .    Word     0004      _DATA    
  1059. TIP  . . . . . . . . . . . . . .    Word     005A      INT14_TEXT    
  1060. TRYAGAIN . . . . . . . . . . . .    L Near     012C      INT14_TEXT    
  1061. WAIT_FOR_CHARACTER . . . . . . .    L Near     01C0      INT14_TEXT    
  1062. X  . . . . . . . . . . . . . . .    Number     0006h     
  1063. _BUFFER_OFFSET . . . . . . . . .    Byte     0916      _DATA    
  1064. _CHAR_TO_SEND  . . . . . . . . .    Byte     091A      _DATA    
  1065. _CLOCK_TICK  . . . . . . . . . .    Word     095B      _DATA    
  1066. _CONNECTED_FLAGS . . . . . . . .    Byte     0814      _DATA    Public
  1067. _DATA_BEGIN  . . . . . . . . . .    DWord     091B      _DATA    Public
  1068. _DATA_END  . . . . . . . . . . .    DWord     092B      _DATA    Public
  1069. _DATA_MAX  . . . . . . . . . . .    DWord     093B      _DATA    Public
  1070. _DATA_START  . . . . . . . . . .    DWord     094B      _DATA    Public
  1071. _GET_COMM_CHAR . . . . . . . . .    L Far     0000      External
  1072. _INT14OPEN . . . . . . . . . . .    L Far     0000      External
  1073. _NETCLOSE  . . . . . . . . . . .    L Far     0000      External
  1074. _NETWRITE  . . . . . . . . . . .    L Far     0000      External
  1075. _OPENING_FLAGS . . . . . . . . .    Byte     0815      _DATA    
  1076. _PNUM  . . . . . . . . . . . . .    Word     080C      _DATA    Public
  1077. _PORT_BUFFER . . . . . . . . . .    Byte     0816      _DATA    Public
  1078. _PRINT_INT2  . . . . . . . . . .    L Far     0000      External
  1079. _PRINT_INT . . . . . . . . . . .    L Far     0000      External
  1080. _SMYDS . . . . . . . . . . . . .    Word     011B      INT14_TEXT    
  1081. _SPEEDUP . . . . . . . . . . . .    Word     0000      _DATA    External
  1082. _TMYDS . . . . . . . . . . . . .    Word     0056      INT14_TEXT    
  1083. _int14netsleep . . . . . . . . .    L Far     0000      External
  1084.  
  1085.        1 Warnings
  1086.        0 Errors
  1087.