; ; 13/9/99 ; ; Prevent overrun if more than 8 digis specified on connect cmd ; ; 17/2/2006 ; ; Add SAVENODES command ; PAGE 56,132 .386 ; ; SEGMENT definitions and order ; ;* 32 Bit code _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' _TEXT ENDS ;* Contains 32 Bit data _BPQDATA SEGMENT DWORD USE32 PUBLIC 'DATA' _BPQDATA ENDS ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:FLAT OFFSET32 EQU _BPQDATA SEGMENT INCLUDE STRUCS.INC SYSOP EQU 1 EXTRN SAVEPORT:BYTE PUBLIC APPLMASK,SAVEDAPPLFLAGS,D10,CMDXLEN,ALIASPTR,CMDALIAS,_MAXDESTS EXTRN NODE:BYTE,LINKEDFLAG:BYTE,_DATABASE:BYTE,CFLAG:BYTE EXTRN L3INTERVAL:BYTE,_L4T1:WORD,L4N2:BYTE,_L3LIVES:BYTE,_L4LIMIT:WORD EXTRN L2KILLTIME:WORD,D1093:WORD EXTRN _L4DEFAULTWINDOW:BYTE,HEADERCHAR:BYTE EXTRN ROUTEVECLEN:DWORD EXTRN PORTTABLE:DWORD,NUMBEROFPORTS:BYTE,COMPAREPORT:BYTE EXTRN LINKS:DWORD,MAXLINKS:WORD EXTRN DESTS:DWORD,ENDDESTLIST:DWORD EXTRN NEIGHBOURS:DWORD,MAXNEIGHBOURS:WORD EXTRN _L4TABLE:DWORD,_MAXCIRCUITS:WORD,ROUTEQUAL:BYTE EXTRN BPQHOSTVECTOR:BYTE,BPQVECLENGTH:BYTE PUBLIC _APPLS,BUFFERWAITS EXTRN INFOMSG:DWORD,INFOLEN:WORD,DESTHEADER:DWORD EXTRN PACLEN:WORD EXTRN OBSINIT:BYTE,OBSMIN:BYTE,L4N2:BYTE EXTRN T3:BYTE,LINKEDFLAG:BYTE,IDINTERVAL:BYTE,MINQUAL:BYTE EXTRN _FULL_CTEXT:BYTE,HIDENODES:BYTE,L4DELAY:BYTE EXTRN BTINTERVAL:BYTE EXTRN D86400:DWORD,D3600:DWORD,D60:DWORD CR EQU 0DH LF EQU 0AH INPROUTEVECLEN DD 11 CMDX STRUC DB ' ' ; COMMAND STRING CMDLEN DB ? ; SIGNIFICANT LENGTH CMDPROC DD ? ; COMMAND PROCESSOR CMDFLAG DD ? ; FLAG/VALUE ADDRESS CMDX ENDS CMDXLEN DD TYPE CMDX PUBLIC COMMANDLIST COMMANDLIST LABEL BYTE ; ; SYSOP COMMANDS ; DB 'SAVENODES ',8 DD SAVENODES,0 DB 'REBOOT ',6 DD REBOOT,0 DB 'RECONFIG ',8 DD RECONFIG,0 ; DB 'RESTART ',8 ; DD RESTART,0 DB 'SENDNODES ',8 DD SENDNODES,0 DB 'EXTRESTART ',10 DD EXTPORTVAL,EXTRESTART DB 'TXDELAY ',3 DD PORTVAL,PORTTXDELAY DB 'MAXFRAME ',3 DD PORTVAL,PORTWINDOW DB 'RETRIES ',3 DD PORTVAL,PORTN2 DB 'FRACK ',3 DD PORTVAL,PORTT1 DB 'RESPTIME ',3 DD PORTVAL,PORTT2 DB 'PPACLEN ',3 DD PORTVAL,PORTPACLEN DB 'QUALITY ',3 DD PORTVAL,PORTQUALITY DB 'PERSIST ',2 DD PORTVAL,PORTPERSISTANCE DB 'TXTAIL ',3 DD PORTVAL,PORTTAILTIME DB 'XMITOFF ',7 DD PORTVAL,PORTDISABLED DB 'DIGIFLAG ',5 DD PORTVAL,DIGIFLAG DB 'DIGIPORT ',5 DD PORTVAL,DIGIPORT DB 'MAXUSERS ',4 DD PORTVAL,USERS DB 'L3ONLY ',6 DD PORTVAL,PORTL3FLAG DB 'BBSALIAS ',4 DD PORTVAL,PORTBBSFLAG DB 'VALIDCALL ',5 DD VALNODES,0 IF BLACKBITS DB 'EXCLUDE ',5 DD DISPBLACKLIST,0 ENDIF DB 'CLOCK ',5 DD DISPCLOCK,0 ; DB 'COLDSTART ',9 ; DD COLDSTART ; DB 'WARMSTART ',9 ; DD WARMSTART DB 'FULLDUP ',4 DD PORTVAL,FULLDUPLEX DB 'SOFTDCD ',4 DD PORTVAL,SOFTDCDFLAG DB 'REMDUMP ',7 DD REMDUMP,0 ; DB 'OBSINIT ',7 DD SWITCHVAL,OBSINIT DB 'OBSMIN ',6 DD SWITCHVAL,OBSMIN DB 'NODESINT ',8 DD SWITCHVAL,L3INTERVAL DB 'L3TTL ',5 DD SWITCHVAL,_L3LIVES DB 'L4RETRIES ',5 DD SWITCHVAL,L4N2 DB 'L4TIMEOUT ',5 DD SWITCHVALW,_L4T1 DB 'T3 ',2 DD SWITCHVALW,T3 DB 'IDLETIME ',8 DD SWITCHVALW,_L4LIMIT DB 'LINKEDFLAG ',10 DD SWITCHVAL,LINKEDFLAG DB 'IDINTERVAL ',5 DD SWITCHVAL,IDINTERVAL DB 'MINQUAL ',7 DD SWITCHVAL,MINQUAL DB 'FULLCTEXT ',6 DD SWITCHVAL,_FULL_CTEXT DB 'HIDENODES ',8 DD SWITCHVAL,HIDENODES DB 'L4DELAY ',7 DD SWITCHVAL,L4DELAY DB 'L4WINDOW ',6 DD SWITCHVAL,_L4DEFAULTWINDOW DB 'BTINTERVAL ',5 DD SWITCHVAL,BTINTERVAL ; PASSWORD MUST BE LAST ; PASSCMD DB 'PASSWORD ' DB 8 DD PWDCMD DD 0 APPL1 LABEL BYTE _APPLS DB '************',12 DD APPLCMD,0 HOSTCMD DB '************',12 DD APPLCMD,0 REPT MAXAPPLS-2 DB '************',12 DD APPLCMD,0 ENDM DB '*** LINKED ',10 DD LINKCMD,0 CQCALL DB 'CQ ',2 DD CQCMD,0 DB 'CONNECT ',1 DD CMDC00,0 DB 'BYE ',1 DD BYECMD,0 DB 'QUIT ',1 DD BYECMD,0 DB 'INFO ',1 DD CMDI00,0 DB 'VERSION ',1 DD CMDV00,0 DB 'NODES ',1 DD CMDN00,0 DB 'LINKS ',1 DD CMDL00,0 DB 'L4T1 ',2 DD CMDT00,0 DB 'PORTS ',1 DD CMDP00,0 DB 'PACLEN ',3 DD CMDPAC,0 DB 'ROUTES ',1 DD CMDR00,0 DB 'STATS ',1 DD CMDSTATS,0 DB 'USERS ',1 DD CMDS00,0 DB '? ',1 DD CMD?00,0 DB 'DUMP ',4 DD DUMPCMD,0 DB 'MHEARD ',1 DD MHCMD,0 DB 'APRSMH ',4 DD APRSMHCMD,0 DB 'ATTACH ',1 DD ATTACHCMD,0 DB 'RADIO ',3 DD RADIOCMD,0 DB 'NRR ',1 DD NRRCMD,0 NUMBEROFCOMMANDS EQU ($-COMMANDLIST)/TYPE CMDX CMDALIAS DB 32 * ALIASLEN DUP (20H) ; ALIASES FOR ALL COMMANDS ALIASPTR DD OFFSET32 CMDALIAS CMDERRMSG DB 'Invalid command - Enter ? for command list',0dh CMDERRLEN EQU $-CMDERRMSG NEEDMH DB 0 CMDLIST DB 'CONNECT BYE INFO NODES PORTS ROUTES USERS MHEARD' CMDLISTLEN EQU $-CMDLIST TABLESFULL DB 'Sorry - System Tables Full!',0dh TABLESFULLLEN EQU $-TABLESFULL INVALIDCALL DB 'Invalid callsign',0dh INVCALLLEN EQU $-INVALIDCALL INVALIDWIND DB 'Invalid window',0dh INVWINDLEN EQU $-INVALIDWIND INVALIDPORT DB 'Invalid port',0dh INVPORTLEN EQU $-INVALIDPORT L3INVALIDPORT DB 'Sorry, port is for internode traffic only',0dh L3INVPORTLEN EQU $-L3INVALIDPORT PACINVALIDPORT DB 'Sorry, port is not an ax.25 port',0dh PACINVPORTLEN EQU $-PACINVALIDPORT WINMOR DB 'W'+'W','I'+'I','N'+'N','M'+'M','O'+'O','R'+'R' ; WINMOR IN AX25 PACTORCALL DB 'P'+'P','A'+'A','C'+'C','T'+'T','O'+'O','R'+'R' ; PACTOR IN AX25 T4MSG DB 'L4 timeout - ' T4MSGLEN EQU $-T4MSG PACMSG DB 'PACLEN - ' PACMSGLEN EQU $-PACMSG OKMSG DB 'Ok',0DH BADVALUEMSG DB 'Invalid parameter',0DH BADVALLEN EQU $-BADVALUEMSG PASSWORDMSG DB 'Command requires SYSOP status - enter password',0DH LPASSMSG EQU $-PASSWORDMSG PORTHDDR DB 'Ports:',0dh NODEHDDR DB 'Nodes:',0dh ROUTEHDDR DB 'Routes:',0dh NOTFOUNDMSG DB 'Not found',0DH NODEROUTEHDDR DB 'Routes to: ' USERHDDR DB 'Links:',0DH MHHDDR DB 'Heard List for Port ' MHERRMSG DB 'Error - format is MH portnum',0dh MHERRLEN EQU $-MHERRMSG ATTERRMSG DB 'Error - Invalid Port',0dh ATTERRLEN EQU $-ATTERRMSG ATTERRMSG1 DB 'Error - Port in use',0dh ATTERRLEN1 EQU $-ATTERRMSG1 ATTERRMSG2 DB 'Error - TNC Not Ready',0dh ATTERRLEN2 EQU $-ATTERRMSG2 ATTERRMSG3 DB 'Sorry, you are not allowed to use this port',0dh ATTERRLEN3 EQU $-ATTERRMSG3 ATTERRMSG4 DB 'Sorry, an interlocked port is in use',0dh ATTERRLEN4 EQU $-ATTERRMSG4 AXATTERRMSG1 DB 'Error - No free streams on this port',0dh AXATTERRLEN1 EQU $-AXATTERRMSG1 RADERRMSG DB 'Error - Rig Control Interface not available',0dh RADERRLEN EQU $-RADERRMSG MHDISMSG DB 'MHEARD not enabled on that port',0dh MHDISLEN EQU $-MHDISMSG UPLNKMSG DB 'Uplink' DOWNLNKMSG DB 'Downlink' CROSSLNKMSG DB 'Circuit' HOSTLNKMSG DB 'Host' PACTORMSG DB 'Attached to Port ' TNCUplinkMSG DB 'TNC Uplink Port ' CLOSINGMSG DB '(Closing) ' CONNECTEDMSG DB 'Connected to ' LCONNECTEDMSG EQU $-CONNECTEDMSG DISCONNMSG DB '*** DISCONNECTED',0DH LDISCONNMSG EQU $-DISCONNMSG NOFREEPORTS DB 'Sorry, All ' DB 'Ports are in use - Please try later',CR NOFREEPORTSLEN EQU $-NOFREEPORTS NOPORTS DB 'Sorry, Application ' DB 'is not running - Please try later',CR NOPORTSLEN EQU $-NOPORTS ATTPACLEN DB 0 ; PORT PACLEN HOSTBUSYMSG DB 'HOST ' NOPORTMSG DB 'Downlink connect needs port number - C P CALLSIGN ',cr LNOPORTMSG EQU $-NOPORTMSG SAVETNCSTATE DB 0 ; WINMOR/PACTOR TNC STATE CQFLAG DB 0 STAYSWITCH DB 0 ; CONNECT STRING INCLUDED S(TAY) SPYSWITCH DB 0 COMMANDBUFFER DB 80 DUP (0) ; COMMAND HANDLER INPUT BUFFER USERSBUFFER DB 40 DUP (0) ; BUFFER FOR USERS COMMAND CONNECTCALL DB 10 DUP (0) ; CALLSIGN IN CONNECT MESSAGE DIGICALL DB 10 DUP (0) ; DIGI IN CONNECT COMMAND AX25STRING DB 64 DUP (0) ; DIGI STRING IN AX25 FORMAT DIGIPTR DD 0 ; POINTER TO CURRENT DIGI IN STRING CONNECTREPLYPTR DD 0 ; BUFFER ADDR FOR CONNECT REJECT MSGS CONNECTSESSION DD 0 ; _L4TABLE ENTRY FOR CONNECT COMMAND TARGETDEST DD 0 ; DESTINATION IF CROSS CONNECT CMDTAIL DD 0 ; POINTER TO REST OF BUFFER CONNECTPORT DB 0 ; PORT FOR CONNECT COMMAND APPLMASK DD 0 ; APPLICATION MASK SAVEDAPPLFLAGS DB 0 CMDPTR DD 0 ; NAME OF COMMAND NSTAR DB 0 ; SET IF NODES * INPUT RPORT DB 0 ; PONT NUM FOR SELCTIVE ROUTES REPLYBUFFER DD 0 ; ADDRESS OF COMMAND HANDLER REPLY BUFFER SAVELINK DD 0 ; CURRENT LINK ; CMDPACLEN DW 0 ; CURRENT PACLEN TEMPFIELD DB 7 DUP (0) ; TEMP STORAGE FOR CALL VALUE DW 0 ; PARAM VALUE HEXVALUE DD 0 DECODEDNAME DB 20 DUP (0) ; CALL IN ALIAS:CALL FORMAT STATS DB 'Time active (mins) ' db 1 STATSTIME DD 0 SEMSTATS db 'Semaphore Get/Rel/Clashes ' db 3 _SEMGETS DD 0 _SEMRELEASES DD 0 _SEMCLASHES DD 0 db 'Buffers:Max/Cur/Min/Out/Wait' DB 5 MAXBUFFS DD 0 _QCOUNT LABEL DWORD QCOUNT DW 0,0 MINBUFFCOUNT DW 65535,0 NOBUFFCOUNT DD 0 BUFFERWAITS DD 0 DB 'Known Nodes/Max Nodes ' DB 2 _NUMBEROFNODES DD 0 _MAXDESTS DD 0 db 'L4 Connects Sent/Rxed ' db 2 L4CONNECTSOUT DD 0 L4CONNECTSIN DD 0 DB 'L4 Frames TX/RX/Resent/Reseq' DB 4 L4FRAMESTX DD 0 L4FRAMESRX DD 0 L4FRAMESRETRIED DD 0 OLDFRAMES DD 0 db 'L3 Frames Relayed ' db 1 L3FRAMES DD 0 DB 0 STATSLEN EQU 28 L2STATS db 'L2 Frames Digied' DD L2DIGIED db 'L2 Frames Heard ' DD L2FRAMES db 'L2 Frames Rxed ' DD L2FRAMESFORUS db 'L2 Frames Sent ' DD L2FRAMESSENT db 'L2 Timeouts ' DD L2TIMEOUTS db 'REJ Frames Rxed ' DD L2REJCOUNT db 'RX out of Seq ' DD L2OUTOFSEQ db 'L2 Resequenced ' DD L2RESEQ db 'Undrun/Poll T-O ' DD L2URUNC db 'RX Overruns ' DD L2ORUNC db 'RX CRC Errors ' DD RXERRORS DB 'FRMRs Sent ' DD L2FRMRTX DB 'FRMRs Received ' DD L2FRMRRX DB 'Frames abandoned' DD L1DISCARD DB 'Link Active % ' DD AVSENDING L2STATSLEN EQU 16 PORTSTATS EQU 15 PORT DB ' Port' STATCMDCOUNT DD 0 STATCMDPTR DD 0 CMDSTACKP DD 0 ; STACK POINTER ON ENTRY - USED TO ABORT ; COMMAND IF NO BUFFERS LEFT D10 DB 10 D100 DB 100 W10 DW 10 D11 DB 11 W18 DW 18 W16 DW 16 B19 DB 19 ; ; POWERS OF 10 - 8 4-BYTE NUMBERS FROM 100,000,000 TO 10 ; POWERS DD 100000000 DD 10000000 DD 1000000 DD 100000 TENK DD 10000 DD 1000 DWORD100 DD 100 DWORD10 DD 10 ; ACCUM DB 4 DUP (0) CONVFLAG DB 0 SUPPRESS DB 0 ; ZERO SUPPRESS FLAG LASTPOINTER DD 0 IF BLACKBITS PUBLIC BLACKLIST BLACKLIST DB 71 DUP (0) ; 10 ENTRIES, 7 BYTES EACH BLACKEND DD BLACKLIST ; KEEP JUST AFTER LIST ENDIF PUBLIC L4FRAMESTX,L4FRAMESRX,MINBUFFCOUNT,NOBUFFCOUNT,MAXBUFFS PUBLIC L4FRAMESRETRIED,L4CONNECTSIN,L4CONNECTSOUT,STATSTIME,NEEDMH PUBLIC L3FRAMES,DECODEDNAME,QCOUNT,STATSTIMER,_NUMBEROFNODES PUBLIC _QCOUNT EXTRN _MYCALL:BYTE,AX25CALL:BYTE,NORMCALL:BYTE,_NEXTID:BYTE EXTRN BUFFER:DWORD,APPLCALLTABLE:BYTE, NODEORDER:BYTE PUBLIC OLDFRAMES PUBLIC _SEMGETS,_SEMRELEASES,_SEMCLASHES ; ; SYSOP STUFF ; WHATMSG DB 'Invalid Command',0dh WAS DB ' was ',0 BADMSG DB 'Bad Parameter',0dh BADPORT DB 'Invalid Port Number',0dh NOTEXTPORT DB 'Only valid on EXT ports',0dh NOVALCALLS DB 'No Valid Calls defined on this port',0dh _PWTEXT DB 80 dup (0) _PWLEN DB 0 VALNODESFLAG DB 0 EXTONLY DB 0 ; set if command is only valid on EXT ports PWCHARS DB 5 DUP (0) ; PROMPT SENT PWFLAG DB 0 ; SET WHEN RESPONSE NEEDED NUMBER DB 5 DUP (0) HEXFLAG DB 0 PORTNO DB 0 ; PORT NO FROM COMMAND NEWVALUE DB 0 ZAPFLAG DB 0 ; CLEAR ROUTE STATS FLAG ROUTEPORT DB 0 ; PORT FOR ROUTE UPDATE NEWROUTEVAL DB 0 ROUTEDISP DB 0 ; DISPLAY/UPDATE FLAG PUBLIC RAN1,RAN2,RAN3,RAN4,RAN5,_PWTEXT,_PWLEN RAN1 DB 2 RAN2 DB 3 RAN3 DB 4 RAN4 DB 5 RAN5 DB 6 B10 DB 10 FILENAME DB 'BPQNODES',0 HANDLE DW 0 LINE DB 80 DUP (0) ROUTEADD DB 'ROUTE ADD ' NODEADD DB 'NODE ADD ' _BPQDATA ENDS _TEXT SEGMENT EXTRN _SaveNodes@0:NEAR, _Reconfig@0:NEAR, _Reboot@0:NEAR, _Restart@0:NEAR, _FormatMH:NEAR, _FormatUptime:NEAR EXTRN _MHDATA:DWORD, _MAXHEARDENTRIES:DWORD, _FormatAPRSMH:NEAR, _MHLEN:DWORD PUBLIC COMMANDHANDLER,_COUNTNODES,B2HEX,GETVALUE PUBLIC CONVTODIGITS,_SETUPNODEHEADER,DECODENODENAME,CONV_DIGITS EXTRN _FINDDESTINATION:NEAR,FINDDESTALIAS:NEAR,SENDSABM:NEAR EXTRN _Q_ADD:NEAR,GETBUFF:NEAR,RELBUFF:NEAR,COMPARECALLS:NEAR EXTRN GETPORTQUALITY:NEAR,RESET2:NEAR,FINDLINK:NEAR EXTRN CONVFROMAX25:NEAR,CONVTOAX25:NEAR,SENDL4CONNECT:NEAR EXTRN Q_REM:NEAR,GETFREECIRCUIT:NEAR,GETPORTTABLEENTRY:NEAR EXTRN GETPORTWINDOW:NEAR,CLOSECURRENTSESSION:NEAR,INC_ID:NEAR EXTRN SENDNODESMSG:NEAR EXTRN _POSTDATAAVAIL:NEAR extrn _time:near, _SendNRRecordRoute:near EXTRN ATTACHTOBBS:NEAR EXTRN _FINDNEIGHBOUR:NEAR EXTRN COUNT_Q:NEAR,COUNT_AT_L2:NEAR PUBLIC DECODECALLSTRING PUBLIC STATSTIMER STATSTIMER: MOV ESI,PORTTABLE MOVZX ECX,NUMBEROFPORTS PUBLIC STATST10 STATST10: MOV AX,SENDING[ESI] DIV D11 MOV AVSENDING[ESI],AL MOV AX,SENDING[ESI] ADD AX,ACTIVE[ESI] DIV D11 MOV AVACTIVE[ESI],AL MOV SENDING[ESI],0 MOV ACTIVE[ESI],0 MOV ESI,PORTPOINTER[ESI] LOOP STATST10 RET PUBLIC COMMANDHANDLER COMMANDHANDLER: push ebx CALL INNERCOMMANDHANDLER pop ebx ; See if any more commands in buffer cmp PARTCMDBUFFER[ebx],0 jne @f ; Command ret @@: mov edi,PARTCMDBUFFER[ebx] mov PARTCMDBUFFER[ebx],0 ; Check that message has a CR, if not save buffer and exit push edi movzx ecx,MSGLENGTH[EDI] sub ecx,8 lea edi,8[edi] ; New Data mov al,13 repne scasb pop edi jz COMMANDHANDLER ; Found CR so process it mov PARTCMDBUFFER[ebx],edi ret ; Wait for rest INNERCOMMANDHANDLER: ; MOV CMDSTACKP,ESP ; SAVE STACK FOR NO BUFFER RECOVERY ; If a partial command is stored, append this data to it. cmp PARTCMDBUFFER[ebx],0 je @f ; No Partial Command push edi ; Save message movzx ecx,MSGLENGTH[EDI] sub ecx,8 ; Length of this msg lea esi,8[edi] ; New Data mov edi,PARTCMDBUFFER[ebx] ; Old Data movzx eax,MSGLENGTH[EDI] ; Old Length push eax add eax,ecx ; Old + New cmp eax,200 pop eax jb CLOK ; Command far too long - ignore previous mov eax,0 mov MSGLENGTH[EDI], ax CLOK: add MSGLENGTH[EDI], cx add edi,eax ; to end of old data rep movsb pop edi call RELBUFF mov edi,PARTCMDBUFFER[ebx] mov PARTCMDBUFFER[ebx],0 @@: ; Check that message has a CR, if not save buffer and exit push edi movzx ecx,MSGLENGTH[EDI] sub ecx,8 lea edi,8[edi] ; New Data mov al,13 repne scasb jz @f ; Found pop edi mov PARTCMDBUFFER[ebx],edi ret @@: ; ; If ecx is non-zero there are chars beyond the cr in the buffer ; or ecx,ecx jz NoMoreChars ; see if LF after CR cmp byte ptr[EDI], 10 ; LF jne nolf inc edi dec ecx jmp @B nolf: ; Get a new buffer, and copy extra data to it. ; command is on stack, edi points to char past cr push edi call GETBUFF JNZ SHORT @F pop edi jmp short NoMoreChars ; Just ignore rest @@: pop esi ; Next Command add ecx,8 mov MSGLENGTH[edi],cx push edi add edi,7 mov al,0f0h ; PID stosb rep movsb pop edi ; New Buffer mov PARTCMDBUFFER[ebx],edi NoMoreChars: pop edi ; Original Message ; GET PACLEN FOR THIS CONNECTION ; MOV AH,0 MOV AL,SESSPACLEN[EBX] OR AX,AX JNZ SHORT PACLENOK MOV AX,PACLEN ; DONT ALLOW ZERO! PUBLIC PACLENOK PACLENOK: MOV CMDPACLEN,AX PUSH EDI ; ; TRANSPORT TABLE ENTRY IN EBX, MESSAGE IN EDI ; LEA ESI,8[EDI] ; TO DATA MOV EDI,OFFSET32 COMMANDBUFFER MOV ECX,40 MOV AX,2020H REP STOSW MOV EDI,OFFSET32 COMMANDBUFFER MOV ECX,80 PUBLIC COMMANDDECODE00 COMMANDDECODE00: LODSB AND AL,7FH ; MASK PARITY CMP AL,0DH JE SHORT COMMANDDECODE10 CMP AL,61H JB SHORT COMMANDDECODE05 CMP AL,7AH JA SHORT COMMANDDECODE05 SUB AL,20H PUBLIC COMMANDDECODE05 COMMANDDECODE05: STOSB LOOP COMMANDDECODE00 PUBLIC COMMANDDECODE10 COMMANDDECODE10: ; ; USE INPUT MESSAGE BUFFER FOR REPLY ; POP EDI MOV REPLYBUFFER,EDI ; ; SET UP HEADER ; MOV AL,LINKPORT[EBX] ; FROM LINK TABLE MOV MSGPORT[EDI],AL LEA EDI,7[EDI] ; SKIP HEADER MOV AL,0F0H STOSB ; PID CALL _SETUPNODEHEADER PUSH EDI ; SAVE REPLY BUFFER PUBLIC REDOCOMMAND REDOCOMMAND: MOV ESI,OFFSET32 COMMANDBUFFER ; MESSAGE ADDR CALL SCAN ; STRIP LEADING SPACES ; CMP BYTE PTR [ESI],20H JE SHORT NULLCMD ; IGNORE NULL COMMAND MOV EDI,OFFSET32 COMMANDLIST MOV ECX,NUMBEROFCOMMANDS PUBLIC COMMANDLOOP COMMANDLOOP: CMP EDI,OFFSET32 APPL1 JNE SHORT NOTFIRSTAPPL MOV APPLMASK,1 ; FOR APPLICATION ATTACH REQUESTS MOV ALIASPTR,OFFSET32 CMDALIAS PUBLIC NOTFIRSTAPPL NOTFIRSTAPPL: MOV CMDPTR,EDI ; POINTER TO COMMAND NAME PUSH ESI PUSH EDI PUSH ECX MOV CL,CMDLEN[EDI] ; MIN LENGTH REP CMPSB JE SHORT COMMANDFOUND POP ECX POP EDI POP ESI PUBLIC TRYNEXT TRYNEXT: SHL APPLMASK,1 ADD ALIASPTR,ALIASLEN ADD EDI,TYPE CMDX LOOP COMMANDLOOP POP EDI PUBLIC INVALIDCMD INVALIDCMD: INC BADCOMMANDS[EBX] CMP BADCOMMANDS[EBX],6 JE SHORT FORCEDISC ; TOO MANY ERRORS MOV ESI,OFFSET32 CMDERRMSG MOV ECX,CMDERRLEN REP MOVSB JMP SENDCOMMANDREPLY PUBLIC NULLCMD NULLCMD: POP EDI PUBLIC NOREPLY NOREPLY: MOV EDI,REPLYBUFFER CALL RELBUFF RET PUBLIC BYECMD BYECMD: PUBLIC FORCEDISC FORCEDISC: MOV EDI,REPLYBUFFER CALL RELBUFF MOV STAYFLAG[EBX],0 CALL CLOSECURRENTSESSION RET PUBLIC COMMANDFOUND COMMANDFOUND: CMP BYTE PTR [ESI],' ' JE SHORT ENDOFCOMMAND CMPSB JE SHORT COMMANDFOUND ; LOOP TILL ALL COMPARED OR END ; ; END OF STRING WRONG ; POP ECX POP EDI POP ESI JMP TRYNEXT PUBLIC ENDOFCOMMAND ENDOFCOMMAND: MOV BADCOMMANDS[EBX],0 ; RESET ERROR COUNT POP ECX POP EDI POP EAX ; TO CLEAR STACK ; ; SEE IF SYSOP COMMAND, AND IF SO IF PASSWORD HAS BEEN ENTERED ; CMP EDI,OFFSET32 PASSCMD JAE SHORT COMM_OK ; ; NEEDS PASSWORD FOR SYSOP COMMANDS ; CMP PASSWORD[EBX],0FFFFH JNE SHORT NEEDPASS PUBLIC COMM_OK COMM_OK: MOV VALNODESFLAG,0 ; NOT VALID NODES COMMAND MOV EAX,CMDPROC[EDI] ; COMMAND PROCESSOR POP EDI ; COMMAND REPLY BUFFER PUSH EAX RET ; ENTER COMMAND PROCESSOR - ; ESI POINTS TO CHAR FOLLOWING COMMAND ; PUBLIC NEEDPASS NEEDPASS: POP EDI PUBLIC PASSERROR PASSERROR: MOV ESI,OFFSET32 PASSWORDMSG MOV ECX,LPASSMSG REP MOVSB JMP SENDCOMMANDREPLY PUBLIC CMDI00 CMDI00: MOV ESI,INFOMSG MOVZX ECX,INFOLEN JCXZ @F CALL MOVEANDCHECK ; CHECK FOR PACLEN @@: JMP SENDCOMMANDREPLY extern _VersionStringWithBuild:byte extern _VersionString:byte VERS DB 'Version ' PUBLIC CMDV00 CMDV00: MOV ESI,OFFSET VERS MOV ECX, 8 REP MOVSB ; MOV ESI,OFFSET _VersionStringWithBuild MOV ESI,OFFSET _VersionString @@: lodsb or al,al jz @f stosb jmp @b @@: mov al,0dh stosb JMP SENDCOMMANDREPLY PUBLIC BADLINK BADLINK: JMP INVALIDCMD PUBLIC LINKCMD LINKCMD: ; ; PROCESS *** LINKED to CALLSIGN ; CMP LINKEDFLAG,'Y' ; UNCONDITIONAL? JE SHORT LINKOK CMP LINKEDFLAG,'A' ; APPL ONLY? JNE SHORT BADLINK ; NOT ALLOWED ; ; SEE IF HOST SESSION OR PASSWORD GIVEN ; TEST L4CIRCUITTYPE[EBX],BPQHOST JNZ SHORT LINKOK ; LET HOST DO ANYTHING CMP Authorised_Session[EBX],0 JNE SHORT LINKOK CMP PASSWORD[EBX],0FFFFH JE SHORT LINKOK JMP PASSERROR ; SAY NEEDS PASSWORD PUBLIC LINKOK LINKOK: MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX ADD ESI,3 ; SKIP ' to ' CALL SCAN CMP BYTE PTR [ESI],20H JE SHORT LINKC00 ; NO CALLSIGN CALL DECODECALLSTRING JZ SHORT LINKC10 ; OK PUBLIC LINKC00 LINKC00: JMP CMDC98 ; SEND 'INVALID CALL' PUBLIC LINKC10 LINKC10: LEA EDI,L4USER[EBX] MOV ECX,7 REP MOVSB MOV ESI,OFFSET32 OKMSG MOV EDI,CONNECTREPLYPTR MOV ECX,3 REP MOVSB JMP SENDCOMMANDREPLY ; PUBLIC CMD?00 CMD?00: ; ; DISPLAY AVAILABLE COMMANDS ; MOV ECX,MAXAPPLS MOV ESI,OFFSET32 _APPLS PUBLIC ADDAPPLS ADDAPPLS: CMP BYTE PTR [ESI],'*' JE SHORT NEXTAPPL call CHECKBUFFER ; ENSURE ROOM PUSH ESI CALL COPYTOSPACE MOV AL,20H STOSB POP ESI NEXTAPPL: ADD ESI,TYPE CMDX LOOP ADDAPPLS MOV ESI,OFFSET32 CMDLIST MOV ECX,CMDLISTLEN CMP NEEDMH,1 JE SHORT LEAVECX SUB ECX,7 ; REMOVE MHEARD PUBLIC LEAVECX LEAVECX: REP MOVSB MOV AL,0DH STOSB JMP SENDCOMMANDREPLY PUBLIC MOVEANDCHECK MOVEANDCHECK: CALL CHECKBUFFER ; ALLOW BIG I MESSAGES MOVSB LOOP MOVEANDCHECK RET PUBLIC CMDN00 CMDN00: ; ; PROCESS 'NODES' MESSAGE ; MOV NSTAR,0 ; NOT N * MOV NODEORDER,0 ; Sort by Alias CALL SCAN CMP WORD PTR[ESI], ' C' ; SORT BY CALL JNE @F MOV NODEORDER,1 ; Sort by Call INC ESI CALL SCAN ; See if more params @@: CMP BYTE PTR [ESI],' ' JE SHORT CMDN01 ; ALL NODES ; CMP WORD PTR [ESI],'DA' ; 'ADD ' JNE SHORT NOTNADD CMP WORD PTR 2[ESI],' D' ; 'ADD ' JNE SHORT NOTNADD JMP NODE_ADD PUBLIC NOTNADD NOTNADD: CMP WORD PTR [ESI],'ED' ; 'DEL ' JNE SHORT NOTNDEL CMP WORD PTR 2[ESI],' L' ; 'ADD ' JNE SHORT NOTNDEL JMP NODE_DEL PUBLIC NOTNDEL NOTNDEL: CMP BYTE PTR [ESI],'*' ; Hidden Nodes ? JE SHORT CMDN00H ; YES ; CMP WORD PTR [ESI],' T' ; RTT Info ? JE SHORT CMDN00A ; YES ; JMP CMDN100 ; PROCESS ONE NODE PUBLIC CMDN00A CMDN00A: MOV NSTAR,1 PUBLIC CMDN00H CMDN00H: INC NSTAR PUBLIC CMDN01 CMDN01: MOV ESI,OFFSET32 NODEHDDR MOV ECX,7 REP MOVSB PUSHAD CALL BUILDSORTEDLIST POPAD MOV ESI,DESTHEADER MOV ECX,0 PUBLIC CMDN10 CMDN10: CMP ESI,0 JNE SHORT CMDN10A ; MORE TO GO ; ; END OF LIST ; TEST CL,3 JZ SHORT CMDN99A ; ALREADY AT END OF LINE MOV AL,0DH ; PUT N/L ON END STOSB PUBLIC CMDN99A CMDN99A: JMP SENDCOMMANDREPLY PUBLIC CMDN10A CMDN10A: CALL CHECKBUFFER CMP DEST_CALL[ESI],0 JE SHORT CMDN20 ; SPARE ; PUSH ESI PUSH ECX PUSH EBX MOV EBX,ESI ; SAVE LEA ESI,DEST_CALL[ESI] CALL DECODENODENAME ; CONVERT TO ALIAS:CALL CMP BYTE PTR [ESI],'#' ; HIDDEN? JNE SHORT CMDN12 ; NO CMP NSTAR,0 JNE SHORT CMDN12 ; OK TO DISPLAY CMP HIDENODES,0 ; HIDE NODES ENABLED? JE SHORT CMDN12 ; NO ; ; HIDDEN NODE - IGNORE IT ; PUBLIC CMDN11 CMDN11: POP EBX POP ECX POP ESI JMP SHORT CMDN20 PUBLIC CMDN12 CMDN12: ; ; SEE IF RTT DISPLAY ; CMP NSTAR,2 JNE SHORT CMDN13 ; NORMAL ; ; ONLY DISPLAY IF COUNT NZ, AND ALSO DISPLAY RTT ; CMP DEST_COUNT[EBX],0 JE SHORT CMDN11 ; IGNORE PUBLIC CMDN13 CMDN13: POP EBX MOV ECX,19 CALL MOVEANDCHECK ; CHECK FOR PACLEN POP ECX POP ESI CMP NSTAR,2 JNE SHORT CMDN14 ; NORMAL PUSH EBX MOV EBX,ESI CALL DORTT ; NEEDS EBX = DEST POP EBX JMP SHORT CMDN15 PUBLIC CMDN14 CMDN14: INC ECX TEST CL,3 JNZ SHORT CMDN20 PUBLIC CMDN15 CMDN15: MOV AL,0DH STOSB PUBLIC CMDN20 CMDN20: MOV ESI,DEST_CHAIN[ESI] JMP CMDN10 PUBLIC DORTT DORTT: ; ; USES EBX=DEST ENTRY ; MOV AX,'TR' STOSW MOV AX,'=T' STOSW ; RTT= MOV AX,DEST_RTT[EBX] MOV DX,0 DIV W16 ; CONVERT TO SECS CALL CONV_5DIGITS MOV AX,4620H ; F STOSW MOV AX,'=R' ; R= STOSW MOV AX,DEST_COUNT[EBX] CALL CONV_5DIGITS TEST DEST_STATE[EBX],40H JZ SHORT RTTRET ; NOT BPQ NODE MOV AX,'B ' STOSB ; SPACE STOSW ; DISPLAY ' B' FLAG STOSB ; SPACE MOV AL,DEST_STATE[EBX] ; HOPS TO DEST + CONTROL BITS_ AND AL,3FH ; MASK CONTROL BITS JZ SHORT RTTRET CALL CONV_DIGITS PUBLIC RTTRET RTTRET: RET PUBLIC NRRCMD NRRCMD: ; ; PROCESS 'NRR - Netrom Record Route' COMMAND ; CALL SCAN PUSH EBX PUSH EDI PUSH ESI CALL FINDDESTALIAS POP ESI POP EDI JZ SHORT @F ; FOUND PUSH EDI CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION POP EDI JZ SHORT @F ; FOUND POP EBX MOV ESI,OFFSET32 NOTFOUNDMSG MOV ECX,10 REP MOVSB JMP SENDCOMMANDREPLY @@: LEA EAX, DEST_CALL[ebx] POP EBX pushad push ebx push eax call _SendNRRecordRoute add esp,8 popad MOV ESI,OFFSET32 OKMSG MOV ECX,3 REP MOVSB JMP SENDCOMMANDREPLY PUBLIC CMDP00 CMDP00: ; ; PROCESS 'PORTS' MESSAGE ; MOV ESI,OFFSET32 PORTHDDR MOV ECX,7 REP MOVSB PUBLIC CMDP05 CMDP05: MOV ESI,PORTTABLE MOVZX ECX,NUMBEROFPORTS PUBLIC CMDP10 CMDP10: CALL CHECKBUFFER PUSH ESI PUSH ECX MOV AL,PORTNUMBER[ESI] CALL CONVTODIGITS ; CONVERT AL TO DECIMAL DIGITS MOV AL,20H STOSB LEA ESI,PORTDESCRIPTION[ESI] MOV ECX,30 CALL MOVEANDCHECK ; CHECK FOR PACLEN POP ECX POP ESI MOV AL,0DH STOSB MOV ESI,PORTPOINTER[ESI] LOOP CMDP10 JMP SENDCOMMANDREPLY PUBLIC CMDR00 CMDR00: ; ; PROCESS 'ROUTES' MESSAGE ; MOV RPORT,0 ; NOT SELECTIVE MOV NSTAR,0 ; SYSOP OPTION CALL SCAN CMP BYTE PTR [ESI],' ' JE SHORT CMDR01 ; NORMAL ; MOV NSTAR,1 CMP BYTE PTR 3[ESI],20H JE SHORT CMDR01A ; NO CALLSIGN JMP ROUTEUPDATE PUBLIC CMDR01A CMDR01A: ; ; IF SECOND PARAM, ITS A PORT NUMBER ; ADD ESI,2 CALL SCAN CMP BYTE PTR [ESI],' ' JE SHORT CMDR01 ; NORMAL ; CALL GETVALUE ; EXTRACT NUMBER ; JC SHORT CMDR01 ; DUFF PARAM MOV RPORT,AL PUBLIC CMDR01 CMDR01: MOV ESI,OFFSET32 ROUTEHDDR MOV ECX,8 REP MOVSB MOV ESI,NEIGHBOURS MOVZX ECX,MAXNEIGHBOURS CMDR10: MOV AL,RPORT OR AL,AL JZ SHORT CMDR11 ; NOT SELECTIVE CMP AL,NEIGHBOUR_PORT[ESI] JNE SHORT CMDR12 ; WRONG PORT - IGNORE PUBLIC CMDR11 CMDR11: PUSH ECX CALL DISPLAYROUTE POP ECX PUBLIC CMDR12 CMDR12: ADD ESI,TYPE NEIGHBOUR_LIST LOOP CMDR10 JMP SENDCOMMANDREPLY PUBLIC DISPLAYROUTE DISPLAYROUTE: CALL CHECKBUFFER CMP NEIGHBOUR_CALL[ESI],0 JNE SHORT CMDR20 RET ; PUBLIC CMDR20 CMDR20: MOV AX,2020H CMP NEIGHBOUR_LINK[ESI],0 JE SHORT IDLEROUTE mov ecx,NEIGHBOUR_LINK[ESI] cmp L2STATE[ecx], 5 jb IDLEROUTE ; ; ACTIVE LINK ; MOV AL,'>' PUBLIC IDLEROUTE IDLEROUTE: STOSW MOV AL,NEIGHBOUR_PORT[ESI] CALL CONV_DIGITS MOV AL,20H STOSB MOV EAX,0 CALL CMDR95 ; DISPLAY CALL ; ; CHECK FOR DIGIS ; CMP NEIGHBOUR_DIGI[ESI],0 JE SHORT CMDR50 MOV AX,'IV' STOSW MOV AX,' A' STOSW ; PUT IN VIA MOV EAX,7 CALL CMDR95 ; DISPLAY DIGI CALL CMP NEIGHBOUR_DIGI+7[ESI],0 JE SHORT CMDR50 MOV EAX,14 CALL CMDR95 ; DISPLAY 2ND DIGI CALL PUBLIC CMDR50 CMDR50: MOV AL,NEIGHBOUR_QUAL[ESI] CALL CONV_DIGITS MOV AL,20H STOSB CALL _COUNTNODES ; NODES USING THIS DESTINATION PUSH EAX ; SAVE NODES CALL CONV_5DIGITS POP EAX TEST NEIGHBOUR_FLAG[ESI],1 JZ SHORT NOTLOCKED MOV AL,'!' STOSB NOTLOCKED: CMP NSTAR,0 JNE SHORT CMDR55 JMP CMDR89 ; SKIP EXTRA BITS PUBLIC CMDR55 CMDR55: ; ; DISPLAY FRAME COUNTS, ETC ; MOV AX,2020H STOSW MOV EAX,NBOUR_IFRAMES[ESI] CALL CONVBIGNUMBER MOV AX,2020H STOSW MOV EAX,NBOUR_RETRIES[ESI] CALL CONVBIGNUMBER MOV AX,2020H STOSW ; ; CALCULATE % RETRY RATE ; MOV ECX,NBOUR_IFRAMES[ESI] CMP ECX,0 JE SHORT CANTDOIT ; DONT TRY TO DIVIDE BY ZERO! ; ; CALCULATE AS (RETRIES*100)/FRAMES ; MOV EAX, NBOUR_RETRIES[ESI] MUL DWORD100 DIV ECX CALL CONV_5DIGITS MOV AL,'%' STOSB JMP SHORT DONEIT PUBLIC CANTDOIT CANTDOIT: MOV AL,'*' STOSB PUBLIC DONEIT DONEIT: MOV AX,2020H STOSW MOV AL,NBOUR_MAXFRAME[ESI] CALL CONV_DIGITS MOV AX,2020H STOSW MOV AL,NBOUR_FRACK[ESI] CALL CONV_DIGITS MOV AX,2020H STOSW ; ; DO TIME ; MOV AL,BYTE PTR NEIGHBOUR_TIME+1[ESI] CALL PRINTNUM MOV AL,':' STOSB MOV AL,BYTE PTR NEIGHBOUR_TIME[ESI] CALL PRINTNUM ; ; DISPLAY L2 QUEUE ; CMP NEIGHBOUR_LINK[ESI],0 JE SHORT CMDR89 ; IDLE ROUTE PUSH EBX MOV AX,2020H STOSW MOV EBX,NEIGHBOUR_LINK[ESI] ; TO LINK ENTRY ; MOV AH,0 CALL COUNT_AT_L2 ; SEE HOW MANY QUEUED MOV AL,AH CALL CONV_DIGITS POP EBX MOV AL,' ' STOSB ; IF INP3 DISPLAY SRTT CMP INP3Node[esi],0 ; INP3 Enabled? JE SHORT CMDR89 MOV EAX, SRTT[esi] MOV EDX,0 MOV ECX, 10 DIV ECX MOV EDX,0 MOV ECX, 100 DIV ECX CALL CONV_5DIGITS MOV AL,'.' STOSB MOV EAX, EDX CALL PRINTNUM MOV AL,'s' STOSB MOV AL,'/' STOSB MOV EAX, NeighbourSRTT[esi] MOV EDX,0 MOV ECX, 10 DIV ECX MOV EDX,0 MOV ECX, 100 DIV ECX CALL CONV_5DIGITS MOV AL,'.' STOSB MOV EAX, EDX CALL PRINTNUM MOV AL,'s' STOSB PUBLIC CMDR89 CMDR89: MOV AL,0DH STOSB PUBLIC CMDR90 CMDR90: RET PUBLIC CMDR95 CMDR95: ; ; DO A CALLSIGN ; PUSH ESI PUSH EDI ADD ESI,EAX CALL CONVFROMAX25 ; CONVERT TO CALL INC ECX POP EDI MOV ESI,OFFSET32 NORMCALL CALL MOVEANDCHECK ; CHECK FOR PACLEN POP ESI RET _COUNTNODES: ; ; COUNT NODES WITH ROUTE VIA NEIGHBOUR IN ESI ; PUSH EDI MOV EDI,DESTS MOV EAX,0 PUBLIC COUNTN10 COUNTN10: CMP ROUT1_NEIGHBOUR[EDI],ESI JNE SHORT COUNTN12 INC EAX JMP SHORT COUNTN50 PUBLIC COUNTN12 COUNTN12: CMP ROUT2_NEIGHBOUR[EDI],ESI JNE SHORT COUNTN14 INC EAX JMP SHORT COUNTN50 PUBLIC COUNTN14 COUNTN14: CMP ROUT3_NEIGHBOUR[EDI],ESI JNE SHORT @F INC EAX JMP SHORT COUNTN50 @@: CMP INPROUT1_NEIGHBOUR[EDI],ESI JNE SHORT @F INC EAX JMP SHORT COUNTN50 @@: CMP INPROUT2_NEIGHBOUR[EDI],ESI JNE SHORT @F INC EAX JMP SHORT COUNTN50 @@: CMP INPROUT3_NEIGHBOUR[EDI],ESI JNE SHORT COUNTN50 INC EAX PUBLIC COUNTN50 COUNTN50: ADD EDI,TYPE DEST_LIST CMP EDI,ENDDESTLIST JNE SHORT COUNTN10 POP EDI RET PUBLIC CMDN100 CMDN100: ; ; SELECTIVE NODES DISPLAY ; PUSH EBX PUSH EDI PUSH ESI CALL FINDDESTALIAS POP ESI POP EDI JZ SHORT CMDN105 ; FOUND ; IF * on end, list all ssids PUSH EDI CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT cmp byte ptr -1[esi], '*' jne notstar ; try 0 to 15 mov AX25CALL+6,0 pop edi ssidloop: push edi MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION pop edi jnz @f ; not found call DISPLAYNODE pop ebx CALL CHECKBUFFER push ebx @@: add AX25CALL+6, 2 cmp AX25CALL+6,30 jbe ssidloop pop ebx JMP SENDCOMMANDREPLY notstar: MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION POP EDI JZ SHORT CMDN105 ; FOUND POP EBX MOV ESI,OFFSET32 NOTFOUNDMSG MOV ECX,10 REP MOVSB JMP SENDCOMMANDREPLY CMDN105: CALL DISPLAYNODE pop ebx JMP SENDCOMMANDREPLY DISPLAYNODE: MOV ESI,OFFSET32 NODEROUTEHDDR MOV ECX,11 REP MOVSB LEA ESI,DEST_CALL[EBX] CALL DECODENODENAME ; CONVERT TO ALIAS:CALL REP MOVSB CMP DEST_RTT[EBX],0 JE SHORT @f ; TIMER NOT SET - DEST PROBABLY NOT USED MOVSB ; ADD SPACE CALL DORTT @@: MOV AL,CR STOSB MOV ECX,3 MOV DH,DEST_ROUTE[EBX] ; CURRENT ACTIVE ROUTE MOV DL,1 push ebx PUBLIC CMDN110 CMDN110: MOV ESI,ROUT1_NEIGHBOUR[EBX] CMP ESI,0 JE CMDN199 MOV AX,' ' CMP DH,DL JNE SHORT CMDN112 ; NOT CURRENT DEST MOV AX,' >' CMDN112: STOSW PUSH ECX MOV AL,ROUT1_QUALITY[EBX] CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb MOV AL,ROUT1_OBSCOUNT[EBX] CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb MOV AL,NEIGHBOUR_PORT[ESI] ; GET PORT CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb PUSH EDI CALL CONVFROMAX25 ; CONVERT TO CALL POP EDI MOV ESI,OFFSET32 NORMCALL REP MOVSB MOV AL,CR STOSB ADD EBX,ROUTEVECLEN INC DL ; ROUTE NUMBER POP ECX DEC ECX JNZ CMDN110 PUBLIC CMDN199 CMDN199: POP EBX ; DISPLAY INP3 ROUTES MOV ECX,3 MOV DL,4 PUBLIC CMDNINP3 CMDNINP3: MOV ESI,INPROUT1_NEIGHBOUR[EBX] CMP ESI,0 JE CMDNINPEND MOV AX,' ' CMP DH,DL JNE SHORT @F ; NOT CURRENT DEST MOV AX,' >' @@: STOSW PUSH ECX MOV AL, Hops1[EBX] CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb MOVZX EAX, SRTT1[EBX] MOV EDX,0 MOV ECX, 100 DIV ECX CALL CONV_5DIGITS MOV AL,'.' STOSB MOV EAX, EDX CALL PRINTNUM MOV AL,'s' STOSB MOV AL,' ' STOSB MOV AL,NEIGHBOUR_PORT[ESI] ; GET PORT CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb PUSH EDI CALL CONVFROMAX25 ; CONVERT TO CALL POP EDI MOV ESI,OFFSET32 NORMCALL REP MOVSB MOV AL,CR STOSB ADD EBX,INPROUTEVECLEN INC DL ; ROUTE NUMBER POP ECX LOOP CMDNINP3 CMDNINPEND: ret PUBLIC CMDL00 CMDL00: ; ; PROCESS 'LINKS' MESSAGE ; MOV ESI,OFFSET32 USERHDDR MOV ECX,7 REP MOVSB MOV ESI,LINKS MOVZX ECX,MAXLINKS ; MAX LINES IN ONE MESSAGE PUBLIC CMDL10 CMDL10: CALL CHECKBUFFER ; MAKE SURE ROOM LEFT PUSH ECX CMP BYTE PTR[ESI],0 JE SHORT CMDL50 ; UNUSED ENTRY ; PUSH ESI CALL CMDUXX ADD ESI,7 MOV AL,20H STOSB CALL CMDUXX ; DISPLAY BOTH CALLS POP ESI MOV AL,20H STOSB MOV AX,'=S' STOSW MOV AL,L2STATE[ESI] ADD AL,30H STOSB ; PUT IN STATE MOV AL,20H STOSB MOV AX,'=P' STOSW MOV AL,LINKPORT[ESI] CALL CONV_DIGITS ; PUT IN PORT MOV AL,20H STOSB MOV AX,'=T' STOSW MOV AL,LINKTYPE[ESI] ADD AL,30H STOSB ; PUT IN TYPE MOV AL,20H STOSB MOV AX,'=V' STOSW MOV AL,'2' SUB AL,VER1FLAG[ESI] STOSB ; PUT IN VERSION MOV AL,0DH STOSB PUBLIC CMDL50 CMDL50: ADD ESI,TYPE LINKTABLE POP ECX LOOP CMDL10 PUBLIC CMDL99 CMDL99: JMP SENDCOMMANDREPLY ; ; PROCESS 'USERS' ; PUBLIC CMDS00 EXTERN _SESSIONHDDR:BYTE, _SESSHDDRLEN:DWORD EXTERN _FREE_Q:DWORD CMDS00: mov ESI,OFFSET32 _SESSIONHDDR mov ECX,_SESSHDDRLEN rep movsb mov AX,QCOUNT ; Get number of free buffers CALL CONV_5DIGITS mov AL,' ' stosb push ebx lea ebx, _FREE_Q call COUNT_Q CALL CONV_5DIGITS pop ebx mov AL,')' stosb mov AL,CR stosb MOV ESI,_L4TABLE MOVZX ECX,_MAXCIRCUITS PUBLIC CMDS10 CMDS10: call CHECKBUFFER ; ENSURE ROOM PUSH ECX cmp L4USER[ESI],0 JE CMDS60 ; SPARE ENTRY test L4CIRCUITTYPE[ESI],UPLINK jnz SHORT CMDS10A ; YES ; IF DOWNLINK, ONLY DISPLAY IF NO CROSSLINK cmp L4CROSSLINK[ESI],0 jne CMDS60 ; WILL PROCESS FROM OTHER END ; ; ITS A DOWNLINK WITH NO PARTNER - MUST BE A CLOSING SESSION ; DISPLAY TO THE RIGHT FOR NOW ; PUSH ESI MOV ESI,OFFSET32 CLOSINGMSG MOV ECX,10 REP MOVSB POP ESI PUBLIC CMDS10A CMDS10A: cmp L4CROSSLINK[ESI],0 jne SHORT TWO_ENTRIES push ESI call DISPLAYCIRCUIT pop ESI jmp SHORT CMDS20 PUBLIC TWO_ENTRIES TWO_ENTRIES: push EDI mov EDI,OFFSET32 USERSBUFFER mov ECX,17 mov AX,' ' rep stosw mov EDI,OFFSET32 USERSBUFFER push ESI call DISPLAYCIRCUIT pop ESI pop EDI push ESI mov ESI,OFFSET32 USERSBUFFER mov ECX,17 rep movsw pop ESI push ESI mov ESI,L4CROSSLINK[ESI] CMP L4STATE[ESI],5 JE SHORT CMDS19A mov AX,'~<' stosw mov AX,'>~' stosw JMP SHORT CMDS19B PUBLIC CMDS19A CMDS19A: mov AX,'-<' stosw mov AX,'>-' stosw PUBLIC CMDS19B CMDS19B: mov AX,' ' stosw call DISPLAYCIRCUIT pop ESI PUBLIC CMDS20 CMDS20: mov AL,CR stosb PUBLIC CMDS60 CMDS60: POP ECX add ESI,TYPE TRANSPORTENTRY loop CMDS10_J jmp SENDCOMMANDREPLY PUBLIC CMDS10_J CMDS10_J: JMP CMDS10 PUBLIC CMDUXX_1 CMDUXX_1: push EBX push ESI PUSH ECX push EDI call _FINDDESTINATION pop EDI jz SHORT NODE_FOUND push EDI ; NET/ROM not found call CONVFROMAX25 ; CONVERT TO CALL pop EDI mov ESI,OFFSET32 NORMCALL rep movsb jmp SHORT END_CMDUXX PUBLIC NODE_FOUND NODE_FOUND: lea ESI,DEST_CALL[EBX] call DECODENODENAME REP MOVSB PUBLIC END_CMDUXX END_CMDUXX: POP ECX pop ESI pop EBX ret PUBLIC DISPLAYCIRCUIT DISPLAYCIRCUIT: MOV AH,L4CIRCUITTYPE[ESI] PUSH ESI CMP AH,PACTOR+UPLINK JNE SHORT @F mov ESI,OFFSET32 TNCUplinkMSG mov ECX,16 rep movsb POP ESI PUSH ESI mov al, KAMSESSION[ESI] push eax MOV ESI,L4TARGET[ESI] ; PORT MOV AL,PORTNUMBER[ESI] CALL CONV_DIGITS mov al,'/' stosb pop eax CALL CONV_DIGITS POP ESI PUSH ESI mov al, '(' stosb LEA ESI,L4USER[ESI] CALL CMDUXX ; DISPLAY USER mov al, ')' stosb POP ESI ret @@: CMP AH,PACTOR+DOWNLINK JNE SHORT @F mov ESI,OFFSET32 PACTORMSG mov ECX,17 rep movsb POP ESI PUSH ESI mov al, KAMSESSION[ESI] push eax MOV ESI,L4TARGET[ESI] ; PORT MOV AL,PORTNUMBER[ESI] CALL CONV_DIGITS mov al,'/' stosb pop eax CALL CONV_DIGITS POP ESI ret @@: CMP AH,L2LINK+UPLINK JNE SHORT CMDS11 mov ESI,OFFSET32 UPLNKMSG mov ECX,6 rep movsb POP ESI PUSH ESI PUSH EAX MOV AL,20H STOSB MOV ESI,L4TARGET[ESI] ; NODE MOV AL,LINKPORT[ESI] CALL CONV_DIGITS POP EAX jmp SHORT CMDS17 PUBLIC CMDS11 CMDS11: CMP AH,L2LINK+DOWNLINK JE CMDS30 ; DISPLAY L2 DOWNLINK PUBLIC CMDS13 CMDS13: TEST AH,BPQHOST JZ SHORT CMDS14 ; ; MAY BE TNC2 OR BPQ MODE ; MOV ESI,OFFSET32 HOSTLNKMSG MOV ECX,4 REP MOVSB POP ESI PUSH ESI PUBLIC CMDS13A CMDS13A: MOV DL,AH ; SAVE MOV EAX,L4TARGET[ESI] ; BPQ HOST VECTOR SUB EAX,OFFSET32 BPQHOSTVECTOR DIV BPQVECLENGTH INC AL ; WANT 1-64 CBW DIV D10 OR AX,3030H STOSW ; PUT IN HOSTMODE SUBPORT NUMBER MOV AH,DL JMP SHORT CMDS17 PUBLIC CMDS14 CMDS14: mov ESI,OFFSET32 CROSSLNKMSG mov ECX,7 rep movsb PUBLIC CMDS17 CMDS17: POP ESI MOV AL,'(' STOSB TEST AH,BPQHOST JNZ SHORT HOST_ENTRY CMP AH,L2LINK+UPLINK JE SHORT ONECALL PUSH ESI MOV ESI,L4TARGET[ESI] ; NODE LEA ESI,DEST_CALL[ESI] CALL CMDUXX_1 POP ESI MOV AL,' ' STOSB PUBLIC ONECALL ONECALL: PUSH ESI LEA ESI,L4USER[ESI] CALL CMDUXX ; DISPLAY USER ; POP ESI MOV AL,')' STOSB RET PUBLIC HOST_ENTRY HOST_ENTRY: push ESI LEA ESI,L4USER[ESI] call CMDUXX_1 pop ESI mov AL,')' stosb ret PUBLIC CMDS30 CMDS30: MOV ESI,OFFSET32 DOWNLNKMSG MOV ECX,8 REP MOVSB POP ESI PUSH ESI MOV ESI,L4TARGET[ESI] ; L2 SESSION MOV AL,20H STOSB MOV AL,LINKPORT[ESI] CALL CONV_DIGITS MOV AL,'(' STOSB PUSH ESI LEA ESI,OURCALL[ESI] CALL CMDUXX POP ESI MOV AL,' ' STOSB LEA ESI,LINKCALL[ESI] CALL CMDUXX ; REMOTE USER POP ESI MOV AL,')' STOSB RET PUBLIC CMDUXX CMDUXX: push ESI PUSH ECX push EDI call CONVFROMAX25 ; CONVERT TO CALL pop EDI mov ESI,OFFSET32 NORMCALL rep movsb POP ECX pop ESI ret PUBLIC CQCMD CQCMD: MOV CQFLAG,1 MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX MOV ESI,OFFSET32 CQCALL MOV CONNECTPORT,1 ; MAYBE NEED TO CHANGE JMP GOTPORT ; ISSUE DUMMY 'CONNECT' TO CQ PUBLIC CMDC00 CMDC00: ; ; PROCESS CONNECT COMMAND ; MOV CQFLAG,0 ; NOT CQ CALL MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX IF BLACKBITS PUSH ESI LEA ESI,L4USER[EBX] CALL CHECKBLACKLIST POP ESI JNZ SHORT ALLOWED ; ; CONNECTS FROM THIS STATION ARE NOT ALLOWED ; MOV EDI,REPLYBUFFER CALL RELBUFF RET PUBLIC ALLOWED ALLOWED: ENDIF MOV CONNECTPORT,0 ; NO PORT SPECIFIED CALL SCAN CMP BYTE PTR [ESI],' ' JE SHORT HOSTCONNECT JMP CMDC01X ; ; C WITH NO PARAMS - LOOK FOR AN APPL 2 PORT WITH CONOK ON ; PUBLIC HOSTCONNECT HOSTCONNECT: ; ; HOST MODE ; CMP CFLAG,0 JE CMDC01X ; C Command Disabled MOV CMDPTR,OFFSET32 HOSTCMD MOV ALIASPTR,OFFSET32 CMDALIAS+ALIASLEN MOV APPLMASK,2 ; BBS JMP APPLCMD PUBLIC CMDC01J CMDC01J: JMP CMDC01 ; INVALID CALL PUBLIC CMDC98AJ CMDC98AJ: JMP CMDC98A ; INVALID PORT PUBLIC CMDC01X CMDC01X: ; ; SEE IF PORT SPECIFIED ; PUSH ESI ; SAVE IN CASE NOT PORT CALL GETVALUE JC SHORT NOPORT ; POINT TO FIRST CHAR OF CALL ; ; IF THERE IS NOTHING FOLLOWING THE NUMBER, ASSUME IT IS A ; NUMERIC ALIAS INSTEAD OF A PORT ; CALL SCAN CMP BYTE PTR[ESI+1],20H ; COULD JUST BE S OR Z JBE SHORT NOPORT ADD ESP,4 ; DISCARD SAVED ESI PUSH EBX PUSH EAX CALL GETPORTTABLEENTRY ; SEE IF PORT IS DEFINED POP EAX CMP AL,PORTNUMBER[EBX] POP EBX JNE SHORT CMDC98AJ ; ILLEGAL MOV CONNECTPORT,AL JMP SHORT GOTPORT PUBLIC NOPORT NOPORT: POP ESI PUBLIC GOTPORT GOTPORT: CALL SCAN CALL DECODECALLSTRING JNZ SHORT CMDC01J ; INVALID ; ; SEE IF CALL TO ANY OF OUR HOST SESSIONS - UNLESS DIGIS SPECIFIED ; MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT MOV AL,STAYSWITCH MOV STAYFLAG[ESI],AL ; SET STAY VALUE CMP AX25STRING+7,0 JNE CMDC02 ; FORCE L2 CONNECT IF DIGIS SPECIFIED ; MOV EDX,OFFSET32 APPLCALLTABLE MOV APPLMASK,1 MOV ECX,MAXAPPLS @@: PUSH ECX MOV ESI,OFFSET32 CONNECTCALL LEA EDI,APPLALIAS_TEXT[EDX] ; BBS ALIAS MOV ECX,6 REP CMPSB JE SHORT BBSCONNECT_J ; MOV ESI,OFFSET32 CONNECTCALL LEA EDI,APPLCALL_TEXT[EDX] ; BBS CALLSIGN MOV ECX,10 REP CMPSB JE SHORT BBSCONNECT_J ADD EDX,TYPE APPLCALLS SHL APPLMASK,1 POP ECX LOOP @B JMP SHORT NOTBBSC PUBLIC BBSCONNECT_J BBSCONNECT_J: POP ECX JMP BBSCONNECT PUBLIC NOTBBSC NOTBBSC: ; CMP AX25STRING+7,0 JNE SHORT CMDC02 ; FORCE L2 CONNECT IF DIGIS SPECIFIED ; ; SEE IF CALL TO ANOTHER NODE ; CMP BYTE PTR CONNECTCALL+6,'-' ; SSID? JE SHORT NOTALIASC MOV ESI,OFFSET32 CONNECTCALL CALL FINDDESTALIAS JZ SHORT L4CONNECT ; FOUND ; PUBLIC NOTALIASC NOTALIASC: MOV ESI,OFFSET32 AX25STRING CALL _FINDDESTINATION JNZ SHORT CMDC02 ; NOT NETROM CONNECT PUBLIC L4CONNECT L4CONNECT: MOV TARGETDEST,EBX ; SAVE POINTER JMP CMDC06 PUBLIC CMDC01 CMDC01: JMP CMDC98 ; INVALID PUBLIC CMDC02 CMDC02: MOV TARGETDEST,0 ; INDICATE L2 DOWNLINK REQUIRED CMP CONNECTPORT,0 JNE SHORT CMDC05 ; L2 NEEDS PORT NUMBER CMP NUMBEROFPORTS,1 ; IF ONLY ONE PORT, DONT NEED NUMBER JNE SHORT MULTIPORT MOV CONNECTPORT,1 JMP SHORT CMDC05 PUBLIC MULTIPORT MULTIPORT: MOV ESI,OFFSET32 NOPORTMSG MOV ECX,LNOPORTMSG MOV EDI,CONNECTREPLYPTR MOV EBX,CONNECTSESSION ; REP MOVSB JMP CMDP00 ; LIST AVAILABLE PORTS PUBLIC CMDC05 CMDC05: ; ; ENSURE PORT IS AVAILABLE FOR L2 USE ; MOV AL,CONNECTPORT CALL GETPORTTABLEENTRY CMP PROTOCOL[EBX], 10 JNE NOTPACTORPORT ; ; PACTOR style port ; ; if Via PACTOR or WINMOR, convert to attach, then call = Digi's are in AX25STRING (+7) push esi push edi push ecx mov esi, offset AX25STRING+7 mov edi, offset WINMOR mov ecx, 6 rep cmpsb je @F mov esi, offset AX25STRING+7 mov edi, offset PACTORCALL mov ecx, 6 rep cmpsb je @f pop ecx pop edi pop esi jmp short NotWINPAC @@: pop ecx pop edi pop esi mov COMMANDBUFFER, 'A' MOV EDI,CONNECTREPLYPTR MOV EBX,CONNECTSESSION push edi JMP REDOCOMMAND NOTWINPAC: ; ; If on a KAM or SCS with ax.25 on port 2, do an Attach command, then pass on connect ; MOV ECX, MAXHOSTMODESESSIONS[EBX] cmp ECX,1 ja @f MOV ESI,OFFSET32 PACINVALIDPORT MOV ECX,PACINVPORTLEN JMP CMDC99 @@: mov esi,ebx ; ; Only Allow Attach VHF from Secure Applications or if PERMITGATEWAY is set ; CMP PERMITGATEWAY[EBX],1 JE @F ; OK PUSH EBX MOV EBX,CONNECTSESSION TEST Authorised_Session[EBX], 1 POP EBX JNZ short @f ; OK MOV ESI,OFFSET32 ATTERRMSG3 ; Not Allowed MOV ECX,ATTERRLEN3 JMP CMDC99 @@: dec ecx ; First is Pactor Stream mov eax,ecx ; ?? Last ax.25 session shl eax,2 @@: CMP ATTACHEDSESSIONS[ESI][EAX],0 JE @F sub eax,4 loop @b ; ; No free ax.25 sessions MOV ESI,OFFSET32 AXATTERRMSG1 ; In Use MOV ECX,AXATTERRLEN1 JMP CMDC99 @@: ; See if TNC is OK PUSHAD MOV EBX,ESI mov eax,ecx CALL PORTTXCHECK[EBX] ; OR AH,AH JNZ @F ; TNC is OK POPAD MOV ESI,OFFSET32 ATTERRMSG2 ; Not Initialised MOV ECX,ATTERRLEN2 JMP CMDC99 @@: POPAD ; ; GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK ; PUSH EAX CALL GETFREECIRCUIT ; GET AN ENTRY POP EAX JNZ CMDC97 ; TABLES FULL MOV ATTACHEDSESSIONS[ESI][EAX], EBX SHR EAX, 2 MOV KAMSESSION[EBX],AL; // Session Number on KAM Host Mode TNC MOV EAX,CONNECTSESSION ; INCOMING CIRCUIT MOVZX EAX,SESSPACLEN[EAX] ; Incoming PACLEN ; Should set paclen to lower of incoming and outgoing or EAX,EAX jnz @F mov EAX, 256 ; 0 = 256 @@: MOVZX EDX,PORTPACLEN[ESI] ; Paclen for Outgoing port or EDX,EDX jnz @F mov EDX, 256 @@: cmp EAX,EDX jb @F mov eax,edx @@: MOV SESSPACLEN[EBX],AL PUSH ESI MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT MOV SESSPACLEN[ESI],AL MOV L4CROSSLINK[EBX],ESI ; POINTER FROM NEW TO OLD MOV L4CROSSLINK[ESI],EBX ; POINTER FROM OLD TO NEW LEA ESI,L4USER[ESI] LEA EDI,L4USER[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT LEA ESI,L4MYCALL[ESI] LEA EDI,L4MYCALL[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV CIRCUITINDEX[EBX],DL ; OUR INDEX MOV AL,_NEXTID MOV CIRCUITID[EBX],AL ; OUR ID CALL INC_ID MOV ESI,CONNECTSESSION MOV AX,SESSIONT1[ESI] ; CALLERS TIMEOUT MOV SESSIONT1[EBX],AX ; NET SESSION TIMEOUT MOV AL,_L4DEFAULTWINDOW MOV L4WINDOW[EBX],AL MOV L4STATE[EBX],5 POP ESI ; PORT MOV L4TARGET[EBX], ESI MOV L4CIRCUITTYPE[EBX],DOWNLINK+PACTOR ; Pass the C command on CALL GETBUFF JZ SHORT NoBuf ; CANT DO MUCH ELSE PUSH EDI ; Stream Number for KAM is in KAMSESSION MOV AL,KAMSESSION[EBX] MOV 4[EDI],AL MOV ECX,80 ; DONT LOOK TOO FAR! lea ESI,COMMANDBUFFER @@: lodsb cmp al,20h JE SHORT @F LOOP @B @@: call SCAN @@: lodsb cmp al,20h JE SHORT @F LOOP @B @@: call SCAN ; to the Call String MOV EBX,L4TARGET[EBX] ; PORT ENTRY ADD EDI,7 mov al,0f0h stosb mov al, 'C' stosb mov al, ' ' stosb mov ECX,50 REP MOVSB @@: DEC EDI CMP BYTE PTR [EDI], 20H JE @B ; remove trailing spaces inc edi mov al,13 stosb mov ecx,edi pop edi sub ecx,edi MOV MSGLENGTH[EDI],CX LEA ESI,PORTTX_Q[EBX] CALL _Q_ADD NoBuf: MOV EDI,CONNECTREPLYPTR MOV EBX,CONNECTSESSION MOV ESI,OFFSET32 OKMSG MOV ECX,3 REP MOVSB MOV EDI,REPLYBUFFER CALL RELBUFF ret NOTPACTORPORT: MOV ESI,CONNECTSESSION TEST L4CIRCUITTYPE[ESI],BPQHOST JNZ SHORT CMDC06 ; LET HOST DO ANYTHING CMP PORTL3FLAG[EBX],0 JE SHORT CMDC06 ; OK ; ; PORT NOT ALLOWED ; MOV ESI,OFFSET32 L3INVALIDPORT MOV ECX,L3INVPORTLEN JMP CMDC99 PUBLIC CMDC06 CMDC06: ; ; GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK ; CALL GETFREECIRCUIT ; GET AN ENTRY JZ SHORT CMDC07 JMP CMDC97 ; TABLES FULL PUBLIC CMDC07 CMDC07: MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT MOV L4CROSSLINK[EBX],ESI ; POINTER FROM NEW TO OLD MOV L4CROSSLINK[ESI],EBX ; POINTER FROM OLD TO NEW LEA ESI,L4USER[ESI] LEA EDI,L4USER[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT LEA ESI,L4MYCALL[ESI] LEA EDI,L4MYCALL[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV CIRCUITINDEX[EBX],DL ; OUR INDEX MOV AL,_NEXTID MOV CIRCUITID[EBX],AL ; OUR ID CALL INC_ID MOV ESI,CONNECTSESSION MOV AX,SESSIONT1[ESI] ; CALLERS TIMEOUT MOV SESSIONT1[EBX],AX ; NET SESSION TIMEOUT MOV AL,_L4DEFAULTWINDOW MOV L4WINDOW[EBX],AL CMP TARGETDEST,0 JE SHORT CMDC09 ; L2 CONNECT REQUIRED ; ; SET UP CROSSLINK ; MOV L4CIRCUITTYPE[EBX],SESSION+DOWNLINK ; CROSS MOV EAX,TARGETDEST MOV L4TARGET[EBX],EAX ; SET POINTER TO DEST ; MOV L4STATE[EBX],2 ; CONNECTING MOV AL,SPYSWITCH MOV SPYFLAG[EBX],AL MOV EDI,REPLYBUFFER CALL RELBUFF CALL SENDL4CONNECT INC L4CONNECTSOUT RET PUBLIC CMDC09 CMDC09: MOV L4CIRCUITTYPE[EBX],L2LINK+DOWNLINK ; DOWNLINK ; ; FORMAT LINK TABLE ENTRY FOR THIS CONNECTION ; MOV AL,CONNECTPORT MOV COMPAREPORT,AL CALL GETPORTTABLEENTRY MOV EBP,EBX MOV EDI,REPLYBUFFER CALL FINDLINK ; GET LINK FOR THIS ADDRESS PAIR (IN EBX) ; ; SET UP NEW SESSION (OR RESET EXISTING ONE) ; CMP EBX,0 JNE SHORT CMDC09A JMP CMDC97 ; TABLES FULL PUBLIC CMDC09A CMDC09A: ; ; COPY ADDRESS INFO TO LINK TABLE ; LEA ESI,AX25STRING LEA EDI,LINKCALL[EBX] MOV ECX,7 REP MOVSB MOV ESI,CONNECTSESSION MOV AL,L4CIRCUITTYPE[ESI] ; FOR SSID SWAP TEST LEA ESI,L4USER[ESI] LEA EDI,OURCALL[EBX] MOV ECX,7 REP MOVSB ; TEST AL,BPQHOST + PACTOR JNZ SHORT DONTFLIP ; LEAVE ALONE FOR HOST XOR BYTE PTR -1[EDI],00011110B ; FLIP SSID PUBLIC DONTFLIP DONTFLIP: MOV AL,CONNECTPORT MOV LINKPORT[EBX],AL ; PUT IN PORT MOV AL,PORTT1[EBP] MOV L2TIME[EBX],AL ; SET STANDARD TIMER VALUE ADD AL,AL ; *2 FOR DIGIS ; MOV ESI,OFFSET32 AX25STRING+7 PUBLIC CMDC019 CMDC019: CMP BYTE PTR [ESI],0 JE SHORT CMDC020 ; END OF DIGI STRING MOV ECX,7 REP MOVSB ADD L2TIME[EBX],AL ; ADJUST TIMER VALUE FOR 1 DIGI JMP CMDC019 ; COPY OTHERS PUBLIC CMDC020 CMDC020: MOV AL,CONNECTPORT MOV LINKPORT[EBX],AL ; PUT IN MOV LINKTYPE[EBX],2 ; DOWNLINK CALL GETPORTWINDOW MOV LINKWINDOW[EBX],AL CALL RESET2 ; RESET ALL FLAGS MOV L2STATE[EBX],2 ; CONNECTING PUSH EBX LEA EDI,CIRCUITPOINTER[EBX] MOV EAX,EBX MOV EBX,CONNECTSESSION MOV EBX,L4CROSSLINK[EBX] ; TO 'DOWN' SESSION MOV [EDI],EBX ; POINTER TO CIRCUIT MOV L4TARGET[EBX],EAX ; SET UP CROSS LINKS MOV AL,PORTPACLEN[EBP] OR AL,AL JZ SHORT LEAVEPACLEN ; ; SET SESSION PACLEN TO PORT VALUE ; MOV EBX,CONNECTSESSION MOV SESSPACLEN[EBX],AL PUBLIC LEAVEPACLEN LEAVEPACLEN: POP EBX ; LINK ; CMP CQFLAG,1 JE SHORT DUMMYCALL ; A CQ CALL - DONT SEND SABM! CALL SENDSABM ; KICK IT OFF PUBLIC DUMMYCALL DUMMYCALL: ; ; DISCARD BUFFER ; MOV EDI,REPLYBUFFER CALL RELBUFF RET PUBLIC CMDC96 CMDC96: MOV ESI,OFFSET32 INVALIDWIND MOV ECX,INVWINDLEN JMP SHORT CMDC99 PUBLIC CMDC97 CMDC97: MOV ESI,OFFSET32 TABLESFULL MOV ECX,TABLESFULLLEN JMP SHORT CMDC99 PUBLIC CMDC98 CMDC98: MOV ESI,OFFSET32 INVALIDCALL MOV ECX,INVCALLLEN JMP SHORT CMDC99 PUBLIC CMDC98A CMDC98A: MOV ESI,OFFSET32 INVALIDPORT MOV ECX,INVPORTLEN PUBLIC CMDC99 CMDC99: MOV EDI,CONNECTREPLYPTR MOV EBX,CONNECTSESSION ; REP MOVSB JMP SENDCOMMANDREPLY PUBLIC DECODECALLSTRING DECODECALLSTRING: ; ; CONVERT CALL + OPTIONAL DIGI STRING AT [ESI] TO AX25, RETURN ADDRESS ; OF CONVERTED STRING IN [ESI], WITH NZ SET IF INVALID ; ; ALSO RETURN END OF INPUT STRING IN AX MOV STAYSWITCH,0 MOV SPYSWITCH,0 MOV EDI,OFFSET32 AX25STRING MOV ECX,64 MOV AL,0 REP STOSB ; CLEAR STRING MOV EDI,OFFSET32 CONNECTCALL MOV AX,2020H MOV ECX,5 REP STOSW MOV EDI,OFFSET32 CONNECTCALL MOV ECX,10 PUBLIC EXTRACTCALL EXTRACTCALL: LODSB CMP AL,20H JE SHORT EXTR10 ; END STOSB LOOP EXTRACTCALL PUBLIC DECODECALL99_J DECODECALL99_J: JMP DECODECALL99 ; DUFF PUBLIC EXTR10 EXTR10: PUSH ESI MOV ESI,OFFSET32 CONNECTCALL CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT MOV ESI,OFFSET32 AX25CALL MOV EDI,OFFSET32 AX25STRING MOV ECX,7 REP MOVSB POP ESI JNZ SHORT DECODECALL99_J ; INVALID CMP AX25STRING,40H je DECODECALL99_J ; Call starts with space ; ; GET NEXT FIELD = COULD BE CALLSIGN, VIA, OR S (FOR SAVE) ; MOV DIGIPTR,OFFSET32 AX25STRING+7 PUBLIC DIGILOOP DIGILOOP: MOV EDI,OFFSET32 DIGICALL MOV AX,2020H MOV ECX,5 REP STOSW MOV EDI,OFFSET32 DIGICALL MOV ECX,10 CMP BYTE PTR [ESI],20H JE NOTDIGI ; END OF DIGI STRING PUBLIC EXTRACTDCALL EXTRACTDCALL: LODSB CMP AL,20H JE SHORT EXTRD10 ; END CMP AL,',' JE SHORT EXTRD10 ; END STOSB LOOP EXTRACTDCALL JMP DECODECALL99 ; DUFF PUBLIC EXTRD10 EXTRD10: ; ; CHECK FOR VIA, ETC ; CMP DIGICALL,'V' JNE SHORT NOTVIA MOV AL,DIGICALL+1 CMP AL,20H JE SHORT DIGILOOP ; V CMP AL,'I' JNE SHORT NOTVIA MOV AL,DIGICALL+2 CMP AL,20H JE SHORT DIGILOOP ; VI CMP AL,'A' JNE SHORT NOTVIA CMP DIGICALL+3,' ' JE SHORT DIGILOOP ; VIA PUBLIC NOTVIA NOTVIA: CMP WORD PTR DIGICALL,' S' ; S SPACE = STAY JNE SHORT NOTSTAY MOV STAYSWITCH,'S' JMP DIGILOOP PUBLIC NOTSTAY NOTSTAY: CMP WORD PTR DIGICALL,' Z' ; Z SPACE = 'SPY' JNE SHORT NOTSPY MOV SPYSWITCH,'Z' JMP DIGILOOP NOTSPY: CMP DIGIPTR,OFFSET32 AX25STRING+63 ; GOT 8 DIGIS? JE DECODECALL99 PUSH ESI ; SAVE COMMAND POINTER MOV ESI,OFFSET32 DIGICALL CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT MOV ESI,OFFSET32 AX25CALL MOV EDI,DIGIPTR MOV ECX,7 REP MOVSB POP ESI JNZ SHORT DECODECALL99 ; INVALID MOV DIGIPTR,EDI ; SAVE JMP DIGILOOP PUBLIC NOTDIGI NOTDIGI: XOR AL,AL ; RETURN ZERO MOV EAX,ESI ; NEXT CHAR IN INPUT STRING MOV ESI,OFFSET32 AX25STRING RET PUBLIC DECODECALL99 DECODECALL99: OR AL,1 RET ; NZ SET PUBLIC APPLCMD APPLCMD: ; ; SEE IF THERE IS AN ALIAS DEFINDED FOR THIS COMMAND ; MOV ESI,ALIASPTR CMP BYTE PTR [ESI],20H JBE APPLCMD1 ; NO ALIAS ; ; COPY ALIAS TO COMMAND BUFFER, THEN REENTER COMMAND HANDLER ; PUSH EDI ; REPLY BUFFER PTR MOV EDI,OFFSET32 COMMANDBUFFER MOV ECX,ALIASLEN REP MOVSB JMP REDOCOMMAND PUBLIC APPLCMD1 APPLCMD1: MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX JMP SHORT SKIPBBS PUBLIC BBSCONNECT BBSCONNECT: ; ; Convert to an APPL command, so any alias is actioned ; SEE IF THERE IS AN ALIAS DEFINDED FOR THIS COMMAND ; MOV EAX, APPLHASALIAS[EDX] OR EAX,EAX JZ NOALIAS MOV ESI,APPLALIASPTR[EDX] CMP BYTE PTR [ESI],20H JBE NOALIAS ; NO ALIAS ; ; COPY ALIAS TO COMMAND BUFFER, THEN REENTER COMMAND HANDLER ; PUSH EDI ; REPLY BUFFER PTR ; MOV EDI,OFFSET32 COMMANDBUFFER MOV ECX,ALIASLEN REP MOVSB JMP REDOCOMMAND NOALIAS: ; ; LOOK FOR A FREE HOST SESSION ; MOV CMDPTR,OFFSET32 APPL1 MOV EAX,1 MOV ECX,MAXAPPLS @@: TEST APPLMASK,EAX JNZ SHORT @F ADD CMDPTR,TYPE CMDX SHL EAX,1 LOOP @B @@: PUBLIC SKIPBBS SKIPBBS: MOV AX,CMDPACLEN CALL ATTACHTOBBS JZ SHORT BBSCOK ; SESSION FOUND ; ; NO PORTS AVAILABLE ; or edx,edx jz @f ; Appl not running MOV ESI,OFFSET32 NOFREEPORTS MOV EDI,CONNECTREPLYPTR MOV ECX,11 REP MOVSB ; ; ADD APPL NAME ; PUSH ESI MOV ESI,CMDPTR CMP WORD PTR [ESI],'**' JNE SHORT BUSYLOOP ; ; MUST BE HOST PORT ; MOV ESI,OFFSET32 HOSTBUSYMSG PUBLIC BUSYLOOP BUSYLOOP: LODSB STOSB CMP AL,' ' JNE SHORT BUSYLOOP POP ESI MOV ECX,NOFREEPORTSLEN-11 REP MOVSB JMP MSGDONE @@: MOV ESI,OFFSET32 NOPORTS MOV EDI,CONNECTREPLYPTR MOV ECX,19 REP MOVSB ; ; ADD APPL NAME ; PUSH ESI MOV ESI,CMDPTR CMP WORD PTR [ESI],'**' JNE SHORT @F ; ; MUST BE HOST PORT ; MOV ESI,OFFSET32 HOSTBUSYMSG @@: LODSB STOSB CMP AL,' ' JNE SHORT @B POP ESI MOV ECX,NOPORTSLEN-19 REP MOVSB PUBLIC MSGDONE MSGDONE: MOV EBX,CONNECTSESSION ; JMP SENDCOMMANDREPLY ; PUBLIC BBSCOK BBSCOK: ; ; IF CMD_TO_APPL SET IN APPLFLAGS, SEND INPUT MSG TO APPL ; TEST SAVEDAPPLFLAGS,CMD_TO_APPL JZ SHORT DONTSENDCMD CALL GETBUFF JZ SHORT DONTSENDCMD ; CANT DO MUCH ELSE PUSH EDI ADD EDI,8 ; SKIP DATA MOV ESI,OFFSET32 COMMANDBUFFER MOV ECX,72 REP MOVSB MOV AL,0DH STOSB POP EDI MOV MSGLENGTH[EDI],81 PUSH EBX MOV EBX,L4CROSSLINK[EBX] ; TO HOST SESSION LEA ESI,L4TX_Q[EBX] CALL _Q_ADD CALL _POSTDATAAVAIL POP EBX PUBLIC DONTSENDCMD DONTSENDCMD: ; ; IF MSG_TO_USER SET, SEND 'CONNECTED' MESSAGE TO USER ; MOV AL,SAVEDAPPLFLAGS MOV SESS_APPLFLAGS[EBX],AL ; SAVE IN SESSION ENTRY TEST AL,MSG_TO_USER JNZ SHORT SENDCMDMSG ; ; DONT NEED BUFFER ANY MORE ; MOV EDI,REPLYBUFFER CALL RELBUFF RET PUBLIC SENDCMDMSG SENDCMDMSG: MOV ESI,OFFSET32 CONNECTEDMSG MOV ECX,LCONNECTEDMSG MOV EDI,CONNECTREPLYPTR REP MOVSB ; ; ADD BBS CALL, OR APPL ; MOV ESI,OFFSET32 _APPLS MOV EAX,1 MOV ECX,MAXAPPLS PUBLIC GETAPPL GETAPPL: TEST APPLMASK,EAX JNZ SHORT GOTAPPL ADD ESI,TYPE CMDX SHL EAX,1 LOOP GETAPPL PUBLIC BBSCOK01 BBSCOK01: MOV ESI,OFFSET32 APPLCALLTABLE LEA ESI,APPLALIAS_TEXT[EDI] ; BBS ALIAS PUBLIC GOTAPPL GOTAPPL: CMP WORD PTR [ESI],'**' JNE SHORT NOTHOST ; ; MUST BE HOST PORT ; MOV ESI,OFFSET32 HOSTBUSYMSG PUBLIC NOTHOST NOTHOST: CALL COPYTOSPACE MOV AL,0DH STOSB JMP SENDCOMMANDREPLY PUBLIC COPYTOSPACE COPYTOSPACE: LODSB CMP AL,20H JBE SHORT BBSCOK03 STOSB JMP COPYTOSPACE PUBLIC BBSCOK03 BBSCOK03: RET PUBLIC CMDSTATS CMDSTATS: MOV AL,0DH STOSB ; ; SEE IF ANY PARAM ; CALL SCAN LODSB MOV NSTAR,AL ; ; IF ASKING FOR PORT STATS, DONT DO SYSTEM ONES ; CMP AL,' ' JE SHORT DOSYSSTATS CMP AL,'S' JE SHORT DOSYSSTATS MOV ESI,OFFSET32 L2STATS JMP SHORT DOREST PUBLIC DOSYSSTATS DOSYSSTATS: ; Pass the Uptime to FormatUptime to display dd hh mm push STATSTIME call _FormatUptime add esp,4 mov esi,eax mov ecx,STATSLEN + 10 REP MOVSB MOV ESI,OFFSET32 SEMSTATS PUBLIC CMDST00 CMDST00: CMP BYTE PTR [ESI],0 JE SHORT CMDST15 ; DO PORT STATS CALL CHECKBUFFER MOV ECX,STATSLEN REP MOVSB LODSB ; COUNT OF NUMBERS TO PROCESS CBW MOV CX,AX PUBLIC CMDST05 CMDST05: LODSD CALL CONVTO10DIGITS ; DISPLAY COUNTERS LOOP CMDST05 MOV AL,0DH STOSB JMP CMDST00 ; ; DO ONES STORED BY PORT ; PUBLIC CMDST15 CMDST15: INC ESI CMP NSTAR,'S' ; SYSTEM STATS ONLY JNE SHORT DOREST JMP SENDCOMMANDREPLY PUBLIC DOREST DOREST: ; ; PORT NUMBERS ; PUSH EBX MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS CMP NSTAR,' ' JE SHORT CMDST17 ; ; POSITION TO REQUESTED PORT ; MOV AL,NSTAR AND AL,0FH PUBLIC GETFIRSTPORT GETFIRSTPORT: CMP AL,PORTNUMBER[EBX] JE SHORT GOTFIRSTPORT MOV EBX,PORTPOINTER[EBX] LOOP GETFIRSTPORT ; ; REQUESTED PORT NOT FOUND ; POP EBX JMP SENDCOMMANDREPLY PUBLIC GOTFIRSTPORT GOTFIRSTPORT: CMP CL,7 JBE SHORT CMDST17 MOV CL,7 ; LIMIT TO 7 ENTRIES PUBLIC CMDST17 CMDST17: MOV STATCMDCOUNT,ECX MOV STATCMDPTR,EBX PUSH ECX MOV AL,20H MOV ECX,16 REP STOSB POP ECX PUSH ESI PUBLIC CMDST17A CMDST17A: PUSH ECX MOV ESI,OFFSET32 PORT MOV ECX,6 REP MOVSB POP ECX MOV AL,PORTNUMBER[EBX] CALL CONVTODIGITS ; CONVERT AL TO DECIMAL DIGITS MOV EBX,PORTPOINTER[EBX] LOOP CMDST17A MOV AL,0DH STOSB POP ESI POP EBX MOV ECX,PORTSTATS-1 PUBLIC CMDST20 CMDST20: CALL CHECKBUFFER PUSH EBX PUSH ECX MOV ECX,L2STATSLEN REP MOVSB MOV EBX,STATCMDPTR MOV ECX,STATCMDCOUNT PUBLIC CMDST30 CMDST30: PUSH EBX ADD EBX,[ESI] ; TO COUNTER MOV EAX,[EBX] POP EBX CALL CONVTO10DIGITS ; DISPLAY COUNTERS MOV EBX,PORTPOINTER[EBX] LOOP CMDST30 ADD ESI,4 POP ECX POP EBX MOV AL,0DH STOSB LOOP CMDST20 ; DO LINK LOADS ; CALL CHECKBUFFER PUSH EBX MOV ECX,L2STATSLEN REP MOVSB MOV EBX,STATCMDPTR MOV ECX,STATCMDCOUNT PUBLIC CMDST80 CMDST80: PUSH EBX ADD EBX,[ESI] ; TO COUNTER MOV AX,2020H STOSW MOV AL,[EBX] CALL CONVTODIGITS ; DISPLAY COUNTERS MOV AL,20H STOSB MOV AL,1[EBX] CALL CONVTODIGITS ; DISPLAY COUNTERS POP EBX MOV EBX,PORTPOINTER[EBX] LOOP CMDST80 POP EBX MOV AL,0DH STOSB PUBLIC SKIPREST SKIPREST: JMP SHORT SENDCOMMANDREPLY PUBLIC SENDCOMMANDREPLY SENDCOMMANDREPLY: MOV ECX,EDI MOV EDI,REPLYBUFFER SUB ECX,EDI CMP ECX,8 ; NULL PACKET JE SHORT RELEASE MOV MSGLENGTH[EDI],CX ; LEA ESI,L4TX_Q[EBX] ; LINK TX QUEUE CALL _Q_ADD CALL _POSTDATAAVAIL RET PUBLIC RELEASE RELEASE: CALL RELBUFF RET PUBLIC CHECKBUFFER CHECKBUFFER: ; ; MAKE SURE THERE IS ROOM IN CURRENT BUFFER ; MOV EAX,EDI SUB EAX,REPLYBUFFER CMP AX,CMDPACLEN JAE SHORT NEWBUFFER CMP AX,156 JB SHORT CHECKBUFFRET ; ENOUGH LEFT ; PUBLIC NEWBUFFER NEWBUFFER: ; ; END OF BUFFER - QUEUE IT AND GET ANOTHER ; PUSH ESI PUSH ECX CALL SENDCOMMANDREPLY ; ; GET BUFFER ; CALL GETBUFF JNZ SHORT CHECKBUFFER10 ; OK ; ; NO BUFFERS - ABORT ; MOV ESP,CMDSTACKP ; RESET STACK TO ENTRY VALUE RET PUBLIC CHECKBUFFER10 CHECKBUFFER10: MOV REPLYBUFFER,EDI ; ; SET UP HEADER ; LEA EDI,7[EDI] ; SKIP HEADER MOV AL,0F0H STOSB ; PID POP ECX POP ESI PUBLIC CHECKBUFFRET CHECKBUFFRET: RET PUBLIC CMDT00 CMDT00: ; ; SET L4 TIMEOUT FOR CONNECTS ON THIS SESSION ; CALL GETVALUE ; EXTRACT NUMBER ; JC SHORT CMDT99 ; DUFF PARAM OR AX,AX JZ SHORT CMDT50 ; DISPLAY VALUE MOV SESSIONT1[EBX],AX ; SAVE ; ; DISPLAY VALUE ; PUBLIC CMDT50 CMDT50: MOV ESI,OFFSET32 T4MSG MOV ECX,T4MSGLEN REP MOVSB MOVZX EAX,SESSIONT1[EBX] CALL CONVBIGNUMBER MOV AL,0DH STOSB JMP SENDCOMMANDREPLY PUBLIC CMDT99 CMDT99: ; MOV ESI,OFFSET32 BADVALUEMSG MOV ECX,BADVALLEN REP MOVSB JMP SENDCOMMANDREPLY PUBLIC CMDPAC CMDPAC: ; ; SET PACLEN FOR THIS SESSION ; CALL GETVALUE ; EXTRACT NUMBER ; JC SHORT CMDPAC99 ; DUFF PARAM OR AX,AX JZ SHORT CMDPAC50 ; DISPLAY VALUE CMP AL,30 JB SHORT CMDPAC99 MOV SESSPACLEN[EBX],AL ; SAVE ; ; DISPLAY VALUE ; PUBLIC CMDPAC50 CMDPAC50: MOV ESI,OFFSET32 PACMSG MOV ECX,PACMSGLEN REP MOVSB MOVZX EAX,SESSPACLEN[EBX] CALL CONVBIGNUMBER MOV AL,0DH STOSB JMP SENDCOMMANDREPLY PUBLIC CMDPAC99 CMDPAC99: ; MOV ESI,OFFSET32 BADVALUEMSG MOV ECX,BADVALLEN JMP SHORT DOERR PUBLIC MHDISABLE MHDISABLE: MOV ESI,OFFSET32 MHDISMSG MOV ECX,MHDISLEN JMP SHORT DOERR PUBLIC MHERR MHERR: MOV ESI,OFFSET32 MHERRMSG MOV ECX,MHERRLEN PUBLIC DOERR DOERR: REP MOVSB JMP SENDCOMMANDREPLY PUBLIC MHCMD MHCMD: ; ; DISPLAY HEARD LIST ; CALL GETVALUE ; EXTRACT NUMBER ; JC SHORT MHERR ; DUFF PARAM OR AL,AL JE SHORT MHERR ; PORT ZERO PUSH EAX PUSH EBX CALL GETPORTTABLEENTRY MOV ESI,EBX POP EBX POP EAX CMP AL,PORTNUMBER[ESI] JNE SHORT MHERR ; INVALID PUSH ESI MOV ESI,OFFSET32 MHHDDR MOV ECX,20 REP MOVSB POP ESI CALL CONV_DIGITS ; PORT NUM MOV AL,0DH STOSB MOV ESI,PORTMHEARD[ESI] CMP ESI,0 JE SHORT MHDISABLE ; NOT ON THIS PORT MOV ECX,MHENTRIES PUBLIC MHLOOP MHLOOP: CMP BYTE PTR [ESI],0 JE SHORT MHEND CALL CHECKBUFFER PUSH ECX PUSH ESI PUSH EDI CALL CONVFROMAX25 ; CONVERT CALL TO NORMAL POP EDI MOV ESI,OFFSET32 NORMCALL MOV EDX,ECX ; SAVE LEN REP MOVSB POP ESI MOV AL,MHDIGI[ESI] STOSB PUBLIC MHPAD MHPAD: CMP EDX,10 JAE SHORT DOTIME MOV AL,20H STOSB INC EDX JMP SHORT MHPAD PUBLIC DOTIME DOTIME: ; ; DO TIME ; push esi push edi PUSH ESI call _FormatMH mov esi, eax add esp,4 pop edi @@: lodsb or al,al jz @f stosb jmp @B @@: pop esi POP ECX ADD ESI,TYPE MHSTRUC LOOP MHLOOP PUBLIC MHEND MHEND: JMP SENDCOMMANDREPLY APRSMHCMD: ; ; DISPLAY APRES HEARD LIST ; mov al, 13 stosb MOV ESI,_MHDATA MOV ECX,_MAXHEARDENTRIES AMHLOOP: CMP DWORD PTR [ESI],0 JE SHORT AMHEND CALL CHECKBUFFER push ecx push esi push edi PUSH ESI call _FormatAPRSMH mov esi, eax add esp,4 pop edi @@: lodsb or al,al jz @f stosb jmp @B @@: pop esi POP ECX ADD ESI, _MHLEN LOOP AMHLOOP AMHEND: JMP SENDCOMMANDREPLY PUBLIC RADIOCMD EXTERN _Rig_Command@8:NEAR RADIOCMD: ; Send a command over the Rig Control Interface MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX push EBX push esi MOVZX EAX, CIRCUITINDEX[EBX] PUSH ESI ; Command PUSH EAX ; Srream CALL _Rig_Command@8 pop esi POP EBX or eax,eax jnz @F ; OK ; Error Message is in buffer MOV CONNECTREPLYPTR,EDI ; SAVE POINTER CPloop: lodsb stosb cmp al, 13 jne CPloop JMP SENDCOMMANDREPLY @@: MOV EDI,REPLYBUFFER CALL RELBUFF ret PUBLIC ATTACHCMD ATTACHCMD: ; ; ATTACH to a PACTOR or similar port ; MOV CONNECTREPLYPTR,EDI ; SAVE POINTER MOV CONNECTSESSION,EBX CALL GETVALUE ; EXTRACT NUMBER ; JC ATTERR ; DUFF PARAM OR AL,AL JE ATTERR ; PORT ZERO mov CMDTAIL,esi ; save command PUSH EAX PUSH EBX CALL GETPORTTABLEENTRY MOV ESI,EBX POP EBX POP EAX CMP AL,PORTNUMBER[ESI] JNE ATTERR ; INVALID CMP PROTOCOL[ESI], 10 JNE ATTERR ; INVALID MOV AL,PORTPACLEN[ESI] MOV ATTPACLEN,AL ; See if TNC is OK PUSHAD MOV EBX,ESI MOV EAX,0 ; Channel if KAM CALL PORTTXCHECK[EBX] ; mov SAVETNCSTATE, AH ; Save for Free but Disconnecting Test OR AH,AH JNZ @F ; TNC is OK POPAD MOV ESI,OFFSET32 ATTERRMSG2 ; Not Initialised MOV ECX,ATTERRLEN2 REP MOVSB JMP SENDCOMMANDREPLY @@: POPAD mov eax, CMDTAIL cmp byte ptr 2[eax], ' ' je @f ; Not "Attach and Call" jmp short attpactor @@: movzx eax, byte ptr[eax] cmp eax, ' ' je short attpactor ; ; Only Allow Attach VHF from Secure Applications or if PERMITGATEWAY is set ; CMP PERMITGATEWAY[ESI],1 JE @F ; OK TEST Authorised_Session[EBX], 1 JNZ short @f MOV ESI,OFFSET32 ATTERRMSG3 ; Not Allowed MOV ECX,ATTERRLEN3 REP MOVSB JMP SENDCOMMANDREPLY @@: sub al, '@' jc ATTERR cmp EAX, MAXHOSTMODESESSIONS[EBX] jae ATTERR shl eax,2 jmp @f attpactor: mov eax,0 ; pactor/winmor TEST SAVETNCSTATE,80H ; Disconnecting JNZ ATTBUSY CMP PORTINTERLOCK[ESI], 0 JE @F ; ; Check Interlocked Ports mov al, PORTINTERLOCK[ESI] CALL CHECKINTERLOCK JZ @F ; Interlocked port is busy MOV ESI,OFFSET32 ATTERRMSG4 ; In Use MOV ECX,ATTERRLEN4 REP MOVSB JMP SENDCOMMANDREPLY ; @@: CMP ATTACHEDSESSIONS[ESI][EAX],0 JE @F ATTBUSY: MOV ESI,OFFSET32 ATTERRMSG1 ; In Use MOV ECX,ATTERRLEN1 REP MOVSB JMP SENDCOMMANDREPLY @@: ; ; GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK ; PUSH EAX CALL GETFREECIRCUIT ; GET AN ENTRY POP EAX JNZ CMDC97 ; TABLES FULL MOV ATTACHEDSESSIONS[ESI][EAX], EBX SHR EAX, 2 MOV KAMSESSION[EBX],AL; // Session Number on KAM Host Mode TNC PUSH ESI MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT MOVZX EDX,ATTPACLEN ; Paclen for Outgoing port or EDX,EDX jnz @F mov EDX, 256 @@: MOVZX EAX,SESSPACLEN[ESI] ; Incoming PACLEN ; Should set paclen to lower of incoming and outgoing or EAX,EAX jnz @F mov EAX, 256 ; 0 = 256 @@: cmp EAX,EDX jb @F mov eax,edx @@: MOV SESSPACLEN[ESI],AL MOV SESSPACLEN[EBX],AL MOV L4CROSSLINK[EBX],ESI ; POINTER FROM NEW TO OLD MOV L4CROSSLINK[ESI],EBX ; POINTER FROM OLD TO NEW LEA ESI,L4USER[ESI] LEA EDI,L4USER[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV ESI,CONNECTSESSION ; INCOMING CIRCUIT LEA ESI,L4MYCALL[ESI] LEA EDI,L4MYCALL[EBX] MOV ECX,7 REP MOVSB ; PUT IN CALL ; MOV CIRCUITINDEX[EBX],DL ; OUR INDEX MOV AL,_NEXTID MOV CIRCUITID[EBX],AL ; OUR ID CALL INC_ID MOV ESI,CONNECTSESSION MOV AX,SESSIONT1[ESI] ; CALLERS TIMEOUT MOV SESSIONT1[EBX],AX ; NET SESSION TIMEOUT MOV AL,_L4DEFAULTWINDOW MOV L4WINDOW[EBX],AL MOV L4STATE[EBX],5 POP ESI ; PORT MOV L4TARGET[EBX], ESI MOV L4CIRCUITTYPE[EBX],DOWNLINK+PACTOR mov esi, CMDTAIL cmp byte ptr 2[esi], ' ' JE SHORT NoCall ; CANT DO MUCH ELSE ; if attach and call, CALL GETBUFF JZ SHORT NoCall ; CANT DO MUCH ELSE PUSH EDI ; Stream Number for KAM is in KAMSESSION MOV 4[EDI],0 MOV EBX,L4TARGET[EBX] ; PORT ENTRY ADD EDI,7 mov al,0f0h stosb mov al, 'C' stosb mov al, ' ' stosb mov esi, CMDTAIL mov ECX,10 @@: lodsb cmp al, ' ' je @f stosb loop @b @@: mov al,13 stosb mov ecx,edi pop edi sub ecx,edi MOV MSGLENGTH[EDI],CX LEA ESI,PORTTX_Q[EBX] CALL _Q_ADD NoCall: MOV EDI,CONNECTREPLYPTR MOV EBX,CONNECTSESSION MOV ESI,OFFSET32 OKMSG MOV ECX,3 REP MOVSB JMP SENDCOMMANDREPLY ATTERR: MOV ESI,OFFSET32 ATTERRMSG MOV ECX,ATTERRLEN REP MOVSB JMP SENDCOMMANDREPLY CHECKINTERLOCK: ; ; See if any Interlocked ports are Busy ; push ebx MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS CHKINTL: CMP ESI,EBX JE @F ; Our Port CMP AL,PORTINTERLOCK[EBX] JNE @F ; ; Same Group - is it busy ; CMP ATTACHEDSESSIONS[EBX],0 JE @F ; OK OR AL,1 POP EBX RET @@: MOV EBX,PORTPOINTER[EBX] LOOP CHKINTL XOR AL,AL ; Set zero pop EBX RET PUBLIC GETVALUE GETVALUE: ; ; EXTRACT DECIMAL VALUE FROM COMMAND ; PUSH EBX MOV VALUE,0 CALL SCAN JE SHORT ENDVALUE ; NO NUMBER ; ; PROCESS NEXT DIGIT ; PUBLIC VALLOOP VALLOOP: LODSB CMP AL,' ' JE SHORT ENDVALUE CMP AL,0DH JE SHORT ENDVALUE ; ; ANOTHER DIGIT - MULTIPLY BY 10 ; MOV BL,AL MOV AX,VALUE MUL W10 MOV VALUE,AX SUB BL,'0' JC SHORT BADVALUE CMP BL,10 JNC SHORT BADVALUE MOV BH,0 ADD VALUE,BX JMP SHORT VALLOOP PUBLIC ENDVALUE ENDVALUE: POP EBX MOV AX,VALUE CLC RET PUBLIC BADVALUE BADVALUE: POP EBX STC RET ; CARRY=DUFF PUBLIC GETVALUEHEX GETVALUEHEX: ; ; EXTRACT NUMBER (HEX) FROM INPUT STRING ; PUSH EBX MOV HEXVALUE,0 CALL SCAN JE SHORT ENDVALUEHEX ; NO NUMBER ; PUBLIC HEXLOOP HEXLOOP: LODSB CMP AL,' ' JE SHORT ENDVALUEHEX ; ; ANOTHER DIGIT - MULTIPLY BY 16 ; MOV EAX,HEXVALUE SHL EAX,4 MOV HEXVALUE,EAX MOVZX EAX,BYTE PTR ES:-1[ESI] SUB al,'0' JC SHORT BADVALUE CMP AL,10 JC SHORT HEXOK SUB AL,7 CMP AL,10 JC SHORT BADVALUE CMP AL,16 JNC SHORT BADVALUE PUBLIC HEXOK HEXOK: ADD HEXVALUE,EAX JMP SHORT HEXLOOP PUBLIC ENDVALUEHEX ENDVALUEHEX: POP EBX MOV EAX,HEXVALUE CLC RET ;-----------------------------------------------------------------------------; ; Convert byte in AL to nnn, nn or n format ; ;-----------------------------------------------------------------------------; PUBLIC CONV_DIGITS CONV_DIGITS: MOV AH,0 PUBLIC CONV_5DIGITS CONV_5DIGITS: PUSH EDX PUSH EBX MOV EBX,OFFSET32 TENK ; 10000 CMP AX,10 JB SHORT UNITS ; SHORT CUT AND TO STOP LOOP PUBLIC START_LOOP START_LOOP: cmp AX,WORD PTR [EBX] JAE SHORT STARTCONV ADD EBX,4 ; DWORD ENTRIES JMP SHORT START_LOOP ; PUBLIC STARTCONV STARTCONV: MOV DX,0 DIV WORD PTR [EBX] ; ADD AL,30H ; MUST BE LESS THAN 10 STOSB ; MOV AX,DX ; REMAINDER ADD EBX,4 CMP EBX,OFFSET32 DWORD10+4 ; JUST DIVIDED BY 10? JNE SHORT STARTCONV ; NO, SO ANOTHER TO DO ; ; RESET MUST BE UNITS ; PUBLIC UNITS UNITS: add AL,30H stosb POP EBX POP EDX ret PUBLIC CONVTODIGITS CONVTODIGITS: ; ; CONVERT AL TO 3 DECIMAL DIGITS AT [EDI] ; MOV AH,0 DIV D10 ADD AH,30H MOV 2[EDI],AH MOV AH,0 DIV D10 ADD AH,30H MOV 1[EDI],AH ADD AL,30H MOV [EDI],AL CMP WORD PTR [EDI],'00' JNE SHORT CONVTOD00 MOV WORD PTR [EDI],' ' ; CONVERT LEADING ZEROS TO SPACES JMP SHORT CONVTOD20 PUBLIC CONVTOD00 CONVTOD00: CMP BYTE PTR [EDI],'0' JNE SHORT CONVTOD20 MOV BYTE PTR [EDI],' ' ; CONVERT LEADING ZEROS TO SPACES PUBLIC CONVTOD20 CONVTOD20: ADD EDI,3 RET PUBLIC CONVBIGNUMBER CONVBIGNUMBER: MOV SUPPRESS,1 ; ZERO SUPRESS; JMP SHORT DEC000 ; ; THIS ROUTINE CONVERTS A 32 BIT BINARY NUMBER IN EAX ; TO PRINTABLE DECIMAL CHARS ; PUBLIC CONVTO10DIGITS CONVTO10DIGITS: MOV SUPPRESS,0 PUBLIC DEC000 DEC000: PUSH EBX PUSH ESI PUSH ECX MOV CONVFLAG,0 MOV ECX,8 MOV DWORD PTR ACCUM,EAX MOV ESI,OFFSET32 POWERS ; LOW ORDER OF FIRST PUBLIC DEC010 DEC010: MOV BL,0 ; LOOP COUNT FOR SUBTRACT PUBLIC DEC020 DEC020: CALL SUB4 JC SHORT DEC030 ; TOO SMALL INC BL ; NUMBER OF SUBTRACTS JMP SHORT DEC020 ; PUBLIC DEC030 DEC030: CALL ADD4 ; PUT BACK MOV AL,BL ADD AL,'0' ; TO CHARACTER FORM TEST CONVFLAG,1 JNZ SHORT DEC040 ; ALREADY HAVE A SIGNIFICANT CHAR CMP AL,'0' ; IS IT A ZERO JE SHORT DEC036 ; YES, SO CHANGE TO SPACE OR CONVFLAG,1 ; SET NON-ZERO CHAR FOUND JMP SHORT DEC040 ; AND PRINT IT ; PUBLIC DEC036 DEC036: CMP SUPPRESS,1 JE SHORT DEC044 ; SUPPRESS LEADING SPACES MOV AL,' ' PUBLIC DEC040 DEC040: STOSB PUBLIC DEC044 DEC044: ADD ESI,4 LOOP DEC010 MOV AL,ACCUM ; REMAINDER ADD AL,'0' STOSB ; PRINT IT ; POP ECX POP ESI POP EBX RET ; ; ROUTINE TO ADD TWO 4 BYTE NUMBERS ; ; PUBLIC ADD4 ADD4: MOV AL,[ESI] ADD ACCUM,AL MOV AL,[ESI+1] ADC ACCUM+1,AL MOV AL,[ESI+2] ADC ACCUM+2,AL MOV AL,[ESI+3] ADC ACCUM+3,AL RET ; ; ROUTINE TO SUBTRACT TWO 4 BYTE NUMBERS ; ; PUBLIC SUB4 SUB4: MOV AL,[ESI] SUB ACCUM,AL MOV AL,[ESI+1] SBB ACCUM+1,AL MOV AL,[ESI+2] SBB ACCUM+2,AL MOV AL,[ESI+3] SBB ACCUM+3,AL RET PUBLIC SCAN SCAN: MOV ECX,10 ; DONT LOOK TOO FAR! PUBLIC SCAN1 SCAN1: CMP BYTE PTR [ESI],20H JNE SHORT SCANRET INC ESI LOOP SCAN1 XOR AL,AL ; RETURN Z PUBLIC SCANRET SCANRET: RET ; PUBLIC B2HEX B2HEX: PUSH EAX SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 CALL B1HEX POP EAX PUBLIC B1HEX B1HEX: AND AL,0FH CMP AL,10 JB SHORT B1HEX2 ADD AL,7 PUBLIC B1HEX2 B1HEX2: ADD AL,30H STOSB RET PUBLIC _SETUPNODEHEADER _SETUPNODEHEADER: MOV ESI,OFFSET32 _MYCALL CALL DECODENODENAME ; REP MOVSB MOV AL,HEADERCHAR STOSB MOV AL,20H STOSB RET PUBLIC DECODENODENAME DECODENODENAME: ; ; ESI = TABLE ENTRY WITH AX25 CALL AND ALIAS ; ; RETURNS ESI = 20 BYTE DECODED NAME IN FORM ALIAS:CALL ; ECX = LENGTH OF STRING ; PUSH EDI MOV EDI,OFFSET32 DECODEDNAME MOV ECX,10 MOV AX,' ' REP STOSW ; CLEAR IT CALL CONVFROMAX25 PUSH ECX ; SAVE CALL LENGTH MOV EDI,OFFSET32 DECODEDNAME cmp BYTE PTR [ESI],20H ; Does it start with a null or a space ? jbe SHORT NO_MNEMONIC MOV ECX,6 ; MAX LENGTH PUBLIC DECODEN10 DECODEN10: LODSB CMP AL,' ' JE SHORT DECODEN20 STOSB LOOP DECODEN10 PUBLIC DECODEN20 DECODEN20: MOV AL,':' STOSB PUBLIC NO_MNEMONIC NO_MNEMONIC: POP ECX MOV ESI,OFFSET32 NORMCALL REP MOVSB MOV ECX,EDI POP EDI MOV ESI,OFFSET32 DECODEDNAME SUB ECX,ESI RET PUBLIC PRINTNUM PRINTNUM: MOV AH,0 DIV D10 OR AX,3030H STOSW RET IF BLACKBITS PUBLIC CHECKBLACKLIST PUBLIC CHECKBLACKLIST CHECKBLACKLIST: PUSH EDI MOV EDI,OFFSET32 BLACKLIST PUBLIC BCHECKLOOP BCHECKLOOP: CMP BYTE PTR [EDI],0 JE SHORT NOTBLACKED ; END OF LIST PUSH ECX PUSH ESI PUSH EDI MOV ECX,6 REP CMPSB POP EDI POP ESI POP ECX JZ SHORT BLACKED ADD EDI,7 ; TO NEXT ENTRY JMP SHORT BCHECKLOOP PUBLIC NOTBLACKED NOTBLACKED: OR AL,1 PUBLIC BLACKED BLACKED: POP EDI RET ENDIF ; PUBLIC WARMSTART,COLDSTART PUBLIC SENDNODES SENDNODES: PUSH EBX PUSH EDI ; CALL SENDNODESMSG POP EDI POP EBX JMP SENDOK PUBLIC PWDCMD PWDCMD: ; ; REQUEST PASSWORD OR SYSOP AUTHORITY ; CALL SCAN ; TEST L4CIRCUITTYPE[EBX],BPQHOST CMP Authorised_Session[EBX],0 JNZ PASSOK ; HOST - SET AUTHORISED REGARDLESS CMP BYTE PTR [ESI],20H JNE SHORT CHECKPASS ; PASSWORD SUPPLIED ; ; SEND PASSWORD PROMPT ; MOV DX,0 ; CHECKSUM OF VALUE SENT MOV ESI,OFFSET32 RAN1 MOV ECX,5 PUBLIC RANLOOP RANLOOP: LODSB PUSH ECX CALL PWCHR POP ECX PUSH EBX MOV EBX,OFFSET32 _PWTEXT-1 MOVZX EAX,AL ADD EBX,EAX MOV AL,[EBX] ; CHARACTER EQUIVALENT POP EBX ADD DL,AL ADC DH,0 MOV AL,20H STOSB LOOP RANLOOP MOV AL,0DH STOSB MOV PASSWORD[EBX],DX JMP SENDCOMMANDREPLY PUBLIC PWCHR PWCHR: ; ; LIMIT NUMBER IN A TO RANGE 1 - PW LENGTH ; CMP _PWLEN,0 JE SHORT NOPW ; PASSWORD NOT SET PUBLIC PWL000 PWL000: OR AL,AL JZ SHORT TOOLOW SUB AL,_PWLEN JZ SHORT TOOLOW JNC SHORT PWL000 ; LOOP TILL -VE OR ZERO PUBLIC TOOLOW TOOLOW: ADD AL,_PWLEN PUBLIC NOPW1 NOPW1: PUSH EAX MOV AH,0 DIV D10 ADD AX,3030H STOSW POP EAX ; RETURN NUMBER ; RET PUBLIC NOPW NOPW: MOV AL,1 JMP SHORT NOPW1 PUBLIC CHECKPASS CHECKPASS: MOV DX,0 MOV ECX,5 CHECKLOOP: LODSB ADD DL,AL ADC DH,0 LOOP CHECKLOOP CMP PASSWORD[EBX],DX JNE SHORT DUFFPW PUBLIC PASSOK PASSOK: MOV PASSWORD[EBX],0FFFFH ; SET AUTHORISED MOV Authorised_Session[EBX],1 PUBLIC SENDOK SENDOK: MOV ESI,OFFSET32 OKMSG MOVSW MOVSB JMP SENDCOMMANDREPLY PUBLIC DUFFPW DUFFPW: JMP NOREPLY PUBLIC DISPCLOCK DISPCLOCK: ; ; DISPLAY OR SET RTC ; push 0 call _time add esp,4 MOV EDX,0 DIV DWORD PTR D86400 ; REMAINDER IS SECS IN DAY MOV EAX,EDX MOV EDX,0 DIV DWORD PTR D3600 ; GIVES HOURS, REM = SECS MOV CL,AL ; SAVE MOV EAX,EDX MOV EDX,0 DIV DWORD PTR D60 ; GIVES MINS, REM = SECS MOV CH,AL MOV AL,CL ; HOURS CALL PRINTNUM MOV AL,':' STOSB MOV AL,CH CALL PRINTNUM ; JMP SENDCOMMANDREPLY PUBLIC VALNODES VALNODES: MOV VALNODESFLAG,1 JMP SHORT PORTVAL PUBLIC EXTPORTVAL EXTPORTVAL: MOV EXTONLY,1 PUBLIC PORTVAL PORTVAL: ; ; PROCESS PORT VALUE COMMANDS ; ; ESI = COMMAND STRING ; EDI = REPLY BUFFER ; EBX = SESSION ; PUSH EBX ; SAVE SESSION CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC PBADVALUE ; INVALID DIGITS MOV PORTNO,AL ; SAVE PORT NUMBER MOV EBX,PORTTABLE MOVZX ECX,NUMBEROFPORTS PUBLIC FINDPORT FINDPORT: CMP AL,PORTNUMBER[EBX] JE SHORT PORTOK MOV EBX,PORTPOINTER[EBX] LOOP FINDPORT MOV ESI,OFFSET32 BADPORT JMP ERRCOM PUBLIC PORTOK PORTOK: CMP VALNODESFLAG,1 JE SHORT DISPVALNODES CMP EXTONLY,0 JE SHORT NOEXTCHK ; ; MAKE SURE THIS IS AN EXT PORT ; MOV EXTONLY,0 CMP PORTTYPE[EBX],10H ; EXTERNAL? JE SHORT NOEXTCHK ; YES MOV ESI,OFFSET32 NOTEXTPORT JMP ERRCOM PUBLIC NOEXTCHK NOEXTCHK: CALL SCAN CMP BYTE PTR [ESI],20H JBE DISPVAL ; DISPLAY ONLY CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC SHORT PBADVALUE ; INVALID DIGITS MOV CL,0 CALL KEYDISP ; DISPLAY KEYWORD WAS MOV ESI,CMDPTR ; ADDR OF CMD ENTRY MOV ESI,CMDFLAG[ESI] ; ADDR OF FLAG MOV AH,[ESI][EBX] ; GET OLD VALUE MOV AL,BYTE PTR VALUE MOV [ESI][EBX],AL ; SET FLAG MOV AL,AH ; DISPLAY OLD MOV AH,0 JMP VALDISP PUBLIC PBADVALUE PBADVALUE: MOV ESI,OFFSET32 BADMSG PUBLIC ERRCOM ERRCOM: CALL SENDSTRING POP EBX JMP SENDCOMMANDREPLY PUBLIC DISPVALNODES DISPVALNODES: CMP PERMITTEDCALLS[EBX],0 JNE SHORT VALN00 MOV ESI,OFFSET32 NOVALCALLS JMP ERRCOM ; NONE TO DISPLAY PUBLIC VALN00 VALN00: MOV ESI,PERMITTEDCALLS[EBX] PUBLIC VALN10 VALN10: CMP BYTE PTR [ESI],0 JE SHORT VALNRET ; FINISHED MOV EAX,0 CALL CMDR95 ADD ESI,7 JMP VALN10 PUBLIC VALNRET VALNRET: MOV AL,CR CALL SENDCHAR JMP SENDCOMMANDREPLY PUBLIC DISPVALW DISPVALW: MOV ECX,1 CALL KEYDISP MOV ESI,CMDPTR MOV ESI,CMDFLAG[ESI] ; ADDR OF FLAG MOV AX,[ESI][EBX] ; GET VALUE JMP SHORT VALDISP PUBLIC DISPVAL DISPVAL: MOV ECX,1 CALL KEYDISP MOV ESI,CMDPTR MOV ESI,CMDFLAG[ESI] ; ADDR OF FLAG MOV AL,[ESI][EBX] ; GET VALUE MOV AH,0 PUBLIC VALDISP VALDISP: CALL CONV_5DIGITS MOV AL,0DH CALL SENDCHAR POP EBX JMP SENDCOMMANDREPLY PUBLIC KEYDISP KEYDISP: PUSH ECX MOV ESI,CMDPTR MOV ECX,12 ; MAX LENGTH CALL PUTSTRING MOV AL,20H CALL SENDCHAR ; ; IF A PORT PARAM, DISPLAY PORT NO ; CMP EBX,0 JE SHORT NOPORTDISP MOV AL,PORTNO CALL CONV_DIGITS MOV AL,20H CALL SENDCHAR PUBLIC NOPORTDISP NOPORTDISP: MOV ESI,OFFSET32 WAS ; DISPLAY 'was' POP ECX OR CL,CL MOV ECX,5 JZ SHORT KEYDISP12 ; NO MOV ECX,1 ; LEAVE OUT 'WAS' PUBLIC KEYDISP12 KEYDISP12: CALL PUTSTRING RET PUBLIC SWITCHVAL SWITCHVAL: ; ; PROCESS OTHER VALUE COMMANDS ; ; ESI = COMMAND STRING ; EDI = REPLY BUFFER ; EBX = SESSION ; PUSH EBX ; SAVE SESSION MOV EBX,0 ; NO PORT CALL SCAN CMP BYTE PTR [ESI],20H JBE DISPVAL ; DISPLAY ONLY CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JNC SHORT VAL_OK JMP PBADVALUE ; INVALID DIGITS PUBLIC VAL_OK VAL_OK: MOV CL,0 CALL KEYDISP ; DISPLAY KEYWORD WAS MOV ESI,CMDPTR ; ADDR OF CMDX ENTRY MOV ESI,CMDFLAG[ESI] ; ADDR OF FLAG MOV AH,[ESI] ; GET OLD VALUE MOV AL,BYTE PTR VALUE MOV [ESI],AL ; SET FLAG MOV AL,AH ; DISPLAY OLD MOV AH,0 JMP VALDISP PUBLIC SWITCHVALW SWITCHVALW: ; ; PROCESS 16 BIT VALUE COMMANDS ; ; ESI = COMMAND STRING ; EDI = REPLY BUFFER ; EBX = SESSION ; PUSH EBX ; SAVE SESSION MOV EBX,0 ; NO PORT CALL SCAN CMP BYTE PTR [ESI],20H JA SHORT NOTJUSTDISP JMP DISPVALW ; DISPLAY ONLY PUBLIC NOTJUSTDISP NOTJUSTDISP: CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JNC SHORT VAL_OKW JMP PBADVALUE ; INVALID DIGITS PUBLIC VAL_OKW VAL_OKW: MOV CL,0 CALL KEYDISP ; DISPLAY KEYWORD WAS MOV ESI,CMDPTR ; ADDR OF CMDX ENTRY MOV ESI,CMDFLAG[ESI] ; ADDR OF FLAG PUSH [ESI] ; GET OLD VALUE MOV AX,VALUE MOV [ESI],AX ; SET FLAG POP EAX JMP VALDISP IF BLACKBITS PUBLIC DISPBLACKLIST DISPBLACKLIST: PUBLIC BLIST00 BLIST00: CALL SCAN CMP BYTE PTR [ESI],20H JBE SHORT DISPLIST ; DISPLAY ONLY PUSH EDI CMP WORD PTR [ESI],' Z' JNE SHORT UPLIST ; ; CLEAR LIST ; MOV EDI,OFFSET32 BLACKLIST MOV BLACKEND,EDI MOV ECX,70 MOV AL,0 REP STOSB PUBLIC BDISPIT BDISPIT: POP EDI JMP SHORT DISPLIST PUBLIC UPLIST UPLIST: CALL CONVTOAX25 MOV EDI,BLACKEND CMP EDI,OFFSET32 BLACKLIST+70 JE SHORT BDISPIT MOV ESI,OFFSET32 AX25CALL MOV ECX,6 REP MOVSB ADD BLACKEND,7 JMP BDISPIT PUBLIC DISPLIST DISPLIST: MOV ESI,OFFSET32 BLACKLIST PUBLIC BLIST10 BLIST10: CMP BYTE PTR [ESI],0 JE SHORT BLISTRET ; FINISHED MOV EAX,0 CALL CMDR95 ADD ESI,7 JMP BLIST10 PUBLIC BLISTRET BLISTRET: MOV AL,CR CALL SENDCHAR JMP SENDCOMMANDREPLY ENDIF PUBLIC PUTSTRING PUTSTRING: ; ; SEND STRING LENGTH ECX TO NODE ; LODSB CALL SENDCHAR LOOP PUTSTRING RET PUBLIC SENDCHAR SENDCHAR: ; STOSB RET ; ; PUBLIC SENDSTRING SENDSTRING: ; ; SEND STRING TO NODE ; LODSB PUSH EAX CALL SENDCHAR POP EAX CMP AL,0DH JNE SHORT SENDSTRING RET PUBLIC ROUTEUPDATE ROUTEUPDATE: CMP PASSWORD[EBX],0FFFFH JE SHORT GOTPASS JMP PASSERROR PUBLIC GOTPASS GOTPASS: PUSH EBX ; SAVE SESSION PUSH EDI ; SAVE BUFFER CALL CONVTOAX25 CALL SCAN CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC BADROUTECMD ; INVALID DIGITS MOV SAVEPORT,AL CALL SCAN MOV ROUTEDISP,1 CMP BYTE PTR [ESI],20H JE SHORT JUSTDISPLAY MOV ZAPFLAG,0 CMP BYTE PTR [ESI],'Z' JNE SHORT NOTZAP MOV ZAPFLAG,1 JMP SHORT JUSTDISPLAY PUBLIC NOTZAP NOTZAP: MOV ROUTEDISP,2 ; LOCK UPDATE CMP BYTE PTR [ESI],'!' JE SHORT JUSTDISPLAY ; ; LOOK FOR V FOR ADDING A DIGI ; CMP WORD PTR [ESI],' V' ; V [SPACE] JE ADDDIGI CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC SHORT BADROUTECMD ; INVALID DIGITS MOV NEWROUTEVAL,AL MOV ROUTEDISP,0 CALL SCAN ; SEE IF ! MOV AH,[ESI] PUBLIC JUSTDISPLAY JUSTDISPLAY: MOV ESI,OFFSET32 AX25CALL CALL _FINDNEIGHBOUR JZ SHORT FOUNDROUTE ; IN LIST - OK CMP EBX,0 JE SHORT BADROUTECMD ; TABLE FULL?? MOV ECX,7 MOV EDI,EBX REP MOVSB ; PUT IN CALL MOV AL,SAVEPORT MOV NEIGHBOUR_PORT[EBX],AL JMP SHORT FOUNDROUTE PUBLIC BADROUTECMD BADROUTECMD: POP EDI JMP PBADVALUE PUBLIC FOUNDROUTE FOUNDROUTE: CMP ZAPFLAG,1 JNE SHORT NOTCLEARCOUNTS XOR AX,AX MOV ES:WORD PTR NBOUR_IFRAMES[EDI],AX MOV ES:WORD PTR NBOUR_IFRAMES+2[EDI],AX MOV ES:WORD PTR NBOUR_RETRIES[EDI],AX MOV ES:WORD PTR NBOUR_RETRIES+2[EDI],AX JMP SHORT NOUPDATE PUBLIC NOTCLEARCOUNTS NOTCLEARCOUNTS: CMP ROUTEDISP,1 JE SHORT NOUPDATE CMP ROUTEDISP,2 JE SHORT LOCKUPDATE MOV AL,NEWROUTEVAL MOV NEIGHBOUR_QUAL[EBX],AL CMP AH,'!' JNE SHORT NOUPDATE PUBLIC LOCKUPDATE LOCKUPDATE: XOR NEIGHBOUR_FLAG[EBX],1 ; FLIP LOCKED BIT PUBLIC NOUPDATE NOUPDATE: MOV ESI,EBX POP EDI POP EBX CALL DISPLAYROUTE JMP SENDCOMMANDREPLY PUBLIC ADDDIGI ADDDIGI: ADD ESI,2 PUSH ESI ; SAVE INPUT BUFFER MOV ESI,OFFSET32 AX25CALL CALL _FINDNEIGHBOUR POP ESI JZ SHORT ADD_FOUND ; IN LIST - OK JMP BADROUTECMD PUBLIC ADD_FOUND ADD_FOUND: CALL CONVTOAX25 ; GET DIGI CALLSIGN PUSH ESI MOV ESI,OFFSET32 AX25CALL LEA EDI,NEIGHBOUR_DIGI[EBX] MOV ECX,7 REP MOVSB POP ESI ; MSG BUFFER ; ; SEE IF ANOTHER DIGI ; CMP BYTE PTR [ESI],20H JE SHORT NOMORE CALL CONVTOAX25 ; GET DIGI CALLSIGN MOV ESI,OFFSET32 AX25CALL LEA EDI,NEIGHBOUR_DIGI+7[EBX] MOV ECX,7 REP MOVSB PUBLIC NOMORE NOMORE: JMP NOUPDATE PUBLIC NODE_ADD NODE_ADD: CMP PASSWORD[EBX],0FFFFH JE SHORT GOTPASS1 JMP PASSERROR PUBLIC GOTPASS1 GOTPASS1: ; ; FORMAT IS NODE ADD ALIAS:CALL ROUTE QUAL ; ; FIND CALL (AFTER ':') ; PUSH EBX ; SAVE SESSION PUSH EDI ; REPLY BUFFER ADD ESI,4 MOV EDI,OFFSET32 TEMPFIELD MOV ECX,7 ; MAX ALIAS PNODE30: LODSB CMP AL,':' JE SHORT PNODE40 STOSB LOOP PNODE30 PNODE35: JMP BADROUTECMD PNODE40: DEC ECX JCXZ PNODE45 ; 6 CHAR ALIAS MOV AL,20H REP STOSB ; CLEAR REST OF ALIAS PNODE45: CALL CONVTOAX25 JNZ SHORT PNODE35 ; DUFF ; PUSH ESI ; SAVE POINTER MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION JZ SHORT PNODE47 ; ALREADY THERE CMP EBX,0 JNE SHORT PNODE48 PNODE47: POP ESI JMP PNODE35 ; NOROOMFORNODE PNODE48: LEA EDI,DEST_CALL[EBX] MOV ECX,7 REP MOVSB MOV ECX,6 ; ADD ALIAS MOV ESI,OFFSET32 TEMPFIELD REP MOVSB POP ESI ; ; 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 ESI,OFFSET32 AX25CALL PUSH EBX ; SAVE DEST CALL _FINDNEIGHBOUR MOV EAX,EBX ; ROUTE TO AX POP EBX JZ SHORT NOTBADROUTE JMP SHORT BADROUTE NOTBADROUTE: ; ; UPDATE ROUTE LIST FOR THIS DEST ; MOV ROUT1_NEIGHBOUR[EBX],EAX MOV AL,ROUTEQUAL MOV ROUT1_QUALITY[EBX],AL MOV ROUT1_OBSCOUNT[EBX],255 ; LOCKED ; POP EDI POP EBX INC _NUMBEROFNODES JMP SENDOK BADROUTE: ; ; KILL IT ; MOV ECX,TYPE DEST_LIST MOV EDI,EBX MOV AL,0 REP STOSB JMP BADROUTECMD PUBLIC NODE_DEL NODE_DEL: CMP PASSWORD[EBX],0FFFFH JE SHORT GOTPASS2 JMP PASSERROR PUBLIC GOTPASS2 GOTPASS2: ; ; FORMAT IS NODE DEL ALL ; ; PUSH EBX ; SAVE SESSION PUSH EDI ; REPLY BUFFER ADD ESI,4 CALL CONVTOAX25 JNZ SHORT DNODE45 ; DUFF ; MOV ESI,OFFSET32 AX25CALL CALL _FINDDESTINATION JZ SHORT DNODE48 ; FOUND PUBLIC DNODE45 DNODE45: JMP PNODE35 PUBLIC DNODE48 DNODE48: ; ; KILL IT ; MOV ECX,TYPE DEST_LIST MOV EDI,EBX MOV AL,0 REP STOSB POP EDI POP EBX JMP SENDOK ; ENDIF PUBLIC REMDUMP REMDUMP: ; CALL SCAN CALL GETVALUEHEX ; GET NUMBER, UP TO SPACE , CR OR OFFH MOV DUMPPTR[EBX],EAX MOV ESI,OFFSET32 OKMSG MOVSW MOVSB JMP SENDCOMMANDREPLY PUBLIC BUILD_DUMP_FRAME PUBLIC BUILD_DUMP_FRAME BUILD_DUMP_FRAME: ; ; GET BUFFER ; CMP QCOUNT,20 JB SHORT DUMPRET CALL GETBUFF JNZ SHORT B_DUMP10 ; OK ; ; NO BUFFERS (!!) - ABORT ; PUBLIC DUMPRET DUMPRET: RET PUBLIC B_DUMP10 B_DUMP10: MOV REPLYBUFFER,EDI ; ; SET UP HEADER ; LEA EDI,7[EDI] ; SKIP HEADER MOV AL,0F0H STOSB ; PID MOV AX,0AAAAH STOSW ; FLAG MOV EAX,DUMPPTR[EBX] STOSD ; ADDR MOV ESI,EAX MOV ECX,192 ; ; FIND FIRST NZ BYTE ; PUBLIC FINDNZ FINDNZ: LODSB CMP AL,0 JNE SHORT DOCOPY INC DWORD PTR -4[EDI] ; START INC DUMPPTR[EBX] JZ SHORT B_DUMP20 ; FINISHED CMP ESI,0 JNE SHORT FINDNZ ; ; NO MORE ; JMP SHORT B_DUMP20 PUBLIC DOCOPY DOCOPY: DEC ESI REP MOVSB ADD DUMPPTR[EBX],192 JNC SHORT B_DUMP20 ; ; END ; PUBLIC B_DUMP15 B_DUMP15: MOV DUMPPTR[EBX],0 PUBLIC B_DUMP20 B_DUMP20: ; ; SCAN BACK TO FIRST NZ ; DEC EDI CMP BYTE PTR [EDI],0 JE SHORT B_DUMP20 INC EDI JMP SENDCOMMANDREPLY PUBLIC DUMPCMD DUMPCMD: ; CALL SCAN CALL GETVALUEHEX ; GET NUMBER, UP TO SPACE , CR OR OFFH MOV ESI,EAX ADD ESI,OFFSET32 _DATABASE MOV AL,0DH STOSB CALL DOLINE CALL DOLINE JMP SENDCOMMANDREPLY PUBLIC DOLINE DOLINE: MOV EAX,ESI ; DISPLAY ADDR SHR EAX,24 CALL B2HEX MOV EAX,ESI ; DISPLAY ADDR SHR EAX,16 CALL B2HEX MOV EAX,ESI ; DISPLAY ADDR SHR EAX,8 CALL B2HEX MOV EAX,ESI ; DISPLAY ADDR CALL B2HEX MOV AX,20H STOSB STOSB MOV ECX,16 PUBLIC DUMP00 DUMP00: LODSB CALL B2HEX MOV AL,20H STOSB LOOP DUMP00 MOV AL,0DH STOSB RET ; BADCONFIGMSG DB "Configuration File check falled - will continue with old config", 0DH REBOOTOK DB "Rebooting in 20 secs", 0DH REBOOTFAILED DB "Shutdown failed", 0DH RESTARTOK DB "Restarting", 0DH RESTARTFAILED DB "Restart failed", 0DH SAVENODES: push edi call _SaveNodes@0 pop edi MOV ESI,OFFSET32 OKMSG MOVSW MOVSB JMP SENDCOMMANDREPLY RECONFIG: push edi call _Reconfig@0 pop edi or eax,eax jz @f ; Bad Config MOV ESI,OFFSET32 OKMSG MOVSW MOVSB JMP SENDCOMMANDREPLY @@: MOV ESI,OFFSET32 BADCONFIGMSG mov ecx,64 rep movsb JMP SENDCOMMANDREPLY REBOOT: push edi call _Reboot@0 pop edi or eax,eax jz @f ; Bad MOV ESI,OFFSET32 REBOOTOK mov ecx,21 rep movsb JMP SENDCOMMANDREPLY @@: MOV ESI,OFFSET32 REBOOTFAILED mov ecx,16 rep movsb JMP SENDCOMMANDREPLY RESTART: push edi call _Restart@0 pop edi or eax,eax jz @f ; Bad MOV ESI,OFFSET32 RESTARTOK mov ecx,11 rep movsb JMP SENDCOMMANDREPLY @@: MOV ESI,OFFSET32 RESTARTFAILED mov ecx,15 rep movsb JMP SENDCOMMANDREPLY PUBLIC BUILDSORTEDLIST BUILDSORTEDLIST: MOV DESTHEADER,0 MOV EBX,DESTS MOV ECX,_MAXDESTS PUBLIC BS00 BS00: CMP DEST_CALL[EBX],0 JE SHORT BS10 ; TRY NEXT ENTRY PUSH ESI PUSH EDI PUSH ECX CALL CHAINNODE POP ECX POP EDI POP ESI PUBLIC BS10 BS10: ADD EBX,TYPE DEST_LIST LOOP BS00 RET ; PUBLIC CHAINNODE CHAINNODE: ; ; PUT NODE IN BX ON SORTED NODES CHAIN ; MOV DEST_CHAIN[EBX],0 ; END PUSH ESI PUSH EDI MOV ESI,DESTHEADER CMP ESI,0 JNE SHORT NOTEMPTY ; ; LIST IS EMPTY - THIS MUST BE FIRST ; MOV DESTHEADER,EBX JMP SHORT CHAINRET PUBLIC NOTEMPTY NOTEMPTY: MOV LASTPOINTER,OFFSET32 DESTHEADER PUBLIC SCANLOOP SCANLOOP: PUSH ESI CMP NODEORDER,1 JE @F LEA ESI,DEST_ALIAS[ESI] LEA EDI,DEST_ALIAS[EBX] MOV ECX,6 JMP SHORT SCANX @@: LEA ESI,DEST_CALL[ESI] LEA EDI,DEST_CALL[EBX] MOV ECX,7 PUBLIC SCANX SCANX: REP CMPSB POP ESI JB SHORT CARRYON ; ; ADD IT HERE ; MOV ESI,LASTPOINTER MOV EAX,DEST_CHAIN[ESI] ; NEXT MOV DEST_CHAIN[ESI],EBX MOV DEST_CHAIN[EBX],EAX JMP SHORT CHAINRET PUBLIC CARRYON CARRYON: CMP DEST_CHAIN[ESI],0 JE SHORT SCANEND MOV LASTPOINTER,ESI MOV ESI,DEST_CHAIN[ESI] JMP SCANLOOP PUBLIC SCANEND SCANEND: ; ; ADD ON END ; MOV DEST_CHAIN[ESI],EBX PUBLIC CHAINRET CHAINRET: POP EDI POP ESI RET _TEXT ENDS END