.186 PAGE 56,132 ; .LALL .LFCOND DEBUG EQU 0 CR EQU 0DH LF EQU 0AH ; CODE SEGMENT PUBLIC 'CODE' CODE ENDS ; TO FORCE LINK ORDER INCLUDE KANTEQU.ASM INCLUDE ENVIRON.ASM INCLUDE STRUCS.ASM DATA SEGMENT PUBLIC 'DATA' ; VECS DB 160 DUP ('*') ; VECTORS DW 128 DUP ('**') STACKTOP LABEL WORD ; NEIGHBOURS DW 0 DW TYPE NEIGHBOUR_LIST MAXNEIGHBOURS DW 20 ; MAX ADJACENT NODES DESTS DW 0 ; NODE LIST DW TYPE DEST_LIST MAXDESTS DW 125 ; MAX NODES IN SYSTEM LINKS DW 0 ; L2 LINK TABLE MAXLINKS DW 10 ; MAX LEVEL 2 LINKS (UP,DOWN AND INTERNODE) L4TABLE DW 0 MAXCIRCUITS DW 20 ; NUMBER OF L4 CIRCUITS PORTTABLE DW 0 NUMBEROFPORTS DW 0 ENDDESTLIST DW 0 ; NODE LIST+1 ; NUMBEROFSTREAMS DW 0 TNCTABLE DW 0 PROMSUM DW 0 ; CHECKSUM OF PROM IMAGE (FOR WARM START TEST) FREE_Q DW 0 ; FREE BUFFER CHAIN BUFFERPOOL DW 0 ; START OF BUFFER POOL OBSINIT DW 5 ; INITIAL OBSOLESCENCE VALUE OBSMIN DW 4 ; MINIMUM TO BROADCAST L3INTERVAL DW 60 ; 'NODES' INTERVAL IN MINS IDINTERVAL DW 15 ; 'ID' BROADCAST INTERVAL BTINTERVAL DW 0 ; BEACON INTERVAL MINQUAL DW 30 ; MIN QUALITY FOR AUTOUPDATES HIDENODES DB 0 ; N * COMMAND SWITCH BBSQUAL DB 255 ; QUALITY OF BBS RELATIVE TO NODE ; TRANSDELAY DB 2 ; TRANSPARENT MODE TIMEOUT NUMBEROFBUFFERS DW 255 ; PACKET BUFFERS PACLEN DW 100 ; MAX PACKET SIZE ; ; L2 SYSTEM TIMER RUNS AT 10 HZ ; T3 DW 10*61*3 ; LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions) L2KILLTIME DW 16*60*10 ; IDLE LINK TIMER (16 MINS) L3LIVES DW 15 ; MAX L3 HOPS L4N2 DW 3 ; LEVEL 4 RETRY COUNT L4T1 DW 60 ; LEVEL 4 TIMEOUT L4LIMIT DW 60*15 ; IDLE SESSION LIMIT - 15 MINS L4DELAY DW 5 ; L4 DELAYED ACK TIMER L4DEFAULTWINDOW DB 4 ; DEFAULT WINDOW BBS DB 0 ; INCLUDE BBS SUPPORT NODE DB 1 ; INCLUDE SWITCH SUPPORT LINKEDFLAG DB 0 ; ; STATION INFORMATION ; MYCALL DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED) DB 'KANT ' ; NODE ALIAS (KEEP TOGETHER) BBSCALL DB 7 DUP (0) ; BBS ADDR IN AX25 DB 'KANT ' ; BBS ALIAS DB 20H ; FOR ATTACH COMMAND MYNODECALL DB 'G8BPQ-6 ' ; NODE CALLSIGN (ASCII) MYLINKCALL DB 'G8BPQ-6 ' ; BBS CALLSIGN ; CWCALL DB 'G8BPQ ' ; CWID CALLSIGN ; ; 'ID' MESSAGE - SENT EVERY 10 MINS ; IDHDDR DB 0,0,0 DW 21 ; HEADER LENGTH IDDEST DB 'I'+'I','D'+'D',40h,40h,40h,40h,11100000B ; ID IN AX25 FORM IDORIGIN DB 7 DUP (0) DB 03H,0F0H ; UI, PID ; IDMSG DW 0 ; ; INFOMSG DW 0 INFOLEN DW 0 ; CTEXTMSG DW 0 CTEXTLEN DW 0 ; FULL_CTEXT DB 1 ; CTEXT ON ALL CONNECTS IF NZ MYALIAS DB 7 DUP (0) ; ALIAS IN AX25 FORM BBSALIAS DB 7 DUP (0) AX25CALL DB 7 DUP (0) ; WORK AREA FOR AX25 <> NORMAL CALL CONVERSION NORMCALL DB 10 DUP (0) ; CALLSIGN IN NORMAL FORMAT NORMLEN DW 0 ; LENGTH OF CALL IN NORMCALL NEXTFREEDATA DW ENDOFDATA ; OFFSET OF NEXT FREE BYTE CURRENTPORT DB 0 ; PORT FOR CURRENT MESSAGE CURRENTPORTPTR DW 0 ; PORT CONTROL TABLE ENTRY FOR CURRENT PORT SDCBYTE DB 0 ; CONTROL BYTE FOR CURRENT FRAME SDRBYTE DB 0 ; SAVED CONTROL BYTE FOR FRMR BUFFER DW 0 ; GENERAL SAVE AREA FOR BUFFER ADDR ADJBUFFER DW 0 ; BASE ADJUSED FOR DIGIS TEMPFIELD DB 7 DUP (0) ; ADDRESS WORK FILED BUFFLEN EQU 340 ; ?? RANDOM DB 0 ; 'RANDOM' NUMBER FOR PERSISTENCE CALCS L2TIMERFLAG DB 0 ; INCREMENTED AT 100HZ BY TIMER INTERRUPT L3TIMERFLAG DW 0 ; DITTO L4TIMERFLAG DB 10 ; DITTO REALTIMETICKS DW 0 ; 100HZ TICKS TENHZCOUNT DW 0 ; 10 HZ TICKS HEADERCHAR DB '}' ; CHAR FOR NODE HEADER MSGS LASTPOINTER DW 0 ; PREVIOUS NODE DURING CHAINING LEDFLAG DB 0 ; FOR WATCHDOG LED (7) HDLCPORT1 DW 0 ; FOR INTERRUPT HANDLER ASYNCPORT DW 0 ; DITTO PORTPTR DW 0 TRACE_Q DW 0 ; FRAMES TO BE TRACED TNCPORTLIST DB 8 DUP (0) ; ONLY ONE ALLOWED UNPROTOCALL DB 80 DUP (0) ASYNCMODE DB 0 ; ASYNC PORT MODE - TERMINAL OR KISS TIMACTIVE DB 0 ; PORT TIMER ROUTINES ACTIVE BUFFERSLOW DB 0 ; TO FORCE RESET ON BUFFER PROBLEM ; IPHOSTVECTOR DB 7 DUP (0) ; FOR ROUTER (EVENTUALLY) ; ; VECTOR FORMAT IS: ; ; 0-1 2 BYTES - ADDRESS OF SESSION ENTRY ; 2 1 BYTE - STATE CHANGE FLAGS ; 3 1 BYTE - APPLICATION MASK ; 4 1 BYTE - APPLICATION FLAGS ; 5-6 2 BYTES - RAW FRAME QUEUE ; PUBLIC MYCALL,MYALIAS,BBSALIAS,NORMCALL,AX25CALL,DESTS,IDMSG,UNPROTOCALL PUBLIC FREE_Q,CURRENTPORT,CURRENTPORTPTR,NEIGHBOURS,MYLINKCALL PUBLIC LINKS,PORTTABLE,NUMBEROFPORTS,BUFFER,ADJBUFFER,BUFFLEN PUBLIC SDCBYTE,SDRBYTE,L4TABLE,BUFFER,BBSCALL,NORMLEN,ASYNCMODE PUBLIC INFOMSG,INFOLEN,RANDOM,BBS,NODE,TRACE_Q,TRANSDELAY PUBLIC ENDDESTLIST,ASYNCPORT,HDLCPORT1,NUMBEROFSTREAMS,TNCTABLE PUBLIC MAXLINKS,MAXDESTS,MAXNEIGHBOURS,MAXCIRCUITS,HEADERCHAR PUBLIC BBS,T3,PACLEN,L2KILLTIME,IDINTERVAL,BTINTERVAL,IPHOSTVECTOR PUBLIC OBSINIT,OBSMIN,NODE,L3INTERVAL,L4T1,L4N2,L3LIVES,L4LIMIT,L4DELAY PUBLIC MINQUAL,HIDENODES,L4DEFAULTWINDOW PUBLIC LINKEDFLAG,REALTIMETICKS,TENHZCOUNT PUBLIC CTEXTMSG,CTEXTLEN,FULL_CTEXT EXTRN MINBUFFCOUNT:BYTE,NOBUFFCOUNT:WORD,RESTARTS:BYTE EXTRN IDTIMER:WORD,QCOUNT:BYTE,ROUTEQUAL:BYTE,SWITCH:BYTE EXTRN DESTHEADER:WORD,ENDOFDATA:WORD,BTTIMER:WORD EXTRN RAN1:BYTE,RAN2:BYTE,RAN3:BYTE,RAN5:BYTE,NEEDMH:BYTE EXTRN MAXBUFFS:BYTE EXTRN SAVEPORT:BYTE DATA ENDS CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:DATA ; EXTRN KISSINIT:NEAR,KANTINIT:NEAR,ENDOFCODE:BYTE ; ; MACHINE MAY HAVE 128K (OR MORE) OF BB RAM AT 0, ; OR 64K ADDRESSABLE AT 38000H (BUT REPEATING THROUGH MAP) ; ; IF DLL, THEN CODE IS LOADED IN SEG 0, BUT VECTORS MUST BE AT 0:0 ; DATA IS AT 38000 ; ; PROM BASED CODE MAY RUN WITH CODE ANYWHERE (SO IT CAN GO IN EITHER ; SOCKET - 80000 OR C0000) ; ; PROM BASED CODE USES DATA AT 38000 ; ; THUS PROM CODE NEEDS 2 * 32K RAMS, DLL 1 * 128K AND 1 * 32K (AT LEAST) ; ; THE CONFIG FILE INFO IS PATCHED INTO ROM AT 32K ; CONFIGTABLE LABEL BYTE INITDATA STRUC ; ; CONFIGURATION DATA STRUCTURE ; ; DEFINES LAYOUT OF CONFIG RECORD PRODUCED BY CONFIGURATION PROG ; ; LAYOUT MUST MATCH THAT IN CONFIG.C SOURCE ; ; LAYOUT IS THE SAME AS FOR PC VERSION ; C_NODECALL DB 10 DUP (0) ; OFFSET = 0 C_NODEALIAS DB 10 DUP (0) ; OFFSET = 10 C_BBSCALL DB 10 DUP (0) ; OFFSET = 20 C_BBSALIAS DB 10 DUP (0) ; OFFSET = 30 ; C_OBSINIT DW 0 ; OFFSET = 40 C_OBSMIN DW 0 ; OFFSET = 42 C_NODESINTERVAL DW 0 ; OFFSET = 44 C_L3TIMETOLIVE DW 0 ; OFFSET = 46 C_L4RETRIES DW 0 ; OFFSET = 48 C_L4TIMEOUT DW 0 ; OFFSET = 50 C_BUFFERS DW 0 ; OFFSET = 52 C_PACLEN DW 0 ; OFFSET = 54 C_TRANSDELAY DW 0 ; OFFSET = 56 C_T3 DW 0 ; OFFSET = 58 DW 0 ; OFFSET = 60 DW 0 ; OFFSET = 62 C_IDLETIME DW 0 ; OFFSET = 64 C_EMSFLAG DB 0 ; OFFSET = 66 C_LINKEDFLAG DB 0 ; OFFSET = 67 C_BBS DB 0 ; OFFSET = 68 C_NODE DB 0 ; OFFSET = 69 DB 0 ; OFFSET = 70 DB 0 ; OFFSET = 71 SPARE (WAS UFQ) C_MAXLINKS DW 0 ; OFFSET = 72 C_MAXDESTS DW 0 C_MAXNEIGHBOURS DW 0 C_MAXCIRCUITS DW 0 ; 78 C_TNCPORTLISTO DB 16 DUP (0) ; OFFSET = 80 NOW SPARE C_IDINTERVAL DW 0 ; 96 C_FULLCTEXT DW 0 ; 98 C_MINQUAL DW 0 ; 100 C_HIDENODES DB 0 ; 102 C_L4DELAY DW 0 ; 103 C_L4WINDOW DW 0 ; 105 C_BTINTERVAL DW 0 ; 106 X_UNPROTO DB 9 DUP (0) ; 108 ; NOW SPARE C_BBSQUAL DW 0 ; 117 C_UNPROTO DB 80 DUP (0) ; 119 DB 37h DUP (0) ; CHECK THIS !!!!! C_VERSION DB 0 ; CONFIG PROG VERSION ; ; C_APPLICATIONS DB 128 DUP (0) ; 16 BYTES FOR EACH OF 8 SERVICES C_TNCPORTLIST DB 128 DUP (0) ; 8 BYTES FOR EACH OF 16 PORTS C_IDMSG DB 512 DUP (0) C_INFOMSG DB 512 DUP (0) C_ROUTES DB 512 DUP (0) C_CTEXT DB 512 DUP (0) C_PORTS DB 16 * 512 DUP (0) ; MAX 16 PORTS! INITDATA ENDS ; START: DATASEG EQU 3820H ; KEEP 512 BYTES CLEAR FOR VECTORS ; ; FIRST 160 BYTES KEPT FREE FOR INTERRUPT VECTORS, ; IN CASE RUNNING FROM RAM ; JMP STARTUP DB CONFIGVERSION ; FOR CONFIG PATCH ROUTINE DD 39 DUP (0) ; FIRST 32 RESERVED, WE NEED 8 D10 DW 10 B10 DB 10 B100 DB 100 ; TICKSPERMINUTE DW 18*60 ; FOR CWID STARTUP: ; ; SET UP BASIC ONCHIP CONTROLS ; CLI CLD ; MOV AL,0 MOV DX,OPHA OUT (DX),AL ; I/O BASE HIGH - ZERO MOV AL,0 MOV DX,RFC OUT (DX),AL ; NO REFRESH MOV AL,01110111B ; UPPER AND LOWER = 512 K EACH MOV DX,WMB OUT (DX),AL MOV AL,00110000B ; MAX WAIT IN PROM, NONE IN RAM/IO MOV DX,WCY1 OUT (DX),AL MOV AL,4 MOV DX,WCY2 OUT (DX),AL ; 1 WAIT FOR DMA MOV AL,0E0H MOV DX,SULA OUT (DX),AL ; SERIAL I/O AT 0E0H MOV AL,0E4H MOV DX,TULA OUT (DX),AL ; TIMERS AT 0E4H - 0E7H MOV AL,0E8H MOV DX,IULA OUT (DX),AL ; INTERRUPT CONTROLLER AT 0E8H MOV AL,0F0H MOV DX,DULA OUT (DX),AL ; DMA CONTROLLER AT 0F0H MOV AL,0FH MOV DX,OPSEL OUT (DX),AL ; ENABLE ALL INTERNAL DEVICES MOV AL,07H MOV DX,OPCN OUT (DX),AL ; SERIAL I/O WITH SRDY ; SCU INT TO INT P1 ; ; SET UP INTERRUPT SYSTEM ; MOV AL,1AH ; LEVEL, SINGLE OUT (IIW1),AL MOV AL,32 OUT (IIW2),AL ; VECTORS START AT 32 MOV AL,0F4H OUT (IMKW),AL ; MASK ALL BUT LEVEL 0 (TIMER) 1(SCU) 3(SCC) MOV AL,0 MOV DX,TCKS OUT (DX),AL ; ALL COUNTERS FROM INTERNAL /2 CLOCK ; ; FIRE UP COUNTER 0 AS A TIMEBASE, COUNTER 1 AS BRG FOR SERIAL I/O ; MOV AL,00110110B ; TIMER 0, LOW/HI, MODE3, BINARY OUT (TMD),AL MOV AX,HZ100 ; 100 HZ OUT (TCT0),AL MOV AL,AH OUT (TCT0),AL MOV AL,01110110B ; TIMER 1, LOW/HI, MODE3, BINARY OUT (TMD),AL MOV AX,BD9600 ; 9600 BAUD OUT (TCT1),AL MOV AL,AH OUT (TCT1),AL ; MOV AL,10110110B ; TIMER 2, LOW/HI, MODE3, BINARY OUT (TMD),AL MOV AX,BD9600 ; 9600 BAUD OUT (TCT2),AL MOV AL,AH OUT (TCT2),AL ; FOR TOUT2 ; ; GET SERIAL I/O UNIT GOING ; MOV AL,11001110B ; 2 STOP NO PARITY 8 BIT 16X OUT (SMD),AL MOV AL,25H ; SRDY + RXEN +TXEN OUT (SCM),AL ; MOV AL,0 OUT (SIMK),AL ; UNMASK TX AND RX INTS ; ; SET UP VECTORS ; XOR AX,AX MOV DS,AX MOV SI,0 MOV CX,40 ; SET ALL VECTORS TO REBOOT VECINIT: MOV WORD PTR [SI],0 MOV WORD PTR 2[SI],0FFFFH ; RESTART AT FFFF:0 ADD SI,4 LOOP VECINIT MOV SI,32*4 MOV WORD PTR [SI],OFFSET TCUINT MOV WORD PTR 2[SI],CS MOV WORD PTR 4[SI],OFFSET SCUINT MOV WORD PTR 6[SI],CS ; MOV WORD PTR 12[SI],OFFSET SCCINT MOV WORD PTR 14[SI],CS MOV AX,DATASEG MOV ES,AX MOV SS,AX MOV SP,OFFSET STACKTOP ; LED 0,OFF LED 1,OFF LED 2,OFF LED 3,OFF LED 4,OFF LED 5,OFF LED 6,OFF LED 7,ON ; ; CHECK FOR POSSIBILITY OF A WARM START ; ; ; SEE IF PROM HAS CHANGED ; MOV DX,0 MOV CX,32768 MOV SI,0 CKLOOP: ADD DX,WORD PTR CS:[SI] ADD SI,2 LOOP CKLOOP CMP DX,ES:PROMSUM JNE COLDINIT ; PROM HAS CHANGED ; ; CHECK CONFIG DATA FROM PROM ; ; ES = DATA SEG, DS = CS+800 (TO REFERENCE CONFIG INFO FROM PROM ; MOV AX,CS ADD AX,800H MOV DS,AX ASSUME DS:NOTHING MOV AL,DS:C_BBS CMP BBS,AL JNE COLDINIT MOV AL,DS:C_NODE CMP NODE,AL JNE COLDINIT MOV AX,DS:C_MAXLINKS CMP MAXLINKS,AX JNE COLDINIT MOV AX,DS:C_MAXDESTS CMP MAXDESTS,AX JNE COLDINIT MOV AX,DS:C_MAXNEIGHBOURS CMP MAXNEIGHBOURS,AX JNE COLDINIT MOV AX,DS:C_MAXCIRCUITS CMP MAXCIRCUITS,AX JNE COLDINIT ; ; SEEMS POSSIBLE CONFIG IS OK - START IT UP ; MOV AX,DATASEG MOV DS,AX JMP WARMENTRY COLDINIT: ; ; ; DATA IS LOADED IMMEDIATELY FOLLOWING CODE, BUT IS ADDRESSED VIA ITS ; SEGMENT BASE ; ; COPY DATA TO ITS RAM SEGMENT ; MOV AX,DATASEG MOV ES,AX MOV AX,CS MOV DS,AX MOV SI,OFFSET ENDOFCODE+160 ; LEAVE VECTORS! = START OF DATA MOV DI,160 MOV CX,OFFSET ENDOFDATA-160 ; LENGTH OF DATA ; MOV SI,OFFSET ENDOFCODE ; START OF DATA ; MOV DI,0 ; MOV CX,OFFSET ENDOFDATA ; LENGTH OF DATA REP MOVSB ; ; CLEAR REST ; MOV CX,0FD80H SUB CX,OFFSET ENDOFDATA XOR AL,AL REP STOSB ; MOV ES:PROMSUM,DX ; SAVE PROM CHECKSUM ; ; COPY CONFIG DATA FROM PROM ; ; ES = DATA SEG, DS = CS+800 (TO REFERENCE CONFIG INFO FROM PROM ; MOV AX,CS ADD AX,800H MOV DS,AX ASSUME DS:NOTHING MOV SI,OFFSET C_NODECALL CMP DS:C_NODE,0 JNE GOTNODE ; ; USE BBS CALL FOR NODE AS WELL ; MOV SI,OFFSET C_BBSCALL GOTNODE: MOV DI,OFFSET MYNODECALL MOV CX,10 REP MOVSB ; COPY NODE CALL MOV DI,OFFSET MYCALL+7 MOV CX,6 REP MOVSB ; COPY NODE ALIAS ; ; IF NO BBS, SET BOTH TO NODE CALLSIGN ; MOV SI,OFFSET C_BBSCALL CMP DS:C_BBS,0 JNE GOTBBS MOV SI,OFFSET C_NODECALL GOTBBS: MOV DI,OFFSET MYLINKCALL MOV CX,10 REP MOVSB ; COPY BBS CALL MOV DI,OFFSET BBSCALL+7 MOV CX,6 REP MOVSB ; COPY BBS ALIAS MOV SI,OFFSET C_UNPROTO MOV DI,OFFSET UNPROTOCALL ; UNPROTO DEST MOV CX,80 UNPLOOP: ; ; CONVERT TO UPPER CASE ; LODSB CMP AL,'a' JB UNPOK CMP AL,'z' JA UNPOK SUB AL,20H UNPOK: STOSB LOOP UNPLOOP MOV AX,DS:C_OBSINIT MOV OBSINIT,AX MOV AX,DS:C_OBSMIN MOV OBSMIN,AX MOV AX,DS:C_NODESINTERVAL MOV L3INTERVAL,AX MOV AX,DS:C_IDINTERVAL MOV IDINTERVAL,AX OR AX,AX JZ NO_ID MOV IDTIMER,2 NO_ID: MOV AX,DS:C_BTINTERVAL MOV BTINTERVAL,AX OR AX,AX JZ NO_BT MOV BTTIMER,2 NO_BT: MOV AX,DS:C_FULLCTEXT MOV FULL_CTEXT,AL MOV AX,DS:C_BBSQUAL MOV BBSQUAL,AL MOV AX,DS:C_MINQUAL MOV MINQUAL,AX MOV AX,DS:C_L3TIMETOLIVE MOV L3LIVES,AX MOV AX,DS:C_L4RETRIES MOV L4N2,AX MOV AX,DS:C_L4WINDOW MOV L4DEFAULTWINDOW,AL MOV AX,DS:C_L4TIMEOUT MOV L4T1,AX MOV AX,DS:C_BUFFERS MOV NUMBEROFBUFFERS,AX MOV AX,DS:C_PACLEN MOV PACLEN,AX MOV AX,DS:C_T3 MUL D10 ; 10HZ L2 CLOCK MOV T3,AX MOV AX,DS:C_IDLETIME MOV L4LIMIT,AX MUL D10 MOV L2KILLTIME,AX MOV AX,DS:C_L4DELAY MOV L4DELAY,AX MOV AL,DS:C_BBS MOV BBS,AL MOV AL,DS:C_NODE MOV NODE,AL MOV AL,DS:C_LINKEDFLAG MOV LINKEDFLAG,AL MOV AX,DS:C_MAXLINKS MOV MAXLINKS,AX MOV AX,DS:C_MAXDESTS MOV MAXDESTS,AX MOV AX,DS:C_MAXNEIGHBOURS MOV MAXNEIGHBOURS,AX MOV AX,DS:C_MAXCIRCUITS MOV MAXCIRCUITS,AX MOV AL,DS:C_HIDENODES MOV HIDENODES,AL MOV SI,OFFSET C_TNCPORTLIST MOV DI,OFFSET TNCPORTLIST MOV CX,8 REP MOVSB ; ; SET UP APPLICATION LIST ; IF 0 MOV CX,8 MOV SI,OFFSET C_APPLICATIONS MOV DI,OFFSET APPLS APPLLOOP: CMP BYTE PTR [SI],20H ; UNUSED - LEAVE ALONE JE NXTAPPL PUSH SI PUSH DI PUSH CX MOV CX,12 REP MOVSB POP CX POP DI ; ; SET LENGTH FIELD ; MOV BYTE PTR ES:12[DI],0 ; LENGTH MOV SI,DI LENLOOP: INC BYTE PTR ES:12[DI] INC SI CMP BYTE PTR ES:[SI],20H JA LENLOOP POP SI NXTAPPL: ADD SI,16 ADD DI,15 LOOP APPLLOOP ; ENDIF ; SET UP PORT TABLE ; MOV PORTPTR,OFFSET C_PORTS MOV BX,NEXTFREEDATA MOV PORTTABLE,BX PORTLOOP: MOV SI,PORTPTR CMP BYTE PTR [SI],0 JNE PORTREADOK ; ; END OF LIST ; JMP ENDPORTLOOP PORTREADOK: LODSW MOV ES:PORTNUMBER[BX],AL LEA DI,PORTDESCRIPTION[BX] MOV CX,30 REP MOVSB ; LODSW ; H/W TYPE MOV ES:PORTTYPE[BX],AL OR AL,AL JZ ASYNCPORT1 MOV ES:PORTTYPE[BX],4 ; HDLC MOV ES:PORTINITCODE[BX],OFFSET KANTINIT MOV ES:PORTTXROUTINE[BX],OFFSET HDLCTX MOV ES:PORTRXROUTINE[BX],OFFSET HDLCRX MOV ES:PORTTIMERCODE[BX],OFFSET HDLCTIMER CMP HDLCPORT1,0 JNE PORTREST MOV HDLCPORT1,BX JMP SHORT PORTREST ASYNCPORT1: MOV ES:PORTINITCODE[BX],OFFSET KISSINIT MOV ES:PORTTXROUTINE[BX],OFFSET KISSTX MOV ES:PORTRXROUTINE[BX],OFFSET KISSRX MOV ES:PORTTIMERCODE[BX],OFFSET KISSTIMER MOV ES:PORTDISABLED[BX],1 ; DISABLE INITIALLY CMP ASYNCPORT,0 JNE PORTREST MOV ASYNCPORT,BX PORTREST: LODSW MOV ES:PROTOCOL[BX],AL LODSW MOV ES:IOBASE[BX],AX LODSW MOV ES:INTLEVEL[BX],AL LODSW MOV ES:BAUDRATE[BX],AX LODSW MOV ES:CHANNELNUM[BX],AL LODSW MOV ES:BBSBANNED[BX],AL LODSW MOV ES:PORTQUALITY[BX],AL LODSW MOV ES:PORTWINDOW[BX],AL LODSW DIV B10 ; CONVERT TO TIMER TICKS MOV ES:PORTTXDELAY[BX],AL LODSW DIV B10 ; CONVERT TO TIMER TICKS MOV ES:PORTSLOTTIME[BX],AL LODSW MOV ES:PORTPERSISTANCE[BX],AL LODSW MOV ES:FULLDUPLEX[BX],AL LODSW MOV ES:SOFTDCDFLAG[BX],AL LODSW DIV B100 ; CONVERT MSECS TO 1/10 SECS MOV ES:PORTT1[BX],AL LODSW DIV B100 ; CONVERT MSECS TO 1/10 SECS MOV ES:PORTT2[BX],AL LODSW MOV ES:PORTN2[BX],AL LODSW MOV ES:PORTPACLEN[BX],AL ; LODSW MOV ES:QUAL_ADJUST[BX],AL ; 'SAME PORT' QUALITY FACTOR ; LODSW MOV ES:DIGIFLAG[BX],AL ; DIGI CONTROL FLAG ; LODSW MOV ES:DIGIPORT[BX],AL ; PORT FOR CROSS BAND DIGI ; LODSW MOV ES:USERS[BX],AL ; NUMBER OF L2 SESSIONS ; LODSW ; ; IF USING KISS, SET A DEFAULT; ; CMP ES:PORTTYPE[BX],0 ; ASYNC JE TAILKISS ; ; ON HDLC, TAIL TIMER IS USED TO HOLD RTS FOR 'CONTROLLED FULL DUP' ; MODE. VALUE IS IN SECONDS, NOT MS ; JMP SHORT SETTAIL TAILKISS: OR AX,AX JNZ GOTTAIL MOV AX,30 ; DEFAULT GOTTAIL: DIV B10 ; CONVERT TO TIMER TICKS SETTAIL: MOV ES:PORTTAILTIME[BX],AL LODSW MOV ES:PORTBBSFLAG[BX],AL ; PORT CALL/ALIAS IS BBS FLAG MOV SI,PORTPTR ADD SI,110 ; LODSW MOV ES:PORTL3FLAG[BX],AL ; L3 ONLY FLAG ; LODSW MOV ES:KISSFLAGS[BX],AL ; KISS MODE OPTION BITS ; LODSW MOV ES:PORTINTERLOCK[BX],AL ; PORT INTERLOCK MASK ; LODSW MOV ES:NODESPACLEN[BX],AL ; LENGTH OF NODES PACKET LODSW MOV ES:TXPORT[BX],AL ; IF SHARED TX SYSTEM MOV AL,122[SI] ; MINQUAL MOV ES:PORTMINQUAL[BX],AL ; ; SET UP CWID ; MOV SI,PORTPTR MOV AL,121[SI] ; FLAG FOR ONOFF KEYING CMP AL,'o' JNE SETTYPE MOV AL,'O' SETTYPE: MOV ES:CWTYPE[BX],AL MOV SI,PORTPTR ADD SI,80 ; TO CWID FIELD MOV CX,8 ; MAX ID LENGTH LEA DI,CWID[BX] MOV ES:CWPOINTER[BX],DI MOV AX,29 ; ALLOW A MINUTE FOR CHANNEL TO GO QUIET SUB AL,ES:PORTNUMBER[BX] ; SPREAD THEM OUT A BIT MUL TICKSPERMINUTE MOV ES:CWIDTIMER[BX],AX CWIDLOOP: LODSB CMP AL,20H JBE CWIDEND CMP AL,'Z' JA CWIDBAD SUB AL,2FH JC CWIDBAD ; DUFF CHAR CBW PUSH SI MOV SI,OFFSET CWTABLE ADD SI,AX ADD SI,AX LODS WORD PTR CS:CWTABLE ; PATTERN STOSW POP SI CWIDBAD: LOOP CWIDLOOP CWIDEND: ; ; SEE IF LINK CALLSIGN/ALIAS SPECIFIED ; MOV SI,PORTPTR ADD SI,90 ; TO LINK CALL CMP BYTE PTR [SI],20H JBE NOLINKCALL MOV DI,OFFSET NORMCALL MOV CX,10 REP MOVSB PUSH DS PUSH ES POP DS ; SET DS TO DATA MOV SI,OFFSET NORMCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL LEA DI,PORTCALL[BX] MOV CX,7 REP MOVSB POP DS NOLINKCALL: MOV SI,PORTPTR ADD SI,100 ; TO LINK ALIAS CMP BYTE PTR [SI],20H JBE NOLINKALIAS MOV DI,OFFSET NORMCALL MOV CX,10 REP MOVSB PUSH DS PUSH ES POP DS ; SET DS TO DATA MOV SI,OFFSET NORMCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL LEA DI,PORTALIAS[BX] MOV CX,7 REP MOVSB POP DS NOLINKALIAS: ; ; SET UP NEXT PORT PTR ; MOV AX,BX ADD AX,TYPE PORTCONTROL MOV ES:PORTPOINTER[BX],AX ; ; SEE IF PERMITTED LINK CALLSIGNS SPECIFIED ; MOV SI,PORTPTR ADD SI,256 ; TO PERMITTED CALLS CMP BYTE PTR [SI],20H JBE NOPERMITTEDCALLS ; NONE SPECIFIED MOV ES:PERMITTEDCALLS[BX],AX; START OF STRING NEXTPERMCALL: CMP BYTE PTR [SI],20H JBE NOMOREPERMITTEDCALLS ; NO MORE LEFT MOV DI,OFFSET NORMCALL MOV CX,10 GETPERMCALLLOOP: LODSB STOSB CMP AL,' ' JE ENDPERMCALL CMP AL,',' JE ENDPERMCALL LOOP GETPERMCALLLOOP ENDPERMCALL: PUSH SI PUSH DS PUSH ES POP DS ; SET DS TO DATA MOV SI,OFFSET NORMCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,ES:PORTPOINTER[BX] MOV CX,7 REP MOVSB ADD ES:PORTPOINTER[BX],7 POP DS POP SI MOV AX,SI SUB AX,PORTPTR CMP AX,502 ; WITHIN 10 OF END? JBE NEXTPERMCALL ; OK NOMOREPERMITTEDCALLS: INC ES:PORTPOINTER[BX] ; ADD NULL TO END OF STRING NOPERMITTEDCALLS: ; ; SEE IF PORT UNPROTO ADDR SPECIFIED ; MOV SI,PORTPTR ADD SI,128 ; TO UNPROTO CMP BYTE PTR [SI],20H JBE NOPORTUNPROTO ; NONE SPECIFIED MOV AX,ES:PORTPOINTER[BX] MOV ES:PORTUNPROTO[BX],AX ; START OF STRING NEXTUNPROTO: CMP BYTE PTR [SI],20H JBE NOMOREUNPROTO ; NO MORE LEFT MOV DI,OFFSET NORMCALL MOV CX,10 GETUNPROTOLOOP: LODSB STOSB CMP AL,' ' JE ENDUNPROTO CMP AL,',' JE ENDUNPROTO LOOP GETUNPROTOLOOP ENDUNPROTO: PUSH SI PUSH DS PUSH ES POP DS ; SET DS TO DATA MOV SI,OFFSET NORMCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,ES:PORTPOINTER[BX] MOV CX,7 REP MOVSB ADD ES:PORTPOINTER[BX],7 POP DS POP SI MOV AX,SI SUB AX,PORTPTR CMP AX,242 ; WITHIN 10 OF END? JBE NEXTUNPROTO ; OK NOMOREUNPROTO: INC ES:PORTPOINTER[BX] ; ADD NULL TO END OF STRING NOPORTUNPROTO: ; ; ADD MH AREA IF NEEDED ; MOV SI,PORTPTR CMP BYTE PTR 120[SI],'N' JE NO_MH MOV ES:NEEDMH,1 MOV AX,ES:PORTPOINTER[BX] MOV ES:PORTMHEARD[BX],AX ; START OF AREA ADD ES:PORTPOINTER[BX],20*(TYPE MHSTRUC) NO_MH: MOV BX,ES:PORTPOINTER[BX] INC NUMBEROFPORTS ADD PORTPTR,512 JMP PORTLOOP ENDPORTLOOP: MOV NEXTFREEDATA,BX MOV AX,DATASEG MOV DS,AX ASSUME DS:DATA ; ; SET UP VARIOUS CONTROL TABLES ; MOV AX,TYPE LINKTABLE MUL MAXLINKS MOV BX,NEXTFREEDATA MOV LINKS,BX ADD NEXTFREEDATA,AX ; MOV AX,TYPE DEST_LIST MUL MAXDESTS MOV BX,NEXTFREEDATA MOV DESTS,BX ADD BX,AX MOV NEXTFREEDATA,BX MOV ENDDESTLIST,BX ; MOV AX,TYPE NEIGHBOUR_LIST MUL MAXNEIGHBOURS MOV BX,NEXTFREEDATA MOV NEIGHBOURS,BX ADD NEXTFREEDATA,AX ; MOV AX,TYPE TRANSPORTENTRY MUL MAXCIRCUITS MOV BX,NEXTFREEDATA MOV L4TABLE,BX ADD NEXTFREEDATA,AX ; ; SET UP DEFAULT ROUTES LIST ; MOV BX,NEIGHBOURS MOV SI,OFFSET C_ROUTES ADD SI,8000H ROUTELOOP: CMP BYTE PTR CS:[SI],0 JE ROUTEEND PUSH SI MOV DI,OFFSET NORMCALL MOV CX,10 REP MOVS NORMCALL,CONFIGTABLE ; COPY INTO OUR SEG MOV SI,OFFSET NORMCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,BX MOV CX,7 REP MOVSB POP SI ADD SI,10 LODS CONFIGTABLE MOV ES:NEIGHBOUR_QUAL[BX],AL ; SET QUALITY LODS CONFIGTABLE MOV ES:NEIGHBOUR_PORT[BX],AL ; SET PORT LODS CONFIGTABLE MOV ES:NBOUR_MAXFRAME[BX],AL ; SET WINDOW LODS WORD PTR CONFIGTABLE OR AX,AX JZ NORFRACK DIV B100 NORFRACK: MOV ES:NBOUR_FRACK[BX],AL ; SET FRACK LODS CONFIGTABLE MOV ES:NBOUR_PACLEN[BX],AL MOV ES:NEIGHBOUR_FLAG[BX],1 ; LOCKED ROUTE ADD BX,TYPE NEIGHBOUR_LIST JMP ROUTELOOP ROUTEEND: ; ; SET UP TNC 'COMBIOS' PORT CONTROL TABLE ; MOV BX,NEXTFREEDATA ; START ADDR MOV TNCTABLE,BX MOV SI,OFFSET TNCPORTLIST TNCLOOP: LODSB ; PORT NUMBER OR AL,AL ; END OF LIST? JE NOMORETNCS ; DEC AL ; COMBIOS NUMBERS START FROM 1, INT 14 PORTS FROM 0 INC NUMBEROFSTREAMS PUSH CX CALL INITIALISETNCPORT POP CX LODSB ; ; TNC MODE - 0=TNC2 2=KISS 4=UFQ 6=AA4RE ; ; OR AL,AL ; JZ TNC2PORT ; NORMAL PORT ; CMP AL,2 ; JE KISSPORT ; ; HOST MODE - EITHER UFQ OR AA4RE ; ; OR HOSTFLAG[BX],1 ; CMP AL,6 ; JE NEXTPORT ; AA4RE MODE ; ; UFQ VARIENT OF HOSTMODE ; ; MOV SWITCH+2,'1' ; MAKE SWITCH SW1TCH ; MOV TRACEFLAG[BX],1 ; AND TURN ON MONITOR ; MOV MCON[BX],1 ; MOV MAXHOSTSESSIONS[BX],9 ; MAX USERS ; OR HOSTFLAG[BX],UFQ ; SET UFQ (UNPOLLED) MODE ; JMP SHORT NEXTPORT ;KISSPORT: ; ; KISS MODE PORT ; ; OR HOSTFLAG[BX],KISSMODE ; MOV AL,1[SI] ; OR AL,AL ; JZ NEXTPORT ; NOT SUPPLIED ; MOV MMASK[BX],AL ; SET KISS PORT MASK TNC2PORT: NEXTPORT: ; ; SET APPL CONTROL BITS ; MOV AL,3[SI] MOV APPLFLAGS[BX],AL ; FLAGS ; ; SET APPL IF SPECIFIED ; MOV AL,[SI] OR AL,AL JZ NOAPPL ; NOT SUPPLIED MOV APPLICATION[BX],AL NOAPPL: ; ADD SI,6 ; TO NEXT ENTRY ADD BX,TYPE TNCDATA ; LOOP TNCLOOP NOMORETNCS: MOV NEXTFREEDATA,BX ; SAVE NEW FREE SPACE POINTER ; ; SET UP INFO MESSAGE ; MOV DI,NEXTFREEDATA MOV BX,DI MOV INFOMSG,DI MOV SI,OFFSET C_INFOMSG ADD SI,8000H SETUPINFO: LODS CONFIGTABLE STOSB OR AL,AL JNZ SETUPINFO DEC DI ; DONT WANT THE NULL MOV NEXTFREEDATA,DI SUB DI,BX MOV INFOLEN,DI ; ; SET UP CTEXT MESSAGE ; MOV DI,NEXTFREEDATA MOV BX,DI MOV CTEXTMSG,DI MOV SI,OFFSET C_CTEXT ADD SI,8000H SETUPCTEXT: LODS CONFIGTABLE STOSB OR AL,AL JNZ SETUPCTEXT DEC DI ; DONT WANT THE NULL MOV NEXTFREEDATA,DI SUB DI,BX MOV CTEXTLEN,DI ; ; SET UP ID MESSAGE ; MOV DI,NEXTFREEDATA MOV BX,DI ; SAVE MOV IDMSG,DI MOV SI,OFFSET IDHDDR MOV CX,21 REP MOVSB ; COPY HEADER MOV SI,OFFSET C_IDMSG ADD SI,8000H SETUPID: LODS CONFIGTABLE STOSB OR AL,AL JNZ SETUPID DEC DI ; REMOVE TRAILING NULL MOV NEXTFREEDATA,DI SUB DI,BX MOV BX,IDMSG MOV 3[BX],DI ; PUT LENGTH INTO MESSAGE ; ; SET UP OUR CALLIGN(S) ; MOV SI,OFFSET MYNODECALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,OFFSET MYCALL MOV CX,7 REP MOVSB MOV SI,OFFSET AX25CALL MOV DI,IDMSG LEA DI,12[DI] ; COPY TO ID MESSAGE MOV CX,7 REP MOVSB OR BYTE PTR -1[DI],01100001B ; SET CMD END AND RESERVED BITS MOV SI,OFFSET MYCALL+7 ; ALIAS CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,OFFSET MYALIAS MOV CX,7 REP MOVSB MOV SI,OFFSET MYLINKCALL CALL CONVTOAX25 MOV SI,OFFSET AX25CALL ; CONSOLE CALLSIGN MOV DI,OFFSET BBSCALL MOV CX,7 REP MOVSB MOV SI,OFFSET BBSCALL+7 ; ALIAS CALL CONVTOAX25 MOV SI,OFFSET AX25CALL MOV DI,OFFSET BBSALIAS MOV CX,7 REP MOVSB ; ; SET UP INITIAL DEST ENTRY FOR BBS (IF BOTH NODE AND BBS NEEDED) ; MOV AL,0 CMP AL,NODE JE NOBBSDEST CMP AL,BBS JE NOBBSDEST MOV BX,DESTS MOV SI,OFFSET BBSCALL LEA DI,DEST_CALL[BX] MOV CX,13 REP MOVSB MOV DEST_STATE[BX],80H ; SPECIAL ENTRY MOV AL,BBSQUAL MOV ROUT1_QUALITY[BX],AL MOV ROUT1_OBSCOUNT[BX],255 MOV DESTHEADER,BX ; FIRST IN ALPHABETIC CHAIN NOBBSDEST: ; ; ; SET UP FREE BUFFER POOL - MUST BE DONE LAST ; MOV DI,NEXTFREEDATA ; FREE SPACE MOV BUFFERPOOL,DI JMP COMMONSTART WARMENTRY: ; ; CLEAR OUT CIRCUITS AND LINKS, CLEAR POINTERS AND QUEUES ON ; ROUTES AND DESTS ; INC RESTARTS JNZ WARMOK JMP COLDINIT ; IN CASE LOOPING ; WARMOK: MOV AX,DATASEG MOV DS,AX MOV ES,AX ASSUME DS:DATA ; ; SET UP VARIOUS CONTROL TABLES ; MOV ASYNCMODE,0 ; FORCE REASSESSMENT MOV TIMACTIVE,0 ; IN CASE IN TIMER ROUTINE MOV AX,TYPE LINKTABLE MUL MAXLINKS MOV CX,AX MOV DI,LINKS XOR AL,AL REP STOSB ; CLEAR LINKS MOV AX,TYPE TRANSPORTENTRY MUL MAXCIRCUITS MOV CX,AX MOV DI,L4TABLE XOR AL,AL REP STOSB ; CLEAR SESSIONS ; MOV BX,DESTS MOV CX,MAXDESTS ; CLEARDEST: MOV DEST_Q[BX],0 ADD BX,TYPE DEST_LIST LOOP CLEARDEST MOV BX,NEIGHBOURS MOV CX,MAXNEIGHBOURS CLEARROUTES: MOV NEIGHBOUR_LINK[BX],0 ADD BX,TYPE NEIGHBOUR_LIST LOOP CLEARROUTES MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS CLEARPORTS: ; MOV PORTRX_Q[BX],0 MOV PORTTX_Q[BX],0 ; MOV SENDING[BX],0 MOV ACTIVE[BX],0 MOV INTCHAIN[BX],0 MOV BX,PORTPOINTER[BX] LOOP CLEARPORTS ; MOV TRACE_Q,0 CMP NUMBEROFSTREAMS,0 JE WARMDONE ; ; REINITIALISE VIRTUAL TNC ; MOV BX,TNCTABLE ; MOV AL,0 CALL INITIALISETNCPORT WARMDONE: COMMONSTART: MOV FREE_Q,0 MOV QCOUNT,0 MOV DI,BUFFERPOOL MOV CX,NUMBEROFBUFFERS MOV NUMBEROFBUFFERS,0 BUFF000: MOV AX,DI ADD AX,BUFFLEN JC BUFF001 ; NOT ROOM FOR THIS ONE! CMP AX,0FE00H JA BUFF001 MOV SI,OFFSET FREE_Q PUSH DI CALL Q_ADDF POP DI INC NUMBEROFBUFFERS ADD DI,BUFFLEN LOOP BUFF000 BUFF001: ; MOV NEXTFREEDATA,DI ; MOV AL,QCOUNT MOV MAXBUFFS,AL ; ; RESET STATS FIELDS ; MOV MINBUFFCOUNT,AL MOV NOBUFFCOUNT,0 ; ; CALL PORT INITIALISATION ROUTINES ; CLI MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS INITL00: ; PUSH BX PUSH CX CALL PORTINITCODE[BX] POP CX POP BX MOV BX,PORTPOINTER[BX] LOOP INITL00 ; ; ; IF NO ASYNC PORTS ARE DEFINED, SET TNC MODE ; CMP ASYNCPORT,0 JNE GOTSOME LED 0,ON MOV ASYNCMODE,'T' PUSH DS XOR AX,AX MOV DS,AX MOV SI,32*4 MOV WORD PTR 4[SI],OFFSET SCUINTTNC POP DS ; GOTSOME: STI LED 0,ON OUT WATCHDOG,AL ; KICK WATCHDOG JMP BACKGROUND ; CW LOOKUP TABLE - TWO BITS PER ELEMENT ; ; 00 = END ; 01 = DIT ; 11 = DASH ; ; ; BASED ON DESIGN BY MIKE TUBBY, G8TIC, 1985 ; CWTABLE DW 1101011101B ; / -..-. DW 1111111111B ; 0 ----- DW 1111111101B ; 1 .---- DW 1111110101B ; 2 ..--- DW 1111010101B ; 3 ...-- DW 1101010101B ; 4 ....- DW 0101010101B ; 5 ..... DW 0101010111B ; 6 -.... DW 0101011111B ; 7 --... DW 0101111111B ; 8 ---.. DW 0111111111B ; 9 ----. DW 7 DUP (0) ; ASCII 3A-40 DW 0000001101B ; A .- DW 0001010111B ; B -... DW 0001110111B ; C -.-. DW 0000010111B ; D -.. DW 0000000001B ; E . DW 0001110101B ; F ..-. DW 0000011111B ; G --. DW 0001010101B ; H .... DW 0000000101B ; I .. DW 0011111101B ; J .--- DW 0000110111B ; K -.- DW 0001011101B ; L .-.. DW 0000001111B ; M -- DW 0000000111B ; N -. DW 0000111111B ; O --- DW 0001111101B ; P .--. DW 0011011111B ; Q --.- DW 0000011101B ; R .-. DW 0000010101B ; S ... DW 0000000011B ; T - DW 0000110101B ; U ..- DW 0011010101B ; V ...- DW 0000111101B ; W .-- DW 0011010111B ; X -..- DW 0011110111B ; Y -.-- DW 0001011111B ; Z --.. ; PUBLIC Q_REM,Q_ADD,Q_ADDF,RELBUFF,CONVFROMAX25,CONVTOAX25 PUBLIC GETPORTTABLEENTRY,GETBUFF PUBLIC GETPORTQUALITY,TRACEFRAME,NOBUFFERCHECK EXTRN INITIALISETNCPORT:NEAR,TNCTIMERPROC:NEAR EXTRN L2TIMERPROC:NEAR,L2ROUTINE:NEAR,SDETX:NEAR EXTRN PROCESSIFRAME:NEAR,PROCESSNODEMESSAGE:NEAR EXTRN L4BG:NEAR,SCUINT:NEAR,SCCINT:NEAR EXTRN L4TIMERPROC:NEAR EXTRN CLEARSESSIONENTRY:NEAR,L3FASTTIMER:NEAR EXTRN L3TIMERPROC:NEAR,L3BG:NEAR EXTRN FINDDESTINATION:NEAR EXTRN STATSTIMER:NEAR,HDLCEND:NEAR EXTRN KISSTX:NEAR,HDLCTX:NEAR EXTRN KISSRX:NEAR,HDLCRX:NEAR EXTRN KISSTIMER:NEAR,HDLCTIMER:NEAR EXTRN DISPLAYFRAME:NEAR,DISPLAYFRAMETX:NEAR EXTRN KANTTNCBG:NEAR,WARMSTART:NEAR,COLDSTART:NEAR BACKGROUND: ; ; CHECK FOR TIMER ACTIVITY ; INC RAN1 INC RANDOM ; FOR CSMA TIMER CMP L2TIMERFLAG,10 ; 10 PER SEC JB NOTL2TIMER OUT WATCHDOG,AL ; KICK WATCHDOG INC RAN2 INC TENHZCOUNT SUB L2TIMERFLAG,10 CALL L2TIMERPROC NOTL2TIMER: CMP L3TIMERFLAG,100*60 ; 1 PER MIN JB NOTL3TIMER SUB L3TIMERFLAG,100*60 ; ; CHECK BUFFER POOL - IF BELOW 9 FOR 2 MINS, FORCE A WARM START ; CMP QCOUNT,9 JA COUNTOK INC BUFFERSLOW CMP BUFFERSLOW,2 JB DOL3 ; WAIT A BIT LONGER JMP WARMSTART ; BUFFER PROBLEMS - RESTART COUNTOK: MOV BUFFERSLOW,0 DOL3: CALL L3TIMERPROC CALL STATSTIMER NOTL3TIMER: CMP L4TIMERFLAG,100 ; 1 PER SEC JB NOTL4TIMER SUB L4TIMERFLAG,100 CALL L3FASTTIMER CALL L4TIMERPROC CALL TNCTIMERPROC CALL CHECKSWITCHSTATE ; SEE IF SWITCH HAS CHANGED NOTL4TIMER: ; ; CHECK FOR MESSAGES RECEIVED FROM COMMS LINKS ; MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS MAINL00: MOV AL,PORTNUMBER[BX] MOV CURRENTPORT,AL ; PORT NUMBER MOV CURRENTPORTPTR,BX LEA SI,PORTRX_Q[BX] CLI CALL Q_REM ; SEE IF ANYTHING THERE STI JZ MAINL10 ; INC RAN3 PUSH BX PUSH CX MOV AL,CURRENTPORT MOV MSGPORT[DI],AL ; PUT PORT INTO MSG BUFFER ; CALL L2ROUTINE ; LEVEL 2 PROCESS POP CX POP BX MAINL10: LEA SI,PORTTX_Q[BX] CLI CALL Q_REM ; SEE IF ANYTHING THERE STI JZ MAINL15 ; ; MESSAGE TO SEND - SEND IT ; CMP PORTDISABLED[BX],0 JE PORTACTIVE ; ; PORT HAS BEEN DISABLED ; CALL RELBUFF JMP SHORT MAINL15 PORTACTIVE: PUSH BX PUSH CX INC L2FRAMESSENT[BX] JNZ INC000 INC L2FRAMESSENT+2[BX] INC000: CALL PORTTXROUTINE[BX] ; LEVEL 2 PROCESS POP CX POP BX MAINL15: PUSH BX PUSH CX CALL PORTRXROUTINE[BX] ; SEE IF MESSAGE RECEIVED POP CX POP BX MOV BX,PORTPOINTER[BX] LOOP MAINL00 ; ; CHECK FOR INCOMING MESSAGES ON LINK CONTROL TABLE - ; BY NOW ONLY 'I' FRAMES WILL BE PRESENT - ; LEVEL 2 PROTOCOL HANDLING IS DONE IN MESSAGE RECEIVE CODE ; AND LINK HANDLING INTERRUPT ROUTINES ; MOV BX,LINKS MOV CX,MAXLINKS MAINL20: LEA SI,RX_Q[BX] CLI CALL Q_REM ; SEE IF ANYTHING THERE STI JZ MAINL30 ; PUSH CX PUSH BX CALL PROCESSIFRAME POP BX POP CX MAINL30: ; ; CHECK FOR OUTGOING MSGS ; CMP L2STATE[BX],5 JB MAINL40 ; CANT SEND TEXT TILL CONNECTED ; CMP VER1FLAG[BX],1 ; JE MAINL35 ; NEED TO RETRY WITH I FRAMES IF VER 1 ; CMP L2RETRIES[BX],0 ; JNE MAINL40 ; CANT SEND TEXT IF RETRYING MAINL35: TEST L2FLAGS[BX],RNRSET JNZ MAINL40 ; CANT SEND TEXT IF RNR PUSH BX PUSH CX CALL SDETX POP CX POP BX MAINL40: ADD BX,TYPE LINKTABLE LOOP MAINL20 ; CALL L4BG ; DO LEVEL 4 PROCESSING CALL L3BG ; ; SEE IF ANY FRAMES TO TRACE ; MOV SI,OFFSET TRACE_Q CLI CALL Q_REM STI JZ NOTRACERET ; ; IF BUFFER HAS A LINK TABLE ENTRY ON END, RESET TIMEOUT ; MOV BX,BUFFLEN-2[DI] OR BX,BX JZ NOTIMER CMP L2TIMER[BX],0 JE NOTIMER ; ALREADY EXPIRED MOV AL,L2TIME[BX] XOR AH,AH MOV L2TIMER[BX],AX MOV WORD PTR BUFFLEN-2[DI],0 ; CLEAR FLAG FROM BUFFER NOTIMER: MOV CX,NUMBEROFSTREAMS JCXZ TXTRACEEND MOV BX,TNCTABLE ; TXTRACE00: CMP MTX[BX],0 JE TXTRACE10 ; TX TRACE DISABLED ; PUSH BX ; PUSH CX PUSH DI CALL DISPLAYFRAMETX POP DI ; POP CX ; POP BX TXTRACE10: ; ADD BX,TYPE TNCDATA ; LOOP TXTRACE00 TXTRACEEND: CALL RELBUFF NOTRACERET: ; ; CHECK FOR TNC ACTIVITY ; CMP NUMBEROFSTREAMS,0 JE NOTNCS MOV BX,TNCTABLE CALL KANTTNCBG NOTNCS: JMP BACKGROUND CHECKSWITCHSTATE: ; ; LOOK FOR CHANGE IN SWITCH (USED TO CONTROL ASYNC PORT) ; CMP ASYNCPORT,0 JE NOCHANGE ; LEAVE ALONE IF NO ASYNC PORTS IN AL,IPFW TEST AL,100B ; LEVEL 2 IS SWITCH JNZ SWCLOSED ; ; SWITCH IS OUT, SO SELECT TERMINAL MODE (UNLESS ALREADY SET) ; CMP ASYNCMODE,'T' JE NOCHANGE LED 0,ON MOV ASYNCMODE,'T' ; ; DISABLE ASYNC PORT(S) ; MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS DISPORT10: CMP PORTTYPE[BX],0 ; ASYNC? JNE DISPORT20 MOV PORTDISABLED[BX],1 ; DISABLE PORT DISPORT20: MOV BX,PORTPOINTER[BX] LOOP DISPORT10 PUSH DS XOR AX,AX MOV DS,AX MOV SI,32*4 MOV WORD PTR 4[SI],OFFSET SCUINTTNC POP DS ; JMP SHORT NOCHANGE SWCLOSED: ; ; SELECT KISS MODE - UNLESS ALREADY SET ; CMP ASYNCMODE,'K' JE NOCHANGE LED 0,OFF MOV ASYNCMODE,'K' ; ; REENABLE ASYNC PORT(S) ; MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS ENPORT10: CMP PORTTYPE[BX],0 ; ASYNC? JNE ENPORT20 MOV PORTDISABLED[BX],0 ; REENABLE PORT ENPORT20: MOV BX,PORTPOINTER[BX] LOOP ENPORT10 PUSH DS XOR AX,AX MOV DS,AX MOV SI,32*4 MOV WORD PTR 4[SI],OFFSET SCUINT POP DS ; NOCHANGE: LED 7,ON ; FLASH TOP LED TO SHOW WE ARE STILL OK XOR LEDFLAG,1 JZ LED7RET LED 7,OFF LED7RET: RET TRACEFRAME: PUSH BX MOV BX,TNCTABLE MOV CX,NUMBEROFSTREAMS JCXZ TRACEEND ; TRACELOOP: PUSH BX PUSH CX PUSH DI CALL DISPLAYFRAME POP DI POP CX POP BX ADD BX,TYPE TNCDATA LOOP TRACELOOP TRACEEND: POP BX RET RELBUFF: MOV SI,OFFSET FREE_Q CLI CALL Q_ADDF ; RETURN BUFFER TO FREE QUEUE STI RET FINDLINK: ; ; FIND LINK FOR AN INCOMING MESSAGE ; ; MESSAGE ADDR IN DI MOV BX,0 MOV SI,LINKS MOV CX,MAXLINKS FINDLK00: CMP BYTE PTR [SI],0 JNE FINDLK05 ; NOT A SPARE ENTRY CMP BX,0 JNE FINDLK10 ; ALREADY FOUND A SPARE MOV BX,SI ; POINTER TO FIRST FREE JMP SHORT FINDLK10 ; TRY NEXT ENTRY FINDLK05: PUSH SI PUSH DI PUSH CX LEA DI,MSGORIGIN[DI] ; ORIGIN FROM MESSAGE CALL COMPARECALLS ; COMPARE WITH LINKCALL POP CX POP DI POP SI JNE FINDLK10 PUSH SI PUSH DI PUSH CX LEA DI,MSGDEST[DI] ADD SI,7 ; OURCALL IN TABLE CALL COMPARECALLS ; COMPARE WITH DESTINATON IN MSG POP CX POP DI POP SI JE FINDLKRET ; YES FINDLK10: ADD SI,TYPE LINKTABLE LOOP FINDLK00 ; ; ENTRY NOT FOUND - BX HAS FIRST FREE ENTRY, OR ZERO IF TABLE FULL ; OR AL,1 RET FINDLKRET: MOV BX,SI XOR AL,AL RET COMPARECALLS: ; ; COMPARE AX25 CALLSIGNS IN SI, DI IGNORING EXTRA BITS IN SSID ; MOV CX,6 REP CMPSB ; COMPARE WITH LINKCALL JNE COMPCALLRET ; DONT MATCH LODSB MOV AH,[DI] AND AX,0001111000011110B ; MASK NON-SSID BITS CMP AL,AH COMPCALLRET: RET GETPORTQUALITY: PUSH BX CALL GETPORTTABLEENTRY MOV AL,PORTQUALITY[BX] POP BX RET GETPORTTABLEENTRY: PUSH CX MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS GETPORT10: CMP AL,PORTNUMBER[BX] JE GETPORT20 MOV BX,PORTPOINTER[BX] LOOP GETPORT10 MOV BX,PORTTABLE ; TO FIRST IF NOT DEFINED GETPORT20: POP CX RET CONVTOAX25: ; ; CONVERT CALLSIGN IN [SI] TO AX25 FORMAT IN AX25CALL ; RETURN NZ IF CALLSIGN INVALID ; MOV DI,OFFSET AX25CALL MOV CX,6 ; MAX ALPHANUMERICS MOV AL,40H REP STOSB ; CLEAR IN CASE SHORT CALL MOV AL,01100000B ; DEFAULT SSID STOSB MOV DI,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 SI ; 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 SI ; SAVE MOV DI,OFFSET NORMCALL MOV CX,10 ; MAX ALPHANUMERICS MOV AL,20H REP STOSB ; CLEAR IN CASE SHORT CALL MOV DI,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 SI ADD SI,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 [DI],'-' INC DI CMP AL,10 JB CONVAX70 SUB AL,10 MOV BYTE PTR [DI],'1' INC DI CONVAX70: ADD AL,30H ; CONVERT TO DIGIT STOSB CONVAX90: MOV CX,DI SUB CX,OFFSET NORMCALL MOV NORMLEN,CX ; SIGNIFICANT LENGTH TEST AH,1 ; LAST BIT SET? RET Q_REM: MOV DI,[SI] ; GET ADDR OF FIRST BUFFER CMP DI,0 JE Q_RET ; EMPTY MOV AX,[DI] ; CHAIN FROM BUFFER MOV [SI],AX ; STORE IN HEADER POP [DI] ; CALLERS ADDR PUSH [DI] Q_RET: RET ; Q_ADD: PUSHF ; SAVE INT STATE CLI Q_ADD05: CMP WORD PTR [SI],0 ; END OF CHAIN JE Q_ADD10 MOV SI,[SI] ; NEXT IN CHAIN JMP Q_ADD05 Q_ADD10: MOV WORD PTR [DI],0 ; CLEAR CHAIN ON NEW BUFFER MOV [SI],DI ; CHAIN ON NEW BUFFER POPF ; RECOVER INT STATE RET ; ; ADD TO FRONT OF QUEUE - MUST ONLY BE USED FOR FREE QUEUE ; Q_ADDF: MOV AX,[SI] ; OLD FIRST IN CHAIN MOV [DI],AX MOV [SI],DI ; PUT NEW ON FRONT INC QCOUNT RET GETBUFF: MOV SI,OFFSET FREE_Q CLI CALL Q_REM STI ; JZ NOBUFFS DEC QCOUNT MOV AL,QCOUNT CMP AL,MINBUFFCOUNT JA GETBUFFRET MOV MINBUFFCOUNT,AL GETBUFFRET: OR AL,1 ; SET NZ ; ; FLAG BUFFER WITH ADDR OF CALLING ROUTINE (TRYING TO TRACK DOWN LOST BUFFERS!) ; POP [DI] PUSH [DI] RET NOBUFFS: NOBUFFERCHECK: CMP QCOUNT,0 JA MESSED_UP ; WOT? INC NOBUFFCOUNT XOR AL,AL RET ; MESSED_UP: ; ; BUFFER POOL MUST BE CORRUPT - RESTART ; JMP WARMSTART TCUINT: ; ; TIMER INT - 10 MS ; PUSHA CLD MOV AL,60H ; SPECIFIC EIO TO LEV 0 OUT (IPFW),AL ; INC L2TIMERFLAG ; INCREMENT FLAG FOR BG INC L3TIMERFLAG ; INCREMENT FLAG FOR BG INC L4TIMERFLAG ; INCREMENT FLAG FOR BG ; INC REALTIMETICKS CMP TIMACTIVE,0 JE TIMOK ; ; PREVENT REENTRY ; MOV SI,0CH ADD WORD PTR [SI],1 ; LOCAL STATS ADC WORD PTR 2[SI],0 POPA IRET TIMOK: MOV TIMACTIVE,1 STI ; CALL PORT TIMER ROUTINES ; MOV BX,PORTTABLE MOV CX,NUMBEROFPORTS TIMERINT00: PUSH BX PUSH CX CALL PORTTIMERCODE[BX] POP CX POP BX MOV BX,PORTPOINTER[BX] LOOP TIMERINT00 ; CLI MOV TIMACTIVE,0 TIMEXIT: POPA IRET ; EXTRN GOTTNCCHAR:NEAR,TNCSENDCHAR:NEAR ; ; SERIAL I/O INTERRUPT HANDLER FOR TNC MODE LINK ; SCUINTTNC: ; ; SERIAL COMMS INTERRUPT HANDLER ; PUSHA CLD MOV AL,61H ; SPECIFIC EOI TO LEV 1 OUT (IPFW),AL INC RAN5 MOV BX,TNCTABLE IN AL,SST ; ASYNC STATUS TEST AL,RXRDY JZ NORX CALL GOTTNCCHAR POPA IRET NORX: CALL TNCSENDCHAR POPA IRET ; PUBLIC HEXOUT HEXOUT: RET CODE ENDS END START