PAGE 62,132 ; INCLUDE ENVIRON.ASM INCLUDE STRUCS.ASM XX SEGMENT AT 0 FILLER DB 14 DUP (0) MAJOR DB 0 MINOR DB 0 NEIGHBOURS DW 0 ROUTES_LIST DW 0 ; LENGTH MAXNEIGHBOURS DW 20 ; MAX ADJACENT NODES DESTS DW 0 ; NODE LIST DESTS_LIST DW 0 MAXNODES DW 100 ; MAX NODES IN SYSTEM LINKS DW 0 ; L2 LINK TABLE MAXLINKS DW 30 ; MAX LEVEL 2 LINKS (UP,DOWN AND INTERNODE) L4TABLE DW 0 MAXCIRCUITS DW 50 ; NUMBER OF L4 CIRCUITS PORTTABLE DW 0 NUMBEROFPORTS DW 0 TNCTABLE DW 0 NUMBEROFSTREAMS DW 0 ENDDESTLIST DW 0 ; NODE LIST+1 ; XX ENDS CR EQU 0DH LF EQU 0AH CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:CODE,ES:CODE ; MARKER: ; ; FOLLOWING SEQUENCE OCCURS AT START OF THENODE CODE SEGMENT ; RET DB 'BPQ' ; FOR DUMP SYSTEM FILENAME DB NODESNAME,0 HANDLE DW 0 NORMCALL DB 10 DUP (0) AX25CALL DB 7 DUP (0) DECODEDNAME DB 20 DUP (0) LINE DB 80 DUP (0) ROUTEADD DB 'ROUTE ADD ' NODEADD DB 'NODE ADD ' MSG1 DB NAMESTRING,' ROUTES/NODES Save Program for Version ' db VERSIONSTRING,' - ',DATESTRING,CR,LF,'$' MSG2 DB 'CANT FIND SWITCH CODE',CR,LF,'$' MSG3 DB 'TABLE DUMP COMPLETE',CR,LF,'$' MSG4 DB 0DH,0AH,0AH,'TABLE POINTERS CORRUPT OR MISSING',7,0DH,0AH,0AH,'$' MSG5 DB 0DH,0AH,0AH,'VERSION OF BPQCODE DOES NOT MATCH THAT OF BPQNODES',7,0DH,0AH,0AH,'$' ; START: MOV AX,CODE MOV DS,AX MOV ES,AX MOV DX,OFFSET MSG1 MOV AH,9 INT 21H ; ; TRY ALL INTS - MAY HAVE ONLY EXTERNAL DRIVERS ; ASSUME DS:NOTHING MOV BX,0 FINDLOOP: CALL CHECKIT JE CODEFOUND ADD BX,4 CMP BX,400H JB FINDLOOP PUSH CS POP DS MOV DX,OFFSET MSG2 MOV AH,9 INT 21H MOV AX,4C01H INT 21H CODEFOUND: PUSH DS MOV AX,[SI] ; DATA SEG MOV DS,AX PUSH DS ; SAVE ASSUME DS:NOTHING CMP DS:MAJOR,MAJORVERSION JNE BADVERS CMP DS:MINOR,MINORVERSION JNE BADVERS MOV AX,DS:NEIGHBOURS OR AX,AX JZ BADPOINTERS OR AX,DS:DESTS JZ BADPOINTERS PUSH CS ; GET OUR SEG BACK FOR OPEN POP DS ; ; OPEN FILE ; MOV DX,OFFSET FILENAME MOV CX,0 MOV AH,3CH INT 21H MOV HANDLE,AX POP DS CALL DOROUTES CALL DONODES POP DS CLOSE: PUSH CS POP DS MOV BX,HANDLE MOV AH,3EH INT 21H ; CLOSE FILE ; MOV AX,4C00H INT 21H BADPOINTERS: MOV DX,OFFSET MSG4 JMP SHORT BADCOMMON BADVERS: MOV DX,OFFSET MSG5 BADCOMMON: PUSH CS POP DS MOV AH,9 INT 21H MOV AX,4C02H INT 21H CHECKIT: MOV AX,0 MOV DS,AX MOV AX,2[BX] ; CODE SEGMENT MOV DS,AX MOV SI,0 MOV DI,OFFSET MARKER MOV CX,4 REP CMPSB RET DONODES: MOV SI,OFFSET NODEADD MOV DI,OFFSET LINE MOV CX,9 CLI REP MOVS LINE, NORMCALL STI MOV CX,DS:MAXNODES MOV CH,0 ; IN CASE CORRUPTED MOV BX,DS:DESTS CMDN10: PUSH CX MOV DI,OFFSET LINE+9 CMP DEST_CALL[BX],0 JE CMDN20 ; SPARE ; TEST DEST_STATE[BX],80H JNZ CMDN20 ; SPECIAL (BBS) NODE LEA SI,DEST_CALL[BX] CALL DECODENODENAME ; CONVERT TO ALIAS:CALL MOV CX,18 CMDN15: LODS NORMCALL STOSB CMP AL,' ' JE CMDN16 LOOP CMDN15 CMDN16: PUSH BX MOV CX,3 CMDN110: MOV SI,ROUT1_NEIGHBOUR[BX] CMP SI,0 JE CMDN199 PUSH CX PUSH SI ; SAVE NEIGHBOUR PUSH DI CALL CONVFROMAX25 ; CONVERT TO CALL POP DI MOV SI,OFFSET NORMCALL NCOPY: LODS NORMCALL STOSB CMP AL,' ' JNE NCOPY ; ; GET PORT FROM ROUTES ENTRY ; POP SI MOV AL,NEIGHBOUR_PORT[SI] CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb MOV AL,ROUT1_QUALITY[BX] CALL CONV_DIGITS ; CONVERT AL TO DECIMAL DIGITS mov AL,' ' stosb TEST ROUT1_OBSCOUNT[BX],80H JZ NOTLOCKEDDEST MOV AX,' !' STOSW NOTLOCKEDDEST: ADD BX,4 POP CX LOOP CMDN110 CMDN199: MOV AX,0A0DH STOSW PUSH DS PUSH CS POP DS MOV DX,OFFSET LINE MOV CX,DI SUB CX,DX ; GET LENGTH MOV BX,HANDLE MOV AH,40H INT 21H POP DS POP BX CMDN20: POP CX ADD BX,DS:DESTS_LIST LOOP CMDN10_JMP ; TOO FAR! CMDN99A: RET CMDN10_JMP: JMP CMDN10 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 ES:[DI],'-' INC DI CMP AL,10 JB CONVAX70 SUB AL,10 MOV BYTE PTR ES:[DI],'1' INC DI CONVAX70: ADD AL,30H ; CONVERT TO DIGIT STOSB CONVAX90: MOV CX,DI SUB CX,OFFSET NORMCALL TEST AH,1 ; LAST BIT SET? RET DECODENODENAME: ; ; SI = TABLE ENTRY WITH AX25 CALL AND ALIAS ; ; RETURNS SI = 20 BYTE DECODED NAME IN FORM ALIAS:CALL ; PUSH CX PUSH DI MOV DI,OFFSET DECODEDNAME MOV CX,10 MOV AX,' ' REP STOSW ; CLEAR IT CALL CONVFROMAX25 PUSH CX ; SAVE CALL LENGTH MOV DI,OFFSET DECODEDNAME MOV CX,6 ; MAX LENGTH DECODEN10: LODSB CMP AL,' ' JBE DECODEN20 STOSB LOOP DECODEN10 DECODEN20: MOV AL,':' STOSB POP CX MOV SI,OFFSET NORMCALL CLI REP MOVS LINE, NORMCALL STI POP DI POP CX MOV SI,OFFSET DECODEDNAME RET CONV_DIGITS: cmp AL,100 jb TENS mov AH,0 HUNDREDS_LOOP: cmp AL,100 jb HUNDREDS_LOOP_END sub AL,100 inc AH jmp SHORT HUNDREDS_LOOP HUNDREDS_LOOP_END: push AX mov AL,AH add AL,30H stosb pop AX jmp SHORT TENS_PRINT TENS: cmp AL,10 jb UNITS TENS_PRINT: mov AH,0 TENS_LOOP: cmp AL,10 jb TENS_LOOP_END sub AL,10 inc AH jmp SHORT TENS_LOOP TENS_LOOP_END: push AX mov AL,AH add AL,30H stosb pop AX UNITS: add AL,30H stosb ret DOROUTES: ; MOV SI,OFFSET ROUTEADD MOV DI,OFFSET LINE MOV CX,10 CLI REP MOVS LINE, NORMCALL STI MOV SI,DS:NEIGHBOURS MOV CX,DS:MAXNEIGHBOURS MOV CH,0 ; IN CASE! CMDR10: PUSH CX MOV DI,OFFSET LINE+10 CMP NEIGHBOUR_CALL[SI],0 JE CMDR92 ; SPARE ; MOV AX,0 CALL CMDR95 ; DISPLAY CALL MOV AL,NEIGHBOUR_PORT[SI] CALL CONV_DIGITS MOV AL,20H STOSB MOV AL,NEIGHBOUR_QUAL[SI] CALL CONV_DIGITS MOV AL,20H STOSB TEST NEIGHBOUR_FLAG[SI],1 JZ NOTLOCKED MOV AL,'!' STOSB NOTLOCKED: ; ; CHECK FOR DIGIS ; CMP NEIGHBOUR_DIGI[SI],0 JE CMDR50 MOV AL,20H STOSB MOV AX,'IV' STOSW MOV AX,' A' STOSW ; PUT IN VIA MOV AX,7 CALL CMDR95 ; DISPLAY DIGI CALL CMP NEIGHBOUR_DIGI+7[SI],0 JE CMDR50 MOV AX,14 CALL CMDR95 ; DISPLAY 2ND DIGI CALL CMDR50: MOV AL,20H STOSB MOV AL,NBOUR_MAXFRAME[SI] CALL CONV_DIGITS MOV AL,20H STOSB MOV AL,NBOUR_FRACK[SI] CALL CONV_DIGITS MOV AL,20H STOSB MOV AL,NBOUR_PACLEN[SI] CALL CONV_DIGITS CMDR90: PUSH DS PUSH CS POP DS MOV AX,0A0DH STOSW MOV DX,OFFSET LINE MOV CX,DI SUB CX,DX ; GET LENGTH MOV BX,HANDLE MOV AH,40H INT 21H POP DS CMDR92: POP CX ADD SI,DS:ROUTES_LIST LOOP CMDR10_JMP RET CMDR10_JMP: JMP CMDR10 CMDR95: PUSH SI PUSH DI ADD SI,AX CALL CONVFROMAX25 INC CX MOV SI,OFFSET NORMCALL POP DI CLI REP MOVS LINE, NORMCALL STI POP SI RET CODE ENDS ; END START