3584 lines
103 KiB
NASM
Executable File
3584 lines
103 KiB
NASM
Executable File
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Network Module ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
Jumps
|
|
.386P
|
|
|
|
DRIVERIDSTRING EQU "IPX Network Driver, Copyright (C) 1999 Jeffrey Lim", 0
|
|
FIXEDUSERNAME EQU 1
|
|
|
|
Segment DriverHeader PARA Public 'Code' Use16
|
|
Assume CS:DriverHeader, DS:Nothing
|
|
|
|
;***** Driver Header *******
|
|
|
|
include drhead.inc
|
|
|
|
EndS
|
|
|
|
; DiskDataArea format:
|
|
; Word ConnectionIDNum
|
|
; 16 Username
|
|
; 10 Address
|
|
; DWord Reserved.
|
|
|
|
; Maintenance blocks
|
|
; Acknoweledgement:
|
|
; Offset 0: DB 0 ; Block type
|
|
; Offset 1: DB PacketID ; 2 bytes
|
|
|
|
; Intro:
|
|
; Offset 0: DB 1 ; Block type
|
|
; Offset 1: DB Initiate/Response
|
|
; Offset 2: DB NumberOfConnections
|
|
; Offset 3: 16 bytes name
|
|
; Offset 19: 12 bytes socket address
|
|
; Offset 31->114: 16 bytes name followed by 12 bytes address (3 sets)
|
|
; Max size = 115 bytes.
|
|
|
|
; Note: If Destination of Intro was FF:FF:FF:FF:FF:FF (ie. broadcast)
|
|
; Then a reply intro must be made
|
|
|
|
; Remove:
|
|
; Offset 0: DB 2 ; Block type - size = 1
|
|
; Called when a person gains a maximum limit of 3 extra connections
|
|
; Or does not wish to be listed in the IPX screen any further.
|
|
|
|
; Quit:
|
|
; Offset 0: DB 3 ; Block type - size = 1
|
|
; Called when a person unloads the IPX driver for any reason.
|
|
; Causes removal from group and removal from listings
|
|
|
|
; Talk:
|
|
; Offset 0: DB 4 ; Block type, talk
|
|
; Offset 1: 16 bytes ; Sender name
|
|
; Offset 17: 60 bytes ; Message
|
|
|
|
; Close connection ; Remove oneself from the group.
|
|
; Offset 0: DB 5
|
|
; Causes removal from group
|
|
|
|
; Request connection
|
|
; Offset 0: DB 6
|
|
; Offset 1: 16 bytes ; Sender name
|
|
; Only nodes with no connections can request connections
|
|
|
|
; Accept/Reject connection
|
|
; Offset 0: DB 7
|
|
; Offset 1: DB Number of connections including this one. 0 = reject
|
|
; Offset 2: Other user information (name (16), full address(12))
|
|
; Reply from requested node.
|
|
|
|
; Confirm connection
|
|
; Offset 0: DB 8
|
|
; Offset 1: DB Confirm 0 = cancelled
|
|
; Offset 2: UserName (16), Full Address (12)
|
|
; Add this to the connection list
|
|
; Send out this information to anyone already connected to this group.
|
|
|
|
; Request intro
|
|
; Offset 0: DB 9
|
|
|
|
; Notes:
|
|
; The IPX driver will automatically open port 'IT' (4945h) to listen
|
|
; for general/maintenance broadcasts (Socket1). Listening packets at
|
|
; socket 2 will (only) receive a maximum of 128 bytes.
|
|
; A dedicated (dynamically allocated) socket will be used for all music data.
|
|
; (Socket2). Socket2 will be able to receive the MAXDATASIZE (1024 bytes)
|
|
; Initiate/Terminate connection requests are handled through Socket1
|
|
; Once established, the IPX driver will use 4 packets for listening.
|
|
; Each send packet will be timestamped in order to have a maximum timeout,
|
|
; after which an error message is generated, giving the user the option to
|
|
; drop the participant.
|
|
; Acknowledgement packets will be sent for everything received at Socket2 to
|
|
; Socket1 of the sender.
|
|
|
|
; Required functions:
|
|
; GetBuffer(NumberOfBytes) - returns pointer
|
|
; SetBuffer(NumberOfBytes, Data)
|
|
; GetTimer - returns number of ticks since program startup in EAX.
|
|
; Generic Function Handler
|
|
; S_GetDestination
|
|
; S_DrawString
|
|
; SetInfoLine
|
|
|
|
; Variables required:
|
|
; GlobalKeyList
|
|
|
|
; Provided functions:
|
|
; DriverScreen
|
|
; Poll (Update procedure)
|
|
|
|
; Note: IT's network handler will send data to:
|
|
; either 0 -> everyone
|
|
; or individual connections.
|
|
;
|
|
|
|
MAXIMUMUSERS EQU 4
|
|
TIMEOUT EQU 10
|
|
SENDTIMEOUT EQU 182 ; 10 seconds
|
|
RETRYTIMEOUT EQU 36 ; 2 seconds
|
|
MAINTENANCETIMEOUT EQU 18 ; 1 second
|
|
|
|
TRACEENABLED EQU 0
|
|
SCREENTRACEENABLED EQU 0
|
|
CREATENEWLOGFILE EQU 1
|
|
|
|
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Externals ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
|
|
|
|
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
|
|
|
Segment IPX PARA Public 'Code' USE16
|
|
Assume CS:IPX, DS:Nothing, ES:Nothing
|
|
|
|
ORG 0
|
|
StartDriver:
|
|
|
|
include vtable.inc
|
|
include reqproc.inc
|
|
|
|
IPXEntryAddress Label DWord
|
|
DW Offset F_Nothing ; Done so that it won't crash if there's
|
|
Seg14 DW 0 ; no IPX due to call to Poll
|
|
|
|
IPXMaximumPacketSize DW 0
|
|
IPXRetryCount DW 0
|
|
|
|
IntroBlockInformation Label ; ****************************************
|
|
DB 1 ; Block type
|
|
NumberOfConnections DB 0
|
|
|
|
IF FIXEDUSERNAME
|
|
include username.inc
|
|
ELSE
|
|
CONFIGURATIONOFFSET EQU $+128
|
|
CONFIGURATIONSIZE EQU 16
|
|
UserName DB 16 Dup (0)
|
|
IPXLocalAddress Label
|
|
IPXNetworkAddress DD 0 ; Do not change order
|
|
IPXNodeAddress DW 0, 0, 0 ;
|
|
IPXSocket DW 0 ; Dynamic socket
|
|
ENDIF
|
|
|
|
UserName1 DB 16 Dup (0)
|
|
UserAddress1 DB 10 Dup (0)
|
|
UserSocket1 DW 0
|
|
UserName2 DB 16 Dup (0)
|
|
UserAddress2 DB 10 Dup (0)
|
|
UserSocket2 DW 0
|
|
UserName3 DB 16 Dup (0)
|
|
UserAddress3 DB 10 Dup (0) ; size = 26*4+2=106
|
|
UserSocket3 DW 0
|
|
|
|
AcknowledgementBlockInformation Label ; ************************************
|
|
DB 0
|
|
PacketID DB 0 ; Size = 2
|
|
|
|
ByteBlockInformation Label
|
|
ByteBlock DB 0
|
|
|
|
OldNumberOfConnections DB 0
|
|
|
|
MessageReceived DB 0
|
|
IFE FIXEDUSERNAME
|
|
DriverName DB "ITIPX.NET", 0
|
|
ENDIF
|
|
|
|
ALIGN 2
|
|
|
|
OldNumNodes DW 0
|
|
NumNodes DW 0
|
|
TopNode DW 0
|
|
CurrentNode DW 0
|
|
|
|
NoReply DB 0
|
|
SendingData DB 0
|
|
SendTime DD 0
|
|
RetryTime DD 0
|
|
LastPacketSize DW 0
|
|
|
|
; ---- Interface stuff --------------------------------------------------------
|
|
|
|
RequestConnectionBox DW 0
|
|
DB 27, 24, 54, 32
|
|
DB 3
|
|
|
|
RequestConnectionText DW 1
|
|
DB 29, 27
|
|
DB 20h
|
|
DB "Connection request from:", 13
|
|
DB " "
|
|
ConnectionRequestName DB 16 Dup (0)
|
|
ConnectionRequestAddress DB 12 Dup (0)
|
|
ConnectionRequest DB 0 ; Bit 0 = requesting a connection
|
|
; Bit 1 = connection requested, waiting
|
|
; for reply.
|
|
; Bit 2 = connection accepted, waiting
|
|
; for verification.
|
|
; Bit 7 = leave connetion request box
|
|
|
|
IPXHeaderText DW 1
|
|
DB 36, 25
|
|
DB 23h
|
|
DB "IPX Driver", 0
|
|
|
|
AcceptButton DW 2
|
|
DW 0FFFFh, 0FFFFh, 4, 4
|
|
DW 0
|
|
DW 0, 0
|
|
DW 0
|
|
DW 1 ; Returns 1
|
|
DW 0, 0, 0, 0
|
|
DB 28, 29, 39, 31
|
|
DB 8
|
|
DB 0
|
|
DB " Accept", 0
|
|
|
|
RejectButton DW 2
|
|
DW 0FFFFh, 0FFFFh, 3, 3
|
|
DW 0
|
|
DW 0, 0
|
|
DW 0
|
|
DW 0 ; Returns 0
|
|
DW 0, 0, 0, 0
|
|
DB 41, 29, 52, 31
|
|
DB 8
|
|
DB 0
|
|
DB " Reject", 0
|
|
|
|
ConnectionRequestList DW 3
|
|
DW IdleFunctionList2
|
|
DW ESCReturn0List
|
|
DW RequestConnectionBox
|
|
DW IPXHeaderText
|
|
DW RequestConnectionText
|
|
DW AcceptButton
|
|
DW RejectButton
|
|
DW 0
|
|
|
|
WaitforConnectList DW 2
|
|
DW IdleFunctionList2 ; Needs check for connection
|
|
DW ESCReturn0List ; No global keys.
|
|
DW NoIPXBox
|
|
DW WaitforConnectText
|
|
DW CancelButton
|
|
DW 0
|
|
|
|
ConnectionRejectedList DW 2
|
|
DW IdleFunctionList
|
|
DW ESCReturn0List
|
|
DW NoIPXBox
|
|
DW ConnectionRejectedText
|
|
DW OKButton
|
|
DW 0
|
|
|
|
ConnectionCancelledList DW 2
|
|
DW IdleFunctionList
|
|
DW ESCReturn0List
|
|
DW NoIPXBox
|
|
DW ConnectionCancelledText
|
|
DW OKButton
|
|
DW 0
|
|
|
|
WaitforConnectText DW 1
|
|
DB 28, 27
|
|
DB 20h
|
|
DB "Requesting Connection...", 0
|
|
|
|
|
|
FullScreenBox DW 0
|
|
DB 0, 0, 79, 49
|
|
DB 4
|
|
|
|
NoIPXBox DW 0
|
|
DB 25, 25, 54, 32
|
|
DB 3
|
|
|
|
NoIPXText DW 1
|
|
DB 28, 27
|
|
DB 20h
|
|
DB "IPX Network not detected", 0
|
|
|
|
ConnectionRejectedText DW 1
|
|
DB 31, 27
|
|
DB 20h
|
|
DB "Connection refused", 0
|
|
|
|
ConnectionCancelledText DW 1
|
|
DB 30, 27
|
|
DB 20h
|
|
DB "Connection cancelled", 0
|
|
|
|
NoSocketText DW 1
|
|
DB 27, 27
|
|
DB 20h
|
|
DB "IPX Socket request failure", 0
|
|
|
|
IFE FIXEDUSERNAME
|
|
UserNameBox DW 0
|
|
DB 31, 29, 48, 31
|
|
DB 27
|
|
|
|
UserNameText DW 1
|
|
DB 29, 27
|
|
DB 20h
|
|
DB "Please enter your name", 0
|
|
ENDIF
|
|
|
|
ESCReturn0List DB 0
|
|
DW 101h
|
|
DW Offset F_Return0
|
|
KeyListSeg1 DW 0
|
|
DB 0FFh
|
|
|
|
IFE FIXEDUSERNAME
|
|
UserNameInput DW 16
|
|
DB 32, 30
|
|
StringSeg1 DW 0
|
|
DW Offset UserName
|
|
DW 16
|
|
DW Offset F_Return1
|
|
StringSeg2 DW 0
|
|
DW 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
|
|
ENDIF
|
|
|
|
FillHeader DW 8
|
|
FillHeader2 DD 0
|
|
|
|
DrawHeader DW 8
|
|
DrawHeader2 DD 0
|
|
|
|
OKButton DW 2
|
|
DW 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
|
|
DW 0
|
|
DW 0, 0
|
|
DW 0
|
|
DW 0 ; Returns 0
|
|
DW 0, 0, 0, 0
|
|
DB 35, 29, 44, 31
|
|
DB 8
|
|
DB 0
|
|
DB " OK", 0
|
|
|
|
CancelButton DW 2
|
|
DW 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
|
|
DW 0
|
|
DW 0, 0
|
|
DW 0
|
|
DW 0 ; Returns 0
|
|
DW 0, 0, 0, 0
|
|
DB 34, 29, 45, 31
|
|
DB 8
|
|
DB 0
|
|
DB " Cancel", 0
|
|
|
|
SocketErrorList DW 2
|
|
DW Near Ptr IdleFunctionList
|
|
DW 0
|
|
DW Near Ptr NoIPXBox
|
|
DW Near Ptr NoSocketText
|
|
DW Near Ptr OKButton
|
|
DW Near Ptr FillHeader
|
|
DW 0
|
|
|
|
NoIPXMessageList DW 2
|
|
DW Near Ptr IdleFunctionList
|
|
DW Near Ptr ESCReturn0List
|
|
DW Near Ptr NoIPXBox
|
|
DW Near Ptr NoIPXText
|
|
DW Near Ptr OKButton
|
|
DW Near Ptr FillHeader
|
|
DW 0
|
|
|
|
IFE FIXEDUSERNAME
|
|
IPXGetName Label
|
|
DW 5
|
|
DW Near Ptr IdleFunctionList
|
|
DW Near Ptr ESCReturn0List
|
|
|
|
DW Near Ptr DrawHeader
|
|
DW Near Ptr FillHeader
|
|
DW Near Ptr NoIPXBox
|
|
DW Near Ptr UserNameText
|
|
DW Near Ptr UserNameBox
|
|
DW Near Ptr UserNameInput
|
|
|
|
DW 0
|
|
ENDIF
|
|
|
|
IPXConnectedScreen Label
|
|
DW 5
|
|
DW Near Ptr IdleFunctionList2
|
|
DW Near Ptr GlobalKeyLink
|
|
|
|
DW Near Ptr FullScreenBox
|
|
DW Near Ptr DrawHeader
|
|
DW Near Ptr FillHeader
|
|
DW Near Ptr IPXHeader
|
|
|
|
DW Near Ptr ConnectionDetailMsg
|
|
DW Near Ptr LeaveSessionButton
|
|
DW Near Ptr ShowConnectionDetails
|
|
|
|
DW Near Ptr MessageBox
|
|
DW Near Ptr MessageEnterBox
|
|
DW Near Ptr SendMessageText
|
|
DW Near Ptr GroupMessageInput
|
|
|
|
DW Near Ptr ShowConnectMessages
|
|
DW Near Ptr PacketsSentMessage
|
|
DW Near Ptr PacketsReceivedMessage
|
|
DW Near Ptr PacketsFailedMessage
|
|
DW Near Ptr PacketsRetryMessage
|
|
DW Near Ptr PacketsAckMessage
|
|
|
|
DW 0
|
|
|
|
PacketsSentMessage DW 1
|
|
DB 2, 33
|
|
DB 20h
|
|
DB "Packets sent: ", 0FDh, "D", 0
|
|
PacketsSent DW 0
|
|
|
|
PacketsReceivedMessage DW 1
|
|
DB 2, 34
|
|
DB 20h
|
|
DB "Packets rcvd: ", 0FDh, "D", 0
|
|
PacketsReceived DW 0
|
|
|
|
PacketsFailedMessage DW 1
|
|
DB 2, 35
|
|
DB 20h
|
|
DB "Packets fail: ", 0FDh, "D", 0
|
|
PacketsFailed DW 0
|
|
|
|
PacketsRetryMessage DW 1
|
|
DB 2, 36
|
|
DB 20h
|
|
DB "Packets rtry: ", 0FDh, "D", 0
|
|
PacketsRetry DW 0
|
|
|
|
PacketsAckMessage DW 1
|
|
DB 2, 32
|
|
DB 20h
|
|
DB "Acks Rcvd: ", 0FDh, "D", 0
|
|
PacketsAck DW 0
|
|
|
|
ConnectionDetailMsg DW 1
|
|
DB 2, 13
|
|
DB 23h
|
|
DB "Connection Details", 0
|
|
|
|
LeaveSessionButton DW 2
|
|
DW 10, 10, 0FFFFh, 0FFFFh
|
|
DW 0
|
|
DW 0, 0
|
|
DW 4
|
|
DW Offset IPX_LeaveSession
|
|
Seg19 DW 0
|
|
DW 0, 0, 0
|
|
DB 61, 12, 78, 14
|
|
DB 8
|
|
DB 0
|
|
DB " Leave", 0
|
|
|
|
ShowConnectionDetails DW 8
|
|
DW Offset IPX_ShowConnectionDetails
|
|
Seg20 DW 0
|
|
|
|
IPXScreen Label
|
|
DW 5
|
|
DW Near Ptr IdleFunctionList2
|
|
DW Near Ptr GlobalKeyLink
|
|
|
|
DW Near Ptr FullScreenBox
|
|
DW Near Ptr DrawHeader
|
|
DW Near Ptr FillHeader
|
|
DW Near Ptr IPXHeader
|
|
|
|
DW Near Ptr NodeBox
|
|
DW Near Ptr ConnectNetworkList
|
|
|
|
DW Near Ptr UnloadDriverButton
|
|
|
|
DW Near Ptr MessageBox
|
|
DW Near Ptr MessageEnterBox
|
|
DW Near Ptr SendMessageText
|
|
DW Near Ptr ConnectMessageInput
|
|
|
|
DW Near Ptr ShowConnectMessages
|
|
|
|
DW 0
|
|
|
|
IPXQueueScreen DW 0
|
|
|
|
IPXHeader DW 10
|
|
DB "IPX Network Driver", 0
|
|
|
|
NodeBox DW 0
|
|
DB 2, 12, 52, 36
|
|
DB 27
|
|
|
|
MessageBox DW 0
|
|
DB 2, 37, 78, 46
|
|
DB 27
|
|
|
|
MessageEnterBox DW 0
|
|
DB 15, 47, 78, 49
|
|
DB 27
|
|
|
|
SendMessageText DW 1
|
|
DB 3, 48
|
|
DB 20h
|
|
DB "Send Message", 0
|
|
|
|
ConnectMessageInput DW 16 ; String input
|
|
DB 16, 48
|
|
Seg16 DW 0
|
|
DW Offset MessageEntryArea
|
|
DW 56
|
|
DW Offset IPX_SendMessage
|
|
Seg17 DW 0
|
|
DW 5, 5, 5, 6
|
|
|
|
GroupMessageInput DW 16 ; String input
|
|
DB 16, 48
|
|
Seg21 DW 0
|
|
DW Offset MessageEntryArea
|
|
DW 56
|
|
DW Offset IPX_SendGroupMessage
|
|
Seg22 DW 0
|
|
DW 5, 5, 5, 6
|
|
|
|
ShowConnectMessages DW 8
|
|
DW Offset IPX_DisplayMessages
|
|
Seg18 DW 0
|
|
|
|
UnloadDriverButton DW 2
|
|
DW 0FFFFh, 10, 5, 10
|
|
DW 0
|
|
DW 0, 0
|
|
DW 4
|
|
DW Offset IPX_Shutdown
|
|
Seg15 DW 0
|
|
DW 0, 0, 0
|
|
DB 61, 12, 78, 14
|
|
DB 8
|
|
DB 0
|
|
DB " Disconnect", 0
|
|
|
|
IdleFunctionList DD 0
|
|
DD 0
|
|
|
|
ConnectNetworkList DW 15
|
|
DrawConnectNetworkList DW Offset IPX_DrawConnect
|
|
Seg11 DW 0
|
|
PreConnectNetworkList DW Offset IPX_PreConnect
|
|
Seg12 DW 0
|
|
PostConnectNetworkList DW Offset IPX_PostConnect
|
|
Seg13 DW 0
|
|
|
|
IdleFunctionList2 DD 0
|
|
DW Offset IdleCheck
|
|
IdleSeg DW 0
|
|
DD 0
|
|
|
|
GlobalKeyLink DB 7
|
|
GlobalKeyLink2 DD 0
|
|
|
|
Label ConnectKeys Byte
|
|
DB 0
|
|
DW 1C8h ; Up arrow
|
|
DW IPX_ConnectUp
|
|
|
|
DB 0
|
|
DW 1D0h ; Down arrow
|
|
DW IPX_ConnectDown
|
|
|
|
DB 0 ; PgUp
|
|
DW 1C9h
|
|
DW IPX_ConnectPgUp
|
|
|
|
DB 0 ; PgDn
|
|
DW 1D1h
|
|
DW IPX_ConnectPgDn
|
|
|
|
DB 0
|
|
DW 1C7h
|
|
DW IPX_ConnectHome
|
|
|
|
DB 0
|
|
DW 1CFh
|
|
DW IPX_ConnectEnd
|
|
|
|
DB 0 ; Tab
|
|
DW 10Fh
|
|
DW IPX_ConnectTab
|
|
|
|
DB 0
|
|
DW 11Ch
|
|
DW IPX_ConnectEnter
|
|
|
|
DB 0FFh
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
MessageBlock DB 4
|
|
MessageSenderName DB 16 Dup (0)
|
|
MessageEntryArea DB 56 Dup (0)
|
|
|
|
MessageData DB 72*8 Dup (0)
|
|
|
|
InfoListMessage DB 64 Dup (0)
|
|
ConnectionNumberMsg DB "Connection Number ", 0FDh, "D", 0Dh
|
|
DB " User name: ", 0
|
|
ConnectionAddressMsg DB " User address: ", 0
|
|
UnknownPacketMessage DB "IPX Error: Unknown Packet Type Received", 0
|
|
|
|
; This prompt needs to be reworded.
|
|
AutoRejectMessage DB "IPX AutoRejectConnection: "
|
|
ClosedMessage DB "IPX ClosedConnection: "
|
|
AutoDropMessage DB "IPX DropConnection: "
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Macro_MaintenanceRHeader Macro Index
|
|
MaintenanceRHeader&Index& Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
DB 12 Dup (0) ; Destination Address
|
|
DB 12 Dup (0) ; Source Address
|
|
MaintenanceRData&Index& Label
|
|
DB 128 Dup (0)
|
|
|
|
EndM
|
|
|
|
IndexCounter = 1
|
|
Rept 4
|
|
Macro_MaintenanceRHeader %IndexCounter
|
|
IndexCounter = IndexCounter+1
|
|
EndM
|
|
|
|
MaintenanceSendHeaderBroadcast Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
DB 0, 0, 0, 0 ; Destination net address
|
|
DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; Node address - broadcast
|
|
DW 'IT' ; Destination socket
|
|
DB 12 Dup (0) ; Source Address
|
|
|
|
MaintenanceSendHeaderDirected Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
MaintenanceDirectedDestination Label
|
|
DB 12 Dup (0) ; Destination address
|
|
DB 12 Dup (0) ; Source Address
|
|
|
|
MaintenanceECB1 Label
|
|
DD 0 ; Link Address - IPX controlled
|
|
DW Offset MaintenanceESR
|
|
MESeg1 DW 0
|
|
DB 0 ; In use flag - IPX controlled
|
|
DB 0 ; Completion code - IPX controlled
|
|
DW 'IT' ; Socket Number - Required
|
|
DB 16 Dup (0) ; IPX workspace - IPX controlled
|
|
DB 6 Dup (0) ; Immediate address - IPX controlled
|
|
DW 2 ; Fragment count - Required
|
|
DW Offset MaintenanceRHeader1
|
|
Seg1 DW 0
|
|
DW 30 ; Fragment size 1
|
|
DW Offset MaintenanceRData1
|
|
Seg2 DW 0
|
|
DW 128 ; Fragment size 2
|
|
|
|
MaintenanceECB2 Label
|
|
DD 0 ; Link Address - IPX controlled
|
|
DW Offset MaintenanceESR
|
|
MESeg2 DW 0
|
|
DB 0 ; In use flag - IPX controlled
|
|
DB 0 ; Completion code - IPX controlled
|
|
DW 'IT' ; Socket Number - Required
|
|
DB 16 Dup (0) ; IPX workspace - IPX controlled
|
|
DB 6 Dup (0) ; Immediate address - IPX controlled
|
|
DW 2 ; Fragment count - Required
|
|
DW Offset MaintenanceRHeader2
|
|
Seg3 DW 0
|
|
DW 30 ; Fragment size 1
|
|
DW Offset MaintenanceRData2
|
|
Seg4 DW 0
|
|
DW 128 ; Fragment size 2
|
|
|
|
MaintenanceECB3 Label
|
|
DD 0 ; Link Address - IPX controlled
|
|
DW Offset MaintenanceESR
|
|
MESeg3 DW 0
|
|
DB 0 ; In use flag - IPX controlled
|
|
DB 0 ; Completion code - IPX controlled
|
|
DW 'IT' ; Socket Number - Required
|
|
DB 16 Dup (0) ; IPX workspace - IPX controlled
|
|
DB 6 Dup (0) ; Immediate address - IPX controlled
|
|
DW 2 ; Fragment count - Required
|
|
DW Offset MaintenanceRHeader3
|
|
Seg5 DW 0
|
|
DW 30 ; Fragment size 1
|
|
DW Offset MaintenanceRData3
|
|
Seg6 DW 0
|
|
DW 128 ; Fragment size 2
|
|
|
|
MaintenanceECB4 Label
|
|
DD 0 ; Link Address - IPX controlled
|
|
DW Offset MaintenanceESR
|
|
MESeg4 DW 0
|
|
DB 0 ; In use flag - IPX controlled
|
|
DB 0 ; Completion code - IPX controlled
|
|
DW 'IT' ; Socket Number - Required
|
|
DB 16 Dup (0) ; IPX workspace - IPX controlled
|
|
DB 6 Dup (0) ; Immediate address - IPX controlled
|
|
DW 2 ; Fragment count - Required
|
|
DW Offset MaintenanceRHeader4
|
|
Seg7 DW 0
|
|
DW 30 ; Fragment size 1
|
|
DW Offset MaintenanceRData4
|
|
Seg8 DW 0
|
|
DW 128 ; Fragment size 2
|
|
|
|
MaintenanceSendECB Label
|
|
DD 0 ; Link Address - IPX controlled
|
|
DD 0
|
|
SendECBInUse Label Byte
|
|
DB 0 ; In use flag - IPX controlled
|
|
DB 0 ; Completion Code - IPX controlled
|
|
DW 'IT' ; Socket Number - Required
|
|
DB 16 Dup (0) ; IPX workspace - IPX controlled
|
|
MSendDest DB 6 Dup (0FFh); Immediate address - broadcast
|
|
DW 2 ; Fragment count - Required
|
|
MaintenanceSendHeader DW 0
|
|
Seg9 DW 0
|
|
DW 30 ; Fragment size 1
|
|
MaintenanceSendDataOffset DW 0
|
|
Seg10 DW 0
|
|
MaintenanceSendDataSize DW 0
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
MaintenanceSData DB 128 Dup (0)
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
|
|
;Data packet definitions.
|
|
|
|
Zero DB 0
|
|
Ten DB 10
|
|
|
|
NUMBEROFLISTENINGPACKETS EQU 4
|
|
MAXDATASIZE EQU 1024
|
|
|
|
Macro_DataReceiveBlock Macro Index
|
|
DataReceiveHeader&Index& Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
DB 12 Dup (0) ; Destination Address
|
|
DB 12 Dup (0) ; Source Address
|
|
DataReceive&Index& Label
|
|
DB MAXDATASIZE Dup (0)
|
|
|
|
DataReceiveECB&Index& Label
|
|
DD 0 ; Link Address -IPX controlled
|
|
DW Offset DataESR
|
|
DataSegA&Index& DW 0
|
|
DB 0 ; In use flag -IPX controlled
|
|
DB 0 ; Completion code-IPX controlled
|
|
DSocket&Index& DW 0 ; Socket Number -Required
|
|
DB 16 Dup (0) ; IPX workspace -IPX controlled
|
|
DB 6 Dup (0) ; Immediate addr -IPX controlled
|
|
DW 2 ; Fragment count -Required
|
|
DW Offset DataReceiveHeader&Index&
|
|
DataSegB&Index& DW 0
|
|
DW 30 ; Fragment Size 1
|
|
DW Offset DataReceive&Index&
|
|
DataSegC&Index& DW 0
|
|
DW MAXDATASIZE ; Fragment size 2
|
|
|
|
EndM
|
|
|
|
Macro_SendAckBlock Macro Index
|
|
|
|
SendAckHeader&Index& Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
DB 10 Dup (0) ; Destination Address
|
|
DW 'IT'
|
|
DB 12 Dup (0) ; Source Address
|
|
|
|
SendAckECB&Index& Label
|
|
DD 0 ; Link Address -IPX controlled
|
|
DD 0 ; ESR Address -None
|
|
DB 0 ; In use flag -IPX controlled
|
|
DB 0 ; Completion code-IPX controlled
|
|
DW 'IT' ; Socket Number -Required
|
|
DB 16 Dup (0) ; IPX workspace -IPX controlled
|
|
DB 6 Dup (0) ; Immediate addr -IPX controlled
|
|
DW 2 ; Fragment count -Required
|
|
DW Offset SendAckHeader&Index&
|
|
SendAckA&Index& DW 0
|
|
DW 30 ; Fragment Size 1
|
|
DW Offset Zero ; Offset 42 = 2Ah
|
|
SendAckB&Index& DW 0
|
|
DW 1
|
|
|
|
EndM
|
|
|
|
IndexCounter = 1
|
|
Rept NUMBEROFLISTENINGPACKETS
|
|
Macro_DataReceiveBlock %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
IndexCounter = 1
|
|
Rept (MAXIMUMUSERS-1)
|
|
Macro_SendAckBlock %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
|
|
Macro_DataSendBlock Macro Index
|
|
DataSendHeader&Index& Label
|
|
DW 0 ; Checksum
|
|
DW 0 ; Length
|
|
DB 0 ; Transport Control
|
|
DB 4 ; Packet type
|
|
DB 12 Dup (0) ; Destination Address
|
|
DB 12 Dup (0) ; Source Address
|
|
|
|
DataSendECB&Index& Label
|
|
DD 0 ; Link Address -IPX controlled
|
|
DW Offset SendDataESR
|
|
SDataSegA&Index& DW 0
|
|
DB 0 ; In use flag -IPX controlled
|
|
SResult&Index& DB 0 ; Completion code-IPX controlled
|
|
SDSocket&Index& DW 0 ; Socket Number -Required
|
|
DB 16 Dup (0) ; IPX workspace -IPX controlled
|
|
DB 6 Dup (0) ; Immediate addr -IPX controlled
|
|
DW 2 ; Fragment count -Required
|
|
DW Offset DataSendHeader&Index&
|
|
SDataSegB&Index& DW 0
|
|
DW 30 ; Fragment Size 1
|
|
DW Offset DataSend
|
|
SDataSegC&Index& DW 0
|
|
DW MAXDATASIZE ; Fragment size 2
|
|
EndM
|
|
|
|
DataSend DB MAXDATASIZE Dup (0)
|
|
|
|
IndexCounter = 1
|
|
Rept 3
|
|
Macro_DataSendBlock %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
; RELOCATION TABLE
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Macro_DataSegments Macro Index
|
|
DW Offset DataSegA&Index&
|
|
DW Offset DataSegB&Index&
|
|
DW Offset DataSegC&Index&
|
|
EndM
|
|
|
|
Macro_AckSegments Macro Index
|
|
DW Offset SendAckA&Index&
|
|
DW Offset SendAckB&Index&
|
|
EndM
|
|
|
|
Macro_SDataSegments Macro Index
|
|
DW Offset SDataSegA&Index&
|
|
DW Offset SDataSegB&Index&
|
|
DW Offset SDataSegC&Index&
|
|
EndM
|
|
|
|
RelocationTable Label Word
|
|
DW Offset Seg1, Offset Seg2, Offset Seg3, Offset Seg4
|
|
DW Offset Seg5, Offset Seg6, Offset Seg7, Offset Seg8
|
|
DW Offset Seg9, Offset Seg10
|
|
IFE FIXEDUSERNAME
|
|
DW Offset StringSeg1, Offset StringSeg2
|
|
ENDIF
|
|
DW Offset MESeg1, Offset MESeg2, Offset MESeg3, Offset MESeg4
|
|
Dw Offset KeyListSeg1, Offset IdleSeg, Offset Seg11, Offset Seg12
|
|
DW Offset Seg13, Offset Seg14, Offset Seg15, Offset Seg16
|
|
DW Offset Seg17, Offset Seg18, Offset Seg19, Offset Seg20
|
|
DW Offset Seg21, Offset Seg22
|
|
|
|
IndexCounter = 1
|
|
Rept NUMBEROFLISTENINGPACKETS
|
|
Macro_DataSegments %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
IndexCounter = 1
|
|
Rept (MAXIMUMUSERS-1)
|
|
Macro_AckSegments %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
IndexCounter = 1
|
|
Rept 3
|
|
Macro_SDataSegments %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
DW 0
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
include debug.inc
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc F_Nothing Far
|
|
|
|
Xor AX, AX
|
|
Ret
|
|
|
|
EndP F_Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc F_Return0 Far
|
|
|
|
Xor DX, DX
|
|
Mov AX, 4
|
|
|
|
Ret
|
|
|
|
EndP F_Return0
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc F_Return1 Far
|
|
|
|
Cmp Byte Ptr [CS:UserName], 0
|
|
JE F_Return0
|
|
|
|
Mov DX, 1
|
|
Mov AX, 4
|
|
Ret
|
|
|
|
EndP F_Return1
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IdleCheck Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Mov AL, ConnectionRequest
|
|
And ConnectionRequest, 0Fh
|
|
|
|
Test AL, 1
|
|
JZ IdleCheckConnectionRequestBit1
|
|
|
|
IdleCheckConnectionRequestBit0: ; OK.. connection around
|
|
Test AL, AL
|
|
JNS IdleNoRedraw
|
|
|
|
Mov DX, 1 ; Return 1.
|
|
Jmp IdleCheckReturnValue
|
|
|
|
IdleCheckConnectionRequestBit1: ; If connection is cancelled before
|
|
Test AL, 2
|
|
JZ IdleCheckNoConnectionRequest
|
|
|
|
Test AL, AL ; Acceptance or Rejection.
|
|
JNS IdleNoRedraw
|
|
|
|
Mov DX, 2
|
|
|
|
IdleCheckReturnValue:
|
|
Mov AX, 5
|
|
Mov DI, 4
|
|
Ret
|
|
|
|
IdleCheckNoConnectionRequest:
|
|
Mov AL, NumberOfConnections
|
|
Cmp OldNumberOfConnections, AL
|
|
Mov OldNumberOfConnections, AL
|
|
JE IdleCheck3
|
|
|
|
; Mov AX, 5
|
|
; Mov DI, 1 ; Redraw
|
|
; Ret
|
|
Jmp IPX_DriverScreen
|
|
|
|
IdleCheck3:
|
|
Mov AX, NumNodes
|
|
Cmp AX, OldNumNodes
|
|
Mov OldNumNodes, AX
|
|
JE IdleCheck1
|
|
|
|
IdleCheck2:
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
IdleCheck1:
|
|
Cmp MessageReceived, 0
|
|
Mov MessageReceived, 0
|
|
JNE IdleCheck2
|
|
|
|
IdleNoRedraw:
|
|
Xor AX, AX
|
|
Ret
|
|
|
|
EndP IdleCheck
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc TransferDestinationAddress ; SI = Header
|
|
|
|
Push AX
|
|
Push CX
|
|
Push SI
|
|
Push DI
|
|
|
|
Add SI, 12h
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
Mov CX, 10/2
|
|
Rep MovsW
|
|
Mov AX, 'IT'
|
|
StosW
|
|
|
|
Pop DI
|
|
Pop SI
|
|
Pop CX
|
|
Pop AX
|
|
Ret
|
|
|
|
EndP TransferDestinationAddress
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc NodeSearch ; DS gets set to DiskDataArea
|
|
; Given EAX:EDX = Node address
|
|
; Returns carry if found and BX = address
|
|
Assume DS:IPX
|
|
|
|
Mov CX, NumNodes
|
|
Mov DS, DiskDataArea
|
|
Assume DS:Nothing
|
|
|
|
; ClC
|
|
; Ret
|
|
|
|
Xor BX, BX
|
|
JCXZ NodeSearch2
|
|
|
|
NodeSearch1:
|
|
Cmp [BX+20], EAX
|
|
JNE NodeSearch3
|
|
Cmp [BX+24], EDX
|
|
JNE NodeSearch3
|
|
|
|
StC
|
|
Ret
|
|
|
|
NodeSearch3:
|
|
Add BX, 32
|
|
Loop NodeSearch1
|
|
; Dec CX
|
|
; JNZ NodeSearch1
|
|
|
|
NodeSearch2:
|
|
Ret
|
|
|
|
EndP NodeSearch
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc CheckFromSelf
|
|
|
|
Push SI
|
|
Push DI
|
|
|
|
Add SI, 12h ; Source internetwork address
|
|
Mov DI, Offset IPXLocalAddress
|
|
Mov CX, 10
|
|
RepE CmpSB
|
|
|
|
Pop DI
|
|
Pop SI
|
|
|
|
Ret
|
|
|
|
EndP CheckFromSelf
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc ConnectionReject
|
|
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AX, 7
|
|
StosW
|
|
Call IPX_MaintenanceSendData
|
|
Ret
|
|
|
|
EndP ConnectionReject
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc FindConnection ; Returns carry set if not found,
|
|
; BX = address, AX = connection number
|
|
; 0 = first connect
|
|
Assume DS:IPX
|
|
|
|
Push CX
|
|
Push SI
|
|
Push DI
|
|
|
|
Xor AX, AX
|
|
Add SI, 18 ; Address of sender
|
|
Mov DI, Offset UserAddress1
|
|
|
|
FindConnection1:
|
|
Cmp AL, NumberOfConnections
|
|
JAE FindConnection2
|
|
|
|
Mov CX, 10
|
|
Push SI
|
|
RepE CmpsB
|
|
Pop SI
|
|
JE FindConnection3
|
|
|
|
Add DI, CX
|
|
Inc AX
|
|
Add DI, 16+12-10
|
|
Jmp FindConnection1
|
|
|
|
FindConnection2:
|
|
StC
|
|
|
|
FindConnection3:
|
|
LEA BX, [DI-26]
|
|
|
|
Pop DI
|
|
Pop SI
|
|
Pop CX
|
|
Ret
|
|
|
|
EndP FindConnection
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc RemoveFromGroup ; Assumes DS = CS = IPX
|
|
|
|
Call FindConnection
|
|
JC RemoveFromGroupEnd
|
|
|
|
PushA
|
|
Push ES
|
|
|
|
Push DS
|
|
Pop ES
|
|
|
|
Mov AH, 6
|
|
Mul AH
|
|
Mov BX, AX
|
|
|
|
Mov SI, Offset ClosedMessage
|
|
Mov DI, Offset InfoListMessage
|
|
Mov CX, 22/2
|
|
Rep MovsW
|
|
Mov SI, [SendPacketInformation+BX]
|
|
Sub SI, 16
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
Mov BX, 100
|
|
Mov SI, Offset InfoListMessage
|
|
Call IT_SetInfoLine
|
|
|
|
Pop ES
|
|
PopA
|
|
|
|
Proc RemoveFromGroup2
|
|
Assume DS:IPX
|
|
|
|
Push AX
|
|
|
|
Mov AH, NumberOfConnections
|
|
Sub AH, AL
|
|
|
|
Mov DI, BX
|
|
LEA SI, [BX+28]
|
|
|
|
Dec NumberOfConnections
|
|
Mov AL, 28/2
|
|
Mul AH
|
|
|
|
Mov CX, AX
|
|
Rep MovsW
|
|
|
|
; Remove from ack list
|
|
Pop CX
|
|
|
|
Mov AX, 0FFFEh
|
|
ShL AL, CL ; AL = mask for 'upper' bits
|
|
ShL AH, CL
|
|
Not AH ; AH = mask for 'lower' bits
|
|
Mov CL, SendingData
|
|
And AL, CL
|
|
And AH, CL
|
|
ShR AL, 1
|
|
Or AL, AH
|
|
Mov SendingData, AL
|
|
|
|
RemoveFromGroupEnd:
|
|
Ret
|
|
|
|
EndP RemoveFromGroup2
|
|
EndP RemoveFromGroup
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SendDataOK ; Returns carry if data is still
|
|
; pending to send.
|
|
Assume DS:IPX
|
|
|
|
Xor AX, AX
|
|
Mov AL, NumberOfConnections
|
|
|
|
Test AL, AL
|
|
JZ SendDataOK_Fail
|
|
|
|
Cmp SResult1, 0
|
|
JNE SendDataOK_Fail
|
|
Dec AX
|
|
JZ SendDataOK_End
|
|
|
|
Cmp SResult2, 0
|
|
JNE SendDataOK_Fail
|
|
Dec AX
|
|
JZ SendDataOK_End
|
|
|
|
Cmp SResult3, 0
|
|
JE SendDataOK_End
|
|
|
|
SendDataOK_Fail:
|
|
StC
|
|
|
|
SendDataOK_End:
|
|
Ret
|
|
|
|
EndP SendDataOK
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Macro_AckOffsets Macro Index
|
|
DW Offset SendAckHeader&Index&+6
|
|
DW Offset SendAckECB&Index&
|
|
EndM
|
|
|
|
AckOffsets Label
|
|
IndexCounter = 1
|
|
Rept (MAXIMUMUSERS-1)
|
|
Macro_AckOffsets %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
PacketReceived DB 0
|
|
|
|
Proc DataESR Far
|
|
|
|
PushF
|
|
PushAD
|
|
Push DS
|
|
|
|
ScreenTraceStart
|
|
|
|
Push ES
|
|
Push SI
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX ; Also ES = IPX
|
|
|
|
ScreenTrace '0'
|
|
|
|
ClD
|
|
|
|
Mov PacketReceived, 1
|
|
Inc PacketsReceived
|
|
|
|
Trace "R: ESR"
|
|
ScreenTrace '1'
|
|
|
|
Cmp Byte Ptr [SI+9], 0 ; Received packet successfully?
|
|
JNE DESRBadPacket
|
|
|
|
Mov DI, [SI+2Ah] ; Offset to fragment 2
|
|
Mov SI, [SI+24h] ; Offset to fragment 1 (ie. header)
|
|
Mov CX, [SI+2]
|
|
XChg CH, CL
|
|
Sub CX, 30
|
|
|
|
ScreenTrace '2'
|
|
|
|
Call FindConnection
|
|
JC DESRRelisten
|
|
|
|
ScreenTrace '3'
|
|
|
|
; Send acknowledgement
|
|
PushA
|
|
Push DS
|
|
Push ES
|
|
|
|
Mov BX, AX
|
|
Mov SI, DI
|
|
Call IT_ReceiveData
|
|
|
|
ScreenTrace '4'
|
|
|
|
Pop ES
|
|
Pop DS
|
|
PopA
|
|
|
|
PushF
|
|
Mov BX, AX
|
|
ShL BX, 2
|
|
|
|
Mov EAX, [SI+12h]
|
|
Mov ECX, [SI+16h]
|
|
Mov DX, [SI+1Ah]
|
|
|
|
Mov DI, [AckOffsets+BX]
|
|
StosD
|
|
Mov [DI], ECX
|
|
Mov [DI+4], DX
|
|
Mov SI, [AckOffsets+BX+2]
|
|
Mov [SI+28], ECX
|
|
Mov [SI+32], DX
|
|
|
|
Mov Word Ptr [SI+2Ah], Offset Zero
|
|
|
|
PopF
|
|
JNC DESRNoBadPacket
|
|
|
|
DESRBadPacket:
|
|
ScreenTrace '5'
|
|
|
|
Mov Word Ptr [SI+2Ah], Offset Ten
|
|
Inc PacketsFailed
|
|
|
|
DESRNoBadPacket:
|
|
ScreenTrace '6'
|
|
|
|
Mov BX, 3
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
ScreenTrace '7'
|
|
Trace "R: Source recognised"
|
|
|
|
Jmp DESRRelisten
|
|
|
|
DESRRelisten:
|
|
ScreenTrace '8'
|
|
Pop SI
|
|
Pop ES
|
|
|
|
Trace "R: Packet relisten to socket"
|
|
|
|
Mov BX, 4 ; Relisten to the socket.
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
ScreenTrace '9'
|
|
|
|
ScreenTraceEnd
|
|
|
|
Pop DS
|
|
PopAD
|
|
PopF
|
|
Ret
|
|
|
|
EndP DataESR
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SendDataGivenBX ; Given BX = Offset to SendPacketInfo stuff
|
|
|
|
Mov SI, [BX]
|
|
Mov DI, [BX+2]
|
|
Mov CX, 6
|
|
Rep MovsW
|
|
|
|
Sub SI, 8
|
|
Mov DI, [BX+4]
|
|
Add DI, 28 ; Immediate address
|
|
|
|
MovsW
|
|
MovsW
|
|
MovsW
|
|
|
|
Inc PacketsSent
|
|
|
|
Push AX
|
|
Push BX
|
|
Mov SI, [BX+4]
|
|
Mov BX, LastPacketSize
|
|
Mov AX, IPXSocket
|
|
Mov [SI+0Ah], AX ; Socket Number
|
|
Mov [SI+2Eh], BX
|
|
Mov BX, 3
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Pop BX
|
|
Pop AX
|
|
|
|
Ret
|
|
|
|
EndP SendDataGivenBX
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
SendPacketInformation DW Offset UserAddress1, Offset DataSendHeader1+6, Offset DataSendECB1
|
|
DW Offset UserAddress2, Offset DataSendHeader2+6, Offset DataSendECB2
|
|
DW Offset UserAddress3, Offset DataSendHeader3+6, Offset DataSendECB3
|
|
|
|
Proc SendITData Near
|
|
|
|
PushAD
|
|
PushF
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Push CS
|
|
Pop ES
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Cmp SendingData, 0
|
|
JNE SendITDataCheckTime
|
|
|
|
Mov AX, MAXDATASIZE
|
|
Mov DI, Offset DataSend
|
|
Call IT_SendData
|
|
Test CX, CX
|
|
JZ SendITDataEnd ; No Network Data to send
|
|
|
|
Call IT_GetTime ; Returns EAX
|
|
Mov SendTime, EAX
|
|
Mov RetryTime, EAX
|
|
|
|
Mov LastPacketSize, CX
|
|
|
|
Mov AL, NumberOfConnections
|
|
Mov BX, Offset SendPacketInformation
|
|
|
|
Test AL, AL
|
|
JZ SendITDataEnd
|
|
|
|
Test DL, DL
|
|
JNZ SendITDataSingle
|
|
|
|
; Have to send to all connections
|
|
|
|
Mov CL, AL
|
|
Mov CH, 1
|
|
ShL CH, CL
|
|
Dec CH
|
|
Mov SendingData, CH
|
|
|
|
SendITData1:
|
|
Trace "Sending broadcast packet"
|
|
|
|
Call SendDataGivenBX
|
|
|
|
Add BX, 6
|
|
Dec AL
|
|
|
|
JNZ SendITData1
|
|
|
|
Jmp SendITDataEnd
|
|
|
|
SendITDataSingle:
|
|
Trace "Sending single packet"
|
|
|
|
Cmp DL, AL
|
|
JA SendITDataEnd ; Invalid destination
|
|
|
|
Mov CL, AL
|
|
Mov CH, 1
|
|
Dec CX
|
|
ShL CH, CL
|
|
Mov SendingData, CH
|
|
|
|
; Have to send to single destination
|
|
Mov AL, 6
|
|
Mul DL ; AX = Destination*6
|
|
|
|
Add BX, AX
|
|
Sub BX, 6
|
|
Call SendDataGivenBX
|
|
Jmp SendITDataEnd
|
|
|
|
SendITDataCheckTime:
|
|
Mov DL, NumberOfConnections
|
|
Test DL, DL
|
|
JZ SendITDataEnd
|
|
|
|
Call IT_GetTime
|
|
Mov EBX, EAX
|
|
Mov ECX, EAX
|
|
Sub EBX, RetryTime
|
|
Sub ECX, SendTime
|
|
|
|
Cmp EBX, RETRYTIMEOUT
|
|
JB SendITDataEnd
|
|
|
|
; Check for true timeout.. drop if so.
|
|
Cmp ECX, SENDTIMEOUT
|
|
JA SendITDataTimeout
|
|
|
|
; Else retry sending packet.
|
|
Mov RetryTime, EAX
|
|
|
|
Mov AL, SendingData
|
|
Mov BX, Offset SendPacketInformation
|
|
|
|
SendITDataRetry:
|
|
ShR AL, 1
|
|
JNC SendITDataRetry2
|
|
|
|
Call SendDataGivenBX
|
|
Inc PacketsRetry
|
|
|
|
SendITDataRetry2:
|
|
Add BX, 6
|
|
Dec DL
|
|
JNZ SendITDataRetry
|
|
|
|
Jmp SendITDataEnd
|
|
|
|
SendITDataTimeout:
|
|
Xor AX, AX ; AX = connection number
|
|
Mov DH, SendingData
|
|
|
|
SendITDataTimeout1:
|
|
ShR DH, 1
|
|
JNC SendITDataTimeout2
|
|
|
|
Mov AH, 6
|
|
Mul AH
|
|
Mov BX, AX
|
|
|
|
Mov SI, Offset AutoDropMessage
|
|
Mov DI, Offset InfoListMessage
|
|
Mov CX, 20/2
|
|
Rep MovsW
|
|
Mov SI, [SendPacketInformation+BX]
|
|
Sub SI, 16
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
Mov BX, 100
|
|
Mov SI, Offset InfoListMessage
|
|
Call IT_SetInfoLine
|
|
|
|
Call RemoveFromGroup2
|
|
Jmp SendITDataEnd
|
|
|
|
SendITDataTimeout2:
|
|
Inc AX
|
|
Dec DL
|
|
JNZ SendITDataTimeout1
|
|
|
|
SendITDataEnd:
|
|
Pop ES
|
|
Pop DS
|
|
PopF
|
|
PopAD
|
|
|
|
Ret
|
|
|
|
EndP SendITData
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SendDataESR Far
|
|
|
|
Push DS
|
|
PushF
|
|
|
|
ScreenTraceStart
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX ; Also ES = IPX
|
|
ClD
|
|
|
|
Trace "S: ESR"
|
|
ScreenTrace 'A'
|
|
|
|
Cmp Byte Ptr [SI+9], 0 ; Received packet successfully?
|
|
JNE SDESRResend
|
|
|
|
ScreenTrace 'B'
|
|
Call SendITData
|
|
|
|
ScreenTrace 'C'
|
|
|
|
ScreenTraceEnd
|
|
|
|
PopF
|
|
Pop DS
|
|
Ret
|
|
|
|
SDESRResend:
|
|
Inc PacketsFailed
|
|
|
|
ScreenTrace 'D'
|
|
|
|
Mov BX, 3
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
ScreenTrace 'E'
|
|
|
|
ScreenTraceEnd
|
|
|
|
PopF
|
|
Pop DS
|
|
Ret
|
|
|
|
EndP SendDataESR
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
MAXIMUMBLOCKTYPE = 10
|
|
|
|
MESRBlockOffsets Label Word
|
|
DW Offset MESRBlockType0, Offset MESRBlockType1
|
|
DW Offset MESRBlockType2, Offset MESRBlockType3
|
|
DW Offset MESRBlockType4, Offset MESRBlockType5
|
|
DW Offset MESRBlockType6, Offset MESRBlockType7
|
|
DW Offset MESRBlockType8, Offset MESRBlockType9
|
|
DW Offset MESRBLockType10
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MaintenanceESR Far ; Given ES:SI = ECB
|
|
|
|
PushF
|
|
PushAD
|
|
|
|
ScreenTraceStart
|
|
|
|
Push DS
|
|
Push SI
|
|
|
|
ClD
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX ; Also ES = IPX
|
|
|
|
ScreenTrace 'a'
|
|
|
|
Cmp Byte Ptr [SI+9], 0 ; Received packet successfully?
|
|
JNE MESRRelisten
|
|
|
|
ScreenTrace 'b'
|
|
|
|
Mov DI, [SI+2Ah] ; Offset to fragment 2
|
|
Mov SI, [SI+24h] ; Offset to fragment 1 (ie. header)
|
|
|
|
Mov DX, [DI] ; DL = block type
|
|
Mov BX, DX
|
|
And BX, 0FFh
|
|
Cmp BL, MAXIMUMBLOCKTYPE
|
|
JA MESRBlockTypeUnknown
|
|
Add BX, BX
|
|
Jmp [MESRBlockOffsets+BX]
|
|
|
|
MESRBlockType0: ; Acknowledgement
|
|
ScreenTrace 'c'
|
|
|
|
Call FindConnection
|
|
JC MESRBlockType0End
|
|
|
|
Inc PacketsAck
|
|
Mov CX, AX
|
|
Mov AL, 0FEh
|
|
|
|
RoL AL, CL
|
|
And SendingData, AL
|
|
|
|
ScreenTrace 'd'
|
|
|
|
Call SendITData
|
|
|
|
MESRBlockType0End:
|
|
ScreenTrace 'e'
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType1: ; Intro
|
|
ScreenTrace 'f'
|
|
; Cmp NumberOfConnections, 3 ; Don't respond if 3 connections already!
|
|
; JE MESRBlockType1End
|
|
|
|
; Ignore packets from self........
|
|
|
|
Call CheckFromSelf
|
|
JE MESRBlockType1End
|
|
|
|
ScreenTrace 'g'
|
|
|
|
; .................................
|
|
|
|
; Now check whether destination was broadcast...
|
|
|
|
Cmp Byte Ptr [DI+1], 0
|
|
JNE MESRBlockType1NoReply
|
|
|
|
Cmp Word Ptr [SI+0Ah], 0FFFFh
|
|
JNE MESRBlockType1NoReply
|
|
Cmp DWord Ptr [SI+0Ch], 0FFFFFFFFh
|
|
JNE MESRBlockType1NoReply
|
|
|
|
Cmp NoReply, 0
|
|
JNE MESRBlockType1End
|
|
; Yes it was broadcast.. now reply..
|
|
|
|
ScreenTrace 'h'
|
|
|
|
Mov AL, 1
|
|
Call SendConnectionData
|
|
|
|
ScreenTrace 'i'
|
|
|
|
MESRBlockType1NoReply:
|
|
ScreenTrace 'j'
|
|
|
|
; Don't log if we don't want to log (ie. only log if current mode = 24)
|
|
|
|
; Cmp NumberOfConnections, 0
|
|
; JNE MESRBlockType1End
|
|
Call IT_GetCurrentMode
|
|
Cmp AL, 24
|
|
JNE MESRBlockType1End
|
|
|
|
ScreenTrace 'k'
|
|
|
|
; Don't log if already logged..
|
|
|
|
Mov EAX, [SI+20] ; Sender's ID
|
|
Mov EDX, [SI+24]
|
|
|
|
Call NodeSearch
|
|
JC MESRBlockType1End
|
|
|
|
ScreenTrace 'l'
|
|
|
|
; Don't have the node -> log it!
|
|
|
|
LEA SI, [DI+2]
|
|
Push CS
|
|
Push DS
|
|
Pop ES
|
|
Pop DS
|
|
|
|
Mov DI, NumNodes
|
|
Xor DX, DX
|
|
|
|
Cmp DI, 2000
|
|
JA MESRBlockType1End
|
|
|
|
LodsB
|
|
|
|
ShL DI, 5
|
|
Mov DL, AL
|
|
|
|
Inc DX
|
|
|
|
Xor AX, AX
|
|
Add NumNodes, DX
|
|
|
|
MESRBlockType1Transfer:
|
|
StosW
|
|
Mov CX, 26/2
|
|
Rep MovsW
|
|
Inc AX
|
|
Add DI, 4
|
|
Dec DX
|
|
JNZ MESRBlockType1Transfer
|
|
|
|
MESRBlockType1End:
|
|
ScreenTrace 'm'
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType3: ; Quit ; Have to say farewell to direct connections
|
|
; also. Should cascade to MESRBlockType2
|
|
ScreenTrace 'n'
|
|
Call RemoveFromGroup
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType2: ; Remove ; Only significant on connect driver screen
|
|
ScreenTrace 'o'
|
|
|
|
Cmp NumberOfConnections, 0
|
|
JNE MESRBlockType2End
|
|
Call IT_GetCurrentMode
|
|
Cmp AL, 24
|
|
JNE MESRBlockType2End
|
|
|
|
ScreenTrace 'p'
|
|
|
|
Mov EAX, [SI+20] ; Sender's ID
|
|
Mov EDX, [SI+24]
|
|
|
|
Call NodeSearch
|
|
JNC MESRBlockType2End ; DS = DiskData
|
|
|
|
ScreenTrace 'q'
|
|
|
|
Push DS
|
|
Pop ES
|
|
|
|
Mov CX, CS:NumNodes
|
|
Mov DI, BX
|
|
ShL CX, 5
|
|
LEA SI, [BX+32]
|
|
Xor AX, AX
|
|
|
|
Sub CX, DI
|
|
Rep MovsB
|
|
|
|
Mov CX, 32/2
|
|
Rep StosW
|
|
|
|
Mov SI, BX
|
|
|
|
MESRBlockType2a:
|
|
Cmp [SI], AX
|
|
JE MESRBlockType2b
|
|
|
|
Dec Word Ptr [SI]
|
|
Add SI, 32
|
|
Jmp MESRBlockType2a
|
|
|
|
MESRBlockType2b:
|
|
ScreenTrace 'r'
|
|
|
|
ShR BX, 5
|
|
|
|
Push CS
|
|
Pop DS
|
|
|
|
Dec NumNodes
|
|
Cmp BX, CurrentNode
|
|
JAE MESRBlockType2End
|
|
|
|
Dec CurrentNode
|
|
|
|
MESRBlockType2End:
|
|
ScreenTrace 's'
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType4: ; Message
|
|
ScreenTrace 't'
|
|
|
|
Call CheckFromSelf
|
|
JE MESRBlockType4End
|
|
|
|
; If NumberOfConnections = 0 && CurrentMode = 24, then check that name is logged
|
|
Cmp NumberOfConnections, 0
|
|
JNE MESRBlockType4_6
|
|
|
|
Call IT_GetCurrentMode
|
|
Cmp AL, 24
|
|
JNE MESRBlockType4_3
|
|
|
|
Push DS
|
|
Push ES
|
|
|
|
Mov EAX, [SI+20] ; Sender's ID
|
|
Mov EDX, [SI+24]
|
|
|
|
Call NodeSearch
|
|
JC MESRBlockType4_4
|
|
|
|
; Couldn't find node.
|
|
Push DI
|
|
Push SI
|
|
|
|
Push CS
|
|
Push DS
|
|
Pop ES
|
|
Pop DS
|
|
|
|
LEA SI, [DI+1]
|
|
Mov DI, NumNodes
|
|
Cmp DI, 2000
|
|
JA MESRBlockType4_5
|
|
|
|
ShL DI, 5
|
|
Xor AX, AX
|
|
|
|
StosW
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
|
|
Pop SI
|
|
Push SI
|
|
|
|
Add SI, 18
|
|
Mov CX, 10/2
|
|
Rep MovsW
|
|
|
|
Inc NumNodes
|
|
|
|
MESRBlockType4_5:
|
|
Pop SI
|
|
Pop DI
|
|
|
|
MESRBlockType4_4:
|
|
Pop ES
|
|
Pop DS
|
|
|
|
Jmp MESRBlockType4_3
|
|
|
|
MESRBlockType4_6:
|
|
; Have connections.. only accept messages from group
|
|
Call FindConnection
|
|
JC MESRBlockType4End
|
|
|
|
MESRBlockType4_3:
|
|
Mov MessageReceived, 1
|
|
|
|
Push DI
|
|
|
|
Mov SI, Offset MessageData+72
|
|
Mov DI, Offset MessageData
|
|
Mov CX, (72*7)/2
|
|
Rep MovsW
|
|
|
|
Pop SI
|
|
LodsB
|
|
Mov CX, 72/2
|
|
Rep MovsW
|
|
|
|
Call IT_GetCurrentMode
|
|
Cmp AL, 24
|
|
JE MESRBlockType4End
|
|
|
|
Sub SI, 72
|
|
Mov DI, Offset InfoListMessage
|
|
|
|
Mov CX, 61
|
|
|
|
Push SI
|
|
|
|
MESRBlockType4_1:
|
|
LodsB
|
|
StosB
|
|
Test AL, AL
|
|
LoopNZ MESRBlockType4_1
|
|
|
|
Pop SI
|
|
Mov Word Ptr [DI-1], ':'+ ' '*100h
|
|
Inc DI
|
|
Add SI, 16
|
|
Mov AX, 0FEh+2300h
|
|
StosW
|
|
|
|
MESRBlockType4_2:
|
|
LodsB
|
|
StosB
|
|
Test AL, AL
|
|
LoopNZ MESRBlockType4_2
|
|
Xor AL, AL
|
|
StosB
|
|
|
|
Mov BX, 150
|
|
Mov SI, Offset InfoListMessage
|
|
Call IT_SetInfoLine
|
|
|
|
MESRBlockType4End:
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType5:
|
|
Call RemoveFromGroup
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType6: ; Request connection
|
|
; auto reject if:
|
|
; This node is requesting a connection
|
|
; Someone else is requesting a connection
|
|
; NumConnections already = 3
|
|
Cmp NumberOfConnections, 3
|
|
JE MESRBlockType6AutoReject
|
|
Test ConnectionRequest, 0Fh
|
|
JNE MESRBlockType6AutoReject
|
|
|
|
Or ConnectionRequest, 2 ; Mark that someone is requesting a con
|
|
|
|
; Else prompt user
|
|
; Save connection request address
|
|
|
|
Push DI
|
|
|
|
Add SI, 18 ; Save address of connection requester
|
|
Mov DI, Offset ConnectionRequestAddress
|
|
Mov CX, 12/2
|
|
Rep MovsW
|
|
|
|
Pop DI
|
|
|
|
Inc DI
|
|
Mov SI, DI
|
|
Xor AL, AL
|
|
Mov CX, 16
|
|
Push CX
|
|
RepNE ScasB ; DI = one after 0 found
|
|
Pop CX
|
|
Sub DI, SI
|
|
Mov DX, DI
|
|
Sub CX, DI
|
|
ShR CX, 1
|
|
|
|
Mov DI, Offset ConnectionRequestName
|
|
|
|
Mov AL, ' '
|
|
Rep StosB
|
|
|
|
Mov CX, DX
|
|
Rep MovsB
|
|
|
|
Mov IPXQueueScreen, 1
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
MESRBlockType6AutoReject:
|
|
Call MaintenanceWaitforSend
|
|
Call TransferDestinationAddress
|
|
|
|
Push DI
|
|
Mov SI, Offset AutoRejectMessage
|
|
Mov DI, Offset InfoListMessage
|
|
Mov CX, 26/2
|
|
Rep MovsW
|
|
Pop SI
|
|
Inc SI
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
Mov BX, 100
|
|
Mov SI, Offset InfoListMessage
|
|
Call IT_SetInfoLine
|
|
Call ConnectionReject
|
|
|
|
MESRBlockType6End:
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType7: ; Accept/Reject connection
|
|
; First verify that sender is the same as ConnectionRequestAddress and that
|
|
; connectionRequest Bit 0 is set. if not, then send negative confirmation
|
|
|
|
Test [ConnectionRequest], 1
|
|
JZ MESRBlockType7Reject
|
|
|
|
Push SI
|
|
Push DI
|
|
|
|
Mov CX, 10/2
|
|
Add SI, 18 ; Sender's address
|
|
Mov DI, Offset ConnectionRequestAddress
|
|
RepE CmpsW
|
|
|
|
Pop DI
|
|
Pop SI
|
|
|
|
JNE MESRBlockType7Reject
|
|
|
|
; OK..
|
|
; Connection rejected if DH = 0
|
|
|
|
Or ConnectionRequest, 80h ; Leave wait for connection request
|
|
; screen
|
|
ShR DX, 8
|
|
JZ MESRBlockTypeFinished
|
|
|
|
Call MaintenanceWaitforSend
|
|
Call TransferDestinationAddress
|
|
|
|
; Connection accepted if DH != 0
|
|
; Then copy DH*28 lots of bytes starting at UserName1
|
|
; And set NumberOfConnections to DH
|
|
; Then call IT_EstablishConnection
|
|
|
|
Mov NumberOfConnections, DL
|
|
LEA SI, [DI+2]
|
|
Mov DI, Offset UserName1
|
|
|
|
MESRBlockType7Accepted:
|
|
Mov CX, 28/2
|
|
Rep MovsW
|
|
Dec DX
|
|
JNZ MESRBlockType7Accepted
|
|
|
|
; Send positive ack
|
|
|
|
Mov SI, Offset UserName
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AX, 108h
|
|
Mov CX, 28/2
|
|
StosW
|
|
Rep MovsW
|
|
Call IPX_MaintenanceSendData
|
|
|
|
Call IT_NewConnection
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
MESRBlockType7Reject:
|
|
Test DH, DH ; If connection rejected, dont' send
|
|
; Further response.
|
|
JZ MESRBlockType7End
|
|
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AX, 8
|
|
StosW
|
|
Call IPX_MaintenanceSendData
|
|
|
|
MESRBlockType7End:
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType8: ; Confirm connection
|
|
|
|
; Check whether connection was requested and whether this cancellation
|
|
; is from that sender.
|
|
|
|
; If Confirm connection is from ConnectionRequestAddress and ConnectRequest & 2
|
|
; *OR* Confirm connection is from someone in the current group
|
|
; Then add user to user list, increment NumberOfConnections
|
|
|
|
Cmp NumberOfConnections, 3
|
|
JE MESRBlockType8End
|
|
|
|
Call FindConnection ; Was it from the group?
|
|
JNC MESRBlockType8AddUser ; Yes -> Add user
|
|
|
|
Push SI
|
|
Push DI
|
|
|
|
Add SI, 12h
|
|
Mov DI, Offset ConnectionRequestAddress
|
|
Mov CX, 12/2
|
|
RepE CmpsW
|
|
|
|
Pop DI
|
|
Pop SI
|
|
JNE MESRBlockType8End
|
|
|
|
Test DH, DH ; Cancelled?
|
|
JZ MESRBlockType8ScreenRefresh
|
|
|
|
; If received from group, then don't send
|
|
; If not received from group, then send to rest of group.
|
|
; Establish connection
|
|
; If NumConnections != 0
|
|
; then send connection establishment to all
|
|
; other connected users.
|
|
; Send to the rest of the group!
|
|
Mov AL, NumberOfConnections
|
|
|
|
Push AX
|
|
Inc AL
|
|
Call IT_EstablishConnection
|
|
Pop AX
|
|
|
|
Test AL, AL
|
|
JZ MESRBlockType8AddUser
|
|
|
|
Call MaintenanceWaitforSend
|
|
|
|
Push DI
|
|
|
|
Mov SI, DI
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov CX, 30/2
|
|
Rep MovsW
|
|
|
|
Mov SI, Offset UserAddress1
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderDirected
|
|
Mov [MaintenanceSendDataOffset], Offset MaintenanceSData
|
|
Mov [MaintenanceSendDataSize], 30
|
|
|
|
MESRBlockType8Group1:
|
|
|
|
Push AX
|
|
Push SI
|
|
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
Mov CX, 10/2
|
|
Rep MovsW
|
|
Mov AX, 'IT'
|
|
StosW
|
|
|
|
Call SendMaintenancePacket
|
|
|
|
Pop SI
|
|
Pop AX
|
|
|
|
Dec AL
|
|
JZ MESRBlockType8GroupEnd
|
|
|
|
Add SI, 28
|
|
Call MaintenanceWaitforSend
|
|
Jmp MESRBlockType8Group1
|
|
|
|
MESRBlockType8GroupEnd:
|
|
Pop DI
|
|
|
|
MESRBlockType8AddUser:
|
|
LEA SI, [DI+2]
|
|
Mov AL, 28
|
|
Mul NumberOfConnections
|
|
|
|
Mov DI, AX
|
|
Add DI, Offset UserName1
|
|
Mov CX, 28/2
|
|
Rep MovsW
|
|
|
|
Inc NumberOfConnections
|
|
|
|
MESRBlockType8ScreenRefresh:
|
|
Or ConnectionRequest, 80h
|
|
|
|
MESRBlockType8End:
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType9: ; Request intro
|
|
; Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderDirected
|
|
Mov AL, 1
|
|
Call SendConnectionData
|
|
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
;******************************************************************************
|
|
|
|
MESRBlockType10: ; Resend data
|
|
Call FindConnection
|
|
JC MESRBlockType10End
|
|
|
|
Inc PacketsRetry
|
|
|
|
Mov AH, 6
|
|
Mul AH
|
|
Mov BX, AX
|
|
Add BX, Offset SendPacketInformation
|
|
Call SendDataGivenBX
|
|
|
|
MESRBlockType10End:
|
|
Jmp MESRBlockTypeFinished
|
|
|
|
MESRBlockTypeUnknown:
|
|
Mov BX, 72
|
|
Mov SI, Offset UnknownPacketMessage
|
|
Call IT_SetInfoLine
|
|
|
|
MESRBlockTypeFinished:
|
|
; Should process the info, respond if necessary and set the packet back
|
|
; for listening.
|
|
|
|
MESRRelisten:
|
|
Push CS
|
|
Push CS
|
|
Pop ES
|
|
Pop DS
|
|
|
|
Pop SI
|
|
|
|
ScreenTrace 'z'
|
|
|
|
Mov BX, 4 ; Relisten to the socket.
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
ScreenTrace 'Z'
|
|
|
|
Pop DS
|
|
ScreenTraceEnd
|
|
|
|
PopAD
|
|
PopF
|
|
Ret
|
|
|
|
EndP MaintenanceESR
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MaintenanceWaitForSend
|
|
|
|
PushF
|
|
PushAD
|
|
Push DS
|
|
|
|
ScreenTraceStart
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Call IT_GetTime ; Returns EAX
|
|
Mov EDX, EAX
|
|
|
|
SendMaintenancePacket1:
|
|
Cmp [SendECBInUse], 0
|
|
JE SendMaintenancePacket2
|
|
|
|
StI
|
|
|
|
Mov BX, 0Ah ; IPX processing.
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov EBX, EDX
|
|
Call IT_GetTime
|
|
Sub EBX, EAX
|
|
Cmp EBX, MAINTENANCETIMEOUT
|
|
JB SendMaintenancePacket1
|
|
|
|
; Error message!
|
|
|
|
SendMaintenancePacket2:
|
|
ScreenTraceEnd
|
|
|
|
Pop DS
|
|
PopAD
|
|
PopF
|
|
Ret
|
|
|
|
EndP MaintenanceWaitForSend
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SendMaintenancePacket
|
|
|
|
PushAD
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Push CS
|
|
Pop ES
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Call MaintenanceWaitForSend
|
|
|
|
Mov SI, [MaintenanceSendHeader]
|
|
Mov DI, Offset MSendDest
|
|
Add SI, 10
|
|
MovsW
|
|
MovsW
|
|
MovSW
|
|
|
|
Mov BX, 3
|
|
Mov SI, Offset MaintenanceSendECB
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Pop ES
|
|
Pop DS
|
|
PopAD
|
|
Ret
|
|
|
|
EndP SendMaintenancePacket
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc DetectIPXNetwork Far ; IPX detection.
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
IF FIXEDUSERNAME
|
|
Mov CX, 18
|
|
Mov SI, Offset UserName
|
|
ELSE
|
|
Xor CX, CX
|
|
ENDIF
|
|
Call IT_DecodeUserName
|
|
|
|
Mov AX, 7A00h
|
|
Int 2Fh
|
|
|
|
Sub AL, 0FFh
|
|
JC DetectIPXNetwork1
|
|
|
|
Mov [Word Ptr IPXEntryAddress], DI
|
|
Mov [Word Ptr IPXEntryAddress+2], ES
|
|
|
|
Mov BX, 1Ah
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov [IPXMaximumPacketSize], AX
|
|
Mov [IPXRetryCount], CX
|
|
|
|
Push CS
|
|
Pop ES
|
|
|
|
Mov BX, 9
|
|
Mov SI, Offset IPXLocalAddress
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
ClC
|
|
|
|
DetectIPXNetwork1:
|
|
Ret
|
|
|
|
EndP DetectIPXNetwork
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Macro_SetupListenDataPackets Macro Index
|
|
Mov DSocket&Index&, DX
|
|
EndM
|
|
|
|
Macro_ListenDataPackets Macro Index
|
|
Mov SI, Offset DataReceiveECB&Index&
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
EndM
|
|
|
|
Proc IPX_Initialise Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Trace "IPX: Initialise"
|
|
|
|
Mov SI, Offset RelocationTable
|
|
|
|
IPX_RelocationFixup:
|
|
LodsW
|
|
Test AX, AX
|
|
JZ IPX_RelocationEnd
|
|
Mov BX, AX
|
|
Mov [BX], DS
|
|
|
|
Jmp IPX_RelocationFixup
|
|
|
|
IPX_RelocationEnd:
|
|
Mov EAX, IT_DrawHeader
|
|
Mov EBX, IT_FillHeader
|
|
Mov ECX, IdleUpdateInfoLine
|
|
Mov EDX, GlobalKeyList
|
|
|
|
Mov DrawHeader2, EAX
|
|
Mov FillHeader2, EBX
|
|
Mov IdleFunctionList, ECX
|
|
Mov IdleFunctionList2, ECX
|
|
Mov GlobalKeyLink2, EDX
|
|
|
|
Call DetectIPXNetwork
|
|
JNC IPX_Initialise1
|
|
|
|
Push DS
|
|
Push Offset NoIPXMessageList
|
|
Jmp IPX_InitialiseReturn
|
|
|
|
IPX_Initialise1:
|
|
Xor AL, AL
|
|
Xor BX, BX ; Open socket
|
|
Mov DX, 'IT'
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
Test AL, AL
|
|
JNZ IPX_InitialiseError1
|
|
|
|
Xor AL, AL
|
|
Xor BX, BX
|
|
Xor DX, DX
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
Test AL, AL
|
|
JNZ IPX_InitialiseError2
|
|
|
|
Mov IPXSocket, DX
|
|
|
|
IndexCounter = 1
|
|
Rept NUMBEROFLISTENINGPACKETS
|
|
Macro_SetupListenDataPackets %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
IPX_Initialise2:
|
|
|
|
IFE FIXEDUSERNAME
|
|
; OK.. ask for user name.
|
|
Push DS
|
|
Push Offset IPXGetName
|
|
Call IT_FunctionHandler
|
|
|
|
Push CS
|
|
Pop DS
|
|
|
|
Test DX, DX
|
|
JNZ IPX_Initialise3
|
|
Jmp IPX_Shutdown1
|
|
|
|
IPX_Initialise3:
|
|
ENDIF
|
|
|
|
; Setup to listen for packets!
|
|
|
|
Push CS
|
|
Pop ES
|
|
Mov BX, 4
|
|
|
|
Mov SI, Offset MaintenanceECB1
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov SI, Offset MaintenanceECB2
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov SI, Offset MaintenanceECB3
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov SI, Offset MaintenanceECB4
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
IndexCounter = 1
|
|
Rept NUMBEROFLISTENINGPACKETS
|
|
Macro_ListenDataPackets %IndexCounter
|
|
IndexCounter = IndexCounter + 1
|
|
EndM
|
|
|
|
Jmp IPX_DriverScreen
|
|
|
|
IPX_InitialiseError2: ; Close socket.
|
|
Mov BX, 1
|
|
Mov DX, 'IT'
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
IPX_InitialiseError1:
|
|
Push DS
|
|
Push Offset SocketErrorList
|
|
|
|
IPX_InitialiseReturn:
|
|
Call IT_FunctionHandler
|
|
Jmp IT_UnloadDriver
|
|
|
|
EndP IPX_Initialise
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc BroadcastMaintenanceByte ; Given AL
|
|
|
|
Call MaintenanceWaitforSend
|
|
Mov [ByteBlock], AL
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderBroadcast
|
|
Mov [MaintenanceSendDataOffset], Offset ByteBlockInformation
|
|
Mov [MaintenanceSendDataSize], 1
|
|
Call SendMaintenancePacket
|
|
|
|
Ret
|
|
|
|
EndP BroadcastMaintenanceByte
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_DriverScreen Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Mov ES, DiskDataArea
|
|
Xor DI, DI
|
|
Mov CX, 32768
|
|
Xor AX, AX
|
|
Rep StosW
|
|
|
|
Cmp NumberOfConnections, 0
|
|
JE IPX_DriverScreen1
|
|
|
|
; Alternative screens here for post-connection.
|
|
|
|
Mov AX, 5
|
|
Mov SI, 1
|
|
Mov DI, AX
|
|
Mov DX, Offset IPXConnectedScreen
|
|
Mov CX, CS
|
|
|
|
Ret
|
|
|
|
IPX_DriverScreen1:
|
|
Mov OldNumNodes, 0
|
|
Mov NumNodes, 0
|
|
Mov CurrentNode, 0
|
|
|
|
; Call MaintenanceWaitforSend
|
|
; Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderBroadcast
|
|
Xor AX, AX
|
|
Call SendConnectionData
|
|
|
|
Mov AX, 5
|
|
Mov SI, 1
|
|
Mov DI, AX
|
|
Mov DX, Offset IPXScreen
|
|
Mov CX, CS
|
|
|
|
Ret
|
|
|
|
EndP IPX_DriverScreen
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_Shutdown Far ; Shutdown has to:
|
|
; free all allocated
|
|
; Transmit logoff message
|
|
; release any allocated sockets
|
|
; Unload driver
|
|
IFE FIXEDUSERNAME
|
|
Call IT_GotoHomeDirectory
|
|
ENDIF
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
IFE FIXEDUSERNAME
|
|
; Now to save config into driver file.
|
|
Mov AX, 3D02h ; Read write access
|
|
Mov DX, Offset DriverName
|
|
Int 21h
|
|
JC SaveConfiguration2
|
|
|
|
Mov BX, AX
|
|
|
|
Mov AX, 4200h
|
|
Xor CX, CX
|
|
Mov DX, Offset CONFIGURATIONOFFSET
|
|
Int 21h
|
|
JC SaveConfiguration1
|
|
|
|
Mov AH, 40h
|
|
Mov CX, CONFIGURATIONSIZE
|
|
Mov DX, Offset UserName
|
|
Int 21h
|
|
|
|
SaveConfiguration1:
|
|
Mov AH, 3Eh
|
|
Int 21h
|
|
|
|
SaveConfiguration2:
|
|
ENDIF
|
|
Mov AL, 3 ; Block type 3 = quit
|
|
Call BroadcastMaintenanceByte
|
|
|
|
IPX_Shutdown1:
|
|
; Free both sockets
|
|
Mov BX, 1
|
|
|
|
Mov DX, 'IT' ; Release maintenance socket.
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov DX, IPXSocket
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Jmp IT_UnloadDriver
|
|
|
|
EndP IPX_Shutdown
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_LeaveSession Far
|
|
|
|
Mov AL, 5 ; Log off from group.
|
|
Call BroadcastMaintenanceByte
|
|
|
|
Mov CS:NumberOfConnections, 0
|
|
|
|
Jmp IPX_DriverScreen
|
|
|
|
EndP IPX_LeaveSession
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_Update Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Xor AX, AX
|
|
XChg IPXQueueScreen, AX
|
|
|
|
Test AX, 1
|
|
JZ IPX_Update2
|
|
|
|
Push AX
|
|
|
|
; For Connection requests..
|
|
And ConnectionRequest, 0Fh
|
|
|
|
Call IT_S_SaveScreen
|
|
Push CS
|
|
Push Offset ConnectionRequestList
|
|
Call IT_FunctionHandler
|
|
|
|
Push CS
|
|
Push CS
|
|
Pop DS
|
|
Pop ES
|
|
|
|
Call IT_S_RestoreScreen
|
|
|
|
; Transfer destination address
|
|
Mov SI, Offset ConnectionRequestAddress
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
Mov CX, 12/2
|
|
Rep MovsW
|
|
|
|
Cmp DX, 1
|
|
JB IPX_UpdateConnectionReject
|
|
JA IPX_UpdateConnectionCancelled
|
|
|
|
IPX_UpdateConnectionAccept:
|
|
; Have to send complete info about all connnections back
|
|
; including socket numbers
|
|
Mov AH, NumberOfConnections
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AL, 7
|
|
Mov SI, Offset UserName
|
|
Inc AH
|
|
Mov CX, ((16+12)*3)/2
|
|
StosW
|
|
Rep MovsW
|
|
Call IPX_MaintenanceSendData
|
|
|
|
Jmp IPX_UpdateConnectionEnd
|
|
|
|
IPX_UpdateConnectionReject:
|
|
Call ConnectionReject
|
|
Jmp IPX_UpdateConnectionEnd
|
|
|
|
IPX_UpdateConnectionCancelled:
|
|
Push CS
|
|
Push Offset ConnectionCancelledList
|
|
Call IT_FunctionHandler
|
|
Call IT_S_RestoreScreen
|
|
|
|
IPX_UpdateConnectionEnd:
|
|
And ConnectionRequest, Not 2
|
|
Pop AX
|
|
|
|
IPX_Update3:
|
|
Mov BX, 0Ah ; Relinquish control
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Mov AX, 1
|
|
Ret ; Redraw required.
|
|
|
|
IPX_Update2:
|
|
Call SendITData
|
|
|
|
Call IT_GetCurrentMode
|
|
Cmp AL, 24
|
|
JE IPX_Update3
|
|
|
|
IPX_UpdateEnd:
|
|
Mov BX, 0Ah ; Relinquish control
|
|
Call [DWord Ptr IPXEntryAddress]
|
|
|
|
Xor AX, AX
|
|
XChg AL, PacketReceived
|
|
Ret
|
|
|
|
EndP IPX_Update
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_DrawHexNumber ; Given AL = Number
|
|
|
|
LodsB
|
|
Mov DH, AL
|
|
ShR AL, 4
|
|
Cmp AL, 10
|
|
SBB AL, 69h
|
|
DAS
|
|
StosW
|
|
Mov AL, DH
|
|
And AL, 0Fh
|
|
Cmp AL, 10
|
|
SBB AL, 69h
|
|
DAS
|
|
StosW
|
|
|
|
Ret
|
|
|
|
EndP IPX_DrawHexNumber
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_DrawAddress
|
|
|
|
Mov CX, 3
|
|
|
|
IPX_DrawAddress1:
|
|
Call IPX_DrawHexNumber
|
|
Mov AL, ':'
|
|
StosW
|
|
Loop IPX_DrawAddress1
|
|
Call IPX_DrawHexNumber
|
|
Mov AL, ' '
|
|
StosW
|
|
|
|
Mov CX, 5
|
|
|
|
IPX_DrawAddress2:
|
|
Call IPX_DrawHexNumber
|
|
Mov AL, ':'
|
|
StosW
|
|
Loop IPX_DrawAddress2
|
|
Call IPX_DrawHexNumber
|
|
|
|
Ret
|
|
|
|
EndP IPX_DrawAddress
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_DrawConnect Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Call IT_S_GetDestination ; Gets ES
|
|
|
|
Mov AX, 168+200h
|
|
Mov DI, (13*80+22)*2
|
|
Mov CX, 23
|
|
|
|
IPX_DrawConnect2:
|
|
StosW
|
|
Add DI, 158
|
|
Loop IPX_DrawConnect2
|
|
|
|
Cmp [NumNodes], 0
|
|
JNE IPX_DrawConnect1
|
|
|
|
Ret
|
|
|
|
IPX_DrawConnect1:
|
|
Mov SI, [TopNode]
|
|
Mov DX, [NumNodes]
|
|
Mov BX, [CurrentNode]
|
|
|
|
Cmp BX, DX
|
|
JB IPX_DrawConnectClip3
|
|
|
|
Mov BX, DX
|
|
Dec BX
|
|
Mov [CurrentNode], BX
|
|
|
|
IPX_DrawConnectClip3:
|
|
|
|
; Need to make sure they're within bounds.
|
|
Cmp BX, SI
|
|
JAE IPX_DrawConnectClip1
|
|
|
|
Mov SI, BX
|
|
|
|
IPX_DrawConnectClip1:
|
|
LEA DI, [SI+22]
|
|
Cmp BX, DI
|
|
JBE IPX_DrawConnectClip2
|
|
|
|
LEA SI, [BX-22]
|
|
|
|
IPX_DrawConnectClip2:
|
|
Mov DI, (13*80+3)*2
|
|
Mov [TopNode], SI
|
|
|
|
Sub DX, SI
|
|
JZ IPX_DrawConnectEnd
|
|
|
|
ShL SI, 5
|
|
|
|
Mov DS, [DiskDataArea]
|
|
Assume DS:Nothing
|
|
|
|
Cmp DX, 23
|
|
JB IPX_DrawConnectClip
|
|
|
|
Mov DX, 23
|
|
|
|
IPX_DrawConnectClip:
|
|
Push DI
|
|
|
|
LodsW
|
|
|
|
Mov AH, 3
|
|
Mov CX, 16
|
|
|
|
Test AL, AL
|
|
JZ IPX_DrawConnectUserName
|
|
|
|
Add DI, 4
|
|
|
|
IPX_DrawConnectUserName:
|
|
LodsB
|
|
StosW
|
|
Loop IPX_DrawConnectUserName
|
|
|
|
Pop DI
|
|
|
|
Add DI, 40
|
|
|
|
Call IPX_DrawAddress
|
|
|
|
Add SI, 4
|
|
Add DI, 62
|
|
|
|
Dec DL
|
|
JNZ IPX_DrawConnectClip
|
|
|
|
Mov CL, 0E0h
|
|
Jmp IPX_PreConnectChain
|
|
|
|
IPX_DrawConnectEnd:
|
|
Ret
|
|
|
|
EndP IPX_DrawConnect
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_PreConnect Far
|
|
|
|
Mov CL, 30h
|
|
|
|
IPX_PreConnectChain:
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Cmp [NumNodes], 0
|
|
JE IPX_PreConnectEnd
|
|
|
|
Mov AX, [CurrentNode]
|
|
Sub AX, [TopNode]
|
|
Add AX, 13
|
|
Mov BX, 160
|
|
Mul BX
|
|
|
|
Call IT_S_GetDestination
|
|
|
|
Mov DL, CL
|
|
Mov DH, CL
|
|
Or DH, 2
|
|
|
|
LEA DI, [EAX+6]
|
|
Mov CX, 49
|
|
|
|
IPX_PreConnectScreen1:
|
|
Mov AX, [ES:DI]
|
|
Mov AH, DL
|
|
Cmp CX, 49-19
|
|
JNE IPX_PreConnectScreen2
|
|
|
|
Mov AH, DH
|
|
|
|
IPX_PreConnectScreen2:
|
|
StosW
|
|
Loop IPX_PreConnectScreen1
|
|
|
|
IPX_PreConnectEnd:
|
|
Ret
|
|
|
|
EndP IPX_PreConnect
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_PostConnect Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Mov SI, Offset ConnectKeys
|
|
Call IT_FunctionDivider
|
|
JC IPX_PostConnect1
|
|
|
|
Jmp [Word Ptr SI]
|
|
|
|
IPX_PostConnect1:
|
|
Xor AX, AX
|
|
Ret
|
|
Xor AX, AX
|
|
Ret
|
|
|
|
EndP IPX_PostConnect
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectUp Far
|
|
Assume DS:IPX
|
|
|
|
Mov AX, 1
|
|
|
|
Sub CurrentNode, AX
|
|
AdC CurrentNode, 0
|
|
|
|
Ret
|
|
|
|
EndP IPX_ConnectUp
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectDown Far
|
|
Assume DS:IPX
|
|
|
|
Mov AX, 1
|
|
Add CurrentNode, AX
|
|
Ret
|
|
|
|
EndP IPX_ConnectDown
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectPgUp Far
|
|
Assume DS:IPX
|
|
|
|
Mov AX, CurrentNode
|
|
Sub AX, 24
|
|
JNC IPX_ConnectPgUp1
|
|
|
|
Xor AX, AX
|
|
|
|
IPX_ConnectPgUp1:
|
|
Mov CurrentNode, AX
|
|
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectPgUp
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectPgDn Far
|
|
Assume DS:IPX
|
|
|
|
Add CurrentNode, 24
|
|
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectPgDn
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectHome Far
|
|
|
|
Mov CurrentNode, 0
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectHome
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectEnd Far
|
|
|
|
Mov CurrentNode, 1000
|
|
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectEnd
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectTab Far
|
|
Assume DS:IPX
|
|
|
|
Mov AX, 6
|
|
StosW
|
|
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectTab
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_GetDestinationAddress
|
|
|
|
Push CS
|
|
Push CS
|
|
Pop DS
|
|
Pop ES
|
|
Assume DS:IPX
|
|
|
|
Cmp NumNodes, 1
|
|
JB IPX_GetDestinationAddress1
|
|
|
|
Mov SI, CurrentNode
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
ShL SI, 5
|
|
Mov CX, 10/2
|
|
Add SI, 18 ; SI = offset to node address
|
|
|
|
Push DS
|
|
Mov DS, DiskDataArea
|
|
|
|
Rep MovsW
|
|
Mov AX, 'IT'
|
|
StosW ; Destination socket is maintenance socket.
|
|
|
|
Pop DS
|
|
ClC
|
|
|
|
IPX_GetDestinationAddress1:
|
|
Ret
|
|
|
|
EndP IPX_GetDestinationAddress
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_MaintenanceSendData
|
|
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderDirected
|
|
|
|
Proc IPX_MaintenanceSendDataNoHeader
|
|
Sub DI, Offset MaintenanceSData
|
|
Mov [MaintenanceSendDataOffset], Offset MaintenanceSData
|
|
Mov [MaintenanceSendDataSize], DI
|
|
|
|
Call SendMaintenancePacket
|
|
|
|
Ret
|
|
|
|
EndP IPX_MaintenanceSendDataNoHeader
|
|
EndP IPX_MaintenanceSendData
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SendConnectionData
|
|
Assume DS:IPX
|
|
|
|
PushA
|
|
Push DS
|
|
Pop ES
|
|
|
|
Call MaintenanceWaitforSend
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderBroadcast
|
|
|
|
Test AX, AX
|
|
JZ SendConnectionData2
|
|
|
|
Call TransferDestinationAddress
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderDirected
|
|
|
|
SendConnectionData2:
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov SI, Offset IntroBlockInformation
|
|
MovsB
|
|
StosB
|
|
MovSB
|
|
Mov DL, NumberOfConnections
|
|
|
|
SendConnectionData1:
|
|
Mov CX, (16+10)/2
|
|
Rep MovsW
|
|
LodsW
|
|
Dec DL
|
|
JNS SendConnectionData1
|
|
|
|
|
|
Call IPX_MaintenanceSendDataNoHeader
|
|
PopA
|
|
Ret
|
|
|
|
EndP SendConnectionData
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectEnter Far ; Have to request a connection
|
|
|
|
Call IPX_GetDestinationAddress
|
|
JC IPX_ConnectEnter1
|
|
Assume DS:IPX
|
|
|
|
Or ConnectionRequest, 1
|
|
|
|
Push DS
|
|
Mov DS, DiskDataArea
|
|
Assume DS:Nothing
|
|
|
|
Sub SI, 26
|
|
Mov DI, Offset ConnectionRequestName
|
|
Mov CX, 26/2
|
|
Rep MovsW
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Mov SI, Offset UserName
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AL, 6
|
|
StosB
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
|
|
Call IPX_MaintenanceSendData
|
|
|
|
Push DS
|
|
Push Offset WaitforConnectList
|
|
Call IT_FunctionHandler
|
|
|
|
Push CS
|
|
Push CS
|
|
Pop DS
|
|
Pop ES
|
|
|
|
And ConnectionRequest, Not 1
|
|
|
|
; If DX = 0, then connection was cancelled
|
|
; If DX = 1, then either connected or cancelled.
|
|
|
|
Test DX, DX
|
|
JNZ IPX_ConnectEnter2
|
|
|
|
; Connection cancelled.
|
|
Mov SI, Offset ConnectionRequestAddress
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
Mov CX, 10/2
|
|
Rep MovsW
|
|
Mov AX, 'IT'
|
|
StosW
|
|
|
|
Mov DI, Offset MaintenanceSData
|
|
Mov AX, 8
|
|
StosW
|
|
Call IPX_MaintenanceSendData
|
|
Jmp IPX_ConnectEnter1
|
|
|
|
IPX_ConnectEnter2:
|
|
Cmp NumberOfConnections, 0
|
|
JNE IPX_ConnectEnter3
|
|
|
|
; Connection rejected
|
|
|
|
Push DS
|
|
Push Offset ConnectionRejectedList
|
|
Call IT_FunctionHandler
|
|
Jmp IPX_ConnectEnter1
|
|
|
|
IPX_ConnectEnter3:
|
|
; Connection established
|
|
|
|
IPX_ConnectEnter1:
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_ConnectEnter
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_SendGroupMessage Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
|
|
Cmp MessageEntryArea, 0
|
|
JE IPX_SendMessageEnd
|
|
|
|
Mov SI, Offset UserName
|
|
Mov DI, Offset MessageSenderName
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderDirected
|
|
Mov [MaintenanceSendDataOffset], Offset MessageBlock
|
|
Mov [MaintenanceSendDataSize], 73
|
|
|
|
Mov SI, Offset UserAddress1
|
|
Mov DL, NumberOfConnections
|
|
|
|
IPX_SendGroupMessage1:
|
|
Mov DI, Offset MaintenanceDirectedDestination
|
|
Mov CX, 10/2
|
|
Rep MovsW
|
|
Mov AX, 'IT'
|
|
StosW
|
|
|
|
Call SendMaintenancePacket
|
|
Add SI, 18
|
|
|
|
Dec DL
|
|
JNZ IPX_SendGroupMessage1
|
|
|
|
Jmp IPX_SendMessageChain
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_SendMessage Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
|
|
Cmp MessageEntryArea, 0
|
|
JE IPX_SendMessageEnd
|
|
|
|
Mov SI, Offset UserName
|
|
Mov DI, Offset MessageSenderName
|
|
Mov CX, 16/2
|
|
Rep MovsW
|
|
|
|
Mov [MaintenanceSendHeader], Offset MaintenanceSendHeaderBroadcast
|
|
Mov [MaintenanceSendDataOffset], Offset MessageBlock
|
|
Mov [MaintenanceSendDataSize], 73
|
|
Call SendMaintenancePacket
|
|
|
|
; Wait until sent, then does this..
|
|
|
|
IPX_SendMessageChain:
|
|
Call MaintenanceWaitForSend
|
|
|
|
Mov SI, Offset MessageData+72
|
|
Mov DI, Offset MessageData
|
|
Mov CX, 72*7/2
|
|
Rep MovsW
|
|
Mov SI, Offset MessageSenderName
|
|
Mov CX, 72/2
|
|
Rep MovsW
|
|
|
|
Xor AX, AX
|
|
Mov DI, Offset MessageEntryArea
|
|
Mov CX, 56/2
|
|
Rep StosW
|
|
|
|
IPX_SendMessageEnd:
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP IPX_SendMessage
|
|
EndP IPX_SendGroupMessage
|
|
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ShowConnectionDetails Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
MOv DX, 1
|
|
Mov DI, (4+15*80)*2
|
|
Mov BX, Offset UserName1
|
|
Call IT_S_GetDestination
|
|
|
|
IPX_ShowConnectionDetailsLoop:
|
|
|
|
; Want to show:
|
|
; Connection %d
|
|
; User name: %s
|
|
; User address: [hex]
|
|
; (Bytes transferred)
|
|
|
|
Push DX
|
|
|
|
Mov AH, 20h
|
|
Mov SI, Offset ConnectionNumberMsg
|
|
Call IT_S_DrawString
|
|
|
|
Mov SI, BX
|
|
Mov CX, 16
|
|
|
|
IPX_ShowConnectionDetails1:
|
|
LodsB
|
|
StosW
|
|
Loop IPX_ShowConnectionDetails1
|
|
|
|
Push SI
|
|
|
|
Add DI, 104
|
|
Mov SI, Offset ConnectionAddressMsg
|
|
Call IT_S_DrawString
|
|
|
|
Pop SI
|
|
|
|
Call IPX_DrawAddress
|
|
|
|
Mov AL, ' '
|
|
StosW
|
|
|
|
Call IPX_DrawHexNumber
|
|
Call IPX_DrawHexNumber
|
|
|
|
Mov BX, SI
|
|
Add DI, 62+160
|
|
|
|
Pop DX
|
|
|
|
Inc DX
|
|
|
|
Cmp DL, NumberOfConnections
|
|
JBE IPX_ShowConnectionDetailsLoop
|
|
|
|
Ret
|
|
|
|
EndP IPX_ShowConnectionDetails
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_DisplayMessages Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:IPX
|
|
|
|
Call IT_S_GetDestination
|
|
|
|
Mov CX, 8
|
|
Mov DI, (38*80+3)*2
|
|
Mov SI, Offset MessageData
|
|
|
|
IPX_DisplayMessages1:
|
|
Cmp Byte Ptr [SI], 0
|
|
JE IPX_DisplayMessages4
|
|
|
|
Push SI
|
|
Push DI
|
|
|
|
Push SI
|
|
Mov AH, 3
|
|
|
|
IPX_DisplayMessages2:
|
|
LodSB
|
|
Test AL, AL
|
|
JZ IPX_DisplayMessages5
|
|
StosW
|
|
Jmp IPX_DisplayMessages2
|
|
|
|
IPX_DisplayMessages5:
|
|
Pop SI
|
|
Add SI, 16
|
|
|
|
Mov AL, ':'
|
|
StosW
|
|
Mov AL, ' '
|
|
StosW
|
|
|
|
Mov AH, 2
|
|
|
|
IPX_DisplayMessages3:
|
|
LodsB
|
|
StosW
|
|
Test AL, AL
|
|
JNZ IPX_DisplayMessages3
|
|
|
|
Pop DI
|
|
Pop SI
|
|
|
|
IPX_DisplayMessages4:
|
|
Add SI, 72
|
|
Add DI, 160
|
|
Loop IPX_DisplayMessages1
|
|
|
|
Ret
|
|
|
|
EndP IPX_DisplayMessages
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc IPX_ConnectionStatus Far; Returns 0 if not connected
|
|
; Otherwise returns connection count
|
|
|
|
Mov AL, CS:NumberOfConnections
|
|
Ret
|
|
|
|
EndP IPX_ConnectionStatus
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
EndDriver:
|
|
|
|
ProvidedVariableTableStart:
|
|
DB NUMPROVIDEDVARIABLES-($-ProvidedVariableTableStart) Dup (0)
|
|
|
|
ProvidedProcedureTableStart:
|
|
DW Offset IPX_Initialise
|
|
DW Offset IPX_Shutdown
|
|
DW Offset IPX_DriverScreen
|
|
DW Offset IPX_Update
|
|
DW Offset IPX_ConnectionStatus
|
|
|
|
DW NUMPROVIDEDFUNCTIONS - ($-ProvidedProcedureTableStart)/4 Dup (0)
|
|
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
EndS
|
|
|
|
End
|