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 >
Wrap
File List
|
1992-04-13
|
42KB
|
1,087 lines
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 1 - 1
page 60,132
;
; Int 14h support routines
;****************************************************************************
;* *
;* *
;* part of NCSA Telnet *
;* by Tim Krauskopf, VT100 by Gaige Paulsen, Tek by Aaron Contorer *
;* Kurt Mahan, Heeren Pathak, Quincey Koziol, & Chris Wilson *
;* *
;* National Center for Supercomputing Applications *
;* 152 Computing Applications Building *
;* 605 E. Springfield Ave. *
;* Champaign, IL 61820 *
;* *
;****************************************************************************
;* *
;* DATE REASON DEVELOPER *
;* ---- ------ --------- *
;* 01/03/92 Update the timer ISR to prevent lock ups LJD *
;* *
;******************************************************************
;
NAME INT14
;Microsoft EQU 1
;Lattice EQU 1
ifndef Microsoft
endif
;
;******************************************************************
;*
;* We need to set up a stack for netsleep when we exit to DOS.
= 0006 X EQU 6
= 0001 PORT EQU 1
ifdef Microsoft
.8086
.MODEL LARGE
0000 .DATA
else
endif
even
0000 0000 TIM_OLDSS dw ?
0002 0000 TIM_OLDSP dw ?
ifndef Watcom
0004 0000 TIM_OLDSTKHQQ dw 0
endif
0006 0000 SER_OLDSS dw ?
0008 0000 SER_OLDSP dw ?
ifndef Watcom
000A 0000 SER_OLDSTKHQQ dw 0
endif
even ; Align the stack on an even boundary
000C 0400 [ SER_NEWSTACK dw 1024 dup(?) ; define a stack for netsleep when we shell to DOS
0000
]
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 2 - 1
080C SER_STCK label word
ifndef Watcom
extrn STKHQQ:word ; Microsoft heap/stack bound
endif
= 0004 NUM_COMM_PORTS EQU 4
ifdef Microsoft
ifdef QAK
endif
PUBLIC _CONNECTED_FLAGS
PUBLIC _PORT_BUFFER
ifdef QAK
endif
PUBLIC _PNUM,_DATA_BEGIN,_DATA_MAX,_DATA_END,_DATA_START
EXTRN _PRINT_INT:PROC ; FOR DEBUGGING
EXTRN _PRINT_INT2:PROC ; FOR DEBUGGING
EXTRN _GET_COMM_CHAR:PROC ; GET A CHARACTER FROM A COMM BUFFER
EXTRN _NETCLOSE:PROC ; EXTERNAL PROCEDURE TO CLOSE A CONNECTION
EXTRN _NETWRITE:PROC ; EXTERNAL PROCEDURE TO WRITE TO A CONNECTION
EXTRN _INT14OPEN:PROC ; EXTERNAL PROCEDURE TO OPEN A CONNECTION
EXTRN _SPEEDUP:WORD ; EXTERNAL TIMER SPEEDUP FACTOR
080C 0004 [ _PNUM DW NUM_COMM_PORTS DUP(0) ; PORT WE ARE CONNECTED TO
0000
]
ifdef QAK
endif
0814 00 _CONNECTED_FLAGS DB 0 ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
; COMM. PORT IS CONNECTED (BIT 0 IS COMM PORT
; 0, BIT 1 IS COMM. PORT 1, ETC..)
0815 00 _OPENING_FLAGS DB 0 ; A FLAG IN EACH BIT POSITION TO INDICATE THAT
; COMM. PORT IS OPENING (BIT 0 IS COMM PORT
; 0, BIT 1 IS COMM. PORT 1, ETC..)
0816 0004 [ _PORT_BUFFER DB NUM_COMM_PORTS DUP (64 DUP (0)) ; SPECIFY THE FOUR BUFFERS FOR THE CONNECTION NA
0040 [ MES
00
]
]
0916 0004 [ _BUFFER_OFFSET DB NUM_COMM_PORTS DUP (0) ; THE OFFSETS INTO THE FOUR PORT BUFFERS
00
]
091A 00 _CHAR_TO_SEND DB 0 ; SPACE TO STORE THE CHARACTER TO SEND ON THE NET
091B 0004 [ _DATA_BEGIN DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE BEGINNING OF
00000000
]
; THE DATA BUFFER FOR EACH COMM. PORT
092B 0004 [ _DATA_END DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE END OF
00000000
]
; THE DATA BUFFER FOR EACH COMM. PORT
093B 0004 [ _DATA_MAX DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE MAX OF
00000000
]
; THE DATA BUFFERS FOR EACH COMM. PORT
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 3 - 1
094B 0004 [ _DATA_START DD NUM_COMM_PORTS DUP(0); ARRAY OF POINTERS TO THE START OF
00000000
]
; THE DATA BUFFERS FOR EACH COMM. PORT
095B 0000 _CLOCK_TICK DW 0 ; The number of clock ticks which have elapsed
else
endif
ifdef Microsoft
0000 .CODE
else
endif
;
;**************************************************************************
;
; Routines to install and deinstall a routine which manages the
; serial port
;
;
= 0050 SERIALINT EQU 4*14H ; User hook to timer int
ifdef Microsoft
PUBLIC _INT14INST,_INT14DEINST
ifdef DEBUG
endif
EXTRN _int14netsleep:FAR ; C routine which gets called from handler
PUBLIC _TIMEINST,_TIMEDEINST
else
endif
;
;**************************************************************************
;
; Routines to install and deinstall a timer routine which calls
; netsleep(0);
; The timer is set to go off every 1/18 second to check for packets
; in the incoming packet buffer. We use the user-hook into the system
; timer which occurs every 1/18th of a second.
;
;
= 0070 TIMEINT EQU 4*1CH ; User hook to timer int
;*************************************************************************
;
; Take out the timer interrupt handler, restore previous value
;
ifdef Microsoft
0000 _TIMEDEINST PROC FAR
else
endif
;
;$$$ 01-05-1992 LJD + Stop using the timer routine. !!! THIS NEEDS FURTHER TESTING. !!!!
;
0000 9C pushf
0001 FA cli
0002 2E: C6 06 0059 R mov CS:INTENTER,-1 ; Prevent use of the timer routine while removing it from th
FF e system
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 4 - 1
0008 9D popf
;
;$$$ 01-05-1992 LJD -
;
0009 2E: 8B 0E 005A R MOV CX,CS:TIP ; GET OLD IP FROM SAVE SPOT
000E 2E: 8B 16 005C R MOV DX,CS:TCS ; GET OLD CS FROM SAVE SPOT
0013 BB 0070 MOV BX,TIMEINT ; INTERRUPT IN TABLE FOR TIMER
0016 1E PUSH DS
0017 33 C0 XOR AX,AX ; SYSTEM INTERRUPT TABLE
0019 8E D8 MOV DS,AX
001B 9C PUSHF ; $$$ 01-03-92 LJD +-
001C FA CLI
001D 89 0F MOV [BX],CX ; STORE OLD IP INTO THE TABLE
;
;$$$ 01-03-1992 ljd +
;
; INC BX
; INC BX ; MOVE POINTER IN INTERRUPT TABLE
; MOV [BX],DX ; STORE OLD CS INTO THE TABLE
001F 89 57 02 MOV [BX+2],DX ; STORE OLD CS INTO THE TABLE
0022 9D POPF
; STI
;
;$$$ 01-03-1992 LJD -
;
0023 1F POP DS
0024 CB RET
ifdef Microsoft
0025 _TIMEDEINST ENDP
else
endif
;
;
; install the timer interrupt handler, the handler is technically
; part of this procedure.
;
ifdef Microsoft
0025 _TIMEINST PROC FAR
else
endif
0025 33 C0 XOR AX,AX
0027 2E: A2 0059 R MOV CS:INTENTER,AL ; CLEAR THIS FLAG
002B 2E: 8C 1E 0056 R MOV CS:_TMYDS,DS ; STORE FOR USE BY HANDLER
0030 BB 0070 MOV BX,TIMEINT ; INTERRUPT IN TABLE FOR TIMER (1c)
0033 1E PUSH DS
0034 33 C0 XOR AX,AX ; SYSTEM INTERRUPT TABLE
0036 8E D8 MOV DS,AX
0038 B8 005E R MOV AX,OFFSET THAND ; WHERE THE HANDLER IS
;
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 5 - 1
;$$$ 01-03-1992 ljd +
;
003B 9C PUSHF ; save the current flag states
003C FA CLI
003D 8B 17 MOV DX,[BX] ; KEEP COPY OF THE IP
003F 89 07 MOV [BX],AX ; STORE IP INTO THE TABLE
; INC BX
; INC BX ; MOVE POINTER IN INTERRUPT TABLE
; MOV CX,[BX] ; KEEP COPY OF THE CS, TOO
0041 8B 4F 02 MOV CX,[BX+2] ; KEEP COPY OF THE CS, TOO
0044 8C C8 MOV AX,CS
0046 89 47 02 MOV [BX+2],AX ; STORE NEW CS INTO THE TABLE
0049 9D POPF ; restore the int. flag to what it was originally
; STI
;
;$$$ 01-03-1992 LJD -
;
004A 1F POP DS
004B 2E: 89 16 005A R MOV CS:TIP,DX ; STORE THEM AWAY
0050 2E: 89 0E 005C R MOV CS:TCS,CX
0055 CB RET
;
; Code segment addressable data for keeping track of the interrupt handler
; stuff
;
;PUBLIC _TMYDS
0056 0000 _TMYDS DW 00H ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
0058 00 TICNT DB 0 ; COUNTER OF 1/18THS SEC
0059 00 INTENTER DB 00
005A 0000 TIP DW 00
005C 0000 TCS DW 00
;
; The handler itself.
;
;$$$ 01-03-1992 ljd + Serious modifications made!
;
005E THAND: ; not a public name, only handles ints
005E FA cli ; make sure interrupts are off!
005F 50 push ax
0060 1E push ds
0061 06 push es
;
; Call the routine we replaced to proceed with chaining process.
; (Properly simulate the INT instruction.)
;
0062 9C pushf
0063 FA cli
0064 2E: FF 1E 005A R call dword ptr cs:tip
0069 FA cli ; disable interrupts
006A FC CLD ; SET THE DIRECTION FLAG FORWARD
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 6 - 1
006B 2E: 80 3E 0059 R cmp cs:intenter,0
00
0071 75 5E jnz time2 ; leave if already active
0073 2E: FE 06 0059 R inc cs:intenter
ifdef SLOW
endif
;
ifdef OLD_WAY
endif
;
; SET UP CORRECT DS & ES
;
0078 2E: 8E 1E 0056 R MOV DS,CS:_TMYDS ; GET CORRECT DS
007D 2E: 8E 06 0056 R MOV ES,CS:_TMYDS ; GET CORRECT ES
;
; do we have to set up our own stack here?
;
0082 8C D0 MOV AX,SS
0084 A3 0000 R MOV TIM_OLDSS,AX ; save the stack segment set upon entry
0087 89 26 0002 R MOV TIM_OLDSP,SP ; save the stack pointer set upon entry
;
008B B8 ---- R MOV AX,seg DGROUP:SER_STCK
008E 8E D0 MOV SS,AX ; set a new stack segment
0090 BC 080C R MOV SP,OFFSET DGROUP:SER_STCK ; set a new stack pointer
ifndef Watcom
0093 A1 0000 E mov ax,STKHQQ ; save old end of stack
0096 A3 0004 R mov TIM_OLDSTKHQQ,ax
0099 B8 000C R mov ax,offset DGROUP:SER_NEWSTACK ; load new end of stack
009C A3 0000 E mov STKHQQ,ax
endif
009F FB STI ; enable interrupts
00A0 1E PUSH DS
00A1 06 PUSH ES
00A2 50 PUSH AX
00A3 53 PUSH BX
00A4 51 PUSH CX
00A5 52 PUSH DX
00A6 57 PUSH DI
00A7 56 PUSH SI
ifdef Microsoft
00A8 9A ---- 0000 E CALL _int14netsleep
else
endif
00AD 5E POP SI
00AE 5F POP DI
00AF 5A POP DX
00B0 59 POP CX
00B1 5B POP BX
00B2 58 POP AX
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 7 - 1
00B3 07 POP ES
00B4 1F POP DS
00B5 FA cli
00B6 2E: FE 0E 0059 R dec cs:intenter
00BB 75 14 jnz time2
00BD 2E: 8E 1E 0056 R MOV DS,CS:_TMYDS ; GET CORRECT DS
00C2 A1 0000 R MOV AX,TIM_OLDSS
00C5 8E D0 MOV SS,AX ; RESTORE STACK SEGMENT
00C7 8B 26 0002 R MOV SP,TIM_OLDSP ; RESTORE STACK POINTER
ifndef Watcom
00CB A1 0004 R mov ax,TIM_OLDSTKHQQ ; restore end of stack
00CE A3 0000 E mov STKHQQ,ax
endif
comment #
TSKIP:
XOR AL,AL
MOV CS:INTENTER,AL ; REENTER FLAG, DONE NOW
#
00D1 TIME2:
;
; forward to any other existing routines
;
00D1 07 pop es
00D2 1F pop ds
00D3 58 pop ax
00D4 CF IRET
;
;$$$ 01-03-1992 ljd -
;
ifdef Microsoft
00D5 _TIMEINST ENDP
else
endif
ifdef DEBUG
endif
;*************************************************************************
;
; Take out the serial interrupt handler, restore previous value
;
ifdef Microsoft
00D5 _INT14DEINST PROC FAR
else
endif
00D5 2E: 8B 0E 011E R MOV CX,CS:SIP ; GET OLD IP FROM SAVE SPOT
00DA 2E: 8B 16 0120 R MOV DX,CS:SCS ; GET OLD CS FROM SAVE SPOT
00DF BB 0050 MOV BX,SERIALINT ; INTERRUPT IN TABLE FOR TIMER
00E2 1E PUSH DS
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 8 - 1
00E3 33 C0 XOR AX,AX ; SYSTEM INTERRUPT TABLE
00E5 8E D8 MOV DS,AX
00E7 FA CLI
00E8 89 0F MOV [BX],CX ; STORE OLD IP INTO THE TABLE
00EA 43 INC BX
00EB 43 INC BX ; MOVE POINTER IN INTERRUPT TABLE
00EC 89 17 MOV [BX],DX ; STORE OLD CS INTO THE TABLE
00EE FB STI
00EF 1F POP DS
00F0 CB RET
ifdef Microsoft
00F1 _INT14DEINST ENDP
else
endif
;
;
; install the serial interrupt handler, the handler is technically
; part of this procedure.
;
ifdef Microsoft
00F1 _INT14INST PROC FAR
else
endif
;
;$$$ 01-05-1992 LJD + Don't do this twice!
; XOR AX,AX
; MOV CS:INTENTER,AL ; CLEAR THIS FLAG
;
;$$$ 01-05-1992 LJD -
;
00F1 2E: 8C 1E 011B R MOV CS:_SMYDS,DS ; STORE FOR USE BY HANDLER
00F6 BB 0050 MOV BX,SERIALINT ; INTERRUPT IN TABLE FOR TIMER (1c)
00F9 1E PUSH DS
00FA 33 C0 XOR AX,AX ; SYSTEM INTERRUPT TABLE
00FC 8E D8 MOV DS,AX
00FE B8 0122 R MOV AX,OFFSET SHAND ; WHERE THE HANDLER IS
0101 FA CLI
0102 8B 17 MOV DX,[BX] ; KEEP COPY OF THE IP
0104 89 07 MOV [BX],AX ; STORE IP INTO THE TABLE
0106 43 INC BX
0107 43 INC BX ; MOVE POINTER IN INTERRUPT TABLE
0108 8B 0F MOV CX,[BX] ; KEEP COPY OF THE CS, TOO
010A 8C C8 MOV AX,CS
010C 89 07 MOV [BX],AX ; STORE NEW CS INTO THE TABLE
010E FB STI
010F 1F POP DS
0110 2E: 89 16 011E R MOV CS:SIP,DX ; STORE THEM AWAY
0115 2E: 89 0E 0120 R MOV CS:SCS,CX
011A CB RET
;
; Code segment addressable data for keeping track of the interrupt handler
; stuff
;
;PUBLIC _SMYDS
011B 0000 _SMYDS DW 00H ; THE DATA SEGMENT FOR THIS ASSEMBLY CODE
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 9 - 1
011D 00 SICNT DB 0 ; COUNTER OF 1/18THS SEC
;SENTER DB 00
011E 0000 SIP DW 00
0120 0000 SCS DW 00
;
; The handler itself.
;
;$$$ 01-05-1992 LJD + Modify to protect protocol layer from reentrancy problems
;
;
0122 SHAND: ; not a public name, only handles ints
0122 FA cli ; make sure interrupts are off
0123 1E PUSH DS
0124 06 PUSH ES
0125 50 PUSH AX
0126 53 PUSH BX
0127 51 PUSH CX
0128 52 PUSH DX
0129 57 PUSH DI
012A 56 PUSH SI
012B FC CLD ; ALL MOVES WILL BE FORWARD
012C TRYAGAIN:
012C 2E: 80 3E 0059 R cmp cs:intenter,0
00
0132 74 06 jz no_re_entry
0134 FB sti ; enable interrupts
0135 90 nop
0136 90 nop
0137 FA cli
0138 EB F2 jmp tryagain
013A NO_RE_ENTRY:
013A 2E: FE 06 0059 R inc cs:intenter ; increment the flags (lock out the timer interrupt)
;
; Now it is safe to enable interrupts!
;
013F FB STI
;
;
;
; SET UP CORRECT DS and ES
;
0140 2E: 8E 1E 011B R MOV DS,CS:_SMYDS ; GET CORRECT DS
0145 2E: 8E 06 011B R MOV ES,CS:_SMYDS ; GET CORRECT ES
;
; do we have to set up our own stack here?
;
014A 8C D3 MOV BX,SS
014C 89 1E 0006 R MOV SER_OLDSS,BX
0150 89 26 0008 R MOV SER_OLDSP,SP
0154 FA CLI
0155 BB ---- R MOV BX,seg DGROUP:SER_STCK
0158 8E D3 MOV SS,BX
015A BC 080C R MOV SP,OFFSET DGROUP:SER_STCK
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 10 - 1
ifndef Watcom
015D 8B 1E 0000 E mov bx,STKHQQ ; save old end of stack
0161 89 1E 000A R mov SER_OLDSTKHQQ,bx
0165 BB 000C R mov bx,offset DGROUP:SER_NEWSTACK ; load new end of stack
0168 89 1E 0000 E mov STKHQQ,bx
endif
016C FB STI
016D 8B CA MOV CX,DX ; MOVE THE COMM. PORT INTO THE CX REGISTER
016F B3 01 MOV BL,1 ; MOVE A FLAG INTO THE BL REGISTER
0171 D2 E3 SHL BL,CL ; SHIFT THE FLAG TO LINE UP WITH THE CORRECT INITIALIZATION FLAG
0173 80 FC 03 CMP AH,03 ; CHECK FOR READ STATUS
0176 75 2B JNE NOT_STATUS_CHECK; A COMMUNICATION REQUEST WHICH WE DON'T HANDLE
0178 READ_STATUS: ; CHECK FOR A CHARACTER
ifdef Microsoft
0178 84 1E 0814 R TEST BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IS CONNECTED
else
endif
017C 75 05 JNE GET_PORT_STATUS ; GET THE PORT STATUS
017E B8 2000 MOV AX,2000H ; REPORT ERROR CONDITION
0181 EB 1D JMP SHORT STATUS_FINISHED ;
0183 GET_PORT_STATUS:
ifdef Microsoft
0183 BE 091B R MOV SI,OFFSET _DATA_BEGIN ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
0186 BF 092B R MOV DI,OFFSET _DATA_END ; GET THE POINTER TO THE END OF THE DATA BUFFER
else
endif
0189 D1 E2 SHL DX,1 ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
018B D1 E2 SHL DX,1 ; OFFSET TO THE CORRECT ARRAY ELEMENT
018D 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT ARRAY ELEMENT
018F 03 FA ADD DI,DX
0191 8B 04 MOV AX,DS:[SI] ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
0193 3B 05 CMP AX,DS:[DI] ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
0195 74 06 JE CHARACTER_NOT_READY ; IF THE TWO POINTERS ARE THE SAME, THEN THERE IS NO DATA
0197 B8 2100 MOV AX,2100h ; SET THE DATA READY FLAG
; JMP STATUS_FINISHED
019A E9 015D JMP SSKIP2 ; JUMP TO THE END OF THE ROUTINE
019D CHARACTER_NOT_READY:
019D B8 2000 MOV AX,2000H ; RESET THE DATA READY FLAG
01A0 STATUS_FINISHED:
01A0 E9 0157 JMP SSKIP2 ; JUMP TO THE END OF THE ROUTINE
01A3 NOT_STATUS_CHECK:
01A3 80 FC 02 CMP AH,02 ; CHECK FOR RECEIVING CHARACTER
01A6 75 44 JNE NOT_RECEIVE_CHARACTER; JUMP AROUND RECEIVING A CHARACTER
01A8 RECEIVE_CHARACTER: ; GET A CHARACTER
ifdef Microsoft
01A8 84 1E 0814 R TEST BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 11 - 1
else
endif
01AC 75 04 JNE GET_PORT_CHARACTER; GET A CHARACTER FROM THE PORT
01AE B4 80 MOV AH,80H ; REPORT ERROR CONDITION
01B0 EB 37 JMP SHORT RECEIVE_FINISHED ;
01B2 GET_PORT_CHARACTER:
ifdef Microsoft
01B2 BE 091B R MOV SI,OFFSET _DATA_BEGIN ; GET THE POINTER TO THE BEGINNING OF THE DATA BUFFER
01B5 BF 092B R MOV DI,OFFSET _DATA_END ; GET THE POINTER TO THE END OF THE DATA BUFFER
else
endif
01B8 D1 E2 SHL DX,1 ; MULTIPLY THE PORT NUMBER BY 4 TO GET THE
01BA D1 E2 SHL DX,1 ; OFFSET TO THE CORRECT ARRAY ELEMENT
01BC 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT ARRAY ELEMENT
01BE 03 FA ADD DI,DX
01C0 WAIT_FOR_CHARACTER:
01C0 8B 04 MOV AX,DS:[SI] ; GET THE OFFSET INTO THE DATA BUFFER OF THE BEGINNING
01C2 3B 05 CMP AX,DS:[DI] ; CHECK WHETHER THERE ARE CHARACTERS IN THE BUFFER
01C4 74 FA JE WAIT_FOR_CHARACTER ; IF THE TWO POINTERS ARE THE SAME, THEN WAIT FOR DATA
01C6 1E PUSH DS
01C7 8B F8 MOV DI,AX ; SAVE THE OFFSET OF THE BEGINING POINTER
01C9 8B 44 02 MOV AX,DS:[SI+2] ; GET THE SEGMENT OF THE BEGINNING POINTER
01CC 8E D8 MOV DS,AX
01CE 8A 05 MOV AL,BYTE PTR DS:[DI] ; GET THE CHARACTER FROM THE BEGINNING OF THE QUEUE
01D0 1F POP DS ; RECOVER THE DATA SEGMENT
ifdef Microsoft
01D1 BF 093B R MOV DI,OFFSET _DATA_MAX ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
else
endif
01D4 03 FA ADD DI,DX ; INCREMENT TO THE CORRECT ARRAY ELEMENT
01D6 FF 04 INC WORD PTR DS:[SI] ; INCREMENT THE BEGINNING OF THE QUEUE
01D8 8B 0C MOV CX,DS:[SI] ; GET THE BEGINNING OF THE QUEUE
01DA 3B 0D CMP CX,DS:[DI] ; CHECK FOR WRAPPING AROUND
01DC 7C 09 JL NOT_WRAPPED ; JUMP AROUND WRAP-AROUND FIX
ifdef Microsoft
01DE BF 094B R MOV DI,OFFSET _DATA_START ; GET THE POINTER TO THE MAX OF THE DATA BUFFER
else
endif
01E1 03 FA ADD DI,DX ; INCREMENT TO THE CORRECT ARRAY ELEMENT
01E3 8B 0D MOV CX,DS:[DI] ; GET THE START OF THE QUEUE
01E5 89 0C MOV DS:[SI],CX ; MOVE THE BEGINNING OF THE QUEUE AROUND
01E7 NOT_WRAPPED:
01E7 B4 15 MOV AH,21 ; REPORT SUCCESS
01E9 RECEIVE_FINISHED:
01E9 E9 010E JMP SSKIP2 ; JUMP TO THE END OF THE ROUTINE
01EC NOT_RECEIVE_CHARACTER:
01EC 80 FC 01 CMP AH,01 ; CHECK FOR SEND CHARACTER
01EF 74 03 JE SEND_CHARACTER ; JUMP TO SENDING THE CHARACTER
01F1 E9 00B2 JMP NOT_SEND_CHARACTER; JUMP AROUND SENDING THE CHARACTER
01F4 SEND_CHARACTER: ; SEND A CHARACTER
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 12 - 1
ifdef Microsoft
01F4 84 1E 0814 R TEST BL,_CONNECTED_FLAGS; CHECK WHETHER THIS PORT IN CONNECTED
01F8 74 03 JE DONT_NET_SEND ; CONNECTION NOT OPEN YET, DON'T SEND THE CHARACTER
01FA E9 0088 JMP NET_SEND ; OK, THE CONNECTION IS INITIALIZED, SEND THE CHARACTER
01FD DONT_NET_SEND:
01FD 84 1E 0815 R TEST BL,_OPENING_FLAGS; IF THE OPENING FLAG IS SET FOR THE PORT, CACHE THE CHARACTER IN A BUF
FER
else
endif
0201 75 10 JNE CACHE_PORT_NAME ; GO CACHE THE CHARACTER
0203 3C 02 CMP AL,02 ; CHECK WHETHER THIS IS THE BEGINNING OF A PORT NAME
0205 74 05 JE START_PORT_NAME ; START CACHING THE PORT NAME
0207 B4 80 MOV AH,80H ; REPORT ERROR CONDITION
0209 E9 0098 JMP SEND_FINISHED ;
020C START_PORT_NAME: ; INITIALIZE THE PORT NAME CACHING
ifdef Microsoft
020C 08 1E 0815 R OR _OPENING_FLAGS,BL; SET THE OPENING FLAG
else
endif
0210 E9 008F JMP SEND_DONE ; INDICATE A SUCCESSFUL CHARACTER SEND, BUT DON'T REALLY
0213 CACHE_PORT_NAME: ; STUFF THE CHARACTER INTO A BUFFER, OR OPEN A CONNECTION
0213 3C 03 CMP AL,03H ; CHECK WHETHER THIS IS THE TERMINATING CHARACTER IN A PORT NAME
0215 74 2E JE NET_OPEN ; GO, OPEN THE CONNECTION
ifdef Microsoft
0217 BF 0916 R MOV DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
021A 03 FA ADD DI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
021C 8A C8 MOV CL,AL ; SAVE THE CHARACTER TEMPORARILY
021E B0 40 MOV AL,64 ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
0220 F6 E2 MUL DL ; GET THE OFFSET OF THE PORT BUFFER TO USE
0222 03 05 ADD AX,DS:[DI] ; GET THE OFFSET TO STORE THE CHARACTER AT
0224 FE 05 INC BYTE PTR DS:[DI] ; INCREMENT THE BUFFER OFFSET FOR THE COMM. PORT
0226 80 3D 40 CMP BYTE PTR DS:[DI],64 ; CHECK WHETHER WE HAVE TOO LONG OF A NAME
0229 74 0B JE NAME_TOO_LONG ; JUMP FOR TOO LONG OF A NAME
ifdef Microsoft
022B BE 0816 R MOV SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
022E 03 F0 ADD SI,AX ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
0230 8A C1 MOV AL,CL ; RESTORE THE CHARACTER TO STORE
0232 88 04 MOV [SI],AL ; APPEND THE CHARACTER TO THE PORT NAME
0234 EB 6C JMP SHORT SEND_DONE ; INDICATE A GOOD TRANSFER
0236 NAME_TOO_LONG: ; THE PORT NAME WAS TOO LONG
0236 C6 05 00 MOV BYTE PTR DS:[DI],0 ; RESET THE LENGTH OF THE PORT NAME
0239 F6 D3 NOT BL ;
ifdef Microsoft
023B 20 1E 0815 R AND _OPENING_FLAGS,BL; RESET THE OPENING FLAG
else
endif
023F 8A C1 MOV AL,CL ; RESTORE THE CHARACTER TO SEND
0241 B4 80 MOV AH,80H ; INDICATE ERROR CONDITION
0243 EB 5F JMP SHORT SEND_FINISHED ; JUMP TO THE END OF THE ROUTINE
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 13 - 1
0245 NET_OPEN: ; OPEN THE CONNECTION TO THE NETWORK
0245 F6 D3 NOT BL ;
ifdef Microsoft
0247 20 1E 0815 R AND _OPENING_FLAGS,BL; RESET THE OPENING FLAG
024B BF 0916 R MOV DI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
024E 03 FA ADD DI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
0250 8A C8 MOV CL,AL ; SAVE THE CHARACTER TEMPORARILY
0252 B0 40 MOV AL,64 ; MOVE THE SIZE OF THE PORT NAME BUFFER INTO AL
0254 F6 E2 MUL DL ; GET THE OFFSET OF THE PORT BUFFER TO USE
0256 03 05 ADD AX,DS:[DI] ; GET THE OFFSET TO STORE THE CHARACTER AT
ifdef Microsoft
0258 BE 0816 R MOV SI,OFFSET _PORT_BUFFER; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
025B 53 PUSH BX ; SAVE THE COMM. PORT FLAGS
025C 03 F0 ADD SI,AX ; GET THE CORRECT OFFSET TO STORE THIS CHARACTER AT
025E 8A C1 MOV AL,CL ; RESTORE THE CHARACTER TO STORE
0260 C6 04 00 MOV BYTE PTR [SI],0 ; APPEND THE TERMINATING ZERO
0263 52 PUSH DX ; PUSH THE COMM. PORT WE ARE OPENING
ifdef Microsoft
0264 9A ---- 0000 E CALL _INT14OPEN ; OPEN THE CONNECTION
else
endif
0269 5A POP DX ; RECOVER THE COMM. PORT WE USED
026A 5B POP BX ; RECOVER THE COMM. PORT FLAGS
026B 83 F8 01 CMP AX,1 ; CHECK FOR GOOD OPENING
026E 75 10 JNE BAD_NET_OPEN ; CONNECTION DIDN'T OPEN
0270 F6 D3 NOT BL ;
ifdef Microsoft
0272 08 1E 0814 R OR _CONNECTED_FLAGS,BL; SET THE CONNECTED FLAG
0276 BE 0916 R MOV SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
0279 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
027B C6 04 00 MOV BYTE PTR [SI],0 ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
027E EB 22 JMP SHORT SEND_DONE ; INDICATE A SUCCESSFUL CONNECTION OPENING
0280 BAD_NET_OPEN:
0280 B8 0050 MOV AX,80 ; INDICATE A BAD NETWORK OPEN
0283 EB 1F JMP SHORT SEND_FINISHED ; RETURN FROM THE INTERRUPT
0285 NET_SEND: ; SEND THE CHARACTER IN AL ONTO THE NET
ifdef Microsoft
0285 A2 091A R MOV _CHAR_TO_SEND,AL ; STORE THE CHARACTER TO SEND ON THE NET
else
endif
0288 B8 0001 MOV AX,1 ; THE NUMBER OF CHARACTERS TO DROP ONTO THE NET
028B 50 PUSH AX
028C 1E PUSH DS ; PUSH THE SEGMENT ADDRESS OF THE CHARACTER TO SEND
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 14 - 1
028D B8 091A R MOV AX,OFFSET _CHAR_TO_SEND ; PUSH THE ADDRESS OF THE CHARACTER TO SEND
0290 50 PUSH AX
ifdef Microsoft
0291 BE 080C R MOV SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
else
endif
0294 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
0296 03 F2 ADD SI,DX ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
0298 FF 34 PUSH [SI] ; PUSH THE NETWORK PORT NUMBER
ifdef Microsoft
029A 9A ---- 0000 E CALL _NETWRITE ; CLOSE THE CONNECTION
else
endif
029F 83 C4 08 ADD SP,8 ; RESTORE THE STACK FRAME
; JMP SEND_DONE ; INDICATE A SUCCESSFUL DATA SEND
02A2 SEND_DONE: ; INDICATE A SUCCESSFUL CHARACTER SEND
02A2 B4 60 MOV AH,060h ; INDICATE A HAPPY CHARACTER SEND
02A4 SEND_FINISHED:
02A4 EB 54 JMP SHORT SSKIP2 ; JUMP TO THE END OF THE ROUTINE
02A6 NOT_SEND_CHARACTER:
02A6 80 FC 00 CMP AH,00 ; CHECK FOR PORT INITIALIZATION
02A9 75 2C JNE SSKIP ; A COMMUNICATIONS REQUEST WHICH WE DON'T HANDLE
02AB INIT_COM_PORT: ; INITIALIZE THE COMM. PORT
ifdef QAK
endif
02AB PORT_ALREADY_INIT: ; THE PORT HAS ALREADY BEEN INITIALIZED
ifdef Microsoft
02AB 84 1E 0814 R TEST BL,_CONNECTED_FLAGS; CHECK WHETHER WE WERE CONNECTED
else
endif
02AF 74 19 JE RESET_INIT ; IGNORE RE-INITIALIZATION IF NOT CONNECTED
02B1 F6 D3 NOT BL ; INVERT AL IN PREPERATION FOR TURNING OFF THE FLAGS
ifdef Microsoft
ifdef QAK
endif
02B3 20 1E 0814 R AND _CONNECTED_FLAGS,BL ; RESET THE CONNECTED FLAG FOR THIS PORT
else
endif
ifdef Microsoft
02B7 BE 080C R MOV SI,OFFSET _PNUM ; GET THE OFFSET INTO THE COMM. PORT NETWORK PORT NUMBERS
else
endif
02BA 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
02BC 03 F2 ADD SI,DX ; TWICE BECAUSE THESE ARE INTEGERS, NOT BYTES
02BE 52 PUSH DX
02BF FF 34 PUSH [SI] ; PUSH THE NETWORK PORT NUMBER
ifdef Microsoft
02C1 9A ---- 0000 E CALL _NETCLOSE ; CLOSE THE CONNECTION
else
endif
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 15 - 1
02C6 83 C4 02 ADD SP,2 ; GET RID OF THE PARAMETER WE PASSED
02C9 5A POP DX
02CA RESET_INIT:
ifdef Microsoft
02CA BE 0916 R MOV SI,OFFSET _BUFFER_OFFSET; GET THE OFFSET INTO THE COMM. PORT BUFFER
else
endif
02CD 03 F2 ADD SI,DX ; INCREMENT TO THE CORRECT COMM. PORT OFFSET
02CF C6 04 00 MOV BYTE PTR [SI],0 ; ZERO OUT THE BUFFER OFFSET FOR THE COMM. PORT
02D2 INIT_FINISHED:
02D2 B8 61B0 MOV AX,61B0H ; MOVE THE RS-232 CONNECTED FLAGS INTO THE RETURN VALUE
02D5 EB 23 JMP SHORT SSKIP2 ; JUMP TO THE END OF THE ROUTINE
02D7 SSKIP:
;
;$$$ 01-05-1992 LJD +
;
; XOR BL,BL
; MOV CS:INTENTER,BL ; REENTER FLAG, DONE NOW
02D7 FA CLI ; disable interrupts
02D8 2E: FE 0E 0059 R dec cs:intenter ; reset the flag (unlock for the timer interrupt)
;
;$$$ 01-03-1992 LJD -
;
02DD 8B 1E 0006 R MOV BX,SER_OLDSS ; restore the old stack
02E1 8E D3 MOV SS,BX
02E3 8B 26 0008 R MOV SP,SER_OLDSP
ifndef Watcom
02E7 8B 1E 000A R mov bx,SER_OLDSTKHQQ ; restore end of stack
02EB 89 1E 0000 E mov STKHQQ,bx
endif
02EF FB STI
02F0 SERIAL2:
02F0 5E POP SI
02F1 5F POP DI
02F2 5A POP DX
02F3 59 POP CX
02F4 5B POP BX
02F5 58 POP AX
02F6 07 POP ES
02F7 1F POP DS
02F8 EB 21 JMP SHORT LEAVE_SERIAL ; JUMP TO THE END OF THE SERIAL ROUTINES
02FA SSKIP2:
;
;$$$ 01-05-1992 LJD +
;
; XOR BL,BL
; MOV CS:INTENTER,BL ; REENTER FLAG, DONE NOW
02FA FA CLI ; disable interrupts
02FB 2E: FE 0E 0059 R dec cs:intenter
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Page 16 - 1
0300 8B 1E 0006 R MOV BX,SER_OLDSS ; restore the old stack
0304 8E D3 MOV SS,BX
0306 8B 26 0008 R MOV SP,SER_OLDSP
ifndef Watcom
030A 8B 1E 000A R mov bx,SER_OLDSTKHQQ ; restore end of stack
030E 89 1E 0000 E mov STKHQQ,bx
endif
0312 FB STI
0313 SERIAL3:
0313 5E POP SI
0314 5F POP DI
0315 5A POP DX
0316 59 POP CX
0317 5B POP BX
0318 07 POP ES ; POP AX INTO ES TO PRESERVE THE RETURN VALUE IN AX
0319 07 POP ES
031A 1F POP DS
;
;
; forward to any other existing routines
;
031B LEAVE_SERIAL:
ifdef QAK
else
031B CF IRET
endif
ifdef Microsoft
031C _INT14INST ENDP
else
endif
ifdef Microsoft
;_TEXT ends
else
endif
END
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Symbols 17 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
DGROUP . . . . . . . . . . . . . GROUP
_DATA . . . . . . . . . . . . . 16 Bit 095D Word Public 'DATA'
INT14_TEXT . . . . . . . . . . . 16 Bit 031C Word Public 'CODE'
_TEXT . . . . . . . . . . . . . 16 Bit 0000 Word Public 'CODE'
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Symbols 18 - 1
Procedures, parameters and locals:
N a m e Type Value Attr
_INT14DEINST . . . . . . . . . . P Far 00D5 INT14_TEXT Length= 001C Public
_INT14INST . . . . . . . . . . . P Far 00F1 INT14_TEXT Length= 022B Public
_TIMEDEINST . . . . . . . . . . P Far 0000 INT14_TEXT Length= 0025 Public
_TIMEINST . . . . . . . . . . . P Far 0025 INT14_TEXT Length= 00B0 Public
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Symbols 19 - 1
Symbols:
N a m e Type Value Attr
@CodeSize . . . . . . . . . . . Number 0001h
@DataSize . . . . . . . . . . . Number 0001h
@Interface . . . . . . . . . . . Number 0000h
@Model . . . . . . . . . . . . . Number 0005h
@code . . . . . . . . . . . . . Text INT14_TEXT
@data . . . . . . . . . . . . . Text DGROUP
@fardata? . . . . . . . . . . . Text FAR_BSS
@fardata . . . . . . . . . . . . Text FAR_DATA
@stack . . . . . . . . . . . . . Text DGROUP
BAD_NET_OPEN . . . . . . . . . . L Near 0280 INT14_TEXT
CACHE_PORT_NAME . . . . . . . . L Near 0213 INT14_TEXT
CHARACTER_NOT_READY . . . . . . L Near 019D INT14_TEXT
DONT_NET_SEND . . . . . . . . . L Near 01FD INT14_TEXT
GET_PORT_CHARACTER . . . . . . . L Near 01B2 INT14_TEXT
GET_PORT_STATUS . . . . . . . . L Near 0183 INT14_TEXT
INIT_COM_PORT . . . . . . . . . L Near 02AB INT14_TEXT
INIT_FINISHED . . . . . . . . . L Near 02D2 INT14_TEXT
INTENTER . . . . . . . . . . . . Byte 0059 INT14_TEXT
LEAVE_SERIAL . . . . . . . . . . L Near 031B INT14_TEXT
Microsoft . . . . . . . . . . . Text
NAME_TOO_LONG . . . . . . . . . L Near 0236 INT14_TEXT
NET14 . . . . . . . . . . . . . Text
NET_OPEN . . . . . . . . . . . . L Near 0245 INT14_TEXT
NET_SEND . . . . . . . . . . . . L Near 0285 INT14_TEXT
NOT_RECEIVE_CHARACTER . . . . . L Near 01EC INT14_TEXT
NOT_SEND_CHARACTER . . . . . . . L Near 02A6 INT14_TEXT
NOT_STATUS_CHECK . . . . . . . . L Near 01A3 INT14_TEXT
NOT_WRAPPED . . . . . . . . . . L Near 01E7 INT14_TEXT
NO_RE_ENTRY . . . . . . . . . . L Near 013A INT14_TEXT
NUM_COMM_PORTS . . . . . . . . . Number 0004h
PORT_ALREADY_INIT . . . . . . . L Near 02AB INT14_TEXT
PORT . . . . . . . . . . . . . . Number 0001h
READ_STATUS . . . . . . . . . . L Near 0178 INT14_TEXT
RECEIVE_CHARACTER . . . . . . . L Near 01A8 INT14_TEXT
RECEIVE_FINISHED . . . . . . . . L Near 01E9 INT14_TEXT
RESET_INIT . . . . . . . . . . . L Near 02CA INT14_TEXT
SCS . . . . . . . . . . . . . . Word 0120 INT14_TEXT
SEND_CHARACTER . . . . . . . . . L Near 01F4 INT14_TEXT
SEND_DONE . . . . . . . . . . . L Near 02A2 INT14_TEXT
SEND_FINISHED . . . . . . . . . L Near 02A4 INT14_TEXT
SERIAL2 . . . . . . . . . . . . L Near 02F0 INT14_TEXT
SERIAL3 . . . . . . . . . . . . L Near 0313 INT14_TEXT
SERIALINT . . . . . . . . . . . Number 0050h
SER_NEWSTACK . . . . . . . . . . Word 000C _DATA
SER_OLDSP . . . . . . . . . . . Word 0008 _DATA
SER_OLDSS . . . . . . . . . . . Word 0006 _DATA
SER_OLDSTKHQQ . . . . . . . . . Word 000A _DATA
SER_STCK . . . . . . . . . . . . Word 080C _DATA
SHAND . . . . . . . . . . . . . L Near 0122 INT14_TEXT
SICNT . . . . . . . . . . . . . Byte 011D INT14_TEXT
Microsoft (R) Macro Assembler Version 6.00 04/13/92 00:06:46
int14.asm Symbols 20 - 1
Symbols:
N a m e Type Value Attr
SIP . . . . . . . . . . . . . . Word 011E INT14_TEXT
SSKIP2 . . . . . . . . . . . . . L Near 02FA INT14_TEXT
SSKIP . . . . . . . . . . . . . L Near 02D7 INT14_TEXT
START_PORT_NAME . . . . . . . . L Near 020C INT14_TEXT
STATUS_FINISHED . . . . . . . . L Near 01A0 INT14_TEXT
STKHQQ . . . . . . . . . . . . . Word 0000 _DATA External
TCS . . . . . . . . . . . . . . Word 005C INT14_TEXT
THAND . . . . . . . . . . . . . L Near 005E INT14_TEXT
TICNT . . . . . . . . . . . . . Byte 0058 INT14_TEXT
TIME2 . . . . . . . . . . . . . L Near 00D1 INT14_TEXT
TIMEINT . . . . . . . . . . . . Number 0070h
TIM_OLDSP . . . . . . . . . . . Word 0002 _DATA
TIM_OLDSS . . . . . . . . . . . Word 0000 _DATA
TIM_OLDSTKHQQ . . . . . . . . . Word 0004 _DATA
TIP . . . . . . . . . . . . . . Word 005A INT14_TEXT
TRYAGAIN . . . . . . . . . . . . L Near 012C INT14_TEXT
WAIT_FOR_CHARACTER . . . . . . . L Near 01C0 INT14_TEXT
X . . . . . . . . . . . . . . . Number 0006h
_BUFFER_OFFSET . . . . . . . . . Byte 0916 _DATA
_CHAR_TO_SEND . . . . . . . . . Byte 091A _DATA
_CLOCK_TICK . . . . . . . . . . Word 095B _DATA
_CONNECTED_FLAGS . . . . . . . . Byte 0814 _DATA Public
_DATA_BEGIN . . . . . . . . . . DWord 091B _DATA Public
_DATA_END . . . . . . . . . . . DWord 092B _DATA Public
_DATA_MAX . . . . . . . . . . . DWord 093B _DATA Public
_DATA_START . . . . . . . . . . DWord 094B _DATA Public
_GET_COMM_CHAR . . . . . . . . . L Far 0000 External
_INT14OPEN . . . . . . . . . . . L Far 0000 External
_NETCLOSE . . . . . . . . . . . L Far 0000 External
_NETWRITE . . . . . . . . . . . L Far 0000 External
_OPENING_FLAGS . . . . . . . . . Byte 0815 _DATA
_PNUM . . . . . . . . . . . . . Word 080C _DATA Public
_PORT_BUFFER . . . . . . . . . . Byte 0816 _DATA Public
_PRINT_INT2 . . . . . . . . . . L Far 0000 External
_PRINT_INT . . . . . . . . . . . L Far 0000 External
_SMYDS . . . . . . . . . . . . . Word 011B INT14_TEXT
_SPEEDUP . . . . . . . . . . . . Word 0000 _DATA External
_TMYDS . . . . . . . . . . . . . Word 0056 INT14_TEXT
_int14netsleep . . . . . . . . . L Far 0000 External
1 Warnings
0 Errors