dpvm/it/Network/IPX.ASM

3584 lines
103 KiB
NASM

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ 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