; ; TNC2 INFERFACE MODULE FOR G8BPQ SWITCH ; PAGE 56,132 ; .386 ; ; SEGMENT definitions and order ; ;* 32 Bit code _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' _TEXT ENDS ;* Contains 32 Bit data _DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:FLAT OFFSET32 EQU _DATA SEGMENT extern _ChangeSessionCallsign:DWORD extern _GetApplCall:DWORD LF EQU 0AH CR EQU 0DH ; ; JULY 92 FIX BUGS ; ; AH=1F,AL=2 WAS RETURNING BUFFER COUNT IN AX INSTEAD OF AH ; ; NDREAD (INT14 FN8) DIDNT LOOK FOR DATA FROM NODE ; ; PACLEN BEING OVERWRITTEN BY VALUE FROM NODE ; TNCBUFFLEN EQU 1024 TNCDATA STRUC RXBUFFER DB TNCBUFFLEN DUP (?) ; BUFFER TO USER TXBUFFER DB 260 DUP (?) ; BUFFER TO NODE BIOSPORT DB ? ; INT 14 PORT NUMBER NODEPORT DB ? ; BPQHOST PORT NUMBER ; VMSR DB ? ; VIRTUAL MSR ; BIT 7 - Receive Line Signal Detect (DCD) ; 6 - Ring Indicator ; 5 - Data Set Ready ; 4 - Clear To Send ; 3 - Delta RLSD ( ie state has changed since last ; access) ; 2 - Trailing Edge Ring Detect ; 1 - Delta DSR ; 0 - Delta CTS RTSFLAG DB ? ; BIT 0 SET IF RTS/DTR UP VLSR DB ? ; LAST RECEIVED LSR VALUE RXCOUNT DW ? ; BYTES IN RX BUFFER PUTPTR DD ? ; POINTER FOR LOADING BUFFER GETPTR DD ? ; POINTER FOR UNLOADING BUFFER CURSOR DD ? ; POSTION IN KEYBOARD BUFFER ;KBSESSION DD ? ; POINTER TO L4 SESSION ENTRY FOR CONSOLE ; DW 14 DUP (?) ; 14 MORE SESSIONS FOR HOST MODE PORT MSGLEN DD ? TRANSTIMER DB ? ; TRANPARENT MODE SEND TIMOUT AUTOSENDFLAG DB ? ; SET WHEN TRANSMODE TIME EXPIRES CMDTMR DB ? ; TRANSARENT MODE ESCAPE TIMER COMCOUNT DB ? ; NUMBER OF COMMAND CHARS RECEIVED CMDTIME DB ? ; GUARD TIME FOR TRANS MODE EACAPE COMCHAR DB ? ; CHAR TO LEAVE CONV MODE TRACEFLAG DB ? ; MONITOR ON/OFF ECHOFLAG DB ? ; ECHO ON/OFF FLOWFLAG DB ? ; FLOW OFF/ON CONOK DB ? CBELL DB ? NOMODE DB ? ; MODE CHANGE FLAGS NEWMODE DB ? CONMODEFLAG DB ? ; CONNECT MODE - CONV OR TRANS LFIGNORE DB ? MCON DB ? ; TRACE MODE FLAGS MCOM DB ? MALL DB ? BBSMON DB ? ; SPECIAL SHORT MONITOR FOR BBS MTX DB ? ; MONITOR TRANSMITTED FRAMES MTXFORCE DB ? ; MONITOR TRANSMITTED FRAMES EVEN IF M OFF MMASK DW ? ; MONITOR PORT MASK HEADERLN DB ? ; PUT MONITORED DATA ON NEW LINE FLAG MODEFLAG DB ? ; COMMAND/DATA MODE APPLICATION DB ? ; BIT SIGNIFICANT FIELD TO DEFINE ; WHICH APPLICATION PORT SUPPORTS ; BIT 0 = BBS FOR BACKWARD COMPATIBILITY ; BIT 1 = HOST (BY CONVENTION) ; BIT 2 = SYSOP (DITTO) ; BITS 3 - 7 - USER DEFINABLE ; APPLFLAGS DB ? ; FLAGS TO CONTROL APPL SYSTEM HOSTFLAG DB ? ; SET WHEN RUNNING HOST MODE ;MAXHOSTSESSIONS DB ? ; MAX SESSIONS ON HOST MODE PORT ;HOSTREPLYCURSOR DW 0 ;HOSTREPLYBUFFER DW 0 SENDPAC DB ? ; SEND PACKET CHAR CPACTIME DB ? ; USE PACTIME IN CONV MODE CRFLAG DB ? ; APPEND SENDPAC FLAG TPACLEN DB ? ; MAX PACKET SIZE FOR TNC GENERATED PACKETS UNPROTO DB 64 DUP (?) ; UNPROTO DEST AND DIGI STRING MYCALL DB 10 DUP (?) TNCDATA ENDS ; ; MODEFLAG DEFINITIONS ; COMMAND EQU 1B TRANS EQU 10B CONV EQU 100B ; ; APPL DEFINITIONS ; BBSAPPL EQU 1B HOSTAPPL EQU 10B SYSOPAPPL EQU 100B ; ; HOSTFLAG DEFINITIONS ; ;HOSTMODE EQU 1B ; PK232 HOSTMODE ENABLED ;HOSTESCBIT EQU 10B ; IN ESCAPE SEQUENCE ;UFQ EQU 100B ; UFQ MODE (IE NOT AA4RE) ;POLLED EQU 1000B ; POLL RECEIVED ; ; APPLFLAGS BITS ; CMD_TO_APPL EQU 1B ; PASS COMMAND TO APPLICATION MSG_TO_USER EQU 10B ; SEND 'CONNECTED' TO USER MSG_TO_APPL EQU 100B ; SEND 'CONECTED' TO APPL ; MONITORDATA DB 350 DUP (0) ; RAW FRAME FROM NODE D10 DW 10 ; ; BASIC LINK LEVEL MESSAGE BUFFER LAYOUT ; MESSAGE STRUC MSGCHAIN DD ? ; CHAIN WORD MSGPORT DB ? ; PORT MSGLENGTH DW ? ; LENGTH MSGDEST DB 7 DUP (?) ; DESTINATION MSGORIGIN DB 7 DUP (?) ; ORIGIN ; ; MAY BE UP TO 56 BYTES OF DIGIS ; MSGCONTROL DB ? ; CONTROL BYTE MSGPID DB ? ; PROTOCOL IDENTIFIER MSGDATA DB ? ; START OF LEVEL 2 MESSAGE ; MESSAGE ENDS ; _NodeCall DB 'NOCALL ',0 NEWCALL DB 11 DUP (0) TABLELEN DW TYPE TNCDATA ; LNKSTATEMSG DB 'Link state is: ' CONNECTEDMSG DB 'CONNECTED to ' WHATMSG DB 'Eh?',0DH CMDMSG DB 'cmd:' DISCONNMSG DB CR,'*** DISCONNECTED',CR CONMSG1 DB CR,'*** CONNECTED to ' CONCALL DB 10 DUP (0),CR SIGNON DB CR,CR,'G8BPQ TNC2 EMULATOR',CR,CR CONMSG DB CR,'*** CONNECTED to ' SWITCH DB 'SWITCH',CR SWITCHSP DB 'SWITCH ' WAS DB ' was ' VIA DB ' via ' OFF DB 'OFF',0DH ON DB 'ON ',0DH CMDX STRUC DB ' ' ; COMMAND STRING CMDLEN DB ? ; SIGNIFICANT LENGTH CMDPROC DD ? ; COMMAND PROCESSOR CMDFLAG DD ? ; FLAG/VALUE ADDRESS CMDX ENDS COMMANDLIST LABEL BYTE ; CMDX <'BBSMON',6,ONOFF,BBSMON> ; BBS (SHORT FORM ) MONITOR DB 'BBSMON ',6 DD ONOFF,BBSMON ;BTCMD CMDX <'BTEXT',2,BTEXT> BTCMD DB 'BTEXT ',2 DD BTEXT,0 ; CMDX <'CONOK',4,ONOFF_CONOK,CONOK> DB 'CONOK ',4 DD ONOFF_CONOK,CONOK ; CMDX <'C SWITCH',8,CSWITCH> DB 'C SWITCH',8 DD CSWITCH,0 ; CMDX <'CBELL',2,ONOFF,CBELL> DB 'CBELL ',2 DD ONOFF,CBELL ; CMDX 'CMDTIME ',2,VALUE,CMDTIME ,0,255,'T' DB 'CMDTIME ',2 DD VALHEX,CMDTIME ; CMDX 'COMMAND ',3,VALHEX,COMCHAR ,0,255,'C' DB 'COMMAND ',3 DD VALHEX,COMCHAR ; CMDX <'CONMODE',4,CONMODE> DB 'CONMODE ',4 DD CONMODE,0 ; CMDX <'CPACTIME',2,ONOFF,CPACTIME> DB 'CPACTIME',2 DD ONOFF,CPACTIME ; CMDX <'CR',2,ONOFF,CRFLAG> DB 'CR ',2 DD ONOFF,CRFLAG ; CMDX <'APPLFLAG',5,APPL_VALHEX,APPLFLAGS> DB 'APPLFLAG',5 DD APPL_VALHEX,APPLFLAGS ; CMDX <'APPL',4,APPL_VALHEX,APPLICATION> DB 'APPL ',4 DD APPL_VALHEX,APPLICATION ; CMDX <'CONVERS',4,TNCCONV> DB 'CONVERS ',4 DD TNCCONV,0 ; CMDX <'CONNECT',1,TNCCONNECT> DB 'CONNECT ',1 DD TNCCONNECT,0 ; CMDX <'DISCONNE',1,TNCDISC> DB 'DISCONNE',1 DD TNCDISC,0 ; CMDX <'ECHO',1,ONOFF,ECHOFLAG> DB 'ECHO ',1 DD ONOFF,ECHOFLAG ; CMDX <'FLOW',4,ONOFF,FLOWFLAG> DB 'FLOW ',4 DD ONOFF,FLOWFLAG ; CMDX <'HEADERLN',2,ONOFF,HEADERLN> DB 'HEADERLN',2 DD ONOFF,HEADERLN ; CMDX <'K',1,TNCNODE> ; CONNECT TO NODE DB 'K ',1 DD TNCNODE,0 ; CMDX <'MTXFORCE',4,ONOFF,MTXFORCE> ; MONITOR TXED FRAMES WHEN M OFF DB 'MTXFORCE',4 DD ONOFF,MTXFORCE ; CMDX <'LFIGNORE',3,ONOFF,LFIGNORE> ; IGNORE LF IN DATA FROM USER DB 'LFIGNORE',3 DD ONOFF,LFIGNORE ; CMDX <'MTX',3,ONOFF,MTX> ; MONITOR TRANSMITTED FRAMES DB 'MTX ',3 DD ONOFF,MTX ; CMDX <'MALL',2,ONOFF,MALL> DB 'MALL ',2 DD ONOFF,MALL ; CMDX <'MCOM',4,ONOFF,MCOM> DB 'MCOM ',4 DD ONOFF,MCOM ; CMDX <'MCON',2,ONOFF,MCON> DB 'MCON ',2 DD ONOFF,MCON ; CMDX <'MMASK',2,VALWHEX,MMASK> ; MONITOR PORT MASK DB 'MMASK ',2 DD VALWHEX,MMASK ; CMDX <'MONITOR',1,ONOFF,TRACEFLAG> DB 'MONITOR ',3 DD ONOFF,TRACEFLAG MYC DB 'MYCALL ',2 DD SETMYCALL,0 ; CMDX <'NEWMODE',2,ONOFF,NEWMODE> DB 'NEWMODE ',2 DD ONOFF,NEWMODE ; CMDX <'NODE',3,TNCNODE> ; CONNECT TO NODE DB 'NODE ',3 DD TNCNODE,0 ; CMDX <'NOMODE',2,ONOFF,NOMODE> DB 'NOMODE ',2 DD ONOFF,NOMODE ; CMDX <'SENDPAC',2,VALHEX,SENDPAC> DB 'SENDPAC ',2 DD VALHEX,SENDPAC ; CMDX <'PACLEN',1,VALUE,TPACLEN> DB 'PACLEN ',1 DD VALUE,TPACLEN ; CMDX <'RELEASE',3,TNCRELEASE> DB 'RELEASE ',3 DD TNCRELEASE,0 ; CMDX <'RESTART',7,TNCRELEASE> DB 'RESTART ',7 DD RESTART,0 ; CMDX <'TRANS',1,TNCTRANS> DB 'TRANS ',1 DD TNCTRANS,0 ;UNPROT CMDX <'UNPROTO',1,UNPROTOCMD> UNPROT DB 'UNPROTO ',1 DD UNPROTOCMD,0 NUMBEROFCOMMANDS EQU ($-COMMANDLIST)/TYPE CMDX NEWVALUE DW 0 HEXFLAG DB 0 D16 DB 16 NUMBER DB 4 DUP (0),CR NUMBERH DB '$0000',CR BADMSG DB '?bad parameter',CR,0 BTHDDR DD 0 ; CHAIN DB 0 ; PORT DW 7 ; LENGTH DB 0F0H ; PID BTEXTFLD DB 0DH,256 DUP (0) CMDENDADDR DD 0 ; POINTER TO END OF COMMAND MBOPTIONBYTE DB 0 NORMCALL DB 10 DUP (0) AX25CALL DB 7 DUP (0) 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 NORMLEN DD 0 EVEN TNCTABLE DD TABLE NUMBEROFSTREAMS DD 0 SAVEBX DD 0 TRANSDELAY DB 10 ; 1 SEC STAYSWITCH DB 0 SPYSWITCH DB 0 UNPROTOCALL DB "UNPROTO",80 DUP (0) STREAMBASE DB 33 ; FIRST BPQ HOST PORT PORT DB 0 ; FIRST COMBIOS PORT SAVEPACLEN DB 100 MONLEN DD 0 MONBUFFER DB 500 dup (0) CR EQU 0DH LF EQU 0AH TABLE DB 32 * TYPE TNCDATA DUP (0) EXTRN _BPQHOSTAPI:DWORD, _MONDECODE:DWORD PUBLIC _NodeCall _DATA ENDS _TEXT SEGMENT PUBLIC 'CODE' _TNCTIMERPROC: PUBLIC _TNCTIMERPROC ; ; CALLED AT 10 HZ ; ; CHECK FOR TRANSPARENT MODE SEND TIMOUT ; MOV EBX,TNCTABLE MOV ECX,NUMBEROFSTREAMS OR ECX,ECX JZ TIMEXIT MOV AH,0 TIM000: OR AH,TRACEFLAG[EBX] ; SEE IF ANY PORTS ARE MONITORING ; CHECK FOR PACTIMER EXPIRY AND CMDTIME ; MOV AL,CMDTMR[EBX] CMP CMDTMR[EBX],0 JE TIM010 ; NOT RUNNING ; DEC CMDTMR[EBX] JNZ TIM010 ; NOT EXPIRED ; ; CMDTMR HAS EXPIRED - IF 3 COMM CHARS RECEIVED, ENTER COMMAND MODE ; MOV AL,COMCOUNT[EBX] OR AL,AL JZ TIM010 ; NONE RECEIVED CMP AL,3 JNE KB10_A ; 1 OR 2 - TIMER EXPIRED, SO RESET ; ; 3 ESCAPE CHARS RECEIVED WITH GUARDS - LEAVE TRAN MODE PUSH EBX PUSH ECX CALL SETCOMM00 POP ECX POP EBX KB10_A: MOV COMCOUNT[EBX],0 ; RESET COUNT JMP SHORT TIM100 ; DONT RISK TRANSTIMER AND CMDTIME FIRING AT ONCE TIM010: CMP TRANSTIMER[EBX],0 JE TIM100 ; NOTHING DOING DEC TRANSTIMER[EBX] JNZ TIM100 ; STILL OK ; CMP MSGLEN[EBX],0 JE TIM100 ; MESSAGE ALREADY SENT PUSHA CALL SENDPACKET POPA TIM100: ; CHECK FLOW CONTROL TEST VMSR[EBX],00010000B ; ALREADY OFF? JNZ @F PUSH ECX CALL CHECKCTS POP ECX @@: ADD EBX,TYPE TNCDATA DEC ECX JNZ TIM000 ; TOO FAR FOR LOOP CALL DOMONITORING TIMEXIT: RET EXTERN _xDecodeFrame:near DOMONITORING: ; ; IF ANY PORTS HAVE MONITOR ENABLED, SET MONITOR BIT ON FIRST PORT ; MOV CL,0 OR AH,AH JZ NO_MON MOV CL,80H ; TOP BIT CONTROLS MONITOR NO_MON: ; MOV EBX,TNCTABLE MOV DL,APPLICATION[EBX] OR CL,APPLFLAGS[EBX] CMP CONOK[EBX],0 JNE SETAPPLM MOV DL,0 ; STOP CONNECTS SETAPPLM: MOV AH,1 MOV AL,NODEPORT[EBX] CALL NODE ; ; DO ANY MONITORING ; MOV EBX,TNCTABLE MOV AL,NODEPORT[EBX] MOV AH,11 MOV EDI,OFFSET MONITORDATA CALL NODE CMP ECX,0 JE TRACEEND mov esi,OFFSET MONITORDATA mov edi,offset MONBUFFER pushad push eax push edi push esi call _xDecodeFrame mov MONLEN,EAX add esp,12 popad ; call [_MONDECODE] MOV ECX,NUMBEROFSTREAMS JCXZ TRACEEND ; MOV EBX,TNCTABLE TRACELOOP: TEST TRACEFLAG[EBX],1 ; Does this port wnat monitoring? JZ SHORT NOTRACE push ECX mov esi,offset MONBUFFER mov ecx,MONLEN @@: lodsb call PUTCHARINBUFFER loop @B pop ECX NOTRACE: ADD EBX,TYPE TNCDATA LOOP TRACELOOP TRACEEND: RET _APIGETVMSR: PUBLIC _APIGETVMSR IMUL EBX,ECX,TYPE TNCDATA ADD EBX,TNCTABLE MOVZX EAX,VMSR[EBX] AND VMSR[EBX],0F0H ; CLEAR DELTA BITS RET _APIKEYSUPPORT: PUBLIC _APIKEYSUPPORT IMUL EBX,ECX,TYPE TNCDATA ADD EBX,TNCTABLE KEYSUPPORT: TEST MODEFLAG[EBX],COMMAND JNZ KEYB06C ; COMMAND MODE - SKIP TRANS TEST TEST MODEFLAG[EBX],TRANS JNZ KEYB06T ; TRANS MODE ; ; CONV MODE - SEE IF CPACTIME ON ; CMP CPACTIME[EBX],0 JE KEYB06 ; NOT CPACTIME MOV AH,TRANSDELAY MOV TRANSTIMER[EBX],AH ; REPRIME SEND TIMER JMP SHORT KEYB06 ; PROCESS CHAR KEYB06T: ; ; Transparent Mode - See if Escape Sequence Received (3 esc chars, with guard timer) ; ; ; CHECK FOR COMMAND CHAR IF CMDTIME EXPIRED OR COMAND CHAR ALREADY RECEIVED ; CMP COMCOUNT[EBX],0 JNE KBTRN3 ; ALREADY GOT AT LEAST 1 CMP CMDTMR[EBX],0 JNE KBTRN5 ; LESS THAN CMDTIME SINCE LAST CHAR KBTRN3: CMP AL,COMCHAR[EBX] JNE KBTRN5 ; NOT COMMAND CHAR INC COMCOUNT[EBX] KBTRN5: MOV AH,CMDTIME[EBX] MOV CMDTMR[EBX],AH ; REPRIME ESCAPE TIMER CHKPACTIM: MOV AH,TRANSDELAY MOV TRANSTIMER[EBX],AH JMP SHORT KBNORM ; TRANSPARENT MODE KEYB06: ; ; STILL JUST CONV MODE ; CMP AL,SENDPAC[EBX] JNE NOTSENDPAC ; ; SEND PACKET CHAR - SHOUD WE SEND IT? ; MOV TRANSTIMER[EBX],0 CMP CRFLAG[EBX],1 JE KBCR_JMP ; SEND IT JMP SENDPACKET KBCR_JMP: JMP KBCR NOTSENDPAC: KEYB06C: ; ; COMMAND OR CONV MODE ; CMP AL,20H JB KBCTRL KBNORM: CMP MSGLEN[EBX],256 JA TOOLONG ; PROTECT BUFFER ; INC MSGLEN[EBX] MOV EDI,CURSOR[EBX] STOSB MOV CURSOR[EBX],EDI TOOLONG: TEST ECHOFLAG[EBX],0FFH JZ NOECHO CALL KBECHO NOECHO: MOV AL,TPACLEN[EBX] CMP BYTE PTR MSGLEN[EBX],AL JB NOSEND ; ; DONT APPLY PACLEN IN COMMAND MODE ; TEST MODEFLAG[EBX],COMMAND JNZ NOSEND JMP SENDPACKET NOSEND: RET KBCTRL: CMP LFIGNORE[EBX],0 JE KBCTRL00 ; ; IF LF, IGNORE IT ; CMP AL,0AH JE NOSEND ; IGNORE RET KBCTRL00: CMP AL,8 JE KBBSPACE CMP AL,1AH ; CTRL/Z JE KBNORM ; FOR MBX TERMINATOR TEST MODEFLAG[EBX],CONV JNZ CTRLREST ; CMP AL,0DH JE KBCR JMP SHORT CTRLREST ; ; CONV MODE ; CTRLREST: CMP AL,COMCHAR[EBX] JE KBESCAPE ; RETURN TO COMMAND MODE ; CMP AL,14H ; CTRL/T JNE IGNORECTRL XOR TRACEFLAG[EBX],1 RET IGNORECTRL: JMP KBNORM KBESCAPE: CALL SETCOMMANDMODE JMP KBRET ; EXIT SETCOMMANDMODE: CMP MSGLEN[EBX],0 JE SETCOMM00 CALL SENDPACKET ; PROCESS WAITING DATA SETCOMM00: OR MODEFLAG[EBX],COMMAND ; BACK TO COMMAND MODE AND MODEFLAG[EBX],NOT (CONV+TRANS) MOV TRANSTIMER[EBX],0 ; CANCEL TRANS MODE SEND TIMER MOV AUTOSENDFLAG[EBX],0 ; IN CASE ALREADY SET MOV ESI,OFFSET CMDMSG MOV ECX,4 CALL SENDREPLY CALL KBRET RET KBBSPACE: CMP MSGLEN[EBX],0 JE KBBS00 DEC MSGLEN[EBX] DEC CURSOR[EBX] TEST ECHOFLAG[EBX],0FFH JZ KBBS00 CALL KBECHO KBBS00: RET KBCR: CALL KBNORM ; PUT CR IN BUFFER SENDPACKET: ; ; SEE IF COMMAND STATE ; TEST MODEFLAG[EBX],COMMAND JZ NOTCOMMAND JMP TNCCOMMAND ; COMMAND TO TNC NOTCOMMAND: ; ; IF CONNECTED, SEND TO L4 (COMMAND HANDLER OR DATA), ; OTHERWISE SEND AS AN UNPROTO FRAME (TO ALL PORTS) ; TEST VMSR[EBX],80H ; CONNECTED? JNZ SENDTOL4 ; ; SEND BUFFER AS AN UNPROTO FRAME ; MOV AL,0 ; UNPROTO STREAM JMP SHORT SENDTONODE SENDTOL4: ;TESTFORBUSY: ; ; TEST VMSR[EBX],00010000B ; CHECK CTS ; JNZ NOTBUSY ; CALL CHECKCTS ; JMP TESTFORBUSY ;NOTBUSY: MOV AL,NODEPORT[EBX] SENDTONODE: MOV ECX,MSGLEN[EBX] LEA ESI,TXBUFFER[EBX] MOV CURSOR[EBX],ESI ; RESET POINTER MOV AH,2 CALL NODE ; SEND FRAME MOV MSGLEN[EBX],0 ; CALL CHECKCTS ; SEE IF NOW BUSY RET KBECHO: CALL PUTCHARINBUFFER ; RET TNCCOMMAND: ; ; PROCESS COMMAND TO TNC CODE ; LEA ESI,TXBUFFER[EBX] MOV EDI,ESI PUSH ESI ; ; CONVERT TO UPPER CASE ; MOV ECX,200 ; IN CASE GARBAGE!! TNCUCLOOP: LODSB CMP AL,0DH JE TNCUCEND CMP AL,61H JB TNCUCOK CMP AL,7AH JA TNCUCOK SUB AL,20H TNCUCOK: STOSB LOOP TNCUCLOOP ; TNCUCEND: MOV CMDENDADDR,ESI ; SAVE REAL END OF COMMAND MOV AL,20H MOV ECX,40 REP STOSB ; PUT A FEW SPACES ON END FOR DECODE ROUTINES POP ESI CALL SCAN CMP BYTE PTR [ESI],20H JE NULLCMD ; BLANK LINE MOV EDI,OFFSET COMMANDLIST MOV ECX,NUMBEROFCOMMANDS COMMANDLOOP: PUSH ESI PUSH EDI PUSH ECX MOV CL,8[EDI] ; MIN LENGTH REP CMPSB JE COMMANDFOUND POP ECX POP EDI POP ESI ADD EDI,TYPE CMDX LOOP COMMANDLOOP TNCDUFF: MOV ESI,OFFSET WHATMSG MOV ECX,4 CALL SENDREPLY NULLCMD: JMP SENDOK COMMANDFOUND: CMP BYTE PTR [ESI],0DH JE ENDOFCOMMAND CMP BYTE PTR [ESI],' ' JE ENDOFCOMMAND CMPSB JE COMMANDFOUND ; LOOP TILL ALL COMPARED OR END ; ; END OF STRING WRONG ; POP ECX POP EDI POP ESI JMP TNCDUFF ENDOFCOMMAND: POP ECX POP EDI POP EAX ; TO CLEAR STACK CALL SCAN JMP DWORD PTR 9[EDI] ; ENTER COMMAND PROCESSOR - ; SI POINTS TO CHAR FOLLOWING COMMAND SCAN: MOV ECX,10 ; DONT LOOK TOO FAR! SCAN1: CMP BYTE PTR [ESI],20H JNE SCANRET INC ESI LOOP SCAN1 XOR AL,AL ; RETURN Z SCANRET: RET ; UNPROTOCMD: ; ; EXTRACT CALLSIGN STRING ; CMP BYTE PTR [ESI],20H JE UNPROTODIS CMP BYTE PTR [ESI],'*' JE CLEARUNPROTO CALL DECODECALLSTRING ; CONVERT TO AX25 FORMAT JZ UNPROTOOK JMP TNCDUFF CLEARUNPROTO: LEA EDI,UNPROTO[EBX] MOV AL,0 MOV ECX,63 REP STOSB ; COPY IN UNPROTODIS: MOV AL,1 CALL DISPLAYUNPROTO ; DISPLAY CURRENT SETTING JMP SENDOK UNPROTOOK: PUSH ESI MOV AL,0 CALL DISPLAYUNPROTO ; DISPLAY OLD STRRING POP ESI LEA EDI,UNPROTO[EBX] MOV ECX,63 REP MOVSB ; COPY IN CONMODE: JMP SENDOK ;CONMODE: JMP KBRET DISPLAYUNPROTO: ; PUSH EAX MOV ESI,OFFSET UNPROT MOV ECX,8 CALL PUTSTRINGINBUFFER MOV ESI,OFFSET WAS ; DISPLAY 'was' MOV ECX,5 POP EAX OR AL,AL JZ DISPU00 ; NO MOV ECX,1 ; LEAVE OUT 'WAS' DISPU00: CALL PUTSTRINGINBUFFER LEA ESI,UNPROTO[EBX] CMP BYTE PTR [ESI],40H JBE DISPUPRET CALL CONVFROMAX25 PUSH ESI MOV ESI,OFFSET NORMCALL CALL PUTSTRINGINBUFFER POP ESI CMP BYTE PTR [ESI],0 JE DISPUPRET PUSH ESI MOV ESI,OFFSET VIA MOV ECX,5 CALL PUTSTRINGINBUFFER POP ESI DISPUPLOOP: CALL CONVFROMAX25 PUSH ESI MOV ESI,OFFSET NORMCALL INC ECX CALL PUTSTRINGINBUFFER POP ESI CMP BYTE PTR [ESI],0 JNE DISPUPLOOP DISPUPRET: MOV AL,0DH CALL PUTCHARINBUFFER RET TNCCONV: OR MODEFLAG[EBX],CONV AND MODEFLAG[EBX],NOT (COMMAND+TRANS) JMP KBRET TNCTRANS: ; ; MAKE PRETTY SURE THIS ISNT A BIT OF STRAY DATA ; CALL SCAN JZ TRANSOK JMP TNCDUFF TRANSOK: OR MODEFLAG[EBX],TRANS AND MODEFLAG[EBX],NOT (COMMAND+CONV) JMP KBRET SETMYCALL: call SCAN cmp byte ptr[esi], 20h jne @f ; Param Supplied ; Just Display MOV ESI,OFFSET MYC MOV ECX,8 CALL PUTSTRINGINBUFFER LEA ESI,MYCALL[EBX] MOV ECX,10 CALL PUTSTRINGINBUFFER MOV AL,0DH CALL PUTCHARINBUFFER JMP SENDOK @@: MOV EDI,OFFSET32 NEWCALL mov ecx,10 push edi push ecx mov al,' ' rep stosb pop ecx pop edi @@: LODSB CMP AL,20H JE SHORT @F ; END STOSB LOOP @B JMP TNCDUFF @@: MOV ESI,OFFSET MYC MOV ECX,8 CALL PUTSTRINGINBUFFER MOV ESI,OFFSET WAS ; DISPLAY 'was' MOV ECX,5 CALL PUTSTRINGINBUFFER LEA ESI,MYCALL[EBX] MOV ECX,10 CALL PUTSTRINGINBUFFER MOV AL,0DH CALL PUTCHARINBUFFER LEA ESI,NEWCALL LEA EDI,MYCALL[EBX] MOV ECX,10 rep movsb JMP SENDOK TNCNODE: ; ; CONNECT TO NODE ; OR MODEFLAG[EBX],CONV ; INTO CONVERSE MODE AND MODEFLAG[EBX],NOT (COMMAND+TRANS) CALL CONNECTTONODE OR VMSR[EBX],88H ; SET CONNECTED CALL READCHANGE ; CLEAR STATUS CHANGE (TO AVOID ; SUPURIOUS 'CONNECTED TO' JMP KBRET READCHANGE: MOV AH,4 MOV AL,NODEPORT[EBX] CALL NODE ; MOV AH,5 MOV AL,NODEPORT[EBX] CALL NODE ; ACK THE STATUS CHANGE RET BTEXT: ; CMP BYTE PTR [ESI],20H JE BTDIS ; PUSH ESI MOV AL,0 CALL DISPLAYBT ; DISPLAY OLD STRING POP ESI MOV EDI,OFFSET BTEXTFLD MOV ECX,255 BTLOOP: LODSB STOSB CMP ESI,CMDENDADDR ; END? JE BTEND LOOP BTLOOP BTEND: XOR AL,AL STOSB ; NULL ON END ; ; SET UP TO SEND IT AS A UI ; MOV ECX,EDI MOV ESI,OFFSET BTHDDR SUB ECX,ESI MOV MSGLENGTH[ESI],CX ; ; PASS TO SWITCH ; MOV ESI,OFFSET BTEXTFLD SUB ECX,6 ; DONT NEED HEADER MOV AH,12 ; UPDATE FUNCTIONS MOV DX,1 ; UPDATE BT CALL NODE ; PASS TO NODE JMP SENDOK BTDIS: MOV AL,1 CALL DISPLAYBT ; DISPLAY CURRENT SETTING JMP SENDOK DISPLAYBT: ; PUSH EAX MOV ESI,OFFSET BTCMD MOV ECX,8 CALL PUTSTRINGINBUFFER MOV ESI,OFFSET WAS ; DISPLAY 'was' MOV ECX,5 POP EAX OR AL,AL JZ DISPBT00 ; NO MOV ECX,1 ; LEAVE OUT 'WAS' DISPBT00: CALL PUTSTRINGINBUFFER MOV ESI,OFFSET BTEXTFLD DISPBT10: LODSB OR AL,AL JZ DISPBT20 CALL PUTCHARINBUFFER JMP DISPBT10 DISPBT20: MOV AL,0DH CALL PUTCHARINBUFFER RET CONVHEX: MOV BYTE PTR NUMBER,'$' INC EDI B2HEX: PUSH EAX SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 CALL B1HEX POP EAX B1HEX: AND AL,0FH CMP AL,10 JB B1HEX2 ADD AL,7 B1HEX2: ADD AL,30H STOSB RET UC: RET VALWHEX: ; ; WORD PARAM - SO FAR ONLY FOR MMASK ; CMP BYTE PTR [ESI],20H JBE DISPWVAL ; DISPLAY ONLY CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC BADVALUE ; INVALID DIGITS MOV CL,0 CALL KEYDISP ; DISPLAY KEYWORD WAS MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV ECX,[ESI][EBX] ; GET OLD VALUE MOV AX,NEWVALUE MOV [ESI][EBX],AX ; SET FLAG MOV EAX,ECX ; DISPLAY OLD JMP VALWDISP JMP SENDOK DISPWVAL: MOV ECX,1 CALL KEYDISP MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV EAX,[ESI][EBX] ; GET VALUE VALWDISP: MOV EDI,OFFSET NUMBERH+1 PUSH EAX MOV AL,AH CALL B2HEX POP EAX CALL B2HEX MOV ESI,OFFSET NUMBERH MOV ECX,6 CALL PUTSTRINGINBUFFER JMP SENDOK VALHEX: MOV HEXFLAG,1 ; DISPLAY IN HEX VALUE: ; ; PROCESS COMMANDS WITH VALUE PARAMS ; CMP BYTE PTR [ESI],20H JBE DISPVAL ; DISPLAY ONLY CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH JC BADVALUE ; INVALID DIGITS VALOK: MOV CL,0 CALL KEYDISP ; DISPLAY KEYWORD WAS MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV AH,[ESI][EBX] ; GET OLD VALUE MOV AL,BYTE PTR NEWVALUE MOV [ESI][EBX],AL ; SET FLAG MOV AL,AH ; DISPLAY OLD JMP VALDISP BADVALUE: MOV ESI,OFFSET BADMSG ERRCOM: CALL NORMSTR JMP SENDOK DISPVAL: MOV CX,1 CALL KEYDISP DISPV00: MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV AL,[ESI][EBX] ; GET VALUE VALDISP: MOV WORD PTR NUMBER+1,2020H ; CLEAR OUT IN CASE LESS THAN 3 DIGITS MOV NUMBER+3,20H MOV EDI,OFFSET NUMBER CMP HEXFLAG,1 JE DISPHEX CALL CONV_DIGITS JMP SHORT DISPCOM DISPHEX: CALL CONVHEX DISPCOM: MOV ESI,OFFSET NUMBER MOV ECX,5 CALL PUTSTRINGINBUFFER JMP SENDOK KEYDISP: PUSH ECX MOV ESI,EDI MOV ECX,8 ; MAX LENGTH CALL PUTSTRINGINBUFFER MOV ESI,OFFSET WAS ; DISPLAY 'was' POP ECX OR CL,CL MOV ECX,5 JZ KEYDISP12 ; NO MOV ECX,1 ; LEAVE OUT 'WAS' KEYDISP12: CALL PUTSTRINGINBUFFER RET PUBLIC GETVALUEF GETVALUEF: CALL SCAN CALL GETVALUE MOV AL,BYTE PTR NEWVALUE RETF GETVALUE: ; ; EXTRACT NUMBER (HEX OR DECIMAL) FROM INPUT STRING ; MOV NEWVALUE,0 LODSB CMP AL,'$' ; HEX? JE DECODEHEX DEC ESI VALLOOP: LODSB CMP AL,' ' JE ENDVALUE CMP AL,0DH JE ENDVALUE CMP AL,',' JE ENDVALUE ; ; ANOTHER DIGIT - MULTIPLY BY 10 ; MOV AX,NEWVALUE MUL D10 MOV NEWVALUE,AX MOV AL,-1[ESI] CALL UC SUB al,'0' JC DUFFVALUE CMP AL,10 JNC DUFFVALUE MOV AH,0 ADD NEWVALUE,AX JC DUFFVALUE JMP VALLOOP DECODEHEX: HEXLOOP: LODSB CMP AL,' ' JE ENDVALUE CMP AL,0FFH JE ENDVALUE CMP AL,',' JE ENDVALUE ; ; ANOTHER DIGIT - MULTIPLY BY 16 ; MOV AX,NEWVALUE MUL D16 MOV NEWVALUE,AX MOV AL,-1[ESI] CALL UC SUB al,'0' JC DUFFVALUE CMP AL,10 JC HEXOK SUB AL,7 CMP AL,10 JC DUFFVALUE CMP AL,16 JNC DUFFVALUE HEXOK: MOV AH,0 ADD NEWVALUE,AX JMP HEXLOOP ENDVALUE: CLC RET DUFFVALUE: STC RET APPL_VALHEX: CALL VALHEX JMP SHORT SETAPPLV ONOFF_CONOK: ; CALL ONOFF ; ; UPDATE APPL FLAGS ON NODE PORT ; SETAPPLV: MOV DL,APPLICATION[EBX] MOV CL,APPLFLAGS[EBX] CMP CONOK[EBX],0 JNE SETAPPL MOV DL,0 ; STOP CONNECTS SETAPPL: MOV AH,1 MOV AL,NODEPORT[EBX] CALL NODE ; Set MYCALL to APPLCALL MOVZX EAX,APPLICATION[EBX] PUSH EAX CALL _GetApplCall mov esi,eax lea edi,MYCALL[EBX] mov ecx,10 rep movsb RET ONOFF: ; ; PROCESS COMMANDS WITH ON/OFF PARAM ; CMP BYTE PTR [ESI],20H JBE CMDDISP LODSB CMP AL,'Y' JE CMDON CMP AL,'N' JE CMDOFF ; TO HANDLE YES/NO LODSB CMP AL,'N' JE CMDON CMP AL,'F' JE CMDOFF CMP AL,' ' JE CMDDISP ; DISPLAY CURRENT VALUE JMP TNCDUFF CMDON: MOV AL,1 JMP SHORT ONOFF00 CMDOFF: MOV AL,0 ONOFF00: MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV AH,[ESI][EBX] ; GET OLD VALUE MOV [ESI][EBX],AL ; SET FLAG MOV AL,0 JMP CMDDISP00 ; DISPLAY CMDDISP: MOV ESI,CMDFLAG[EDI] ; ADDR OF FLAG MOV AH,[ESI][EBX] ; GET OLD VALUE MOV AL,1 ; DISPLAY FLAG CMDDISP00: PUSH EAX MOV ESI,EDI MOV ECX,8 ; MAX LENGTH CALL PUTSTRINGINBUFFER MOV ESI,OFFSET WAS ; DISPLAY 'was' MOV ECX,5 POP EAX PUSH EAX ; DISPLAY ONLY? OR AL,AL JZ CMDDISP12 ; NO MOV ECX,1 ; LEAVE OUT 'WAS' CMDDISP12: CALL PUTSTRINGINBUFFER POP EAX MOV ESI,OFFSET OFF CMP AH,0 JE WASOFF MOV ESI,OFFSET ON WASOFF: MOV ECX,4 CALL PUTSTRINGINBUFFER JMP SENDOK TNCCONNECT: CMP BYTE PTR [ESI],20H ; ANY PARAM? JBE TNCCSTATE ; NO, SO REQUEST FOR CURRENT STATE ; ; CONNECT, BUT NOT TO SWITCH - CONNECT TO NODE, THEN PASS TO IT FOR ; PROCESSING ; OR MODEFLAG[EBX],CONV ; INTO CONVERSE MODE AND MODEFLAG[EBX],NOT (COMMAND+TRANS) OR VMSR[EBX],88H ; SET CONNECTED CALL CONNECTTONODE CALL READCHANGE ; CLEAR PENDING STATUS CHANGE ADD MSGLEN[EBX],20 ; PUT SPACES ON END JMP SENDPACKET ; LOOP BACK - WILL NOW GO TO NODE TNCCSTATE: MOV ESI,OFFSET LNKSTATEMSG ; LINK STATE IS MOV ECX,15 CALL SENDREPLY ; ; GET FROM NODE ; TEST VMSR[EBX],80H JZ TNCST10 ; NOT CONNECTED MOV ESI,OFFSET CONNECTEDMSG MOV ECX,13 CALL SENDREPLY MOV EDI,OFFSET NORMCALL MOV AH,8 MOV AL,NODEPORT[EBX] CALL NODE ; GET CALLSIGN MOV ESI,OFFSET NORMCALL MOV ECX,8 CALL SENDREPLY MOV AL,0DH CALL PUTCHARINBUFFER JMP KBRET TNCST10: MOV ESI,OFFSET DISCONNMSG+5 MOV ECX,13 CALL SENDREPLY JMP KBRET CSWITCH: ; ; CONNECT TO NODE (SPECIAL FOR BBS FORWARDING SYSTEM) ; MOV ESI,OFFSET CMDMSG MOV ECX,4 CALL SENDREPLY CALL CONNECTTONODE JMP KBRET DOCONMODECHANGE: OR VMSR[EBX],88H ; SET CONNECTED ; ; IF NOMODE IS ON LEAVE IN TNC COMMAND MODE, ELSE PUT INTO CONV MODE ; (MAY NEED TO IMPLEMENT CONMODE SOMETIME) ; CMP NOMODE[EBX],0 JNE CSWITCH00 ; OR MODEFLAG[EBX],CONV ; INTO CONVERSE MODE AND MODEFLAG[EBX],NOT (COMMAND+TRANS) CSWITCH00: RET TNCDISC: MOV AH,6 MOV CX,2 ; DISCONNECT MOV AL,NODEPORT[EBX] CALL NODE AND VMSR[EBX],7FH ; DROP DCD OR VMSR[EBX],08H ; DELTA DCD CALL SENDOK ; SEND CMD: RET SENDSTARDISC: MOV ESI,OFFSET DISCONNMSG MOV ECX,18 CALL SENDREPLY RET SENDOK: MOV ESI,OFFSET CMDMSG MOV ECX,4 CALL SENDREPLY KBRET: LEA EDI,TXBUFFER[EBX] MOV CURSOR[EBX],EDI ; RESET MESSAGE START MOV MSGLEN[EBX],0 RET SENDREPLY: LODSB CALL PUTCHARINBUFFER LOOP SENDREPLY RET RESTART: ; ; REINITIALISE CHANNEL ; CALL REINIT MOV ESI,OFFSET SIGNON MOV ECX,23 CALL SENDREPLY CALL SENDOK RET TNCRELEASE: ; ; DISCONNECT TNC, BUT LEAVE SESSION WITH NODE ; CALL DORELEASE CALL SENDOK RET DORELEASE: MOV AH,6 MOV CX,3 MOV AL,NODEPORT[EBX] CALL NODE ; RETURN TO NODE AND VMSR[EBX],7FH ; DROP DCD OR VMSR[EBX],08H ; DELTA DCD RET PUTSTRINGINBUFFER: LODSB CALL PUTCHARINBUFFER LOOP PUTSTRINGINBUFFER RET SEND_CONNECTED: ; ; SEND TAPR-STYLE *** CONNECTED TO CURRENT PORT ; TEST MODEFLAG[EBX],TRANS JNZ SENDCON10 ; NOT IF TRANSPARENT MOV ESI,OFFSET CONMSG MOV ECX,18 CALL PUTSTRINGINBUFFER MOV EDI,OFFSET NORMCALL MOV AH,8 MOV AL,NODEPORT[EBX] CALL NODE ; ; GET PACLEN FROM INCOMMING SESSION ; MOV EAX,SAVEBX ; PACLEN CMP AL,0 JE NOPACLENX MOV TPACLEN[EBX],AL NOPACLENX: MOV ESI,OFFSET NORMCALL MOV ECX,10 CALL PUTSTRINGINBUFFER MOV AL,0DH CALL PUTCHARINBUFFER SENDCON10: RET ; DONT BOTHER! ; ; COMBIOS EMULATION CODE ; ; THE SYSTEM MAINTAINS VIRTUAL MSR AND LSR REGS FOR EACH PORT ; ; THE MSR BITS SUPPORTED ARE DCD=CONNECTED ; CTS=NOT BUSY ; ; AN ATTEMPT IS ALSO MADE TO MAINTAIN DELTA BITS ; ; BIT 7 - Receive Line Signal Detect (DCD) ; 6 - Ring Indicator ; 5 - Data Set Ready ; 4 - Clear To Send ; 3 - Delta RLSD ( ie state has changed since last ; access) ; 2 - Trailing Edge Ring Detect ; 1 - Delta DSR ; 0 - Delta CTS EVEN ; GETPACLENFROMNODE: PUSH ECX PUSH EDX PUSH ESI PUSH EDI MOV AH,8 ; PARAMS MOV AL,NODEPORT[EBX] MOV EDI,OFFSET NORMCALL CALL NODE ; GET CALL ; MOV ECX,SAVEBX CMP CL,0 JE NOPACLEN MOV TPACLEN[EBX],CL NOPACLEN: POP EDI POP ESI POP EDX POP ECX JMP NODERET GETUNACKED: PUSH ECX PUSH EDX PUSH ESI PUSH EDI MOV AH,7 ; BUFFER STATUS MOV AL,NODEPORT[EBX] CALL NODE ; GET CALL ; MOV AH,CL ; UNACKED PACKETS MOV AL,CL ; FOR COMPATIBILITY POP EDI POP ESI POP EDX POP ECX JMP NODERET NODERET: RET SENDCHARSUPPORT: ; ; CALLED FROM SEND CHAR OR SEND BLOCK ; CALL KEYSUPPORT ; CHAR KEYED - BX IS SESSION RET _APIGETCHAR: PUBLIC _APIGETCHAR IMUL EBX,ECX,TYPE TNCDATA ADD EBX,TNCTABLE ; CMP RXCOUNT[EBX],0 JNE @F CALL GETDATA ; Poll Node @@: MOV EAX,-1 ; NOTHING DOING MOV ECX,0 ; no more CMP RXCOUNT[EBX],0 JE APIGETEXIT CALL GETONECHAR MOVZX ECX,RXCOUNT[EBX] ; ANY MORE? APIGETEXIT: RET GETONECHAR: mov eax,0 MOV ESI,GETPTR[EBX] LODSB ; GET CHAR DEC RXCOUNT[EBX] MOV EDX,TNCBUFFLEN ADD EDX,EBX CMP ESI,EDX ; BUFFER WRAP? JB L153C ; NO MOV ESI,EBX ; RESET TO START L153C: CMP RXCOUNT[EBX],128 ; GETTING LOW? JNB L1560 ; NO TEST RTSFLAG[EBX],1 ; RTS UP? JZ L1560 ; YES ; ; RTS HAD BEEN DROPPED TO STOP OTHER END SENDING - RAISE IT AGAIN ; AND RTSFLAG[EBX],0FEH L1560: MOV GETPTR[EBX],ESI RET PUTCHARINBUFFER: ; ; CALLED BY L4 CODE TO PASS DATA TO VIRTUAL TNC ; CMP RXCOUNT[EBX],TNCBUFFLEN JB STILLOK ; ; OVERRUN - LOSE IT ; OR VLSR[EBX],2 ; SET OVERRUN ERROR RET STILLOK: PUSH EDI AND VLSR[EBX],NOT 2 ; CLEAR OVERRRUN MOV EDI,PUTPTR[EBX] STOSB INC WORD PTR RXCOUNT[EBX] MOV EAX,TNCBUFFLEN ; BUFFER LENGTH ADD EAX,EBX ; END ADDR CMP EDI,EAX ; END OF BUFFER ADDR JB L1648 ; OK ; ; BUFFER WRAPAROUND ; MOV EDI,EBX ; POINT BACK TO START L1648: MOV PUTPTR[EBX],EDI CMP RXCOUNT[EBX],TNCBUFFLEN-300 ; ALLOW FOR FULL PACKET JB L1667 ; ; BUFFER GETTING FULL - DROP RTS/DTR ; OR RTSFLAG[EBX],1 ; SET BUSY L1667: POP EDI RET CHECKCTS: ; ; SEE IF CROSS-SESION STILL BUSY ; MOV AH,7 MOV AL,NODEPORT[EBX] CALL NODE ; ; CX = FRAMES QUEUED ; CMP ECX,4 ; SHOULD BE WINDOW?? JB FLOWOK TEST VMSR[EBX],00010000B ; ALREADY OFF? JZ CTSNOCHANGE AND VMSR[EBX],11101111B ; DROP CTS? OR VMSR[EBX],00000001B ; DELTA BIT CTSNOCHANGE: RET FLOWOK: TEST VMSR[EBX],00010000B ; ALREADY ON? JNZ CTSNOCHANGE OR VMSR[EBX],11H ; CTS AND DELTA CTS RET CONNECTTONODE: MOV AL,NODEPORT[EBX] MOV AH,6 ; CONNECT/DISCONNECT MOV CX,0 ; CONNECT USING APPL IN DL MOV DL,APPLICATION[EBX] CALL NODE lea ESI,MYCALL[EBX] CALL CONVTOAX25 lea eax,AX25CALL push eax movzx eax,NODEPORT[EBX] push eax CALL _ChangeSessionCallsign RET GETDATA: ; ; LOOK FOR STATUS CHANGE ; MOV AH,4 MOV AL,NODEPORT[EBX] CALL NODE ; CMP EDX,0 JE NOSTATECHANGE ; ; PORT HAS CONNECTED OR DISCONNECTED - SEND STATUS CHANGE TO PC ; PUSH ECX ; SAVE MOV AH,5 MOV AL,NODEPORT[EBX] CALL NODE ; ACK THE STATUS CHANGE POP ECX CMP ECX,0 JNE SENDHOSTCON ; ; DISCONNECTED ; FORCEOFF: OR MODEFLAG[EBX],COMMAND AND MODEFLAG[EBX],NOT (CONV+TRANS) AND VMSR[EBX],7FH ; DROP DCD OR VMSR[EBX],08H ; DELTA DCD CALL SENDSTARDISC JMP SHORT STATUSPOLLEND SENDHOSTCON: ; ; GET CALLSIGN ; CALL SEND_CONNECTED CALL DOCONMODECHANGE ; SET CONNECTED AND CHANGE MODE IF NEEDED JMP SHORT STATUSPOLLEND NOSTATECHANGE: ; ; VERIFY CURRENT STATE ; CMP CX,0 JNE SHOULDBECONN ; ; SWITCH THINKS WE ARE DISCONNECTED ; TEST VMSR[EBX],80H JZ STATUSPOLLEND ; SO DOES TNC ; JMP FORCEOFF ; DISCONNECT TNC SHOULDBECONN: ; ; SWITCH THINKS WE ARE CONNECTED ; TEST VMSR[EBX],80H JNZ STATUSPOLLEND ; SO DOES TNC ; JMP SENDHOSTCON ; CONNECT TNC STATUSPOLLEND: DONODEPOLL: ; ; SEE IF ANYTHING QUEUED ; MOV AL,NODEPORT[EBX] MOV AH,3 MOV EDI,OFFSET MONITORDATA CALL NODE CMP CX,0 JE DATAPOLLRET MOV ESI,OFFSET MONITORDATA GETD00: ; LODSB CALL PUTCHARINBUFFER LOOP GETD00 DATAPOLLRET: RET NODE: PUSH EBX CALL [_BPQHOSTAPI] MOV SAVEBX,EBX ; FOR FUNCTION 8 POP EBX RET CONSOLESEND: MOV ESI,EDI SENDCONS00: LODSB CALL PUTCHARINBUFFER LOOP SENDCONS00 SENDCONSEND: RET NORMSTR: lodsb OR AL,AL ; End of String ? je NORMSTR_RET ; Yes call PUTCHARINBUFFER jmp SHORT NORMSTR NORMSTR_RET: ret TENK DD 10000 DD 1000 DD 100 DWORD10 DD 10 ; ; Convert byte in AL to nnn, nn or n format ; CONV_DIGITS: ; CONVERT AL TO N\MAX 3 DIGITS MOV AH,0 CONV_5DIGITS: ; CONVERT AX TO 5 DIGITS PUSH EDX PUSH EBX MOV EBX,OFFSET TENK ; 10000 CMP AX,10 JB UNITS ; SHORT CUT AND TO STOP LOOP START_LOOP: cmp AX,WORD PTR [EBX] JAE STARTCONV ADD EBX,4 ; DWORD ENTRIES JMP SHORT START_LOOP ; 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,OFFSET DWORD10+4 ; JUST DIVIDED BY 10? JNE STARTCONV ; NO, SO ANOTHER TO DO ; ; RESET MUST BE UNITS ; UNITS: add AL,30H stosb POP EBX POP EDX ret CONVTOAX25: ; ; CONVERT CALLSIGN IN [SI] TO AX25 FORMAT IN AX25CALL ; RETURN NZ IF CALLSIGN INVALID ; MOV EDI,OFFSET AX25CALL MOV ECX,6 ; MAX ALPHANUMERICS MOV AL,40H REP STOSB ; CLEAR IN CASE SHORT CALL MOV AL,01100000B ; DEFAULT SSID STOSB MOV EDI,OFFSET AX25CALL MOV CL,7 CONVAX00: LODSB CMP AL,'-' JE CONVAX20 ; SSID FOLLOWS CMP AL,' ' JE CONVAX40 ; END OF NAME ; CMP AL,'#' JNE NOTHASH CMP CL,7 JE CONVAX10 ; OK AS FIRST CHAR NOTHASH: CMP AL,'/' ; ALLOW / AND DIGITS (FOR W0RLI!) JB CONVAX49 ; INVALID CMP AL,'9' JBE CONVAX10 ; OK CMP AL,'A' JB CONVAX49 ; INVALID CMP AL,'Z' JBE CONVAX10 ; OK CMP AL,'a' JB CONVAX10 ; OK CMP AL,'z' JA CONVAX49 ; INVALID AND AL,NOT 20H ; CONVERT TO UPPER CASE CONVAX10: SAL AL,1 ; SHIFT UP STOSB LOOP CONVAX00 ; ; HAVE PROCESSED 7 CHARS - NAME IS INVALID ; JMP SHORT CONVAX49 CONVAX20: LODSB ; FIRST CHAR IF SSID CMP AL,'0' JB CONVAX49 ; INVALID CMP AL,'9' JA CONVAX49 ; OK ; MOV AH,AL ; SAVE LODSB CMP AL,' ' JE CONVAX30 ; END OF SSID INC ESI ; OTHER CODE EXPECTS SI TO POINT TO NEXT FIELD CMP AL,'0' JB CONVAX49 ; INVALID CMP AL,'5' ; LIMIT 10 - 15 JA CONVAX49 ; OK ; SUB AL,30H CMP AH,'1' JNE CONVAX49 ; IF 2 DIGITS, FIRST MUST BE 1 ADD AL,10 MOV AH,AL CONVAX30: SAL AH,1 ; UP 1 BIT OR AH,01100000B ; DEFAULT RR BITS MOV AX25CALL+6,AH CONVAX40: ; ; NO SSID SUPPLIED ; XOR AL,AL ; SET ZERO RET CONVAX49: OR AL,1 ; SET NZ RET CONVFROMAX25: ; ; CONVERT AX25 FORMAT CALL IN [SI] TO NORMAL FORMAT IN NORMCALL ; RETURNS LENGTH IN CX AND NZ IF LAST ADDRESS BIT IS SET ; PUSH ESI ; SAVE MOV EDI,OFFSET NORMCALL MOV ECX,10 ; MAX ALPHANUMERICS MOV AL,20H REP STOSB ; CLEAR IN CASE SHORT CALL MOV EDI,OFFSET NORMCALL MOV CL,6 CONVAX50: LODSB CMP AL,40H JE CONVAX60 ; END IF CALL - DO SSID SHR AL,1 STOSB LOOP CONVAX50 CONVAX60: POP ESI ADD ESI,6 ; TO SSID LODSB MOV AH,AL ; SAVE FOR LAST BIT TEST SHR AL,1 AND AL,0FH JZ CONVAX90 ; NO SSID - FINISHED ; MOV BYTE PTR [EDI],'-' INC DI CMP AL,10 JB CONVAX70 SUB AL,10 MOV BYTE PTR [EDI],'1' INC DI CONVAX70: ADD AL,30H ; CONVERT TO DIGIT STOSB CONVAX90: MOV ECX,EDI SUB ECX,OFFSET NORMCALL MOV NORMLEN,ECX ; SIGNIFICANT LENGTH TEST AH,1 ; LAST BIT SET? RET DECODECALLSTRING: ; ; CONVERT CALL + OPTIONAL DIGI STRING AT [SI] TO AX25, RETURN ADDRESS ; OF CONVERTED STRING IN [SI], WITH NZ SET IF INVALID ; ; ALSO RETURN END OF INPUT STRING IN AX MOV STAYSWITCH,0 MOV SPYSWITCH,0 MOV EDI,OFFSET AX25STRING MOV ECX,64 MOV AL,0 REP STOSB ; CLEAR STRING MOV EDI,OFFSET CONNECTCALL MOV AX,2020H MOV ECX,5 REP STOSW MOV EDI,OFFSET CONNECTCALL MOV ECX,10 EXTRACTCALL: LODSB CMP AL,20H JE EXTR10 ; END STOSB LOOP EXTRACTCALL DECODECALL99_J: JMP DECODECALL99 ; DUFF EXTR10: PUSH ESI MOV ESI,OFFSET CONNECTCALL CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT MOV ESI,OFFSET AX25CALL MOV EDI,OFFSET AX25STRING MOV ECX,7 REP MOVSB POP ESI JNZ DECODECALL99_J ; INVALID ; ; GET NEXT FIELD = COULD BE CALLSIGN, VIA, OR S (FOR SAVE) ; MOV DIGIPTR,OFFSET AX25STRING+7 DIGILOOP: MOV EDI,OFFSET DIGICALL MOV AX,2020H MOV ECX,5 REP STOSW MOV EDI,OFFSET DIGICALL MOV ECX,10 CMP BYTE PTR [ESI],20H JE NOTDIGI ; END OF DIGI STRING EXTRACTDCALL: LODSB CMP AL,20H JE EXTRD10 ; END CMP AL,',' JE EXTRD10 ; END STOSB LOOP EXTRACTDCALL JMP DECODECALL99 ; DUFF EXTRD10: ; ; CHECK FOR VIA, ETC ; CMP DIGICALL,'V' JNE NOTVIA MOV AL,DIGICALL+1 CMP AL,20H JE DIGILOOP ; V CMP AL,'I' JNE NOTVIA MOV AL,DIGICALL+2 CMP AL,20H JE DIGILOOP ; VI CMP AL,'A' JNE NOTVIA CMP DIGICALL+3,' ' JE DIGILOOP ; VIA NOTVIA: CMP WORD PTR DIGICALL,' S' ; S SPACE = STAY JNE NOTSTAY MOV STAYSWITCH,'S' JMP DIGILOOP NOTSTAY: CMP WORD PTR DIGICALL,' Z' ; Z SPACE = 'SPY' JNE NOTSPY MOV SPYSWITCH,'Z' JMP DIGILOOP NOTSPY: PUSH ESI ; SAVE COMMAND POINTER MOV ESI,OFFSET DIGICALL CALL CONVTOAX25 ; CONVERT PARAM TO AX25 FORMAT MOV ESI,OFFSET AX25CALL MOV EDI,DIGIPTR MOV ECX,7 REP MOVSB POP ESI JNZ DECODECALL99 ; INVALID MOV DIGIPTR,EDI ; SAVE JMP DIGILOOP NOTDIGI: XOR AL,AL ; RETURN ZERO MOV EAX,ESI ; NEXT CHAR IN INPUT STRING MOV ESI,OFFSET AX25STRING RET DECODECALL99: OR AL,1 RET ; NZ SET ; ; MONITORING STUFF ; PUBLIC _INITTNC2 _INITTNC2: ; ; INITIALISE PORT. CALLED ONCE FOR EACH STREAM. PARAMS ARE PORT NUMBER AND BPQ STREAM ; STREAM SHOULD BE ALLOCATED BY CALLER PUSH ECX ; SAVE PORT NUMBER IMUL EBX,ECX,TYPE TNCDATA ADD EBX,TNCTABLE ; ; EBX = PORT Number, EAX = BPQ STREAM ; MOV NODEPORT[EBX],AL POP EAX MOV BIOSPORT[EBX],AL INC EAX MOV NUMBEROFSTREAMS,EAX ; Assumes ports are initialised in order REINIT: MOV EAX,0 ; START OF BUFFER ADD EAX,EBX MOV PUTPTR[EBX],EAX MOV GETPTR[EBX],EAX MOV RXCOUNT[EBX],0 MOV VLSR[EBX],20H MOV VMSR[EBX],30H MOV MODEFLAG[EBX],COMMAND MOV SENDPAC[EBX],0DH MOV CRFLAG[EBX],1 MOV MALL[EBX],1 MOV MMASK[EBX],0FFFFH ; MONITOR MASK FOR PORTS MOV AL,BYTE PTR SAVEPACLEN MOV TPACLEN[EBX],AL ; TNC PACLEN MOV APPLICATION[EBX],BBSAPPL ; FOR COMPATIBILITY MOV APPLFLAGS[EBX],6 ; DEFAULT MOV COMCHAR[EBX],3 MOV CMDTIME[EBX],10 ; SYSTEM TIMER = 100MS LEA EDI,TXBUFFER[EBX] MOV CURSOR[EBX],EDI ; RESET MESSAGE START PUSH ECX MOV ESI,OFFSET UNPROTOCALL CALL DECODECALLSTRING LEA EDI,UNPROTO[EBX] MOV ECX,56 REP MOVSB ; UNPROTO ADDR POP ECX ; Set MYCALL to APPLCALL PUSH 1 ; Default APPL CALL _GetApplCall mov esi,eax cmp byte ptr[esi],0 jne @f mov esi, offset _nodecall @@: lea edi,MYCALL[EBX] mov ecx,10 rep movsb RET _TEXT ENDS END