1647 lines
27 KiB
NASM
1647 lines
27 KiB
NASM
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 PUBLIC 'DATA'
|
|
_DATA ENDS
|
|
|
|
|
|
ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:FLAT
|
|
|
|
|
|
OFFSET32 EQU <OFFSET FLAT:>
|
|
|
|
_DATA SEGMENT
|
|
|
|
|
|
CR EQU 0DH
|
|
LF EQU 0AH
|
|
|
|
|
|
D10 DW 10
|
|
D60 DD 60
|
|
D3600 DD 3600
|
|
D86400 DD 86400
|
|
|
|
TIMESTAMP DD 0
|
|
|
|
NEWVALUE DW 0
|
|
WORD10 DW 10
|
|
WORD16 DW 16
|
|
|
|
|
|
|
|
;
|
|
; 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
|
|
;
|
|
;
|
|
;
|
|
; L4FLAGS DEFINITION
|
|
;
|
|
L4BUSY EQU 80H ; BNA - DONT SEND ANY MORE
|
|
L4NAK EQU 40H ; NEGATIVE RESPONSE FLAG
|
|
L4MORE EQU 20H ; MORE DATA FOLLOWS - FRAGMENTATION FLAG
|
|
|
|
L4CREQ EQU 1 ; CONNECT REQUEST
|
|
L4CACK EQU 2 ; CONNECT ACK
|
|
L4DREQ EQU 3 ; DISCONNECT REQUEST
|
|
L4DACK EQU 4 ; DISCONNECT ACK
|
|
L4INFO EQU 5 ; INFORMATION
|
|
L4IACK EQU 6 ; INFORMATION ACK
|
|
;
|
|
|
|
|
|
NULL EQU 00H
|
|
CR EQU 0DH
|
|
LF EQU 0AH
|
|
NETROM_PID EQU 0CFH
|
|
NODES_SIG EQU 0FFH
|
|
;
|
|
PORT_MSG DB ' Port=',NULL
|
|
NODES_MSG DB ' (NetRom Routing)',CR,NULL
|
|
NETROM_MSG DB ' NET/ROM',CR,' ',NULL
|
|
TO_MSG DB ' To ',NULL
|
|
TTL_MSG DB ' ttl=',NULL
|
|
AT_MSG DB ' at ',NULL
|
|
VIA_MSG DB ' via ',NULL
|
|
QUALITY_MSG DB ' qlty=',NULL
|
|
LEN_MSG DB ' Len=',0
|
|
|
|
PID_MSG DB ' pid=',NULL
|
|
|
|
MYCCT_MSG DB ' my'
|
|
CCT_MSG DB ' cct=',0
|
|
TIM_MSG DB ' t/o=',0
|
|
|
|
WINDOW DB ' w=',0
|
|
CONN_REQ_MSG DB ' <CON REQ>',NULL
|
|
CONN_ACK_MSG DB ' <CON ACK>',NULL
|
|
CONN_NAK_MSG DB ' <CON NAK> - BUSY',NULL
|
|
DISC_REQ_MSG DB ' <DISC REQ>',NULL
|
|
DISC_ACK_MSG DB ' <DISC ACK>',NULL
|
|
INFO_MSG DB ' <INFO S',NULL
|
|
INFO_ACK_MSG DB ' <INFO ACK R',NULL
|
|
DUFF_NET_MSG DB ' <????>',NULL
|
|
IP_MSG DB ' <IP> ',NULL
|
|
|
|
SABM_MSG DB 'SABM ',NULL
|
|
DISC_MSG DB 'DISC ',NULL
|
|
UA_MSG DB 'UA ',NULL
|
|
DM_MSG DB 'DM ',NULL
|
|
RR_MSG DB 'RR ',NULL
|
|
RNR_MSG DB 'RNR ',NULL
|
|
UI_MSG DB 'UI',NULL
|
|
FRMR_MSG DB 'FRMR ',NULL
|
|
REJ_MSG DB 'REJ ',NULL
|
|
;
|
|
; IP AND TCP BITS
|
|
;
|
|
IPMSG STRUC
|
|
;
|
|
; FORMAT OF IP HEADER
|
|
;
|
|
; NOTE THESE FIELDS ARE STORED HI ORDER BYTE FIRST (NOT NORMAL 8086 FORMAT)
|
|
;
|
|
|
|
VERLEN DB 0 ; 4 BITS VERSION, 4 BITS LENGTH
|
|
TOS DB 0 ; TYPE OF SERVICE
|
|
IPLENGTH DW 0 ; DATAGRAM LENGTH
|
|
IPID DW 0 ; IDENTIFICATION
|
|
FRAGWORD DW 0 ; 3 BITS FLAGS, 13 BITS OFFSET
|
|
IPTTL DB 0
|
|
IPPROTOCOL DB 0 ; HIGHER LEVEL PROTOCOL
|
|
IPCHECKSUM DW 0 ; HEADER CHECKSUM
|
|
IPSOURCE DD 0
|
|
IPDEST DD 0
|
|
;
|
|
; FORMAT OF TCP HEADER WITHIN AN IP DATAGRAM
|
|
;
|
|
; NOTE THESE FIELDS ARE STORED HI ORDER BYTE FIRST (NOT NORMAL 8086 FORMAT)
|
|
;
|
|
|
|
SOURCEPORT DW 0
|
|
DESTPORT DW 0
|
|
|
|
SEQNUM DD 0
|
|
ACKNUM DD 0
|
|
|
|
TCPCONTROL DB 0 ; 4 BITS DATA OFFSET 4 RESERVED
|
|
TCPFLAGS DB 0 ; (2 RESERVED) URG ACK PSH RST SYN FIN
|
|
|
|
TCPWINDOW DW 0
|
|
CHECKSUM DW 0
|
|
URGPTR DW 0
|
|
;
|
|
; OPTIONS AND/OR DATA MAY FOLLOW
|
|
;
|
|
TCPOPTIONS DB 4 DUP (0)
|
|
|
|
IPMSG ENDS
|
|
;
|
|
; TCPFLAGS BITS
|
|
;
|
|
FIN EQU 1B
|
|
SYN EQU 10B
|
|
RST EQU 100B
|
|
PSH EQU 1000B
|
|
ACK EQU 10000B
|
|
URG EQU 100000B
|
|
|
|
|
|
TCP DB 'TCP: ',0
|
|
ICMP DB 'ICMP: ',0
|
|
LEN DB ' LEN: ',0
|
|
|
|
SEQTEXT DB ' SEQ: ',0
|
|
ACKTEXT DB 'ACK: ',0
|
|
WINDTEXT DB 'WIN: ',0
|
|
SYNTEXT DB 'SYN ',0
|
|
FINTEXT DB 'FIN ',0
|
|
RSTTEXT DB 'RST ',0
|
|
PSHTEXT DB 'PSH ',0
|
|
ACKTEXT1 DB 'ACK ',0
|
|
URGTEXT DB 'URG ',0
|
|
|
|
BADSUM DB ' CHECKSUM ERROR ',0
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Parameter area for received frame ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
PORT_NO DB 0 ; Received port number 0 - 256
|
|
VERSION_NO DB 0 ; Version 1 or 2 1,2
|
|
POLL_FINAL DB 0 ; Poll or Final ? P,F
|
|
COMM_RESP DB 0 ; Command or Response C,R
|
|
FRAME_TYPE DB 0 ; Frame Type UI etc in Hex
|
|
PID DB 0 ; Protocol ID
|
|
FRAME_LENGTH DD 0 ; Length of frame 0 - 65...
|
|
NR DB 0 ; N(R) Flag
|
|
NS DB 0 ; N(S) Flag
|
|
INFO_FLAG DB 0 ; Information Packet ? 0 No, 1 Yes
|
|
OPCODE DB 0 ; L4 FRAME TYPE
|
|
FRMRFLAG DB 0
|
|
|
|
TRACEFLAG DB 1
|
|
MALL DB 1
|
|
HEADERLN DB 1
|
|
MCOM DB 1
|
|
MTX DB 1
|
|
MMASK DW 0FFFFH
|
|
;
|
|
; HDLC COMMANDS (WITHOUT P/F)
|
|
;
|
|
UI EQU 3
|
|
SABM EQU 2FH
|
|
DISC EQU 43H
|
|
DM EQU 0FH
|
|
UA EQU 63H
|
|
FRMR EQU 87H
|
|
RR EQU 1
|
|
RNR EQU 5
|
|
REJ EQU 9
|
|
;
|
|
PFBIT EQU 10H ; POLL/FINAL BIT IN CONTROL BYTE
|
|
|
|
|
|
CRLF DB 0DH,0AH
|
|
|
|
AX25CALL DB 7 DUP (0) ; WORK AREA FOR AX25 <> NORMAL CALL CONVERSION
|
|
NORMCALL DB 10 DUP (0) ; CALLSIGN IN NORMAL FORMAT
|
|
NORMLEN DD 0 ; LENGTH OF CALL IN NORMCALL
|
|
;
|
|
TENK DD 10000
|
|
DD 1000
|
|
WORD100 DD 100
|
|
DWORD10 DD 10
|
|
;
|
|
ACCUM DB 4 DUP (0)
|
|
CONVFLAG DB 0
|
|
SUPPRESS DB 0 ; ZERO SUPPRESS FLAG
|
|
|
|
SAVESI DD 0
|
|
SAVEDI DD 0
|
|
|
|
_DATA ENDS
|
|
|
|
; 2:Fm GM8BPQ-2 To NODES <UI pid=CF Len=49 >[18:49:56]
|
|
;FF BPQ (NetRom Routing)
|
|
; N5IN-9 N9 N5IN-3 152
|
|
; GB7CB GALA N5IN-3 151
|
|
; 1:Fm GM8BPQ To APU25N <UI pid=F0 Len=29 >[18:51:48]
|
|
;=5828.55N/00612.62W- {UIV32}
|
|
|
|
; 1:Fm GM8BPQ-1 To BPQ <SABM P>[09:09:51]
|
|
|
|
_TEXT SEGMENT PUBLIC 'CODE'
|
|
|
|
PUBLIC _AGWMONDECODE,_AGWMONOPTIONS
|
|
|
|
_AGWMONOPTIONS:
|
|
|
|
MOV MMASK,AX
|
|
MOV MTX,BL
|
|
MOV MCOM,CL
|
|
|
|
RET
|
|
|
|
_AGWMONDECODE:
|
|
;
|
|
; esi=message, edi=buffer, return length in ECX amd frame type in EAX
|
|
;
|
|
|
|
MOV SAVESI,ESI
|
|
MOV SAVEDI,EDI
|
|
|
|
MOV TIMESTAMP,EAX
|
|
|
|
cmp TRACEFLAG,0
|
|
jne TRACEOK
|
|
|
|
|
|
TRACERET:
|
|
|
|
ret
|
|
|
|
TRACEOK:
|
|
|
|
MOVZX ECX,MSGLENGTH[ESI]
|
|
;
|
|
; GET THE CONTROL BYTE, TO SEE IF THIS FRAME IS TO BE DISPLAYED
|
|
;
|
|
PUSH ESI
|
|
MOV ECX,9 ; MAX DIGIS + 1
|
|
CTRLLOOP:
|
|
TEST BYTE PTR MSGCONTROL-1[ESI],1
|
|
JNZ CTRLFOUND
|
|
|
|
ADD ESI,7
|
|
LOOP CTRLLOOP
|
|
;
|
|
; INVALID FRAME
|
|
;
|
|
POP ESI
|
|
MOV ECX,0
|
|
RET
|
|
|
|
CTRLFOUND:
|
|
|
|
MOV AL,MSGCONTROL[ESI]
|
|
POP ESI
|
|
;
|
|
TEST AL,1 ; I FRAME
|
|
JZ IFRAME
|
|
|
|
AND AL,NOT PFBIT ; CLEAR P/F
|
|
CMP AL,3 ; UI
|
|
JE OKTOTRACE ; ALWAYS DO UI
|
|
|
|
CMP AL,FRMR
|
|
JE OKTOTRACE ; ALWAYS DO FRMR
|
|
|
|
;
|
|
; USEQ/CONTROL - TRACE IF MCOM ON
|
|
;
|
|
CMP MCOM,0
|
|
JNE OKTOTRACE
|
|
|
|
MOV ECX,0
|
|
RET
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Check for MALL ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
IFRAME:
|
|
|
|
cmp MALL,0
|
|
jne OKTOTRACE
|
|
|
|
MOV ECX,0
|
|
ret
|
|
|
|
OKTOTRACE:
|
|
;
|
|
;-----------------------------------------------------------------------------;
|
|
; Get the port number of the received frame ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
mov CL,MSGPORT[ESI]
|
|
mov PORT_NO,CL
|
|
|
|
TEST CL,80H
|
|
JZ NOT_TX
|
|
;
|
|
; TRANSMITTED FRAME - SEE IF MTX ON
|
|
;
|
|
CMP MTX,1
|
|
JE NOT_TX
|
|
|
|
MOV ECX,0
|
|
RET
|
|
|
|
NOT_TX:
|
|
|
|
AND CL,7FH ; MASK T/R BIT
|
|
|
|
DEC CL
|
|
MOV AX,1
|
|
SHL AX,CL ; SHIFT BIT UP
|
|
|
|
TEST MMASK,AX
|
|
JNZ TRACEOK1
|
|
|
|
MOV ECX,0
|
|
RET
|
|
|
|
TRACEOK1:
|
|
|
|
MOV FRMRFLAG,0
|
|
|
|
mov AH,MSGDEST+6[ESI]
|
|
mov AL,MSGORIGIN+6[ESI]
|
|
|
|
mov COMM_RESP,0 ; Clear Command/Response Flag
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Is it a Poll/Final or Command/Response ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
test AH,80H
|
|
mov COMM_RESP,'C'
|
|
jnz NOT_RESPONSE
|
|
mov COMM_RESP,'R'
|
|
|
|
NOT_RESPONSE:
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Is this version 1 or 2 of AX25 ? ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
xor AH,AL
|
|
test AH,80H
|
|
mov VERSION_NO,1
|
|
je VERSION_1
|
|
mov VERSION_NO,2
|
|
|
|
VERSION_1:
|
|
|
|
|
|
mov al,PORT_NO
|
|
and al,7fh
|
|
|
|
|
|
cmp AL,10
|
|
JAE @F
|
|
|
|
PUSH EAX
|
|
|
|
MOV AL,' '
|
|
CALL PUTCHAR
|
|
|
|
POP EAX
|
|
@@:
|
|
call DISPLAY_BYTE_1
|
|
|
|
MOV AL,':'
|
|
|
|
CALL PUTCHAR
|
|
|
|
MOV AL,'F'
|
|
CALL PUTCHAR
|
|
|
|
MOV AL,'m'
|
|
CALL PUTCHAR
|
|
|
|
MOV AL,' '
|
|
CALL PUTCHAR
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Display Origin Callsign ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
PUSH ESI
|
|
|
|
lea ESI,MSGORIGIN[ESI]
|
|
call CONVFROMAX25
|
|
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
POP ESI
|
|
|
|
PUSH ESI
|
|
|
|
mov EBX,OFFSET TO_MSG
|
|
call NORMSTR
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Display Destination Callsign ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
lea ESI,MSGDEST[ESI]
|
|
call CONVFROMAX25
|
|
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
pop ESI
|
|
|
|
movzx EAX,MSGLENGTH[ESI]
|
|
mov FRAME_LENGTH,EAX
|
|
mov CX,8 ; Max number of digi-peaters
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Display any Digi-Peaters ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
NEXT_DIGI:
|
|
|
|
test MSGORIGIN+6[ESI],1
|
|
jnz NO_MORE_DIGIS
|
|
|
|
add ESI,7
|
|
sub FRAME_LENGTH,7 ; Reduce length
|
|
|
|
push ESI
|
|
|
|
push ECX
|
|
lea ESI,MSGORIGIN[ESI]
|
|
call CONVFROMAX25 ; Convert to call
|
|
|
|
push EAX ; Last byte is in AH
|
|
|
|
mov AL,','
|
|
call PUTCHAR
|
|
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
pop EAX
|
|
|
|
test AH,80H
|
|
jz NOT_REPEATED
|
|
|
|
mov AL,'*'
|
|
call PUTCHAR
|
|
|
|
NOT_REPEATED:
|
|
|
|
pop ECX
|
|
pop ESI
|
|
loop NEXT_DIGI
|
|
|
|
NO_MORE_DIGIS:
|
|
|
|
MOV AL,' '
|
|
CALL PUTCHAR
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; If this is Version 2 get the Poll/Final Bit ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
mov POLL_FINAL,0 ; Clear Poll/Final Flag
|
|
|
|
mov AL,MSGCONTROL[ESI] ; Get control byte
|
|
|
|
cmp COMM_RESP,'C'
|
|
jne NOT_COMM
|
|
|
|
test AL,PFBIT
|
|
je NOT_POLL
|
|
|
|
mov POLL_FINAL,'P'
|
|
|
|
NOT_POLL:
|
|
NOT_COMM:
|
|
|
|
cmp COMM_RESP,'R'
|
|
jne NOT_RESP
|
|
|
|
test AL,PFBIT
|
|
je NOT_FINAL
|
|
|
|
mov POLL_FINAL,'F'
|
|
|
|
NOT_FINAL:
|
|
NOT_RESP:
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Start displaying the frame information ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
and AL,NOT PFBIT ; Remove P/F bit
|
|
mov FRAME_TYPE,AL
|
|
|
|
mov AL,'<' ; Print "<"
|
|
call PUTCHAR
|
|
|
|
mov NR,0 ; Reset all the flags
|
|
mov NS,0
|
|
mov INFO_FLAG,0
|
|
|
|
mov AL,FRAME_TYPE
|
|
|
|
test AL,1
|
|
jne NOT_I_FRAME
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Information frame ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
mov AL,'I'
|
|
call PUTCHAR
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
mov INFO_FLAG,1
|
|
mov NR,1
|
|
mov NS,1
|
|
jmp END_OF_TYPE
|
|
|
|
NOT_I_FRAME:
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Un-numbered Information Frame ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
cmp AL,UI
|
|
jne NOT_UI_FRAME
|
|
|
|
mov EBX,OFFSET UI_MSG
|
|
call NORMSTR
|
|
|
|
mov INFO_FLAG,1
|
|
jmp END_OF_TYPE
|
|
|
|
NOT_UI_FRAME:
|
|
test AL,10B
|
|
jne NOT_R_FRAME
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Process supervisory frames ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
mov NR,1 ; All supervisory frames have N(R)
|
|
|
|
and AL,0FH ; Mask the interesting bits
|
|
cmp AL,RR
|
|
jne NOT_RR_FRAME
|
|
|
|
mov EBX,OFFSET RR_MSG
|
|
call NORMSTR
|
|
jmp END_OF_TYPE
|
|
|
|
NOT_RR_FRAME:
|
|
cmp AL,RNR
|
|
jne NOT_RNR_FRAME
|
|
|
|
mov EBX,OFFSET RNR_MSG
|
|
call NORMSTR
|
|
jmp END_OF_TYPE
|
|
|
|
NOT_RNR_FRAME:
|
|
cmp AL,REJ
|
|
jne NOT_REJ_FRAME
|
|
|
|
mov EBX,OFFSET REJ_MSG
|
|
call NORMSTR
|
|
jmp END_OF_TYPE
|
|
|
|
NOT_REJ_FRAME:
|
|
mov NR,0 ; Don't display sequence number
|
|
mov AL,'?' ; Print "?"
|
|
call PUTCHAR
|
|
jmp END_OF_TYPE
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Process all other frame types ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
NOT_R_FRAME:
|
|
cmp AL,UA
|
|
jne NOT_UA_FRAME
|
|
|
|
mov EBX,OFFSET UA_MSG
|
|
call NORMSTR
|
|
jmp SHORT END_OF_TYPE
|
|
|
|
NOT_UA_FRAME:
|
|
cmp AL,DM
|
|
jne NOT_DM_FRAME
|
|
|
|
mov EBX,OFFSET DM_MSG
|
|
call NORMSTR
|
|
jmp SHORT END_OF_TYPE
|
|
|
|
NOT_DM_FRAME:
|
|
cmp AL,SABM
|
|
jne NOT_SABM_FRAME
|
|
|
|
mov EBX,OFFSET SABM_MSG
|
|
call NORMSTR
|
|
|
|
jmp SHORT END_OF_TYPE
|
|
|
|
NOT_SABM_FRAME:
|
|
cmp AL,DISC
|
|
jne NOT_DISC_FRAME
|
|
|
|
mov EBX,OFFSET DISC_MSG
|
|
call NORMSTR
|
|
|
|
jmp SHORT END_OF_TYPE
|
|
|
|
NOT_DISC_FRAME:
|
|
cmp AL,FRMR
|
|
jne NOT_FRMR_FRAME
|
|
|
|
mov EBX,OFFSET FRMR_MSG
|
|
call NORMSTR
|
|
MOV FRMRFLAG,1
|
|
jmp SHORT END_OF_TYPE
|
|
|
|
NOT_FRMR_FRAME:
|
|
mov AL,'?'
|
|
call PUTCHAR
|
|
|
|
END_OF_TYPE:
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; If Version 2 Then display P/F C/R Information ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
IF 0
|
|
|
|
cmp VERSION_NO,2
|
|
jne NOT_VERSION_2
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
mov AL,COMM_RESP ; Print Command/Response Flag
|
|
call PUTCHAR
|
|
|
|
ENDIF
|
|
|
|
cmp POLL_FINAL,0
|
|
je NO_POLL_FINAL
|
|
|
|
|
|
mov AL,POLL_FINAL ; Print Poll/Final Flag if Set
|
|
call PUTCHAR
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
NO_POLL_FINAL:
|
|
NOT_VERSION_2:
|
|
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display sequence numbers if applicable ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
cmp NR,1
|
|
jne NOT_NR_DATA
|
|
|
|
|
|
mov AL,'R'
|
|
call PUTCHAR
|
|
|
|
mov AL,FRAME_TYPE
|
|
rol AL,1
|
|
rol AL,1
|
|
rol AL,1
|
|
|
|
call DISPLAYSEQ
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
NOT_NR_DATA:
|
|
|
|
cmp NS,1
|
|
jne NOT_NS_DATA
|
|
|
|
mov AL,'S'
|
|
call PUTCHAR
|
|
|
|
mov AL,FRAME_TYPE
|
|
ror AL,1
|
|
|
|
call DISPLAYSEQ
|
|
|
|
NOT_NS_DATA:
|
|
|
|
CMP INFO_FLAG,1
|
|
JNE NO_PID_LEN
|
|
|
|
|
|
mov EBX,OFFSET PID_MSG
|
|
call NORMSTR
|
|
|
|
PUSH ESI
|
|
lea ESI,MSGPID[ESI]
|
|
lodsb
|
|
POP ESI
|
|
|
|
CALL HEXOUT
|
|
|
|
mov EBX,OFFSET LEN_MSG
|
|
call NORMSTR
|
|
|
|
MOV EAX,FRAME_LENGTH
|
|
SUB EAX,23
|
|
|
|
CALL DISPLAY_BYTE_1
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
NO_PID_LEN:
|
|
|
|
mov AL,'>'
|
|
call PUTCHAR
|
|
|
|
mov AL,'['
|
|
call PUTCHAR
|
|
|
|
;
|
|
; DISPLAY TIMESTAMP
|
|
;
|
|
|
|
MOV EAX,TIMESTAMP
|
|
mov EDX,0
|
|
DIV D86400
|
|
|
|
MOV EAX,EDX
|
|
MOV edx,0
|
|
DIV D3600
|
|
|
|
CALL DISPLAY_BYTE_2
|
|
|
|
MOV AL,':'
|
|
CALL PUTCHAR
|
|
|
|
MOV EAX,EDX
|
|
MOV EDX,0
|
|
DIV D60 ; MINS IN AX, SECS IN DX
|
|
|
|
PUSH DX
|
|
|
|
CALL DISPLAY_BYTE_2
|
|
|
|
MOV AL,':'
|
|
CALL PUTCHAR
|
|
|
|
POP AX ; SECS
|
|
CALL DISPLAY_BYTE_2
|
|
|
|
|
|
mov AL,']'
|
|
call PUTCHAR
|
|
|
|
|
|
CMP FRMRFLAG,0
|
|
JE NOTFRMR
|
|
;
|
|
; DISPLAY FRMR BYTES
|
|
;
|
|
lea ESI,MSGPID[ESI]
|
|
MOV ECX,3 ; TESTING
|
|
FRMRLOOP:
|
|
lodsb
|
|
CALL BYTE_TO_HEX
|
|
|
|
LOOP FRMRLOOP
|
|
|
|
JMP NO_INFO
|
|
|
|
NOTFRMR:
|
|
;----------------------------------------------------------------------------;
|
|
; Find the PID if an information frame ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
mov AL,0
|
|
|
|
cmp INFO_FLAG,1
|
|
jne NO_PID
|
|
|
|
lea ESI,MSGPID[ESI]
|
|
lodsb
|
|
|
|
NO_PID:
|
|
mov PID,AL
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Is this a NET/ROM message of any sort ? ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
MOV ECX,FRAME_LENGTH
|
|
|
|
cmp PID,NETROM_PID
|
|
je DISPLAY_NETROM
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display the rest of the frame (If Any) ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
DISPLAY_INFO:
|
|
|
|
cmp INFO_FLAG,1 ; Is it an information packet ?
|
|
jne NO_INFO
|
|
|
|
|
|
XOR AL,AL ; IN CASE EMPTY
|
|
|
|
sub ECX,23
|
|
JCXZ NO_INFO ; EMPTY I FRAME
|
|
;
|
|
; PUT TEXT ON A NEW LINE
|
|
;
|
|
PUSH ECX
|
|
MOV AL,0DH
|
|
PUSH ESI
|
|
CALL PUTCHAR
|
|
POP ESI
|
|
POP ECX
|
|
|
|
SAMELN:
|
|
|
|
cmp ECX,257
|
|
jb LENGTH_OK
|
|
|
|
mov ECX,256
|
|
|
|
LENGTH_OK:
|
|
|
|
push ECX
|
|
lodsb
|
|
|
|
cmp AL,0AH
|
|
JE MONOK
|
|
CMP AL,0DH
|
|
JE MONOK
|
|
|
|
CMP AL,20H
|
|
JB SKIP_MON ; IGNORE OTHER CONTROLS
|
|
|
|
MONOK:
|
|
call PUTCHAR
|
|
|
|
SKIP_MON:
|
|
|
|
pop ECX
|
|
loop LENGTH_OK
|
|
|
|
NO_INFO:
|
|
;
|
|
; ADD CR UNLESS DATA ALREADY HAS ONE
|
|
;
|
|
CMP AL,CR
|
|
JE NOTANOTHER
|
|
ADD_CR:
|
|
mov AL,CR
|
|
call PUTCHAR
|
|
|
|
NOTANOTHER:
|
|
;
|
|
MOV ECX,EDI
|
|
SUB ECX,SAVEDI
|
|
|
|
MOVZX EAX,FRAME_TYPE
|
|
|
|
RET
|
|
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display NET/ROM data ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
DISPLAY_NETROM:
|
|
|
|
MOV AL,CR
|
|
CALL PUTCHAR
|
|
|
|
lodsb
|
|
PUSH EAX
|
|
CALL HEXOUT
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
POP EAX
|
|
|
|
cmp AL,NODES_SIG ; Check NODES message
|
|
|
|
JNE DISPLAY_NETROM_DATA
|
|
|
|
cmp FRAME_TYPE, 3
|
|
JNE DISPLAY_NETROM_DATA ; Not UI, so INP3
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display NODES broadcast ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
push ECX
|
|
|
|
mov ECX,6
|
|
REP MOVSB ; ALIAS
|
|
|
|
mov EBX,OFFSET NODES_MSG
|
|
call NORMSTR
|
|
|
|
pop ECX
|
|
|
|
sub ECX,30 ; Header, mnemonic and signature length
|
|
|
|
NODES_LOOP:
|
|
|
|
cmp ECX,0
|
|
jbe NO_INFO
|
|
|
|
push ECX
|
|
push ESI ; Global push for each node
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
push ESI
|
|
|
|
add ESI,7 ; Display destination mnemonic
|
|
|
|
cmp BYTE PTR [ESI],' '
|
|
je NO_MNEMONIC
|
|
|
|
mov ECX,6 ; Max length
|
|
|
|
MNEMONIC_LOOP:
|
|
|
|
lodsb ; Get character
|
|
|
|
cmp AL,' ' ; Short mnemonic ?
|
|
je END_MNEMONIC
|
|
|
|
call PUTCHAR
|
|
|
|
loop MNEMONIC_LOOP
|
|
|
|
END_MNEMONIC:
|
|
|
|
mov AL,':'
|
|
call PUTCHAR
|
|
|
|
NO_MNEMONIC:
|
|
|
|
pop ESI
|
|
push ESI
|
|
|
|
call CONVFROMAX25 ; Display dest callsign
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
mov EBX,OFFSET VIA_MSG
|
|
call NORMSTR
|
|
|
|
pop ESI
|
|
add ESI,13 ; Point to neighbour callsign
|
|
push ESI
|
|
|
|
call CONVFROMAX25
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
mov EBX,OFFSET QUALITY_MSG
|
|
call NORMSTR
|
|
|
|
pop ESI
|
|
add ESI,7 ; Point to quality byte
|
|
|
|
mov AL,[ESI]
|
|
call DISPLAY_BYTE_1
|
|
|
|
mov AL,CR
|
|
call PUTCHAR
|
|
|
|
pop ESI
|
|
pop ECX
|
|
add ESI,21 ; Point to next destination
|
|
sub ECX,21 ; Remove length of each
|
|
|
|
jmp NODES_LOOP
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display normal NET/ROM transmissions ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
DISPLAY_NETROM_DATA:
|
|
|
|
DEC ESI ; BACK TO DATA
|
|
|
|
mov EBX,OFFSET NETROM_MSG
|
|
call NORMSTR
|
|
|
|
PUSH ESI
|
|
|
|
call CONVFROMAX25
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
mov EBX,OFFSET TO_MSG
|
|
call NORMSTR
|
|
|
|
pop ESI
|
|
add ESI,7
|
|
|
|
push ESI
|
|
|
|
call CONVFROMAX25
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
;
|
|
; Display Time To Live number
|
|
;
|
|
mov EBX,OFFSET TTL_MSG
|
|
call NORMSTR
|
|
|
|
pop ESI
|
|
add ESI,7 ; Point to TTL counter
|
|
|
|
lodsb
|
|
call DISPLAY_BYTE_1
|
|
|
|
;
|
|
; DISPLAY CIRCUIT ID
|
|
;
|
|
MOV EBX,OFFSET CCT_MSG
|
|
CALL NORMSTR
|
|
|
|
LODSB
|
|
CALL BYTE_TO_HEX
|
|
|
|
LODSB
|
|
CALL BYTE_TO_HEX
|
|
|
|
INC ESI
|
|
INC ESI ; TO OPCODE
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Determine type of Level 4 frame ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
mov AL,[ESI]
|
|
MOV OPCODE,AL ; SAVE
|
|
AND AL,0FH ; Strip off flags
|
|
|
|
cmp AL,L4CREQ
|
|
jne NOT_L4CREQ
|
|
|
|
mov EBX,OFFSET CONN_REQ_MSG
|
|
call NORMSTR
|
|
|
|
MOV EBX,OFFSET WINDOW
|
|
CALL NORMSTR
|
|
|
|
INC ESI
|
|
LODSB ; WINDOW SIZE
|
|
|
|
CALL DISPLAY_BYTE_1
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
|
|
PUSH ESI
|
|
|
|
call CONVFROMAX25
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
mov EBX,OFFSET AT_MSG
|
|
call NORMSTR
|
|
|
|
pop ESI
|
|
add ESI,7
|
|
PUSH ESI
|
|
|
|
call CONVFROMAX25
|
|
mov ESI,OFFSET NORMCALL
|
|
call DISPADDR
|
|
|
|
|
|
POP ESI
|
|
CMP FRAME_LENGTH,58
|
|
JE NOT_BPQ
|
|
;
|
|
; BPQ EXTENDED CON REQ - DISPLAY TIMEOUT
|
|
;
|
|
MOV EBX,OFFSET TIM_MSG
|
|
CALL NORMSTR
|
|
|
|
MOV AX,7[ESI] ; TIMEOUT
|
|
|
|
CALL DISPLAY_BYTE_1
|
|
;
|
|
NOT_BPQ:
|
|
|
|
JMP ADD_CR
|
|
|
|
NOT_L4CREQ:
|
|
|
|
cmp AL,L4CACK
|
|
jne NOT_L4CACK
|
|
|
|
TEST OPCODE,L4BUSY
|
|
JZ L4CRQ00
|
|
;
|
|
; BUSY RETURNED
|
|
;
|
|
MOV EBX,OFFSET CONN_NAK_MSG
|
|
CALL NORMSTR
|
|
|
|
JMP END_NETROM
|
|
|
|
L4CRQ00:
|
|
|
|
MOV EBX,OFFSET CONN_ACK_MSG
|
|
CALL NORMSTR
|
|
|
|
MOV EBX,OFFSET WINDOW
|
|
CALL NORMSTR
|
|
|
|
MOV AL,1[ESI] ; WINDOW SIZE
|
|
|
|
CALL DISPLAY_BYTE_1
|
|
|
|
MOV EBX,OFFSET MYCCT_MSG
|
|
CALL NORMSTR
|
|
|
|
MOV AL,-2[ESI]
|
|
CALL BYTE_TO_HEX
|
|
|
|
MOV AL,-1[ESI]
|
|
CALL BYTE_TO_HEX
|
|
|
|
JMP ADD_CR
|
|
|
|
NOT_L4CACK:
|
|
|
|
cmp AL,L4DREQ
|
|
jne NOT_L4DREQ
|
|
|
|
mov EBX,OFFSET DISC_REQ_MSG
|
|
call NORMSTR
|
|
|
|
JMP ADD_CR
|
|
|
|
NOT_L4DREQ:
|
|
|
|
cmp AL,L4DACK
|
|
jne NOT_L4DACK
|
|
|
|
mov EBX,OFFSET DISC_ACK_MSG
|
|
call NORMSTR
|
|
|
|
jmp add_cr
|
|
|
|
NOT_L4DACK:
|
|
|
|
cmp AL,L4INFO
|
|
jne NOT_L4INFO
|
|
|
|
mov EBX,OFFSET INFO_MSG
|
|
call NORMSTR
|
|
|
|
mov AL,-2[ESI] ; Get send sequence number
|
|
call DISPLAY_BYTE_1
|
|
|
|
mov AL,' '
|
|
call PUTCHAR
|
|
mov AL,'R'
|
|
call PUTCHAR
|
|
|
|
mov AL,-1[ESI] ; Get receive sequence number
|
|
call DISPLAY_BYTE_1
|
|
|
|
mov AL,'>'
|
|
call PUTCHAR
|
|
|
|
INC ESI ; TO DATA
|
|
MOV ECX,FRAME_LENGTH
|
|
sub ECX,20
|
|
|
|
CALL DOL4FLAGS
|
|
|
|
jmp DISPLAY_INFO
|
|
|
|
|
|
NOT_L4INFO:
|
|
|
|
cmp AL,L4IACK
|
|
jne NOT_L4IACK
|
|
|
|
mov EBX,OFFSET INFO_ACK_MSG
|
|
call NORMSTR
|
|
|
|
mov AL,-1[ESI] ; Get receive sequence number
|
|
call DISPLAY_BYTE_1
|
|
|
|
mov AL,'>'
|
|
call PUTCHAR
|
|
|
|
CALL DOL4FLAGS
|
|
|
|
JMP SHORT END_NETROM
|
|
|
|
NOT_L4IACK:
|
|
|
|
OR AL,AL
|
|
JNZ NOTIP
|
|
;
|
|
; TCP/IP DATAGRAM
|
|
;
|
|
mov EBX,OFFSET IP_MSG
|
|
call NORMSTR
|
|
;
|
|
INC ESI ; NOW POINTING TO IP HEADER
|
|
;
|
|
PUSH ESI
|
|
|
|
LEA ESI,IPSOURCE[ESI]
|
|
CALL PRINT4 ; PRINT IF ADDR IN 'DOTTED DECIMAL' FORMAT
|
|
|
|
POP ESI
|
|
|
|
MOV AL,'>'
|
|
CALL PUTCHAR
|
|
|
|
PUSH ESI
|
|
|
|
LEA ESI,IPDEST[ESI]
|
|
CALL PRINT4 ; PRINT IF ADDR IN 'DOTTED DECIMAL' FORMAT
|
|
|
|
MOV EBX,OFFSET LEN
|
|
CALL NORMSTR
|
|
|
|
POP ESI
|
|
|
|
MOV AL,BYTE PTR IPLENGTH[ESI]
|
|
CALL BYTE_TO_HEX
|
|
|
|
MOV AL,BYTE PTR IPLENGTH+1[ESI]
|
|
CALL BYTE_TO_HEX
|
|
|
|
MOV AL,20H
|
|
CALL PUTCHAR
|
|
|
|
MOV AL,IPPROTOCOL[ESI]
|
|
CALL DISPLAY_BYTE_1 ; DISPLAY PROTOCOL TYPE
|
|
|
|
; mov AL,CR
|
|
; call PUTCHAR
|
|
;
|
|
; MOV ECX,39 ; TESTING
|
|
;IPLOOP:
|
|
; lodsb
|
|
; CALL BYTE_TO_HEX
|
|
;
|
|
; LOOP IPLOOP
|
|
|
|
JMP ADD_CR
|
|
|
|
NOTIP:
|
|
|
|
mov EBX,OFFSET DUFF_NET_MSG
|
|
call NORMSTR
|
|
|
|
|
|
END_NETROM:
|
|
|
|
jmp add_cr
|
|
|
|
DOL4FLAGS:
|
|
;
|
|
; DISPLAY BUSY/NAK/MORE FLAGS
|
|
;
|
|
TEST OPCODE,L4BUSY
|
|
JZ L4F010
|
|
|
|
MOV AL,'B'
|
|
CALL PUTCHAR
|
|
L4F010:
|
|
TEST OPCODE,L4NAK
|
|
JZ L4F020
|
|
|
|
MOV AL,'N'
|
|
CALL PUTCHAR
|
|
L4F020:
|
|
TEST OPCODE,L4MORE
|
|
JZ L4F030
|
|
|
|
MOV AL,'M'
|
|
CALL PUTCHAR
|
|
L4F030:
|
|
RET
|
|
|
|
;----------------------------------------------------------------------------;
|
|
; Display ASCIIZ strings ;
|
|
;----------------------------------------------------------------------------;
|
|
|
|
NORMSTR:
|
|
MOV AL,[EBX]
|
|
INC EBX
|
|
cmp AL,NULL ; End of String ?
|
|
je NORMSTR_RET ; Yes
|
|
call PUTCHAR
|
|
jmp SHORT NORMSTR
|
|
|
|
NORMSTR_RET:
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Display sequence numbers ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
DISPLAYSEQ:
|
|
and AL,7
|
|
add AL,30H
|
|
call PUTCHAR
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Display Callsign pointed to by SI ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
DISPADDR:
|
|
|
|
jcxz DISPADDR_RET
|
|
|
|
LODS NORMCALL
|
|
call PUTCHAR
|
|
|
|
loop DISPADDR
|
|
|
|
DISPADDR_RET:
|
|
ret
|
|
|
|
|
|
PRINT4:
|
|
;
|
|
; DISPLAY IP ADDR IN DOTTED DECIMAL FORMAT
|
|
;
|
|
|
|
LODSB
|
|
CALL DISPLAY_BYTE_1
|
|
MOV AL,'.'
|
|
CALL PUTCHAR
|
|
|
|
LODSB
|
|
CALL DISPLAY_BYTE_1
|
|
MOV AL,'.'
|
|
CALL PUTCHAR
|
|
|
|
LODSB
|
|
CALL DISPLAY_BYTE_1
|
|
MOV AL,'.'
|
|
CALL PUTCHAR
|
|
|
|
LODSB
|
|
CALL DISPLAY_BYTE_1
|
|
|
|
RET
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Convert byte in AL to nnn, nn or n format ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
DISPLAY_BYTE_1:
|
|
|
|
cmp AL,100
|
|
jb TENS_1
|
|
|
|
mov AH,0
|
|
|
|
HUNDREDS_LOOP_1:
|
|
cmp AL,100
|
|
jb HUNDREDS_LOOP_END_1
|
|
|
|
sub AL,100
|
|
inc AH
|
|
jmp SHORT HUNDREDS_LOOP_1
|
|
|
|
HUNDREDS_LOOP_END_1:
|
|
push AX
|
|
mov AL,AH
|
|
add AL,30H
|
|
call PUTCHAR
|
|
pop AX
|
|
jmp SHORT TENS_PRINT_1
|
|
|
|
TENS_1:
|
|
cmp AL,10
|
|
jb UNITS_1
|
|
|
|
TENS_PRINT_1:
|
|
mov AH,0
|
|
|
|
TENS_LOOP_1:
|
|
cmp AL,10
|
|
jb TENS_LOOP_END_1
|
|
|
|
sub AL,10
|
|
inc AH
|
|
jmp SHORT TENS_LOOP_1
|
|
|
|
TENS_LOOP_END_1:
|
|
push AX
|
|
mov AL,AH
|
|
add AL,30H
|
|
call PUTCHAR
|
|
pop AX
|
|
|
|
UNITS_1:
|
|
add AL,30H
|
|
call PUTCHAR
|
|
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Convert byte in AL to nn format ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
DISPLAY_BYTE_2:
|
|
cmp AL,100
|
|
jb TENS_2
|
|
|
|
sub AL,100
|
|
jmp SHORT DISPLAY_BYTE_2
|
|
|
|
TENS_2:
|
|
mov AH,0
|
|
|
|
TENS_LOOP_2:
|
|
cmp AL,10
|
|
jb TENS_LOOP_END_2
|
|
|
|
sub AL,10
|
|
inc AH
|
|
jmp SHORT TENS_LOOP_2
|
|
|
|
TENS_LOOP_END_2:
|
|
push AX
|
|
mov AL,AH
|
|
add AL,30H
|
|
call PUTCHAR
|
|
pop AX
|
|
|
|
UNITS_2:
|
|
add AL,30H
|
|
call PUTCHAR
|
|
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------;
|
|
; Convert byte in AL to Hex display ;
|
|
;-----------------------------------------------------------------------------;
|
|
|
|
BYTE_TO_HEX:
|
|
push AX
|
|
shr AL,1
|
|
shr AL,1
|
|
shr AL,1
|
|
shr AL,1
|
|
call NIBBLE_TO_HEX
|
|
pop AX
|
|
call NIBBLE_TO_HEX
|
|
ret
|
|
|
|
NIBBLE_TO_HEX:
|
|
and AL,0FH
|
|
cmp AL,10
|
|
|
|
jb LESS_THAN_10
|
|
add AL,7
|
|
|
|
LESS_THAN_10:
|
|
add AL,30H
|
|
call PUTCHAR
|
|
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 EDI ; SAVE BUFFER
|
|
|
|
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 EDI
|
|
CMP AL,10
|
|
JB CONVAX70
|
|
SUB AL,10
|
|
MOV BYTE PTR [EDI],'1'
|
|
INC EDI
|
|
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?
|
|
|
|
POP EDI
|
|
RET
|
|
|
|
HEXOUT:
|
|
|
|
PUSH AX
|
|
PUSH AX
|
|
sar al,1
|
|
sar al,1
|
|
sar al,1
|
|
sar al,1
|
|
call hexout1
|
|
pop ax
|
|
call hexout1
|
|
POP AX
|
|
ret
|
|
|
|
hexout1:
|
|
and al,0fh
|
|
cmp al,10
|
|
jl hexout5
|
|
add al,7
|
|
hexout5:
|
|
add al,30h
|
|
STOSB
|
|
;
|
|
ret
|
|
|
|
PUTCHAR:
|
|
STOSB
|
|
RET
|
|
|
|
_TEXT ENDS
|
|
;
|
|
END
|