PAGE 56,132 ; .386 .LALL .LFCOND ; OCTOBER 2006 SUPPORT UP TO 8 L4 APPLICATION CALL/ALIAS PAIRS ; May 2008 Fix convtoax25 to handle null-terminated call strings (UNPROTO SSID Problem) ; Oct 2008 Put pushad/popad round INITIALISEPORTS DEBUG EQU 0 CR EQU 0DH LF EQU 0AH ; ; SEGMENT definitions and order ; ;* 32 Bit code _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' _TEXT ENDS ;* Contains 32 Bit data _BPQDATA SEGMENT DWORD PUBLIC 'DATA' _BPQDATA ENDS ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:FLAT OFFSET32 EQU INCLUDE STRUCS.INC IF DEBUG INCLUDELIB NETLIB ENDIF _BPQDATA SEGMENT ; ; POINTERS TO TABLES ARE AT START TO SIMPLIFY DIAGNOSTIC ; DUMP ANALYSIS, AND NODES SAVE ROUTINES ; PUBLIC _DATABASE,_ENDPOOL,_AUTOSAVE,L4APPL,CFLAG,_FREE_Q PUBLIC _PORTENTRYLEN, _LINKTABLELEN EXTRN BTLENGTH:WORD,BTEXTFLD:BYTE, _MaxHops:DWORD, _MAXRTT:DWORD,_SIGNONMSG:BYTE PUBLIC NODEORDER _DATABASE LABEL BYTE FILLER DB 14 DUP (0) ; PROTECTION AGENST BUFFER PROBLEMS! DB 4,9 ; MAJORVERSION,MINORVERSION INCLUDE DATECOMP.ASM NEIGHBOURS DD 0 DW TYPE NEIGHBOUR_LIST MAXNEIGHBOURS DW 20 ; MAX ADJACENT NODES DESTS DD 0 ; NODE LIST DW TYPE DEST_LIST ;MAXDESTS DW 100 ; MAX NODES IN SYSTEM LINKS DD 0 ; L2 LINK TABLE MAXLINKS DW 30 ; MAX LEVEL 2 LINKS (UP,DOWN AND INTERNODE) ;_L4TABLE DD 0 EXTERN _MAXCIRCUITS:WORD ; NUMBER OF L4 CIRCUITS _LINKTABLELEN DD TYPE LINKTABLE _PORTTABLE LABEL DWORD PORTTABLE DD 0 _NUMBEROFPORTS LABEL WORD NUMBEROFPORTS DW 0 TNCTABLE DD 0 NUMBEROFSTREAMS DW 0 _PORTENTRYLEN DD TYPE PORTCONTROL ENDDESTLIST DD 0 ; NODE LIST+1 ; _FREE_Q LABEL DWORD FREE_Q DD 0 ; FREE BUFFER CHAIN BUFFERPOOL DD 0 ; START OF BUFFER POOL OBSINIT DW 5 ; INITIAL OBSOLESCENCE VALUE OBSMIN DW 4 ; MINIMUM TO BROADCAST L3INTERVAL DW 60 ; 'NODES' INTERVAL IN MINS IDINTERVAL DW 20 ; 'ID' BROADCAST INTERVAL BTINTERVAL DW 20 ; 'BT' BROADCAST INTERVAL MINQUAL DW 10 ; MIN QUALITY FOR AUTOUPDATES HIDENODES DB 0 ; N * COMMAND SWITCH BBSQUAL DB 255 ; QUALITY OF BBS RELATIVE TO NODE ; NUMBEROFBUFFERS DW 999 ; PACKET BUFFERS PACLEN DW 100 ; MAX PACKET SIZE ; ; L2 SYSTEM TIMER RUNS AT 3 HZ ; T3 DW 3*61*3 ; LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions) L2KILLTIME DW 16*60*3 ; IDLE LINK TIMER (16 MINS) _L3LIVES DW 15 ; MAX L3 HOPS L4N2 DW 3 ; LEVEL 4 RETRY COUNT EXTERN _L4T1:WORD ; LEVEL 4 TIMEOUT _L4LIMIT DW 60*15 ; IDLE SESSION LIMIT - 15 MINS L4DELAY DW 5 ; L4 DELAYED ACK TIMER EXTERN _L4DEFAULTWINDOW:BYTE ; DEFAULT WINDOW BBS DB 1 ; INCLUDE BBS SUPPORT NODE DB 1 ; INCLUDE SWITCH SUPPORT NODEORDER DB 0 ; LINKEDFLAG DB 0 EVEN UNPROTOCALL DB 80 DUP (0) ; STATION INFORMATION ; _MYCALL DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED) _MYALIAS DB ' ' ; NODE ALIAS (KEEP TOGETHER) _NETROMCALL DB 7 DUP (0); ; Call used for NETROM (can be MYCALL) _APPLCALLTABLE LABEL BYTE APPLCALLTABLE DB MAXAPPLS * TYPE APPLCALLS DUP (0) _MYNODECALL DB 10 DUP (20H) ; NODE CALLSIGN (ASCII) _MYNETROMCALL DB 10 DUP (20H) ; NETROM CALLSIGN (ASCII) ; ; 'ID' MESSAGE - SENT EVERY 10 MINS ; IDHDDR DD 0 DB 0 DW 23 ; HEADER LENGTH IDDEST DB 'I'+'I','D'+'D',40h,40h,40h,40h,11100000B ; ID IN AX25 FORM IDORIGIN DB 7 DUP (0) DB 03H,0F0H ; UI, PID ; IDMSG DD 0 ; INFOMSG DD 0 INFOLEN DW 0 ; _CTEXTMSG DD 0 _CTEXTLEN DW 0 ; MYALIAS DB 7 DUP (0) ; ALIAS IN AX25 FORM ;BBSALIAS DB 7 DUP (0) AX25CALL DB 7 DUP (0) ; WORK AREA FOR AX25 <> NORMAL CALL CONVERSION NORMCALL DB 10 DUP (0) ; CALLSIGN IN NORMAL FORMAT NORMLEN DW 0 ; LENGTH OF CALL IN NORMCALL NEXTFREEDATA DD OFFSET32 DATAAREA ; OFFSET OF NEXT FREE BYTE CURRENTPORT DB 0 ; PORT FOR CURRENT MESSAGE CURRENTPORTPTR DD 0 ; PORT CONTROL TABLE ENTRY FOR CURRENT PORT SDCBYTE DB 0 ; CONTROL BYTE FOR CURRENT FRAME SDRBYTE DB 0 ; SAVED CONTROL BYTE FOR FRMR BUFFER DD 0 ; GENERAL SAVE AREA FOR BUFFER ADDR ADJBUFFER DD 0 ; BASE ADJUSED FOR DIGIS TEMPFIELD DB 7 DUP (0) ; ADDRESS WORK FILED TRACE_Q DD 0 ; TRANSMITTED FRAMES TO BE TRACED RANDOM DB 0 ; 'RANDOM' NUMBER FOR PERSISTENCE CALCS L2TIMERFLAG DB 0 ; INCREMENTED AT 18HZ BY TIMER INTERRUPT L3TIMERFLAG DW 0 ; DI TTO L4TIMERFLAG DB 10 ; DITTO HEADERCHAR DB '}' ; CHAR FOR NODE HEADER MSGS LASTPOINTER DD 0 ; PERVIOUS NODE DURING CHAINING DESQVIEW DB 0 ; SET NZ IF DV PRESENT _FULL_CTEXT DB 1 ; CTEXT ON ALL CONNECTS IF NZ BPQVECLENGTH DW VECTORLENGTH ; LENGTH OF VECTOR ENTRIES ; Although externally streams are numbered 1 to 64, internally offsets are 0 - 63 _BPQHOSTVECTOR LABEL BYTE BPQHOSTVECTOR DB VECTORLENGTH*BPQHOSTSTREAMS DUP (0) ; Telnet Mon Vector is used to pass trace frames to the Telnet Server _TELNETMONVEC DB VECTORLENGTH DUP (0) _APRSMONVEC DB VECTORLENGTH DUP (0) _IPHOSTVECTOR LABEL BYTE IPHOSTVECTOR DB VECTORLENGTH DUP (0) DB VECTORLENGTH DUP (0) ; for duff calls! ; ; VECTOR FORMAT IS: ; ; 0-3 4 BYTES - ADDRESS OF SESSION ENTRY ; 4 1 BYTE - STATE CHANGE FLAGS ; 5 1 BYTE - APPLICATION MASK ; 6 1 BYTE - APPLICATION FLAGS ; 7 1 byte - Stream ; 8-11 4 BYTES - RAW FRAME QUEUE ; 12-15 4 bytes - Handle for PostMessage REALTIMETICKS DW 0 BGTIMER DB 0 ; TO CONTROL BG SCANS CONFIGPTR DD 0 ; Internal Config Get Offset PUBLIC _MYCALL,MYALIAS,NORMCALL,AX25CALL,DESTS,TRACE_Q,_NETROMCALL PUBLIC CURRENTPORT,CURRENTPORTPTR,NEIGHBOURS PUBLIC _MYNODECALL,_MYALIAS,APPLCALLTABLE,_APPLCALLTABLE PUBLIC LINKS,PORTTABLE,NUMBEROFPORTS,BUFFER,ADJBUFFER,BUFFLEN PUBLIC SDCBYTE,SDRBYTE,BUFFER,NORMLEN,LINKEDFLAG PUBLIC IDMSG,INFOMSG,INFOLEN,RANDOM,NODE,DESQVIEW PUBLIC TNCTABLE,NUMBEROFSTREAMS,ENDDESTLIST,REALTIMETICKS PUBLIC MAXLINKS,MAXNEIGHBOURS,HEADERCHAR PUBLIC _NUMBEROFPORTS,_PORTTABLE PUBLIC BBS,T3,PACLEN,L2KILLTIME,IDINTERVAL,BTINTERVAL PUBLIC OBSINIT,OBSMIN,NODE,L3INTERVAL,L4N2,_L3LIVES,_L4LIMIT,L4DELAY PUBLIC MINQUAL,HIDENODES PUBLIC _CTEXTMSG,_CTEXTLEN,_FULL_CTEXT PUBLIC BPQHOSTVECTOR,BPQVECLENGTH,BPQHOSTSTREAMS,VECTORLENGTH PUBLIC _IPHOSTVECTOR,IPHOSTVECTOR,_BPQHOSTVECTOR,_TELNETMONVEC,_APRSMONVEC EXTRN MINBUFFCOUNT:WORD,NOBUFFCOUNT:WORD,_MAXDESTS:WORD EXTRN IDTIMER:WORD,QCOUNT:WORD,ROUTEQUAL:BYTE,_APPLS:BYTE EXTRN DESTHEADER:DWORD,BTTIMER:WORD,_NUMBEROFNODES:DWORD EXTRN MAXBUFFS:WORD,NEEDMH:BYTE,CMDALIAS:BYTE,ALIASPTR:DWORD EXTRN SAVEPORT:BYTE,STATSTIME:DWORD,CMDXLEN:DWORD EXTRN RAN1:BYTE,RAN2:BYTE,RAN3:BYTE,RAN4:BYTE,RAN5:BYTE; EXTRN _BPQMsg:DWORD, L3TIMER:WORD EXTRN _IPRequired:DWORD, NODESINPROGRESS:BYTE, IDMSG_Q:DWORD EXTRN CURRENTNODE:DWORD,_L4TABLE:DWORD PUBLIC NEEDKISS,HOSTINTERRUPT;,_CONFIGFILENAME CONFIGTABLE LABEL BYTE ; ; CONFIGURATION DATA STRUCTURE ; ; DEFINES LAYOUT OF CONFIG RECORD PRODUCED BY CONFIGURATION PROG ; ; LAYOUT MUST MATCH THAT IN CONFIG.C SOURCE ; C_NODECALL DB 10 DUP (0) ; OFFSET32 = 0 C_NODEALIAS DB 10 DUP (0) ; OFFSET32 = 10 C_BBSCALL DB 10 DUP (0) ; OFFSET32 = 20 C_BBSALIAS DB 10 DUP (0) ; OFFSET32 = 30 ; C_OBSINIT DW 0 ; OFFSET32 = 40 C_OBSMIN DW 0 ; OFFSET32 = 42 C_NODESINTERVAL DW 0 ; OFFSET32 = 44 C_L3TIMETOLIVE DW 0 ; OFFSET32 = 46 C_L4RETRIES DW 0 ; OFFSET32 = 48 C_L4TIMEOUT DW 0 ; OFFSET32 = 50 C_BUFFERS DW 0 ; OFFSET32 = 52 C_PACLEN DW 0 ; OFFSET32 = 54 C_TRANSDELAY DW 0 ; OFFSET32 = 56 C_T3 DW 0 ; OFFSET32 = 58 DW 0 ; OFFSET32 = 60 DW 0 ; OFFSET32 = 62 C_IDLETIME DW 0 ; OFFSET32 = 64 C_EMSFLAG DB 0 ; OFFSET32 = 66 C_LINKEDFLAG DB 0 ; OFFSET32 = 67 C_BBS DB 0 ; OFFSET32 = 68 C_NODE DB 0 ; OFFSET32 = 69 C_HOSTINTERRUPT DB 0 ; OFFSET32 = 70 C_DESQVIEW DB 0 ; OFFSET32 = 71 C_MAXLINKS DW 0 ; OFFSET32 = 72 C_MAXDESTS DW 0 C_MAXNEIGHBOURS DW 0 C__MAXCIRCUITS DW 0 ; 78 C_TNCPORTLISTO DB 16 DUP (0) ; OFFSET32 = 80 C_IDINTERVAL DW 0 ; 96 C_FULLCTEXT DW 0 ; 98 ; SPARE (WAS DIGIFLAG) C_MINQUAL DW 0 ; 100 C_HIDENODES DB 0 ; 102 C_L4DELAY DW 0 ; 103 C_L4WINDOW DW 0 ; 105 C_BTINTERVAL DW 0 ; 107 C_AUTOSAVE DB 0 ; 109 C_L4APPL DB 0 ; 110 C_C DB 0 ; 111 "C" = HOST Command Enabled C_IP DB 0 ; 112 IP Enabled C_MAXRTT DB 0 ; 113 C_MAXHOPS DB 0 ; 114 DB 3 DUP (0) ; 115 NOW SPARE C_BBSQUAL DW 0 ; 118 C_WASUNPROTO DB 0; C_BTEXT DB 120 DUP (0) ; 120 C_VERSTRING DB 10 DUP (0) ; 200 Version String from Config File DB (CONFIGTABLE+255-$) DUP (0) C_VERSION DB 0 ; CONFIG PROG VERSION ; ; Reuse C_APPLICATIONS - no longer used C_NETROMCALL DB 10 DUP (0) DB 118 DUP (0) ; 16 BYTES FOR EACH OF 8 SERVICES - No Longer Used C_TNCPORTLIST DB 128 DUP (0) ; 8 BYTES FOR EACH OF 16 PORTS C_IDMSG EQU 512 C_ROUTES EQU 1536 C_CTEXT EQU 2048 C_PORTS EQU 2560 ; ; VECTORS TO HARDWARE DEPENDENT ROUTINES ; INITCODE DD OFFSET32 KISSINIT ; 0 DD OFFSET32 _PC120INIT ; 2 DD OFFSET32 _DRSIINIT ; 4 DD OFFSET32 _TOSHINIT ; 6 DD OFFSET32 KISSINIT ; 8 DD OFFSET32 _RLC100INIT ; 0A DD OFFSET32 _RLC100INIT ; 0C RLC400 DD OFFSET32 LINKINIT ; 0E INTERNAL DD OFFSET32 EXTINIT ; 10 EXTERNAL DRIVER DD OFFSET32 _BAYCOMINIT ; 12 DD OFFSET32 _PA0INIT ; 14 PA0HZP OPTO-SCC ; TXCODE DD OFFSET32 KISSTX DD OFFSET32 HDLCTX DD OFFSET32 HDLCTX DD OFFSET32 HDLCTX DD OFFSET32 KISSTX ; QUADPORT DD OFFSET32 HDLCTX ; RLC100 DD OFFSET32 HDLCTX ; RLC400 DD OFFSET32 LINKTX ; INTERNAL LINK DD OFFSET32 EXTTX ; EXTERNAL DRIVER DD OFFSET32 HDLCTX DD OFFSET32 HDLCTX ; RXCODE DD OFFSET32 KISSRX DD OFFSET32 HDLCRX DD OFFSET32 HDLCRX DD OFFSET32 HDLCRX DD OFFSET32 KISSRX ; QUADPORT DD OFFSET32 HDLCRX DD OFFSET32 HDLCRX DD OFFSET32 LINKRX ; INTERNAL LINK DD OFFSET32 EXTRX ; EXTERNAL DRIVER DD OFFSET32 HDLCRX DD OFFSET32 HDLCRX ; TIMERCODE DD OFFSET32 KISSTIMER DD OFFSET32 _HDLCTIMER DD OFFSET32 _HDLCTIMER DD OFFSET32 _HDLCTIMER DD OFFSET32 KISSTIMER ; QUADPORT DD OFFSET32 _HDLCTIMER DD OFFSET32 _HDLCTIMER DD OFFSET32 LINKTIMER ; INTERNAL LINK DD OFFSET32 EXTTIMER ; EXTERNAL DRIVER DD OFFSET32 _HDLCTIMER DD OFFSET32 _HDLCTIMER ; CLOSECODE DD OFFSET32 _KISSCLOSE DD OFFSET32 _HDLCCLOSE DD OFFSET32 _HDLCCLOSE DD OFFSET32 _HDLCCLOSE DD OFFSET32 _KISSCLOSE ; QUADPORT DD OFFSET32 _HDLCCLOSE DD OFFSET32 _HDLCCLOSE DD OFFSET32 LINKCLOSE ; INTERNAL LINK DD OFFSET32 EXTCLOSE ; EXTERNAL DRIVER (DUMMY) DD OFFSET32 _HDLCCLOSE DD OFFSET32 _HDLCCLOSE ; TXCHECKCODE DD OFFSET32 KISSTXCHECK DD OFFSET32 _HDLCTXCHECK DD OFFSET32 _HDLCTXCHECK DD OFFSET32 _HDLCTXCHECK DD OFFSET32 KISSTXCHECK ; QUADPORT DD OFFSET32 _HDLCTXCHECK DD OFFSET32 _HDLCTXCHECK DD OFFSET32 LINKTXCHECK ; INTERNAL LINK DD OFFSET32 EXTTXCHECK ; EXTERNAL DRIVER DD OFFSET32 _HDLCTXCHECK DD OFFSET32 _HDLCTXCHECK ; HEXMSG DB 'XXXX XXXXXXXX',LF,0 LOOPMSG DB 'Loopback',0ah,0 NEEDKISS DB 0 ; SET IF KISS USED ; _NODESFILENAME DB 'BPQNODES.DAT',0 NONODESMSG DB 0DH,0AH,'Route/Node recovery file BPQNODES.dat not found - Continuing without it',0ah,0 CONFIGHANDLE DD 0 BADCONFIGMSG DB 'Configuration file read error',0AH,0 BADNODEMSG DB 'Invalid Record in recovery file ' BADNODETEXT DB 80 DUP (0) ROUTEADD DB 'ROUTE ADD ' NODEADD DB 'NODE ADD ' INITPTR DD 0 ; POINTER SAVE AREA EMSFLAG DB 0 _AUTOSAVE DB 0 ; AUTO SAVE NODES ON EXIT FLAG L4APPL DB 1 ; Application for BBSCALL/ALIAS connects CFLAG DB 0 ; C =HOST Command loadedmsg DB cr,lf,lf,'Switch loaded and initialised OK',lf,0 EVEN READCOUNT DW 512 ; CHARS USED IN THIS SEGMENT READPOINTER DD 0 ; NEXT ADDRESS IN DISK BUFFER ; PACTORSAVEQ DD 0 ; Work area for PACTOR busy test. TICKSPERMINUTE DW 10*60 HOSTINTERRUPT DB 0 BPQ DB 'BPQ32.DLL',0 BUFFERRMSG DB 'Corrupt buffer pool detected and dump taken',LF,0 INITMSG DB 'Initialising Port ' INITPORT DW 'XX' DB ' ',0 B10 DB 10 SAVEEAX DD 0 BADEXTMSG DB 7,'Driver installation failed !!',0 BADKISSMSG DB 7,'Type=ASYNC not supported - use External KISS Driver',0 CHARS DD 0 FNBUFFER DB 128 DUP (0) DATAWORDS EQU 80000 DATAAREA DD DATAWORDS dup (0) _ENDPOOL LABEL DWORD _BPQDATA ENDS _TEXT SEGMENT EXTRN _PC120INIT:NEAR,_DRSIINIT:NEAR,_TOSHINIT:NEAR EXTRN _RLC100INIT:NEAR,_BAYCOMINIT:NEAR,_PA0INIT:NEAR EXTRN KISSINIT:NEAR,CLOSESESSIONPARTNER:NEAR EXTRN _POSTDATAAVAIL:NEAR PUBLIC _START extrn _Sleep@4:near extrn _DumpSystem@0:near extrn _OpenConfigFile:near extrn _ReadFile@20:near extrn _GetLastError@0:near extrn _SetFilePointer@16:near extrn _CloseHandle@4:near extrn _PostMessageA@16:near ; extrn _printf:near extrn _time:near extrn _WriteFile@20:near extrn _InitializeExtDriver:near extrn _WritetoConsole@4:near extern _FreeConfig:near PUBLIC SEND_DOS_MESSAGE SEND_DOS_MESSAGE: ; ; SEND MESSAGE IN EDX ; ;WriteFile(STDOUT,"Initialising..\n",15,&n,NULL); push edx call _WritetoConsole@4 RET PUBLIC READ_CONFIG_FILE READ_CONFIG_FILE: ; ; READ FROM FILE USING MSDOS INT 21 FN 9 ; PUSH ECX ; SAVE PUSH 0 PUSH OFFSET32 CHARS PUSH ECX PUSH EDX PUSH CONFIGHANDLE CALL _ReadFile@20 OR EAX,EAX JNE ROK CALL _GetLastError@0 PUBLIC ROK ROK: MOV EAX,CHARS POP ECX ; BYTES REQUESTED RET PUBLIC _START _START: MOV NEXTFREEDATA, OFFSET32 DATAAREA ; For Reinit MOV FREE_Q,0 MOV TRACE_Q,0 MOV IDMSG_Q,0 MOV NUMBEROFPORTS,0 MOV MAXBUFFS,0 MOV QCOUNT,0 MOV _NUMBEROFNODES,0 MOV DESTHEADER,0 MOV READCOUNT,512 ; CHARS USED IN THIS SEGMENT MOV READPOINTER,0 ; NEXT ADDRESS IN DISK BUFFER MOV NODESINPROGRESS,0 MOV CURRENTNODE,0 MOV L3TIMER,1 ; SEND NODES ; MOV EDI, OFFSET DATAAREA MOV ECX, DATAWORDS XOr EAX,EAX REP STOSD ; READ CONFIG FILE, AND EXTRACT DATA ; JMP SHORT PROCESSCONFIG if 0 PUSH OFFSET _CONFIGFILENAME CALL _OPENCONFIGFILE ADD ESP,4 CMP EAX,-1 JE SHORT NOCONFIGFILE MOV CONFIGHANDLE,EAX MOV EDX,OFFSET32 CONFIGTABLE MOV ECX,512 CALL READ_CONFIG_FILE CMP EAX,ECX JNE SHORT SHORTCONFIG JMP SHORT PROCESSCONFIG PUBLIC NOCONFIGFILE NOCONFIGFILE: MOV EDX,OFFSET32 NOCONFIGMSG JMP SHORT CONFIGERR PUBLIC SHORTCONFIG SHORTCONFIG: MOV EDX,OFFSET32 BADCONFIGMSG endif PUBLIC CONFIGERR CONFIGERR: CALL SEND_DOS_MESSAGE MOV EAX,1 RET EXTRN _Buffer:DWORD GETCONFIG: mov esi, _Buffer add esi, CONFIGPTR mov edi, offset CONFIGTABLE mov ecx,512 rep movsb mov eax,512 ret ; PUBLIC PROCESSCONFIG PROCESSCONFIG: mov esi, _Buffer mov edi, offset CONFIGTABLE mov ecx,512 rep movsb MOV AL,C_AUTOSAVE MOV _AUTOSAVE,AL MOV AL,C_L4APPL OR AL,AL JZ @F MOV L4APPL,AL @@: MOV AL,C_C MOV CFLAG,AL MOVZX EAX,C_IP MOV _IPRequired,EAX MOVZX EAX,C_MAXHOPS or eax,eax jz @f MOV _MaxHops,eax @@: MOVZX EAX,C_MAXRTT IMUL EAX,100 or eax,eax jz @f MOV _MAXRTT,eax @@: MOV AL,C_EMSFLAG MOV EMSFLAG,AL ; SAVE EMS FLAG MOV AL,C_HOSTINTERRUPT OR AL,AL JNZ SHORT INT_OK MOV AL, 127 ; DEFAULT PUBLIC INT_OK INT_OK: MOV HOSTINTERRUPT,AL MOV ESI,OFFSET32 C_NODECALL CMP C_NODE,0 JNE SHORT GOTNODE ; ; USE BBS CALL FOR NODE AS WELL ; MOV ESI,OFFSET32 C_BBSCALL PUBLIC GOTNODE GOTNODE: MOV EDI,OFFSET32 _MYNODECALL MOV ECX,10 REP MOVSB ; COPY NODE CALL MOV EDI,OFFSET32 _MYCALL+7 MOV ECX,6 REP MOVSB ; COPY NODE ALIAS ; ; IF NO BBS, SET BOTH TO NODE CALLSIGN ; MOV ESI,OFFSET32 C_BBSCALL CMP C_BBS,0 JNE SHORT GOTBBS MOV ESI,OFFSET32 C_NODECALL PUBLIC GOTBBS GOTBBS: MOV AX,C_BBSQUAL MOV BBSQUAL,AL ; ; copy MYCALL to NETROMCALL ; MOV ESI,OFFSET32 _MYNODECALL MOV EDI,OFFSET32 _MYNETROMCALL MOV ECX,10 REP MOVSB ; COPY NODE CALL ; if NETROMCALL Defined, use it CMP C_NETROMCALL,0 je @F MOV ESI,OFFSET32 C_NETROMCALL MOV EDI,OFFSET32 _MYNETROMCALL MOV ECX,10 REP MOVSB ; COPY NODE CALL @@: ; ; COPY OLD BBS CALL TO APPL1CALL FIELDS. WILL BE OVERWRITTEN LATER IF APPLCALLS ARE SPECIFIED ; MOV EDX,OFFSET32 APPLCALLTABLE LEA EDI,APPLCALL_TEXT[EDX] MOV ECX,10 REP MOVSB ; COPY TEXT FORM OF CALL LEA EDI,APPLALIAS_TEXT[EDX] MOV ECX,10 REP MOVSB ; COPY TEXT FORM OF CALL MOVZX AX,BBSQUAL MOV APPLQUAL[EDX],AX CMP C_WASUNPROTO,0 JNE @F ; OLD CONFIG WITH (OBSOLETE) UNPROTO SPECIFIED CMP C_BTEXT,0 JE @F ; NO BTEXT MOV ESI,OFFSET32 C_BTEXT MOV EDI,OFFSET32 BTEXTFLD ; UNPROTO DEST MOV ECX,120 MOV BTLENGTH,8 ; 7 HEADER, PID PUBLIC BTLOOP BTLOOP: LODSB OR AL,AL JZ ENDBT STOSB INC BTLENGTH LOOP BTLOOP PUBLIC ENDBT ENDBT: @@: MOV AX,C_OBSINIT MOV OBSINIT,AX MOV AX,C_OBSMIN MOV OBSMIN,AX MOV AX,C_NODESINTERVAL MOV L3INTERVAL,AX MOV AX,C_IDINTERVAL MOV IDINTERVAL,AX OR AX,AX JZ SHORT NO_ID MOV IDTIMER,2 PUBLIC NO_ID NO_ID: MOV AX,C_BTINTERVAL MOV BTINTERVAL,AX OR AX,AX JZ SHORT NO_BT MOV BTTIMER,2 PUBLIC NO_BT NO_BT: MOV AX,C_MINQUAL MOV MINQUAL,AX MOV AX,C_FULLCTEXT MOV _FULL_CTEXT,AL MOV AX,C_L3TIMETOLIVE MOV _L3LIVES,AX MOV AX,C_L4RETRIES MOV L4N2,AX MOV AX,C_L4WINDOW MOV _L4DEFAULTWINDOW,AL MOV AX,C_L4TIMEOUT MOV _L4T1,AX ; MOV AX,C_BUFFERS ; MOV NUMBEROFBUFFERS,AX MOV AX,C_PACLEN MOV PACLEN,AX MOV AX,C_T3 MOV T3,AX ADD T3,AX ADD T3,AX ; X 3 MOV AX,C_IDLETIME MOV _L4LIMIT,AX MOV L2KILLTIME,AX ADD L2KILLTIME,AX ADD L2KILLTIME,AX ; X 3 MOV AX,C_L4DELAY MOV L4DELAY,AX MOV AL,C_BBS MOV BBS,AL MOV AL,C_NODE MOV NODE,AL MOV AL,C_DESQVIEW MOV DESQVIEW,AL MOV AL,C_LINKEDFLAG MOV LINKEDFLAG,AL MOV AX,C_MAXLINKS MOV MAXLINKS,AX MOV AX,C_MAXDESTS MOV _MAXDESTS,AX MOV AX,C_MAXNEIGHBOURS MOV MAXNEIGHBOURS,AX MOV AX,C__MAXCIRCUITS MOV _MAXCIRCUITS,AX MOV AL,C_HIDENODES MOV HIDENODES,AL ; SET UP APPLICATION LIST ; MOV ECX,MAXAPPLS mov esi, _Buffer add esi, ApplOffset MOV EDI,OFFSET32 _APPLS MOV ALIASPTR,OFFSET CMDALIAS APPLLOOP: CMP BYTE PTR [ESI],20H ; UNUSED - LEAVE ALONE JE SHORT NXTAPPL PUSH EDI PUSH ECX PUSH ESI MOV ECX,12 REP MOVSB POP ESI ; See if an Alias CMP ACCommandAlias[ESI], 20H JE NOALIAS PUSH ECX PUSH EDI PUSH ESI LEA ESI, ACCommandAlias[ESI] MOV EDI,ALIASPTR MOV ECX,ALIASLEN REP MOVSB POP ESI POP EDI POP ECX NOALIAS: POP ECX POP EDI PUSH ESI ; ; SET LENGTH FIELD ; MOV BYTE PTR 12[EDI],0 ; LENGTH MOV ESI,EDI LENLOOP: INC BYTE PTR 12[EDI] INC ESI CMP BYTE PTR [ESI],20H JA SHORT LENLOOP POP ESI NXTAPPL: ADD ESI,TYPE APPLCONFIG ADD EDI,CMDXLEN ADD ALIASPTR,ALIASLEN LOOP APPLLOOP ; ; SET UP PORT TABLE ; MOV CONFIGPTR,C_PORTS MOV DWORD PTR HEXMSG,'TROP' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV EBX,NEXTFREEDATA MOV PORTTABLE,EBX PUBLIC PORTLOOP PORTLOOP: MOV ECX,512 CALL GETCONFIG CMP AX,512 JNE SHORT BADPORTREAD CMP CONFIGTABLE,0 JE SHORT BADPORTREAD CMP CONFIGTABLE,31 ; TRAP APPLCALLS JBE SHORT PORTREADOK ; ; END OF LIST ; PUBLIC BADPORTREAD BADPORTREAD: JMP ENDPORTLOOP PUBLIC PORTREADOK PORTREADOK: ADD CONFIGPTR, 512 MOV ESI,OFFSET32 CONFIGTABLE LODSW MOV PORTNUMBER[EBX],AL LEA EDI,PORTDESCRIPTION[EBX] MOV ECX,30 REP MOVSB ; MOV EAX,0 LODSW ; H/W TYPE MOV PORTTYPE[EBX],AL SHL EAX,1 ; DWORD FIELDS MOV EDI,OFFSET32 INITCODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTINITCODE[EBX],ECX ; ADDR OF INIT ROUTINE MOV EDI,OFFSET32 TXCODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTTXROUTINE[EBX],ECX MOV EDI,OFFSET32 RXCODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTRXROUTINE[EBX],ECX MOV EDI,OFFSET32 TIMERCODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTTIMERCODE[EBX],ECX MOV EDI,OFFSET32 CLOSECODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTCLOSECODE[EBX],ECX MOV EDI,OFFSET32 TXCHECKCODE ADD EDI,EAX MOV ECX,[EDI] MOV PORTTXCHECK[EBX],ECX LODSW MOV PROTOCOL[EBX],AL LODSW MOV IOBASE[EBX],AX LODSW MOV INTLEVEL[EBX],AL LODSW MOV BAUDRATE[EBX],AX LODSW MOV CHANNELNUM[EBX],AL LODSW MOV BBSBANNED[EBX],AL LODSW MOV PORTQUALITY[EBX],AL LODSW MOV PORTWINDOW[EBX],AL LODSW CALL CONVTIME ; CONVERT TO TIMER TICKS MOV PORTTXDELAY[EBX],AX LODSW CALL CONVTIME ; CONVERT TO TIMER TICKS MOV PORTSLOTTIME[EBX],AL LODSW MOV PORTPERSISTANCE[EBX],AL LODSW MOV FULLDUPLEX[EBX],AL LODSW MOV SOFTDCDFLAG[EBX],AL LODSW CALL CONV3SECS ; CONVERT MSECS TO 1/3 SECS MOV PORTT1[EBX],AL LODSW CALL CONV3SECS ; CONVERT MSECS TO 1/3 SECS MOV PORTT2[EBX],AL LODSW MOV PORTN2[EBX],AL LODSW MOV PORTPACLEN[EBX],AL ; LODSW MOV QUAL_ADJUST[EBX],AL ; 'SAME PORT' QUALITY FACTOR ; LODSW MOV DIGIFLAG[EBX],AL ; DIGI CONTROL FLAG MOV DIGIPORT[EBX],AH ; PORT FOR CROSS BAND DIGI ; LODSW MOV DIGIMASK[EBX],AX ; PORT MASK for UI MULTIPORT REPEAT LODSW MOV USERS[EBX],AL ; NUMBER OF L2 SESSIONS ; LODSW ; ; IF USING KISS, SET A DEFAULT; ; CMP PORTTYPE[EBX],0 ; ASYNC JE SHORT TAILKISS CMP PORTTYPE[EBX],8 ; QUAD JE SHORT TAILKISS ; ; ON HDLC, TAIL TIMER IS USED TO HOLD RTS FOR 'CONTROLLED FULL DUP' ; MODE. VALUE IS IN SECONDS, NOT MS ; JMP SHORT SETTAIL PUBLIC TAILKISS TAILKISS: OR AX,AX JNZ GOTTAIL MOV AX,30 ; DEFAULT PUBLIC GOTTAIL GOTTAIL: CALL CONVTIME ; CONVERT TO TIMER TICKS MOV PORTTAILTIME[EBX],AL PUBLIC SETTAIL SETTAIL: LODSW MOV PORTBBSFLAG[EBX],AL ; PORT CALL/ALIAS IS BBS FLAG MOV ESI,OFFSET32 CONFIGTABLE+110 ; LODSW MOV PORTL3FLAG[EBX],AL ; L3 ONLY FLAG ; LODSW MOV KISSFLAGS[EBX],AL ; KISS MODE OPTION BITS ; LODSW MOV PORTINTERLOCK[EBX],AL ; PORT INTERLOCK MASK ; LODSW MOV NODESPACLEN[EBX],AL ; LENGTH OF NODES PACKET LODSW MOV TXPORT[EBX],AL ; IF SHARED TX SYSTEM ; MOV AL,CONFIGTABLE+122 ; MINQUAL MOV PORTMINQUAL[EBX],AL ; MOV AL,CONFIGTABLE+123 ; MAXDIGIS OR AL,AL JNZ @F ; DEFINED MOV AL,8 @@: MOV PORTMAXDIGIS[EBX],AL MOV AL,CONFIGTABLE+124 ; Default No Keepalives MOV PortNoKeepAlive[EBX], AL ; SET UP CWID ; MOV AL,CONFIGTABLE+121 ; FLAG FOR ONOFF KEYING CMP AL,'o' JNE SHORT SETTYPE MOV AL,'O' ; CONVERT TO UPPER CASE PUBLIC SETTYPE SETTYPE: MOV CWTYPE[EBX],AL MOV ESI,OFFSET32 CONFIGTABLE+80; TO CWID FIELD MOV ECX,8 ; MAX ID LENGTH LEA EDI,CWID[EBX] MOV CWPOINTER[EBX],EDI MOV AX,29 ; ALLOW A MINUTE FOR CHANNEL TO GO QUIET SUB AL,PORTNUMBER[EBX] ; SPREAD THEM OUT A BIT MUL TICKSPERMINUTE MOV CWIDTIMER[EBX],AX ; MOV CWIDTIMER[EBX],10 * 10 ; !!Testing!! PUBLIC CWIDLOOP CWIDLOOP: LODSB CMP AL,20H JBE SHORT CWIDEND CMP AL,'Z' JA SHORT CWIDBAD SUB AL,2FH JC SHORT CWIDBAD ; DUFF CHAR AND EAX,07FH CBW PUSH ESI MOV ESI,OFFSET32 CWTABLE ADD ESI,EAX ADD ESI,EAX LODSW ; PATTERN STOSW POP ESI PUBLIC CWIDBAD CWIDBAD: LOOP CWIDLOOP PUBLIC CWIDEND CWIDEND: ; ; SEE IF LINK CALLSIGN/ALIAS SPECIFIED ; MOV ESI,OFFSET32 CONFIGTABLE+90; TO LINK CALL CMP BYTE PTR [ESI],20H JBE SHORT NOLINKCALL MOV EDI,OFFSET32 NORMCALL MOV ECX,10 REP MOVSB MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,PORTCALL[EBX] MOV ECX,7 REP MOVSB PUBLIC NOLINKCALL NOLINKCALL: MOV ESI,OFFSET32 CONFIGTABLE+100; TO LINK ALIAS CMP BYTE PTR [ESI],20H JBE SHORT NOLINKALIAS MOV EDI,OFFSET32 NORMCALL MOV ECX,10 REP MOVSB MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,PORTALIAS[EBX] MOV ECX,7 REP MOVSB PUBLIC NOLINKALIAS NOLINKALIAS: MOV ESI,OFFSET32 CONFIGTABLE+200; TO LINK ALIAS 2 CMP BYTE PTR [ESI],20H JBE SHORT NOLINKALIAS2 MOV EDI,OFFSET32 NORMCALL MOV ECX,10 REP MOVSB MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,PORTALIAS2[EBX] MOV ECX,7 REP MOVSB PUBLIC NOLINKALIAS2 NOLINKALIAS2: MOV ESI,OFFSET32 CONFIGTABLE+210; TO DLL NAME CMP BYTE PTR [ESI],20H JBE SHORT NODLLNAME LEA EDI,PORT_DLL_NAME[EBX] MOV ECX,16 REP MOVSB PUBLIC NODLLNAME NODLLNAME: MOV ESI,OFFSET32 CONFIGTABLE+226; TO LINK ALIAS 2 CMP BYTE PTR [ESI],20H JBE SHORT NOBCALL MOV EDI,OFFSET32 NORMCALL MOV ECX,10 REP MOVSB MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,PORTBCALL[EBX] MOV ECX,7 REP MOVSB PUBLIC NOBCALL NOBCALL: ; ; SET UP NEXT PORT PTR ; MOV EAX,EBX ADD EAX,TYPE PORTCONTROL MOV PORTPOINTER[EBX],EAX ; ; SEE IF PERMITTED LINK CALLSIGNS SPECIFIED ; MOV ESI,OFFSET32 CONFIGTABLE+256 ; TO PERMITTED CALLS CMP BYTE PTR [ESI],20H JBE SHORT NOPERMITTEDCALLS ; NONE SPECIFIED MOV PERMITTEDCALLS[EBX],EAX; START OF STRING PUBLIC NEXTPERMCALL NEXTPERMCALL: CMP BYTE PTR [ESI],20H JBE SHORT NOMOREPERMITTEDCALLS ; NO MORE LEFT MOV EDI,OFFSET32 NORMCALL MOV ECX,10 PUBLIC GETPERMCALLLOOP GETPERMCALLLOOP: LODSB STOSB CMP AL,' ' JE SHORT ENDPERMCALL CMP AL,',' JE SHORT ENDPERMCALL LOOP GETPERMCALLLOOP PUBLIC ENDPERMCALL ENDPERMCALL: PUSH ESI MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,ES:PORTPOINTER[EBX] MOV ECX,7 REP MOVSB ADD PORTPOINTER[EBX],7 POP ESI CMP ESI,OFFSET32 CONFIGTABLE+502; WITHIN 10 OF END? JBE SHORT NEXTPERMCALL ; OK PUBLIC NOMOREPERMITTEDCALLS NOMOREPERMITTEDCALLS: INC PORTPOINTER[EBX] ; ADD NULL TO END OF STRING PUBLIC NOPERMITTEDCALLS NOPERMITTEDCALLS: ; ; SEE IF PORT UNPROTO ADDR SPECIFIED ; MOV ESI,OFFSET32 CONFIGTABLE+128; TO PORT UNPROTO CMP BYTE PTR [ESI],20H JBE SHORT NOPORTUNPROTO ; NONE SPECIFIED MOV EAX,PORTPOINTER[EBX] MOV PORTUNPROTO[EBX],EAX ; START OF STRING PUBLIC NEXTUNPROTO NEXTUNPROTO: CMP BYTE PTR [ESI],20H JBE SHORT NOMOREUNPROTO ; NO MORE LEFT MOV EDI,OFFSET32 NORMCALL MOV ECX,10 PUBLIC GETUNPROTOLOOP GETUNPROTOLOOP: LODSB STOSB CMP AL,' ' JE SHORT ENDUNPROTO CMP AL,',' JE SHORT ENDUNPROTO LOOP GETUNPROTOLOOP PUBLIC ENDUNPROTO ENDUNPROTO: PUSH ESI MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,ES:PORTPOINTER[EBX] MOV ECX,7 REP MOVSB ADD ES:PORTPOINTER[EBX],7 POP ESI CMP ESI,OFFSET32 CONFIGTABLE+242; WITHIN 10 OF END? JBE SHORT NEXTUNPROTO ; OK PUBLIC NOMOREUNPROTO NOMOREUNPROTO: INC PORTPOINTER[EBX] ; ADD NULL TO END OF STRING PUBLIC NOPORTUNPROTO NOPORTUNPROTO: ; ; ADD MH AREA IF NEEDED ; CMP CONFIGTABLE+120,'N' JE SHORT NO_MH MOV NEEDMH,1 MOV EAX,PORTPOINTER[EBX] MOV PORTMHEARD[EBX],EAX ; START OF AREA ADD PORTPOINTER[EBX],MHENTRIES*(TYPE MHSTRUC) PUBLIC NO_MH NO_MH: MOV EBX,PORTPOINTER[EBX] INC NUMBEROFPORTS JMP PORTLOOP PUBLIC ENDPORTLOOP ENDPORTLOOP: MOV NEXTFREEDATA,EBX ; SET UP APPLICATION CALLS AND ALIASES ; MOV ECX,MAXAPPLS mov esi, _Buffer add esi, ApplOffset MOV EDX,OFFSET32 APPLCALLTABLE CMP BYTE PTR ACApplCall[ESI],20H JNE @F ; ; APPL1CALL IS NOT SPECIFED - LEAVE VALUES SET FROM BBSCALL ADD ESI,TYPE APPLCONFIG ADD EDX,TYPE APPLCALLS DEC ECX @@: APCALLSLOOP: PUSH ESI LEA ESI,ACApplCall[ESI] LEA EDI,APPLCALL_TEXT[EDX] PUSH ECX MOV ECX,10 REP MOVSB ; COPY TEXT FORM OF CALL POP ECX POP ESI PUSH ESI LEA ESI,ACApplAlias[ESI] LEA EDI,APPLALIAS_TEXT[EDX] PUSH ECX MOV ECX,10 REP MOVSB ; COPY TEXT FORM OF CALL POP ECX POP ESI PUSH ESI LEA ESI,ACCommand[ESI] LEA EDI,APPLCMDNAME[EDX] PUSH ECX MOV ECX,12 REP MOVSB ; COPY Command POP ECX POP ESI MOV EAX,ACApplQual[ESI] MOV APPLQUAL[EDX],AX CMP ACCommandAlias[ESI], 20H JE SHORT @F MOV APPLHASALIAS[EDX], 1 LEA EAX,ACCommandAlias[ESI] MOV APPLALIASPTR[EDX], EAX @@: ADD ESI,TYPE APPLCONFIG ADD EDX,TYPE APPLCALLS LOOP APCALLSLOOP ; CONVERT CALL AND ALIAS TO AX25 FORMAT MOV EDX,OFFSET32 APPLCALLTABLE MOV ECX,MAXAPPLS PUBLIC APCONVLOOP APCONVLOOP: PUSH ECX LEA ESI,APPLCALL_TEXT[EDX] CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,APPLCALL[EDX] MOV ECX,7 REP MOVSB LEA ESI,APPLALIAS_TEXT[EDX] CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL LEA EDI,APPLALIAS[EDX] MOV ECX,6 REP MOVSB POP ECX ADD EDX,TYPE APPLCALLS LOOP APCONVLOOP MOV DWORD PTR HEXMSG,'KNIL' MOV EAX,NEXTFREEDATA ; CALL HEXOUT ; SET UP VARIOUS CONTROL TABLES ; MOV EAX,TYPE LINKTABLE MOVZX ECX,MAXLINKS MUL ECX MOV EBX,NEXTFREEDATA MOV LINKS,EBX ADD NEXTFREEDATA,EAX ; MOV DWORD PTR HEXMSG,'TSED' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV EAX,TYPE DEST_LIST MOVZX ECX,_MAXDESTS MUL ECX MOV EBX,NEXTFREEDATA MOV DESTS,EBX ADD EBX,EAX MOV NEXTFREEDATA,EBX MOV ENDDESTLIST,EBX ; MOV DWORD PTR HEXMSG,'GIEN' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV EAX,TYPE NEIGHBOUR_LIST MOVZX ECX,MAXNEIGHBOURS MUL ECX MOV EBX,NEXTFREEDATA MOV NEIGHBOURS,EBX ADD NEXTFREEDATA,EAX ; MOV DWORD PTR HEXMSG,' 4L' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV EAX,TYPE TRANSPORTENTRY MOVZX ECX,_MAXCIRCUITS MUL ECX MOV EBX,NEXTFREEDATA MOV _L4TABLE,EBX ADD NEXTFREEDATA,EAX ; ; SET UP DEFAULT ROUTES LIST ; MOV CONFIGPTR,C_ROUTES CALL GETCONFIG MOV EBX,NEIGHBOURS MOV ESI,OFFSET32 CONFIGTABLE PUBLIC ROUTELOOP ROUTELOOP: CMP BYTE PTR [ESI],0 JE SHORT ROUTEEND PUSH ESI MOV EDI,OFFSET32 NORMCALL MOV ECX,10 REP MOVSB MOV ESI,OFFSET32 NORMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,EBX MOV ECX,7 REP MOVSB POP ESI ADD ESI,10 LODS CONFIGTABLE MOV NEIGHBOUR_QUAL[EBX],AL ; SET QUALITY LODS CONFIGTABLE MOV NEIGHBOUR_PORT[EBX],AL ; SET PORT LODS CONFIGTABLE TEST AL,40H JZ @F MOV NoKeepAlive[EBX], 1 @@: TEST AL,80H JZ @F MOV INP3Node[EBX], 1 MOV NoKeepAlive[EBX], 0 ; Can't have INP3 and No Keepalive @@: AND AL,3FH MOV NBOUR_MAXFRAME[EBX],AL ; SET WINDOW LODS WORD PTR CONFIGTABLE OR AX,AX JZ SHORT NORFRACK CALL CONV3SECS PUBLIC NORFRACK NORFRACK: MOV NBOUR_FRACK[EBX],AL ; SET FRACK LODS CONFIGTABLE MOV NBOUR_PACLEN[EBX],AL MOV NEIGHBOUR_FLAG[EBX],1 ; LOCKED ROUTE ADD EBX,TYPE NEIGHBOUR_LIST JMP ROUTELOOP PUBLIC ROUTEEND ROUTEEND: ; ; SET UP INFO MESSAGE ; MOV DWORD PTR HEXMSG,'OFNI' MOV EAX,NEXTFREEDATA ; CALL HEXOUT mov esi, _Buffer add esi, C_INFOMSG MOV EDI,NEXTFREEDATA MOV EBX,EDI MOV INFOMSG,EDI PUBLIC SETUPINFO SETUPINFO: LODS CONFIGTABLE STOSB OR AL,AL JNZ SHORT SETUPINFO DEC EDI ; DONT WANT THE NULL MOV NEXTFREEDATA,EDI SUB EDI,EBX MOV EAX,EDI MOV INFOLEN,AX ; ; SET UP CTEXT MESSAGE ; MOV CONFIGPTR,C_CTEXT CALL GETCONFIG MOV DWORD PTR HEXMSG,'XETC' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV EDI,NEXTFREEDATA MOV EBX,EDI MOV _CTEXTMSG,EDI MOV ESI,OFFSET32 CONFIGTABLE PUBLIC SETUPCTEXT SETUPCTEXT: LODS CONFIGTABLE STOSB OR AL,AL JNZ SHORT SETUPCTEXT MOV NEXTFREEDATA,EDI SUB EDI,EBX MOV EAX,EDI ; LENGTH DEC EAX ; Dont include NULL MOV _CTEXTLEN,AX ; ; SET UP ID MESSAGE ; MOV DWORD PTR HEXMSG,' DI' MOV EAX,NEXTFREEDATA ; CALL HEXOUT MOV CONFIGPTR,C_IDMSG CALL GETCONFIG MOV EDI,NEXTFREEDATA MOV EBX,EDI ; SAVE MOV IDMSG,EDI MOV ESI,OFFSET32 IDHDDR MOV ECX,23 REP MOVSB ; COPY HEADER MOV ESI,OFFSET32 CONFIGTABLE PUBLIC SETUPID SETUPID: LODS CONFIGTABLE STOSB OR AL,AL JNZ SHORT SETUPID DEC EDI ; REMOVE TRAILING NULL MOV NEXTFREEDATA,EDI SUB EDI,EBX MOV EBX,IDMSG MOV EAX,EDI MOV MSGLENGTH[EBX],AX ; PUT LENGTH INTO MESSAGE ; ; SET UP FREE BUFFER POOL - MUST BE DONE LAST ; MOV DWORD PTR HEXMSG,'FFUB' MOV EAX,NEXTFREEDATA ADD EAX,3 AND EAX,0FFFFFFFCH ; MASK TO DWORD MOV NEXTFREEDATA,EAX CALL HEXOUT MOV EDI,NEXTFREEDATA ; FREE SPACE MOV BUFFERPOOL,EDI MOVZX ECX,NUMBEROFBUFFERS MOV NUMBEROFBUFFERS,0 IF DEBUG MOV EBX,OFFSET32 BUFFERLIST ENDIF PUBLIC BUFF000 BUFF000: MOV EAX,EDI ADD EAX,BUFFLEN CMP EAX,OFFSET32 _ENDPOOL JA SHORT BUFF001 ; NOT ROOM FOR THIS ONE! MOV ESI,OFFSET32 FREE_Q PUSH EDI CALL _Q_ADD_INIT POP EDI INC NUMBEROFBUFFERS INC MAXBUFFS ADD EDI,BUFFLEN LOOP BUFF000 PUBLIC BUFF001 BUFF001: ; MOV NEXTFREEDATA,EDI ; MOV DWORD PTR HEXMSG,' DNE' MOV EAX,NEXTFREEDATA CALL HEXOUT ; SET UP OUR CALLIGN(S) ; MOV ESI,OFFSET32 _MYNETROMCALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,OFFSET32 _NETROMCALL MOV ECX,7 REP MOVSB MOV ESI,OFFSET32 _MYNODECALL CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,OFFSET32 _MYCALL MOV ECX,7 REP MOVSB MOV ESI,OFFSET32 AX25CALL MOV EDI,IDMSG LEA EDI,14[EDI] ; COPY TO ID MESSAGE MOV ECX,7 REP MOVSB OR BYTE PTR -1[EDI],01100001B ; SET CMD END AND RESERVED BITS MOV ESI,OFFSET32 _MYCALL+7 ; ALIAS CALL CONVTOAX25 MOV ESI,OFFSET32 AX25CALL MOV EDI,OFFSET32 MYALIAS MOV ECX,7 REP MOVSB ; ; SET UP INITIAL DEST ENTRY FOR APPLICATIONS (IF BOTH NODE AND BBS NEEDED) ; MOV EBX,DESTS ; ; If NODECALL isn't same as NETROMCALL, Add Dest Entry for NODECALL MOV ESI,OFFSET32 _NETROMCALL MOV EDI,OFFSET32 _MYCALL MOV ECX,7 REP CMPSB JE @F LEA ESI,_MYCALL LEA EDI,DEST_CALL[EBX] MOV ECX,13 REP MOVSB MOV DEST_STATE[EBX],80H ; SPECIAL ENTRY MOV ROUT1_QUALITY[EBX],255 MOV ROUT1_OBSCOUNT[EBX],255 ADD EBX,TYPE DEST_LIST INC _NUMBEROFNODES @@: MOV AL,0 CMP AL,NODE JE SHORT NOBBSDEST CMP AL,BBS JE SHORT NOBBSDEST MOV EDX,OFFSET32 APPLCALLTABLE MOV ECX,MAXAPPLS PUBLIC ADD_APPL_ENTRIES ADD_APPL_ENTRIES: PUSH ECX PUSH EDX CMP APPLQUAL[EDX],0 ; QUALITY JE SHORT NEXT_APPL_ENTRY LEA ESI,APPLCALL[EDX] LEA EDI,DEST_CALL[EBX] MOV ECX,13 REP MOVSB MOV DEST_STATE[EBX],80H ; SPECIAL ENTRY MOV AL,BYTE PTR APPLQUAL[EDX] MOV ROUT1_QUALITY[EBX],AL MOV ROUT1_OBSCOUNT[EBX],255 MOV APPNODEPOINTER[EDX],EBX ; SAVE POINTER TO NODES ENTRY FOR THIS APP ADD EBX,TYPE DEST_LIST INC _NUMBEROFNODES PUBLIC NEXT_APPL_ENTRY NEXT_APPL_ENTRY: POP EDX POP ECX ADD EDX,TYPE APPLCALLS loop ADD_APPL_ENTRIES PUBLIC NOBBSDEST NOBBSDEST: ; Don't Initialise ports till later - part of Perl fix ; CALL _INITIALISEPORTS ; READ ROUTE/NODE RECOVERY FILE (IF PRESENT) PUSH OFFSET _NODESFILENAME ; New name BPQNODES.DAT CALL _OPENCONFIGFILE ADD ESP,4 CMP EAX,-1 JNE SHORT PROCESSNODESFILE MOV EDX,OFFSET32 NONODESMSG CALL SEND_DOS_MESSAGE JMP NONODESFILE PUBLIC PROCESSNODESFILE PROCESSNODESFILE: MOV CONFIGHANDLE,EAX PUBLIC INITNODESLOOP INITNODESLOOP: CALL GETRECORD ; EXTRACT NEXT RECORD (INTO UNPROTOCALL) MOV EDI,OFFSET32 UNPROTOCALL MOV AL,[EDI] CMP AL,1AH ; EOF? JE SHORT ENDNODESLOOP CMP AL,';' ; COMMENT? JE SHORT INITNODESLOOP ; YES MOV ESI,OFFSET32 ROUTEADD MOV ECX,10 REP CMPSB JE SHORT PROCROUTEJMP MOV EDI,OFFSET32 UNPROTOCALL MOV ESI,OFFSET32 NODEADD MOV ECX,9 REP CMPSB JE SHORT PROCNODE PUBLIC BADNODELINE BADNODELINE: MOV ESI,OFFSET UNPROTOCALL MOV EDI,OFFSET BADNODETEXT MOV ECX,79 REP MOVSB MOV EDX,OFFSET32 BADNODEMSG CALL SEND_DOS_MESSAGE ; ; DISPLAY BAD LINE ; PUBLIC PRINTTOEND PRINTTOEND: MOV ESI,OFFSET32 UNPROTOCALL PUBLIC PRINTTOEND1 PRINTTOEND1: LODSB CMP AL,1AH ; EOF? JE SHORT ENDNODESLOOP CALL PRINTIT CMP ESI,OFFSET32 UNPROTOCALL+79 JNE SHORT PRINTTOEND1 MOV AL,CR CALL PRINTIT MOV AL,LF CALL PRINTIT JMP INITNODESLOOP PUBLIC PRINTIT PRINTIT: ; MOV AH,14 ; PUSH DWORD PTR 10H ; VMMCALL EXEC_VXD_INT RET PUBLIC PROCNODE PROCNODE: JMP PROCESSNODEADD PUBLIC PROCROUTEJMP PROCROUTEJMP: JMP SHORT PROCROUTE PUBLIC ENDNODESLOOP ENDNODESLOOP: PUSH CONFIGHANDLE CALL _CloseHandle@4 PUBLIC NONODESFILE NONODESFILE: ; ; set up stream number in BPQHOSTVECTOR MOV EBX,OFFSET BPQHOSTVECTOR MOV EAX,1 PUBLIC SET_LOOP SET_LOOP: MOV HOSTSTREAM[EBX],AL ADD EBX,VECTORLENGTH INC EAX CMP EAX,65 JNE SHORT SET_LOOP ; TERMINATE ; ; ; CALCULATE LENGTH OF DATA SEG ; ; mov EDX,OFFSET32 loadedmsg ; CALL SEND_DOS_MESSAGE XOR EAX,EAX RET ; PUBLIC BADRETURN BADRETURN: JMP BADNODELINE PUBLIC PROCROUTE PROCROUTE: ; ; FORMAT IS ROUTE ADD CALLSIGN PORT QUAL (VIA .... ; PUBLIC PROCESSLINE PROCESSLINE: MOV ESI,OFFSET32 UNPROTOCALL+10 CALL CONVTOAX25 JNZ BADCALL CALL GETVALUE MOV SAVEPORT,AL ; SET PORT FOR _FINDNEIGHBOUR CALL GETVALUE MOV ROUTEQUAL,AL ; MOV INITPTR,ESI ; SAVE ; ; SEE IF ALREADY IN LIST ; MOV ESI,OFFSET32 AX25CALL CALL _FINDNEIGHBOUR JZ INITRETURN ; IGNORE IF ALREADY THERE (PROBABLY FROM CONFIG FILE CMP EBX,0 JE NOROOM MOV EDI,EBX MOV ECX,7 REP MOVSB MOV AL,SAVEPORT MOV NEIGHBOUR_PORT[EBX],AL ; SET PORT MOV AL,ROUTEQUAL MOV NEIGHBOUR_QUAL[EBX],AL ; SET QUALITY MOV ESI,INITPTR LODSB CMP AL,'!' JNE SHORT NOTLOCKED MOV NEIGHBOUR_FLAG[EBX],1 ; LOCKED ROUTE INC ESI PUBLIC NOTLOCKED NOTLOCKED: ; ; SEE IF ANY DIGIS ; cmp byte ptr[esi], 'V' JNE SHORT INITINP3 ADD ESI,4 CALL CONVTOAX25 JNZ SHORT BADCALL PUSH ESI MOV ESI,OFFSET32 AX25CALL LEA EDI,7[EBX] MOV ECX,7 REP MOVSB POP ESI CMP BYTE PTR [ESI],20H JE SHORT INITINP3 CALL CONVTOAX25 JNZ SHORT BADCALL MOV ESI,OFFSET32 AX25CALL LEA EDI,14[EBX] MOV ECX,7 REP MOVSB PUBLIC INITINP3 INITINP3: CALL GETVALUE ; MAXFRAME CALL GETVALUE ; FRACK CALL GETVALUE ; PACLEN CALL GETVALUE ; INP3/Keepalive Flag test al,2 jz @f mov byte ptr NoKeepAlive[EBX], 1; @@: test al,1 jz @f mov byte ptr INP3Node[EBX], 1 ; Enabled is First Byte mov byte ptr NoKeepAlive[EBX], 0; Can't have INP3 and No Keepalive @@: PUBLIC NOROOM NOROOM: PUBLIC INITRETURN INITRETURN: JMP INITNODESLOOP PUBLIC BADCALL BADCALL: JMP BADRETURN PUBLIC PROCESSNODEADD PROCESSNODEADD: ; ; FORMAT IS NODE ADD ALIAS:CALL ROUTE QUAL ; ; FIND CALL (AFTER ':') ; MOV ESI,OFFSET32 UNPROTOCALL+9 MOV EDI,OFFSET32 TEMPFIELD MOV ECX,7 ; MAX ALIAS PUBLIC PNODE30 PNODE30: LODSB CMP AL,':' JE SHORT PNODE40 STOSB LOOP PNODE30 PUBLIC PNODE35 PNODE35: JMP BADRETURN PUBLIC PNODE40 PNODE40: DEC ECX JCXZ PNODE45 ; 6 CHAR ALIAS MOV AL,20H REP STOSB ; CLEAR REST OF ALIAS PUBLIC PNODE45 PNODE45: CALL CONVTOAX25 JNZ SHORT PNODE35 ; DUFF ; MOV INITPTR,ESI ; SAVE POINTER MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION JNZ SHORT PNODE47 JMP BADRETURN ; SHOULD ONLY BE IN ONCE PUBLIC PNODE47 PNODE47: CMP EBX,0 JNE SHORT PNODE48 JMP NOROOMFORNODE PUBLIC PNODE48 PNODE48: LEA EDI,DEST_CALL[EBX] MOV ECX,7 REP MOVSB MOV ECX,6 ; ADD ALIAS MOV ESI,OFFSET32 TEMPFIELD REP MOVSB INC _NUMBEROFNODES NODEROUTELOOP: ; MOV ESI,INITPTR ; ; GET NEIGHBOURS FOR THIS DESTINATION ; CALL CONVTOAX25 JNZ SHORT BADROUTE ; CALL GETVALUE MOV SAVEPORT,AL ; SET PORT FOR _FINDNEIGHBOUR CALL GETVALUE MOV ROUTEQUAL,AL ; MOV INITPTR,ESI ; SAVE AGAIN PUSH OBSINIT ; SAVE CMP BYTE PTR [ESI],'!' JNE SHORT NOTLOCKEDNODE ADD INITPTR,2 MOV OBSINIT,255 ; SPECIAL FOR LOCKED PUBLIC NOTLOCKEDNODE NOTLOCKEDNODE: MOV ESI,OFFSET32 AX25CALL PUSH EBX ; SAVE DEST CALL _FINDNEIGHBOUR MOV EAX,EBX ; ROUTE TO EAX POP EBX JZ SHORT NOTBADROUTE ADD ESP,2 JMP SHORT BADROUTE PUBLIC NOTBADROUTE NOTBADROUTE: ; ; UPDATE ROUTE LIST FOR THIS DEST ; CALL PROCROUTES ; POP OBSINIT JMP SHORT NODEROUTELOOP PUBLIC BADROUTE BADROUTE: PUBLIC NOROOMFORNODE NOROOMFORNODE: JMP INITRETURN ; FINISHED PUBLIC GETRECORD ; ; READ A RECORD FROM INPUT FILE ; PUBLIC GETRECORD GETRECORD: MOV EDI,OFFSET32 UNPROTOCALL PUSH EDI MOV ECX,40 MOV AX,2020H REP STOSW MOV ECX,79 ; MAX SIZE POP EDI PUBLIC GETRECORDLOOP GETRECORDLOOP: CALL GETDISK CMP AL,0AH JE SHORT ENDRECORD ; CMP AL,1AH JNE SHORT NOTENDOFFILE STOSB RET PUBLIC NOTENDOFFILE NOTENDOFFILE: CMP AL,0DH JE SHORT GETRECORDLOOP ; STOSB LOOP GETRECORDLOOP ; PUBLIC ENDRECORD ENDRECORD: RET ; ; PUBLIC GETDISK GETDISK: ; GET A BYTE FROM DISK BUFFER CMP READCOUNT,512 JE SHORT READIT ; GET NEW BLOCK ; MOV ESI,READPOINTER ; GET NEXT CHAR POINTER PUBLIC READNEXT READNEXT: LODSB MOV READPOINTER,ESI INC READCOUNT ; CHARS USED (AND SETS NONZERO FLAG) ; RET ; WITH ZERO FLAG NOT SET ; PUBLIC READIT READIT: PUSH EDI MOV EAX,0 MOV READCOUNT,0 ; MOV EDX,OFFSET32 CONFIGTABLE MOV READPOINTER,EDX MOV ECX,512 CALL READ_CONFIG_FILE POP EDI CMP EAX,ECX JE SHORT READOK MOV ESI,OFFSET32 CONFIGTABLE ADD ESI,EAX MOV BYTE PTR [ESI],1AH ; ENSURE EOF DETECTED PUBLIC READOK READOK: MOV ESI,OFFSET32 CONFIGTABLE JMP READNEXT ;PUBLIC READCONFIG, READCONFIGRECORD, POSITIONCONFIG ; PUBLIC READCONFIG READCONFIG: PUSH EBX CALL POSITIONCONFIG MOV ECX,512 CALL READCONFIGRECORD POP EBX RET PUBLIC POSITIONCONFIG POSITIONCONFIG: PUSH 0 ; FILE_BEGIN PUSH 0 PUSH EAX PUSH CONFIGHANDLE CALL _SetFilePointer@16 RET PUBLIC READCONFIGRECORD READCONFIGRECORD: PUSH EBX MOV EDX,OFFSET32 CONFIGTABLE CALL READ_CONFIG_FILE POP EBX RET PUBLIC _Q_ADD_INIT _Q_ADD_INIT: PUBLIC _Q_ADDI05 _Q_ADDI05: CMP DWORD PTR [ESI],0 ; END OF CHAIN JE SHORT _Q_ADDI10 MOV ESI,[ESI] ; NEXT IN CHAIN JMP _Q_ADDI05 PUBLIC _Q_ADDI10 _Q_ADDI10: MOV DWORD PTR [EDI],0 ; CLEAR CHAIN ON NEW BUFFER MOV [ESI],EDI ; CHAIN ON NEW BUFFER INC QCOUNT RET D10 DW 10 D50 DW 1000/18 D300 DW 1000/3 PUBLIC CONVTIME CONVTIME: ; ; CONVERT AX (MS INTERVALS) TO 10MS IF KISS ; MOV DX,0 CMP PORTTYPE[EBX],0 ; ASYNC JE SHORT CONVKISS CMP PORTTYPE[EBX],8 ; QUAD JE SHORT CONVKISS RET PUBLIC CONVKISS CONVKISS: DIV D10 RET PUBLIC CONV3SECS CONV3SECS: ; ; CONVERT AX (MS) TO L2 TICKS (APPROX 3 PER SEC) ; MOV DX,0 DIV D300 ; APPROX 50 MS - 18.2 HZ OR AL,AL JNZ SHORT CONV3X INC AL ; ENSURE NZ PUBLIC CONV3X CONV3X: RET LINKINIT: ; ; CANT THINK OF ANYTHING FOR NOW ; PUSH EBX MOV EDX,OFFSET32 LOOPMSG CALL SEND_DOS_MESSAGE POP EBX RET PUBLIC EXTINIT EXTINIT: ; ; LOAD DLL - NAME IS IN PORT_DLL_NAME ; push ebx call _InitializeExtDriver add esp,4 CMP eax,0 JNE SHORT EXTOK ; ; NO ROUTINE ; MOV eax,RETADDR MOV PORT_EXT_ADDR[EBX],EAX PUSH EBX MOV EDX,OFFSET32 BADEXTMSG CALL SEND_DOS_MESSAGE POP EBX ret ; PUBLIC EXTOK EXTOK: MOV PORT_EXT_ADDR[EBX],EAX PUBLIC EXTOK2 EXTOK2: ; ; ALSO CALL THE ROUTINE TO START IT UP, ESPECIALLY IF A L2 ROUTINE ; push ebx ; Port control entry CALL PORT_EXT_ADDR[EBX] ; ; Startup returns address of processing routine ; MOV PORT_EXT_ADDR[EBX],EAX RET PUBLIC EXTRESET EXTRESET: ; ; CALLED INSTEAD OF DRIVER IF EXT DRIVER HAS BEEN UNLOADED ; PUSHAD CALL EXTINIT ; REINITIALIZE DRIVER POPAD POP SAVEEAX ; SAVE OLD RETURN ADDR ; ; STACK SHOULD NOW BE OK TO RETRY ORIGINAL CALL ; CALL PORT_EXT_ADDR[EBX] ; DO THE CALL PUSH SAVEEAX ; RESTORE STACK RET PUBLIC _RESET_EXT_ADDR _RESET_EXT_ADDR: PUBLIC _RESET_EXT_ADDR PUSH EBX CALL GETPORTTABLEENTRY MOV eax,offset32 EXTRESET MOV PORT_EXT_ADDR[EBX],EAX POP EBX RET ; CW LOOKUP TABLE - TWO BITS PER ELEMENT ; ; 00 = END ; 01 = DIT ; 11 = DASH ; ; ; BASED ON DESIGN BY MIKE TUBBY, G8TIC, 1985 ; CWTABLE DW 1101011101B ; / -..-. DW 1111111111B ; 0 ----- DW 1111111101B ; 1 .---- DW 1111110101B ; 2 ..--- DW 1111010101B ; 3 ...-- DW 1101010101B ; 4 ....- DW 0101010101B ; 5 ..... DW 0101010111B ; 6 -.... DW 0101011111B ; 7 --... DW 0101111111B ; 8 ---.. DW 0111111111B ; 9 ----. DW 7 DUP (0) ; ASCII 3A-40 DW 0000001101B ; A .- DW 0001010111B ; B -... DW 0001110111B ; C -.-. DW 0000010111B ; D -.. DW 0000000001B ; E . DW 0001110101B ; F ..-. DW 0000011111B ; G --. DW 0001010101B ; H .... DW 0000000101B ; I .. DW 0011111101B ; J .--- DW 0000110111B ; K -.- DW 0001011101B ; L .-.. DW 0000001111B ; M -- DW 0000000111B ; N -. DW 0000111111B ; O --- DW 0001111101B ; P .--. DW 0011011111B ; Q --.- DW 0000011101B ; R .-. DW 0000010101B ; S ... DW 0000000011B ; T - DW 0000110101B ; U ..- DW 0011010101B ; V ...- DW 0000111101B ; W .-- DW 0011010111B ; X -..- DW 0011110111B ; Y -.-- DW 0001011111B ; Z --.. _TEXT ENDS _TEXT SEGMENT ; ; LOCKED CODE ; PUBLIC Q_REM,_Q_ADD,RELBUFF,CONVFROMAX25,CONVTOAX25 PUBLIC GETPORTTABLEENTRY,GETBUFF,TRACEFRAME PUBLIC GETPORTQUALITY,BGTIMER EXTRN L2TIMERPROC:NEAR,L2ROUTINE:NEAR,SDETX:NEAR EXTRN PROCESSIFRAME:NEAR,PROCESSNODEMESSAGE:NEAR EXTRN L4BG:NEAR,GETVALUE:NEAR EXTRN L4TIMERPROC:NEAR EXTRN CLEARSESSIONENTRY:NEAR,L3FASTTIMER:NEAR EXTRN L3TIMERPROC:NEAR,L3BG:NEAR,PROCROUTES:NEAR EXTRN TNCTIMERPROC:NEAR,_FINDDESTINATION:NEAR EXTRN STATSTIMER:NEAR,_FINDNEIGHBOUR:NEAR EXTRN _HDLCTX:NEAR,KISSRX:NEAR,KISSTX:NEAR,KISSTIMER:NEAR,_KISSCLOSE:NEAR EXTRN _HDLCRX:NEAR,COMMANDHANDLER:NEAR EXTRN _HDLCTIMER:NEAR EXTRN _HDLCCLOSE:NEAR, _HDLCTXCHECK:NEAR PUBLIC DUMMYCODE DUMMYCODE: RET ; DUMMY FOR MISSING ROUTINES DB 'BPQ' ; FOR DUMP SYSTEM DD QCOUNT ; ADDR OF QCOUNT FOR DUMP SYSTEM ; PUBLIC _BACKGROUND ;_BACKGROUND: PUBLIC BACKGROUND BACKGROUND: ; ; CHECK FOR TIMER ACTIVITY ; PUSH EBP CMP L2TIMERFLAG,3 ; 3 PER SEC JB SHORT NOTL2TIMER SUB L2TIMERFLAG,3 PUSH EBP CALL L2TIMERPROC POP EBP PUBLIC NOTL2TIMER NOTL2TIMER: CMP L3TIMERFLAG,549 ; 1 PER MIN, but PC Clock is a bit slow JB SHORT NOTL3TIMER SUB L3TIMERFLAG,549 CALL L3TIMERPROC CALL STATSTIMER PUBLIC NOTL3TIMER NOTL3TIMER: CMP L4TIMERFLAG,10 ; 1 PER SEC JB SHORT NOTL4TIMER SUB L4TIMERFLAG,10 CALL L3FASTTIMER CALL L4TIMERPROC PUBLIC NOTL4TIMER NOTL4TIMER: ; ; SEE IF ANY FRAMES TO TRACE ; MOV ESI,OFFSET32 TRACE_Q CALL Q_REM JZ SHORT NOTRACERET ; IF BUFFER HAS A LINK TABLE ENTRY ON END, RESET TIMEOUT ; PUSH EBX MOV EBX,BUFFLEN-4[EDI] OR EBX,EBX JZ SHORT NOTIMER CMP L2TIMER[EBX],0 JE SHORT NOTIMER ; ALREADY EXPIRED MOV AL,L2TIME[EBX] XOR AH,AH MOV L2TIMER[EBX],AX MOV DWORD PTR BUFFLEN-4[EDI],0 ; CLEAR FLAG FROM BUFFER PUBLIC NOTIMER NOTIMER: POP EBX OR MSGPORT[EDI],80H CALL _BPQTRACE CALL RELBUFF JMP NOTL4TIMER PUBLIC NOTRACERET NOTRACERET: PUBLIC DOBGSCAN DOBGSCAN: ; ; CHECK FOR MESSAGES RECEIVED FROM COMMS LINKS ; MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS OR ECX,ECX JZ BGNOPORTS PUBLIC MAINL00 MAINL00: MOV AL,PORTNUMBER[EBX] MOV CURRENTPORT,AL ; PORT NUMBER MOV CURRENTPORTPTR,EBX LEA ESI,PORTRX_Q[EBX] CALL Q_REM ; SEE IF ANYTHING THERE JZ SHORT MAINL10 cmp PROTOCOL[EBX],10 JNE @F ; ; PACTOR Style Message ; push ebx movzx eax,byte ptr 4[EDI] ; Session Number for Kantronics shl eax,2 ; *4 mov eax,ATTACHEDSESSIONS[EBX][EAX] or eax,eax jnz gotsess ; TNC not attached - discard CALL RELBUFF pop EBX JMP SHORT MAINL10 ; SEE IF ANY MORE gotsess: MOV L4KILLTIMER[EAX],0 ; Reset Idle Timeout mov ebx,L4CROSSLINK[EAX] or ebx,ebx jnz gotlink ; No Crosslink - pass to command handler mov ebx, eax push ecx CALL COMMANDHANDLER ; BUFFER USED FOR REPLY OR CONNECT pop ecx pop ebx JMP SHORT MAINL10 gotlink: LEA ESI,L4TX_Q[EBX] call _Q_ADD CALL _POSTDATAAVAIL pop ebx JMP SHORT MAINL00 ; DO ANY MORE @@: ; TIME STAMP IT ; ; push ecx push edx push 0 call _time add esp,4 pop edx pop ecx MOV BUFFLEN-8[EDI],EAX PUSH EBX PUSH ECX MOV AL,CURRENTPORT MOV MSGPORT[EDI],AL ; PUT PORT INTO MSG BUFFER ; PUSH EBP CALL L2ROUTINE ; LEVEL 2 PROCESS POP EBP POP ECX POP EBX INC RAN2 PUBLIC MAINL00_J MAINL00_J: JMP MAINL00 ; DO ANY MORE PUBLIC MAINL10 MAINL10: CMP PORTTX_Q[EBX],0 JE MAINL15 ; NO FRAMES ; ; SEE IF PORT IS BUSY ; mov eax, PORTTX_Q[EBX] ; Buffer movzx eax, byte ptr 4[eax] ; Channel if KAM Hostmode PUSH ECX PUSH EBX CALL PORTTXCHECK[EBX] ; POP EBX POP ECX OR AL,AL JZ SHORT NOTBUSY ; OK ; If a Pactor Port, some channels could be busy whilst others are not. cmp PROTOCOL[EBX],10 JNE MAINL15 ; BUSY ; ; Try passing any other messages on the queue to the node. ; mov PACTORSAVEQ, 0 PACTORLOOP: LEA ESI,PORTTX_Q[EBX] CALL Q_REM ; SEE IF ANYTHING THERE JZ SHORT ENDOFLIST movzx eax, byte ptr 4[EDI] ; Channel if KAM Hostmode PUSH ECX PUSH EBX CALL PORTTXCHECK[EBX] ; POP EBX POP ECX OR AL,AL JZ SHORT @F ; OK lea ESI,PACTORSAVEQ call _Q_ADD ; Save it jmp PACTORLOOP @@: ; ; MESSAGE TO SEND - SEND IT ; INC RAN3 CMP PORTDISABLED[EBX],0 JE SHORT @F ; ; PORT HAS BEEN DISABLED ; CALL RELBUFF JMP SHORT PACTORLOOP ; SEE IF ANY MORE @@: INC L2FRAMESSENT[EBX] PUSH ECX PUSH EDI ; Msg for 'c' Routines PUSH EBX ; VECTOR for 'c' Routines CALL PORTTXROUTINE[EBX] ; LEVEL 2 PROCESS POP EBX POP EDI POP ECX JMP SHORT PACTORLOOP ; SEE IF MORE ENDOFLIST: ; Move the saved frames back onto Port Q mov EAX,PACTORSAVEQ mov PORTTX_Q[EBX],EAX JMP SHORT MAINL15 NOTBUSY: LEA ESI,PORTTX_Q[EBX] CALL Q_REM ; SEE IF ANYTHING THERE JZ SHORT MAINL15 ; ; MESSAGE TO SEND - SEND IT ; INC RAN3 CMP PORTDISABLED[EBX],0 JE SHORT PORTACTIVE ; ; PORT HAS BEEN DISABLED ; CALL RELBUFF JMP MAINL10 ; SEE IF ANY MORE PUBLIC PORTACTIVE PORTACTIVE: ; INC L2FRAMESSENT[EBX] PUSH ECX PUSH EDI ; Msg for 'c' Routines PUSH EBX ; VECTOR for 'c' Routines CALL PORTTXROUTINE[EBX] ; LEVEL 2 PROCESS POP EBX POP EDI POP ECX JMP MAINL10 ; SEE IF MORE PUBLIC MAINL15 MAINL15: PUSH ECX PUSH EBX ; VECTOR for 'C' code CALL PORTRXROUTINE[EBX] ; SEE IF MESSAGE RECEIVED POP EBX POP ECX MOV EBX,PORTPOINTER[EBX] DEC ECX JNZ MAINL00 PUBLIC BGNOPORTS BGNOPORTS: ; ; CHECK FOR INCOMING MESSAGES ON LINK CONTROL TABLE - ; BY NOW ONLY 'I' FRAMES WILL BE PRESENT - ; LEVEL 2 PROTOCOL HANDLING IS DOR INCOMING MESSAGES ON LINK CONTROL TABLE - ; BY NOW ONLY 'I' FRAMES WILL BE PRESENT - ; LEVEL 2 PROTOCOL HANDLING IS DONE IN MESSAGE RECEIVE CODE ; AND LINK HANDLING INTERRUPT ROUTINES ; MOV EBX,LINKS MOVZX ECX,MAXLINKS PUBLIC MAINL20 MAINL20: LEA ESI,RX_Q[EBX] CALL Q_REM ; SEE IF ANYTHING THERE JZ SHORT MAINL30 ; PUSH ECX PUSH EBX CALL PROCESSIFRAME POP EBX POP ECX INC RAN4 JMP SHORT MAINL20 ; SEE IF ANY MORE PUBLIC MAINL30 MAINL30: ; ; CHECK FOR OUTGOING MSGS ; CMP L2STATE[EBX],5 JB SHORT MAINL40 ; CANT SEND TEXT TILL CONNECTED ; CMP VER1FLAG[EBX],1 ; JE SHORT MAINL35 ; NEED TO RETRY WITH I FRAMES IF VER 1 ; CMP L2RETRIES[EBX],0 ; JNE SHORT MAINL40 ; CANT SEND TEXT IF RETRYING PUBLIC MAINL35 MAINL35: TEST L2FLAGS[EBX],RNRSET JNZ SHORT MAINL40 ; CANT SEND TEXT IF RNR PUSH EBX PUSH ECX CALL SDETX POP ECX POP EBX INC RAN5 PUBLIC MAINL40 MAINL40: ADD EBX,TYPE LINKTABLE LOOP MAINL20 ; CALL L4BG ; DO LEVEL 4 PROCESSING CALL L3BG CALL TNCTIMERPROC POP EBP RET PUBLIC TRACEFRAME TRACEFRAME: PUSH EBX CALL _BPQTRACE POP EBX RET PUBLIC _BPQTRACE _BPQTRACE: ; ; ATTACH A COPY OF FRAME TO ANY BPQ HOST PORTS WITH MONITORING ENABLED ; MOV ECX,BPQHOSTSTREAMS + 2 ; Include Telnet and APRS Trace Streams MOV EBX,OFFSET32 BPQHOSTVECTOR ; ; VECTOR FORMAT IS: ; ; 0-3 4 BYTES - ADDRESS OF SESSION ENTRY ; 4 1 BYTE - STATE CHANGE FLAGS ; 5 1 BYTE - APPLICATION MASK ; 6 1 BYTE - APPLICATION FLAGS - TOP BIT ENABLES MONITORING ; 7-10 2 BYTES - RAW FRAME QUEUE ; PUBLIC BPQTRACELOOP BPQTRACELOOP: CMP QCOUNT,100 JB SHORT BPQTRACERET TEST BYTE PTR HOSTAPPLFLAGS[EBX],80H JZ SHORT NOTRACE ; NOT ENABLED ; PUSH ECX PUSH EDI ; SAVE MESSAGE CALL GETBUFF JZ SHORT NOBUFFER POP ESI ; ORIGINAL MESSAGE PUSH ESI ; SAVE AGAIN PUSH EDI ; MOVZX ECX,MSGLENGTH[ESI] ADD ESI,4 ADD EDI,4 ; DONT COPY CHAIN WORD MOV ECX,BUFFLEN-8 ; TO GET TIMESTAMP REP MOVSB POP EDI LEA ESI,HOSTTRACEQ[EBX] CALL _Q_ADD ; PUT ON QUEUE ; ; Post a message if requested ; MOV eax,HOSTHANDLE[EBX] or eax,eax jz short nopost push 1 movzx ecx,HOSTSTREAM[EBX] push ecx push _BPQMsg PUSH EAX call _PostMessageA@16 PUBLIC nopost nopost: PUBLIC NOBUFFER NOBUFFER: POP EDI POP ECX PUBLIC NOTRACE NOTRACE: ADD EBX,VECTORLENGTH LOOP BPQTRACELOOP PUBLIC BPQTRACERET BPQTRACERET: RET PUBLIC _RELBUFF _RELBUFF LABEL NEAR RELBUFF: ; ; see if buffer is already on free q ; ; MOV ESI,OFFSET32 FREE_Q ;relaa: ; cmp esi,edi ; je relxx ; mov esi,[esi] ; cmp esi,0 ; je relok ; end of chain ; jmp relaa ; cmp EDI,0 ; jne relok ;relxx: ; CALL CBBAD ;relok: MOV ESI,OFFSET32 FREE_Q CALL _Q_ADDF ; RETURN BUFFER TO FREE QUEUE RET if 0 FINDLINK: ; ; FIND LINK FOR AN INCOMING MESSAGE ; ; MESSAGE ADDR IN EDI MOV EBX,0 MOV ESI,LINKS MOVZX ECX,MAXLINKS PUBLIC FINDLK00 FINDLK00: CMP BYTE PTR [ESI],0 JNE SHORT FINDLK05 ; NOT A SPARE ENTRY CMP EBX,0 JNE SHORT FINDLK10 ; ALREADY FOUND A SPARE MOV EBX,ESI ; POINTER TO FIRST FREE JMP SHORT FINDLK10 ; TRY NEXT ENTRY PUBLIC FINDLK05 FINDLK05: PUSH ESI PUSH EDI PUSH ECX LEA EDI,MSGORIGIN[EDI] ; ORIGIN FROM MESSAGE CALL COMPARECALLS ; COMPARE WITH LINKCALL POP ECX POP EDI POP ESI JNE SHORT FINDLK10 PUSH ESI PUSH EDI PUSH ECX LEA EDI,MSGDEST[EDI] ADD ESI,7 ; OURCALL IN TABLE CALL COMPARECALLS ; COMPARE WITH DESTINATON IN MSG POP ECX POP EDI POP ESI JE SHORT FINDLKRET ; YES PUBLIC FINDLK10 FINDLK10: ADD ESI,TYPE LINKTABLE LOOP FINDLK00 ; ; ENTRY NOT FOUND - EBX HAS FIRST FREE ENTRY, OR ZERO IF TABLE FULL ; OR AL,1 RET PUBLIC FINDLKRET FINDLKRET: MOV EBX,ESI XOR AL,AL RET COMPARECALLS: ; ; COMPARE AX25 CALLSIGNS IN ESI, EDI IGNORING EXTRA BITS IN SSID ; MOV ECX,6 REP CMPSB ; COMPARE WITH LINKCALL JNE SHORT COMPCALLRET ; DONT MATCH LODSB MOV AH,[EDI] AND AX,0001111000011110B ; MASK NON-SSID BITS CMP AL,AH PUBLIC COMPCALLRET COMPCALLRET: RET endif PUBLIC GETPORTQUALITY GETPORTQUALITY: PUSH EBX CALL GETPORTTABLEENTRY MOV AL,PORTQUALITY[EBX] POP EBX RET PUBLIC GETPORTTABLEENTRY GETPORTTABLEENTRY: PUSH ECX MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS JCXZ GETNOPORTS PUBLIC GETPORT10 GETPORT10: CMP AL,PORTNUMBER[EBX] JE SHORT GETPORT20 MOV EBX,PORTPOINTER[EBX] LOOP GETPORT10 PUBLIC GETNOPORTS GETNOPORTS: MOV EBX,PORTTABLE ; TO FIRST IF NOT DEFINED PUBLIC GETPORT20 GETPORT20: POP ECX RET PUBLIC CONVTOAX25 CONVTOAX25: ; ; CONVERT CALLSIGN IN [ESI] TO AX25 FORMAT IN AX25CALL ; RETURN NZ IF CALLSIGN INVALID ; MOV EDI,OFFSET32 AX25CALL MOV ECX,6 ; MAX ALPHANUMERICS MOV AL,40H REP STOSB ; CLEAR IN CASE SHORT CALL MOV AL,01100000B ; DEFAULT SSID STOSB MOV EDI,OFFSET32 AX25CALL MOV CL,7 PUBLIC CONVAX00 CONVAX00: LODSB CMP AL,'-' JE SHORT CONVAX20 ; SSID FOLLOWS CMP AL,' ' JBE SHORT CONVAX40 ; END OF NAME ; CMP AL,'#' JNE SHORT NOTHASH CMP CL,7 JE SHORT CONVAX10 ; OK AS FIRST CHAR PUBLIC NOTHASH NOTHASH: CMP AL,'/' ; ALLOW / AND DIGITS (FOR W0RLI!) JB SHORT CONVAX49 ; INVALID CMP AL,'9' JBE SHORT CONVAX10 ; OK CMP AL,'A' JB SHORT CONVAX49 ; INVALID CMP AL,'Z' JBE SHORT CONVAX10 ; OK CMP AL,'a' JB SHORT CONVAX10 ; OK CMP AL,'z' JA SHORT CONVAX49 ; INVALID AND AL,NOT 20H ; CONVERT TO UPPER CASE PUBLIC CONVAX10 CONVAX10: SAL AL,1 ; SHIFT UP STOSB LOOP CONVAX00 ; ; HAVE PROCESSED 7 CHARS - NAME IS INVALID ; JMP SHORT CONVAX49 PUBLIC CONVAX20 CONVAX20: LODSB ; FIRST CHAR IF SSID CMP AL,'0' JB SHORT CONVAX49 ; INVALID CMP AL,'9' JA SHORT CONVAX49 ; OK ; MOV AH,AL ; SAVE LODSB CMP AL,' ' JBE SHORT CONVAX30 ; END OF SSID CMP AL,',' JE SHORT CONVAX30 ; END OF SSID INC ESI ; OTHER CODE EXPECTS ESI TO POINT TO NEXT FIELD CMP AL,'0' JB SHORT CONVAX49 ; INVALID CMP AL,'5' ; LIMIT 10 - 15 JA SHORT CONVAX49 ; OK ; SUB AL,30H CMP AH,'1' JNE SHORT CONVAX49 ; IF 2 DIGITS, FIRST MUST BE 1 ADD AL,10 MOV AH,AL PUBLIC CONVAX30 CONVAX30: SAL AH,1 ; UP 1 BIT OR AH,01100000B ; DEFAULT RR BITS MOV AX25CALL+6,AH PUBLIC CONVAX40 CONVAX40: ; ; NO SSID SUPPLIED ; XOR AL,AL ; SET ZERO RET PUBLIC CONVAX49 CONVAX49: OR AL,1 ; SET NZ RET PUBLIC CONVFROMAX25 CONVFROMAX25: ; ; CONVERT AX25 FORMAT CALL IN [ESI] TO NORMAL FORMAT IN NORMCALL ; RETURNS LENGTH IN CX AND NZ IF LAST ADDRESS BIT IS SET ; PUSH ESI ; SAVE MOV EDI,OFFSET32 NORMCALL MOV ECX,10 ; MAX ALPHANUMERICS MOV AL,20H REP STOSB ; CLEAR IN CASE SHORT CALL MOV EDI,OFFSET32 NORMCALL MOV CL,6 PUBLIC CONVAX50 CONVAX50: LODSB CMP AL,40H JE SHORT CONVAX60 ; END IF CALL - DO SSID SHR AL,1 STOSB LOOP CONVAX50 PUBLIC CONVAX60 CONVAX60: POP ESI ADD ESI,6 ; TO SSID LODSB MOV AH,AL ; SAVE FOR LAST BIT TEST SHR AL,1 AND AL,0FH JZ SHORT CONVAX90 ; NO SSID - FINISHED ; MOV BYTE PTR [EDI],'-' INC EDI CMP AL,10 JB SHORT CONVAX70 SUB AL,10 MOV BYTE PTR [EDI],'1' INC EDI PUBLIC CONVAX70 CONVAX70: ADD AL,30H ; CONVERT TO DIGIT STOSB PUBLIC CONVAX90 CONVAX90: MOV ECX,EDI SUB ECX,OFFSET32 NORMCALL MOV NORMLEN,CX ; SIGNIFICANT LENGTH TEST AH,1 ; LAST BIT SET? RET PUBLIC Q_REM Q_REM: ; CALL CHECKBUFFERS MOV EDI,[ESI] ; GET ADDR OF FIRST BUFFER CMP EDI,0 JE SHORT Q_RET ; EMPTY ; CALL CHECKBUFFER_EDI ; MAKE SURE OK MOV EAX,[EDI] ; CHAIN FROM BUFFER MOV [ESI],EAX ; STORE IN HEADER ; POP [EDI] ; CALLERS ADDR ; PUSH [EDI] PUBLIC Q_RET Q_RET: RET ; PUBLIC _Q_ADD _Q_ADD: PUSH EAX MOV EAX,0 ; CALL CHECKBUFFERS ; CALL CHECKBUFFER_EDI ; MAKE SURE EDI IS IN POOL PUBLIC _Q_ADD05 _Q_ADD05: CMP DWORD PTR [ESI],0 ; END OF CHAIN JE SHORT _Q_ADD10 CMP ESI,[ESI] JNE SHORT _Q_ADD07 ; OK ; ; BUFFER IS CHAINED TO ITSELF !! ; CALL CBBAD ; FORCE DUMP PUBLIC _Q_ADD07 _Q_ADD07: MOV ESI,[ESI] ; NEXT IN CHAIN CMP ESI,EDI JNE SHORT _Q_ADD08 ; OK ; ; ADDRESS IS ALREADY ON QUEUE!! ; CALL CBBAD ; FORCE DUMP PUBLIC _Q_ADD08 _Q_ADD08: ; CALL CHECKBUFFER ; MAKE SURE ADDR IS OK INC AX JNZ _Q_ADD05 ; ; LOOP!! CALL CBBAD ; FORCE DUMP PUBLIC _Q_ADD10 _Q_ADD10: CMP ESI,EDI JNE SHORT _Q_ADD12 ; OK ; ; WE ARE ABOUT TO CHAIN A BUFFER TO ITSELF!! ; CALL CBBAD ; FORCE DUMP PUBLIC _Q_ADD12 _Q_ADD12: MOV DWORD PTR [EDI],0 ; CLEAR CHAIN ON NEW BUFFER MOV [ESI],EDI ; CHAIN ON NEW BUFFER POP EAX RET ; ; ADD TO FRONT OF QUEUE - MUST ONLY BE USED FOR FREE QUEUE ; PUBLIC _Q_ADDF _Q_ADDF: INC QCOUNT ; CALL CHECKBUFFER_EDI ; MAKE SURE EDI IS IN POOL MOV EAX,[ESI] ; OLD FIRST IN CHAIN MOV [EDI],EAX MOV [ESI],EDI ; PUT NEW ON FRONT ; RET PUBLIC _GETBUFF _GETBUFF LABEL NEAR PUBLIC GETBUFF GETBUFF: MOV ESI,OFFSET32 FREE_Q CALL Q_REM JZ SHORT NOBUFFS DEC QCOUNT MOV AX,QCOUNT CMP AX,MINBUFFCOUNT JA SHORT GETBUFFRET MOV MINBUFFCOUNT,AX PUBLIC GETBUFFRET GETBUFFRET: OR AL,1 ; SET NZ ; ; FLAG BUFFER WITH ADDR OF CALLING ROUTINE (TRYING TO TRACK DOWN LOST BUFFERS!) ; ; POP [EDI] ; PUSH [EDI] RET PUBLIC NOBUFFS NOBUFFS: INC NOBUFFCOUNT XOR AL,AL RET ; IF 0 PUBLIC CHECKBUFFERS CHECKBUFFERS: ; ; CHECK FIRST WORD OF EACH BUFFER IS EITHER ZERO ; OR WITHIN THE POOL ; PUSHAD MOV ESI,BUFFERPOOL MOV EAX,ESI MOVZX ECX,NUMBEROFBUFFERS PUBLIC CBLOOP CBLOOP: CMP DWORD PTR [ESI],0 JE CBNEXT CMP DWORD PTR [ESI],EAX ; BUFFERPOOL JB CBBAD CMP DWORD PTR [ESI],OFFSET32 _ENDPOOL JB SHORT CBNEXT ; ; CORRUPT - TAKE DUMP AND FORCE PROGRAM ERROR ; ENDIF PUBLIC CBBAD CBBAD: PUSHAD MOV EDX,OFFSET32 BUFFERRMSG CALL SEND_DOS_MESSAGE CALL _DumpSystem@0 push 10000 call _Sleep@4 POPAD PUSH 0 RET IF 0 PUBLIC CBNEXT CBNEXT: ADD ESI,BUFFLEN LOOP CBLOOP POPAD RET ; PUBLIC CHECKBUFFER_EDI CHECKBUFFER_EDI: ; ; CHECK THAT ADDRESS IN DSI IS WITHIN THE BUFFER POOL ; CMP EDI,BUFFERPOOL JB SHORT CBBAD2 CMP DWORD PTR [ESI],OFFSET32 _ENDPOOL JAE SHORT CBBAD2 RET PUBLIC CHECKBUFFER CHECKBUFFER: ; ; CHECK THAT ADDRESS IN ESI IS WITHIN THE BUFFER POOL ; CMP ESI,BUFFERPOOL JB SHORT CBBAD2 CMP DWORD PTR [ESI],OFFSET32 _ENDPOOL JAE SHORT CBBAD2 RET ; ; CORRUPT - TAKE DUMP AND FORCE PROGRAM ERROR ; PUBLIC CBBAD2 CBBAD2: PUSHAD MOV EDX,OFFSET32 BUFFERRMSG CALL SEND_DOS_MESSAGE CALL _DumpSystem push 10000 call _Sleep@4 POPAD PUSH 0 RET PUBLIC CHECKNOTINPOOL CHECKNOTINPOOL: ; ; CHECK BUFFER IN EDI IS NOT IN ON FREE Q ; PUSHAD MOV ESI,BUFFERPOOL MOV EAX,ESI MOVZX ECX,NUMBEROFBUFFERS PUBLIC CBXLOOP CBXLOOP: CMP DWORD PTR [ESI],0 JE CBXNEXT CMP DWORD PTR [ESI],EAX ; BUFFERPOOL JB CBXBAD CMP DWORD PTR [ESI],OFFSET32 _ENDPOOL JB SHORT CBXNEXT ; ; CORRUPT - TAKE DUMP AND FORCE PROGRAM ERROR ; PUBLIC CBXBAD CBXBAD: PUSHAD MOV EDX,OFFSET32 BUFFERRMSG CALL SEND_DOS_MESSAGE CALL _DumpSystem push 10000 call _Sleep@4 POPAD PUSH 0 RET PUBLIC CBXNEXT CBXNEXT: ADD ESI,BUFFLEN LOOP CBXLOOP POPAD RET ; ENDIF TIMERUNHOOKED DB 0 PUBLIC TIMERUNHOOKED,_TIMERINTERRUPT PUBLIC _TIMERINTERRUPT _TIMERINTERRUPT: ; ; CALLED EVERY 100 MS ; ; pushfd cld pushad INC RAN1 INC BGTIMER INC REALTIMETICKS INC L2TIMERFLAG ; INCREMENT FLAG FOR BG INC L3TIMERFLAG ; INCREMENT FLAG FOR BG INC L4TIMERFLAG ; INCREMENT FLAG FOR BG ; ; CALL PORT TIMER ROUTINES ; MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS JCXZ TIMNOPORTS PUSH EBP PUBLIC TIMERINT00 TIMERINT00: PUSH ECX PUSH EBX CALL PORTTIMERCODE[EBX] POP EBX POP ECX MOV EBX,PORTPOINTER[EBX] LOOP TIMERINT00 ; PUBLIC TIMNOPORTS TIMNOPORTS: ; CALL BACKGROUND POP EBP popad popfd RET ; LOOPBACK PORT ROUTINES ; PUBLIC LINKTX LINKTX: ; ; LOOP BACK TO SWITCH ; PUSH EBX ; ; RESET TIMER ; MOV EBX,BUFFLEN-4[EDI] OR EBX,EBX JZ SHORT LNOTIMER CMP L2TIMER[EBX],0 JE SHORT LNOTIMER ; ALREADY EXPIRED MOV AL,L2TIME[EBX] XOR AH,AH MOV L2TIMER[EBX],AX MOV DWORD PTR BUFFLEN-4[EDI],0 ; CLEAR FLAG FROM BUFFER PUBLIC LNOTIMER LNOTIMER: POP EBX LEA ESI,PORTRX_Q[EBX] CALL _Q_ADD RET PUBLIC LINKRX LINKRX: ; ; PACKETS ARE TRANSFERED DIRECT FROM TX ROUTINE TO RX QUEUES, SO ; THIS ROUTINE IS NOT NEEDED PUBLIC LINKTIMER LINKTIMER: PUBLIC LINKCLOSE LINKCLOSE: PUBLIC EXTCLOSE EXTCLOSE: RET PUBLIC KISSTXCHECK KISSTXCHECK: PUBLIC LINKTXCHECK LINKTXCHECK: XOR EAX, EAX ; Return zero RET ; PUBLIC HDLCTX HDLCTX: ; PUSH EBX ; ; RESET TIMER ; MOV EBX,BUFFLEN-4[EDI] OR EBX,EBX JZ SHORT HNOTIMER ; CMP L2TIMER[EBX],0 JE SHORT HNOTIMER ; ALREADY EXPIRED ; MOV AL,L2TIME[EBX] XOR AH,AH MOV L2TIMER[EBX],AX ; MOV DWORD PTR BUFFLEN-4[EDI],0 ; CLEAR FLAG FROM BUFFER ; PUBLIC HNOTIMER HNOTIMER: ; POP EBX ; push edi ; buffer push ebx CALL _HDLCTX pop ebx pop edi MOV ESI,OFFSET32 TRACE_Q CALL _Q_ADD RET ; PUBLIC HDLCRX HDLCRX: ; ; POLL FOR PACKETS FROM INTERFACE ; ; RETURNS PACKET LENGTH IN CX (ZERO IF NONE) ; ; DATA POINTER IN DS:SI ; CMP QCOUNT,10 JB SHORT HDLCEXIT ; DONT POLL ; call GETBUFF JZ SHORT HDLCEXIT ; WOT? push edi ; buffer push ebx CALL _HDLCRX pop EBX pop edi OR EAX,EAX JZ NOHDLCMSG ; NOTHING LEA ESI,PORTRX_Q[EBX] CALL _Q_ADD ; JMP HDLCRX ; GET ANY MORE PUBLIC HDLCEXIT HDLCEXIT: RET PUBLIC NOHDLCMSG NOHDLCMSG: CALL RELBUFF RET ; ; EXTERNAL DRIVER INTERFACE ROUTINES ; ; THE SWITCH CAN INTERFACE TO A PRE-LOADED TSR DRIVER ROUTINE. ; ; THE DRIVER MAY BE EITHER A LEVEL 1 ROUTINE - EFFECTIVELY ; A KISS MODE INTERFACE, OR MAY PROVIDE THE LEVEL 2 FEATURES, ; WITH THE SWITCH HANDLING L3 AND ABOVE. THE LATTER MODE IS MORE ; APPROPRIATE FOR INTELLIGENT INTERFACE CARDS, SUCH AS THE VNA ; ; ; THE ROUTINE IS CALLED VIA A SIMULATED INT, SO SHOULD RETURN ; WITH AN IRET. THE DRIVER MAY SUPPORT MULTIPLE LOGICAL CHANNELS - ; THE CHANNEL NUMBER IS PASSED IN AL ; ; THE ROUTINE MUST PROVIDE THE FOLLOWING FUNCTIONS: ; ; ; AH=0 INITIALISE. CALLED ONCE ON LOAD ; ; AH=1 RETURNS POINTER TO RECEIVED FRAME IN DS:ESI, LENGTH IN CX ; RETURNS CX IF NO FRAME READY ; ; AH=2 SEND FRAME IN BUFFER IN DS:EDI - LENGTH IS IN WORD AT 5[EDI] ; DATA FOLLOWS LENGTH ; AH=3 STATUS. RETURNS AX=0 IF TX NOT BUSY. CX=0 IF RX NOT READY ; ; ; DUMMY ROUTINE IN CASE INT ROUTINE NOT LOADED RETADDR DD RETINS PUBLIC RETINS RETINS: xor eax,eax RET PUBLIC EXTTX EXTTX: ; ; PROBABLY USED ONLY FOR L1 INTERFACE - WILL SORT OUT L2 LATER ; PUSH EBX ; ; RESET TIMER ; MOV EBX,BUFFLEN-4[EDI] OR EBX,EBX JZ SHORT XNOTIMER ; CMP L2TIMER[EBX],0 JE SHORT XNOTIMER ; ALREADY EXPIRED ; MOV AL,L2TIME[EBX] XOR AH,AH MOV L2TIMER[EBX],AX ; MOV DWORD PTR BUFFLEN-4[EDI],0 ; CLEAR FLAG FROM BUFFER ; PUBLIC XNOTIMER XNOTIMER: ; POP EBX ; push edi ; buffer MOVZX EAX,PORTNUMBER[EBX] push eax ; Port push 2 ; Function CALL PORT_EXT_ADDR[EBX] add esp,8 pop edi cmp PROTOCOL[EBX], 10 jne @f CALL RELBUFF ret @@: MOV ESI,OFFSET32 TRACE_Q CALL _Q_ADD RET ; PUBLIC EXTRX EXTRX: ; ; POLL FOR PACKETS FROM INTERFACE ; ; RETURNS PACKET LENGTH IN CX (ZERO IF NONE) ; ; DATA POINTER IN DS:SI ; CMP QCOUNT,10 JB SHORT EXTEXIT ; DONT POLL ; call GETBUFF JZ SHORT EXTEXIT ; WOT? PUSH EBX push edi ; buffer MOVZX EAX,PORTNUMBER[EBX] push eax ; Port push 1 ; Function CALL PORT_EXT_ADDR[EBX] add esp,8 pop edi POP EBX OR EAX,EAX JZ NOEXTMSG ; NOTHING cmp PROTOCOL[EBX],10 JNE @F ; ; PACTOR Style Port - Negative values used to report events - for now -1 = Disconnected ; CMP EAX,-1 JNE @F movzx eax,byte ptr 4[EDI] ; Session Number for Kantronics shl eax,2 ; *4 push eax call RELBUFF pop eax ; GET RID OF ANY SESSION ENTRIES push ebx add ebx,eax push EBX mov ebx,ATTACHEDSESSIONS[EBX] or ebx,ebx jz nosesstofree call CLOSESESSIONPARTNER ; Kills any crosslink, plus local link nosesstofree: pop EBX mov ATTACHEDSESSIONS[ebx], 0 pop ebx ret @@: LEA ESI,PORTRX_Q[EBX] CALL _Q_ADD ; JMP EXTRX ; GET ANY MORE PUBLIC EXTEXIT EXTEXIT: RET PUBLIC NOEXTMSG NOEXTMSG: CALL RELBUFF RET ; PUBLIC EXTTIMER EXTTIMER: ; ; USED TO SEND A RE-INIT IN THE CORRECT PROCESS ; CMP EXTRESTART[EBX],0 JE SHORT EXTTIMERET ; NOTHING DOING MOV EXTRESTART[EBX],0 ; CLEAR push 0 ; no buffer MOVZX EAX,PORTNUMBER[EBX] push eax ; Port push 4 ; Function - reinit CALL PORT_EXT_ADDR[EBX] ADD ESP,12 PUBLIC EXTTIMERET EXTTIMERET: OR EAX,EAX ; RETURN ZERO IF OK TO SEND RET RET ; PUBLIC EXTTXCHECK EXTTXCHECK: push EAX ; Channel FOr KAM Pactor (in buff field) MOVZX EAX,PORTNUMBER[EBX] push eax ; Port push 3 ; Function CALL PORT_EXT_ADDR[EBX] ADD ESP,12 OR AL,AL ; RETURN ZERO IF OK TO SEND RET if 0 ; ; DUMMIES - KISS IS NOW AN EXTERNAL DRIVER ; PUBLIC KISSINIT KISSINIT: PUSH EBX MOV EDX,OFFSET32 BADKISSMSG CALL SEND_DOS_MESSAGE POP EBX PUBLIC KISSRX KISSRX: PUBLIC KISSTIMER KISSTIMER: RET PUBLIC KISSTX KISSTX: PUSH EBX ; ; RESET TIMER ; MOV EBX,BUFFLEN-4[EDI] OR EBX,EBX JZ SHORT KNOTIMER ; CMP L2TIMER[EBX],0 JE SHORT KNOTIMER ; ALREADY EXPIRED ; MOV AL,L2TIME[EBX] XOR AH,AH MOV L2TIMER[EBX],AX ; MOV DWORD PTR BUFFLEN-4[EDI],0 ; CLEAR FLAG FROM BUFFER ; PUBLIC KNOTIMER KNOTIMER: ; POP EBX ; MOV ESI,OFFSET32 TRACE_Q CALL _Q_ADD RET ; endif ; PUBLIC HEXOUT PUBLIC HEXOUT HEXOUT: PUSH ESI PUSH EDI MOV EDI,OFFSET32 HEXMSG+5 PUSH EAX SHR EAX,28 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,24 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,20 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,16 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,12 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,8 AND EAX,0FFH call hexout1 pop Eax PUSH EAX SHR EAX,4 AND EAX,0FFH call hexout1 pop Eax PUSH EAX AND EAX,0FFH call hexout1 pop Eax MOV EDX,OFFSET32 HEXMSG CALL SEND_DOS_MESSAGE POP EDI POP ESI ret PUBLIC hexout1 hexout1: and al,0fh cmp al,10 jl SHORT hexout5 add al,7 PUBLIC hexout5 hexout5: add al,30h STOSB ; ret ; PUBLIC _INITIALISEPORTS extern _OutputDebugStringA@4:near PUBLIC _INITIALISEPORTS _INITIALISEPORTS: ; ; CALL PORT INITIALISATION ROUTINES ; pushad MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS JCXZ NOPORTS PUBLIC INITL00 INITL00: ; PUSH ECX MOV AL,PORTNUMBER[EBX] MOV AH,0 DIV B10 ADD AX,3030H MOV INITPORT,AX PUSH EBX MOV EDX,OFFSET32 INITMSG CALL SEND_DOS_MESSAGE POP EBX PUSH EBX CALL PORTINITCODE[EBX] POP EBX POP ECX MOV EBX,PORTPOINTER[EBX] LOOP INITL00 ; ; CALL CLEARINTS PUBLIC NOPORTS NOPORTS: popad RET _TEXT ENDS END