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

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