;ProfiPacket - packet radio terminal program
;Copyright (C) 1999  Alexander Feigl
;
;This program is free software; you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation; either version 2 of the License, or
;(at your option) any later version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
;
;Author:
;
;Alexander Feigl
;Burachstraße 51
;
;D-88250 Weingarten
;
;EMail : Alexander.Feigl@gmx.de


                CPU M68000
                SNMAOPT Q+,P+,A+,B-,S+,M+,E+
                nolist
AJUMP                   MACRO
                        dc.w $4ef9
                        dc.l \1
                        ENDM
                
                        incdir "sys:include/"
                        include "exec/exec_lib.i"
                        include "/global.i"
                        include "utility/utility_lib.i"
                                
_Nil                    moveq #0,d0
                        rts
                        dc.b "ProfCmds"
                
                
ECHO_Head               dc.l ECHO_Name
                        dc.l 1
                        dc.l ECHO_Init
                        dc.l CSTA_Head
                        dc.l 64                 ;Subtype (5=Interlink)
                        
ECHO_Name               dc.b "E",$1,"CHO",0
                        even
ECHO_Init               movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #ECHO_Functions-ECHO_FunctionsBegin,d0
                        move.l #echo_Size,d1
                        lea ECHO_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,echo_QSOBase(a6)
                        move.l d7,echo_OldServer(A6)
                        move.l d6,echo_Channel(a6)
                        move.l a2,echo_Parameter(a6)
                        move.l a4,echo_ThisQSO(a6)
                        move.l a6,qso_Server(a4)
                        
                        cmpa.l #0,a2
                        beq .Invalid_Parameters
                        tst.b (A2)
                        beq .Invalid_Parameters
                        ;move.l a2,a0
                        ;GOQSO ParseComLine
                        ;tst.l d0
                        ;blt .Invalid_Parameters
                        ;cmp.l #0,d0
                        ;bgt .Invalid_Parameters
                        
                        move.l echo_Parameter(a6),a0
                        lea echo_Output(a6),a1
.Loop                   move.b (a0)+,(a1)+
                        tst.b -1(a0)
                        bne .Loop
                        subq.l #1,a1
                        move.b #$d,(a1)+
                        clr.b (a1)+
                        
                        lea echo_Output(a6),a0
                        move.l echo_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        move.l echo_ThisQSO(a6),a0
                        clr.l qso_SendPrompt(a0)
.Server_Success         bsr ECHO_Cleanup
                        movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l echo_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr ECHO_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        

ECHO_Cleanup            move.l echo_OldServer(a6),d0
                        move.l echo_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #ECHO_Functions-ECHO_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

ECHO_ConnectProced      rts

ECHO_ReceivePacket      rts

ECHO_TerminalInput      rts     

ECHO_AbortServer                rts

ECHO_GetServerType      moveq #64,d0
                        rts

ECHO_Nop                        rts

                        
ECHO_FunctionsBegin     
                AJUMP GEN_AskAudioPass          ;-54
                AJUMP ECHO_AbortServer          ;-48
                        AJUMP ECHO_GetServerType                ;-42
                        AJUMP ECHO_TerminalInput                ;-36
                        AJUMP ECHO_ReceivePacket                ;-30
                        AJUMP ECHO_Nop                  ;-24
                        AJUMP ECHO_ConnectProced                ;-18
                        AJUMP ECHO_Cleanup              ;-12
                        AJUMP ECHO_Init                 ;-6
ECHO_Functions          
                        
                        even
                        
                        
                        rsreset
echo_ThisQSO            rs.l 1
echo_Channel            rs.l 1
echo_OldServer          rs.l 1
echo_QSOBase            rs.l 1
echo_Parameter          rs.l 1
echo_Output             rs.b 1024
echo_Size               rs.b 0


CSTA_Head               dc.l CSTA_Name
                        dc.l 1
                        dc.l CSTA_Init
                        dc.l INCH_Head
                        dc.l 64                 ;Subtype (3=Interlink)
                        
CSTA_Name               dc.b "CS",$1,"TATUS",0
                        even
CSTA_Init               movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #CSTA_Functions-CSTA_FunctionsBegin,d0
                        move.l #csta_Size,d1
                        lea CSTA_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,csta_QSOBase(a6)
                        move.l d7,csta_OldServer(A6)
                        move.l d6,csta_Channel(a6)
                        move.l a2,csta_Parameter(a6)
                        move.l a4,csta_ThisQSO(a6)
                        move.l a6,qso_Server(a4)
                        
                        move.l a2,a0
                        GOQSO ParseComLine
                        tst.l d0
                        blt .Invalid_Parameters
                        cmp.l #0,d0
                        bgt .Invalid_Parameters
                        
                        moveq #1,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l csta_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        
                        moveq #1,d7
.Main_Loop              move.l d7,d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Server_Success
                        move.l d0,a4
                        tst.l qso_Server(a4)
                        beq .Next_Channel
                        lea csta_Output(a6),a3
                        move.b #" ",(a3)+
                        move.b #" ",(a3)+
                        move.b #" ",(a3)+
                        move.l d7,d0
                        divu #10,d0
                        or.l #$00300030,d0
                        move.b d0,(a3)+
                        swap d0
                        move.b d0,(a3)+
                        move.b #" ",(a3)+
                        move.b #" ",(a3)+
                        move.b #" ",(a3)+
                        lea qso_MyCall(a4),a0
                        moveq #10,d0
                        bsr .SpaceUpTo
                        lea qso_Call(a4),a0
                        moveq #10,d0
                        bsr .SpaceUpTo
                        move.l qso_User(a4),a0
                        cmp.l #0,a0
                        beq .DoNameUserX
                        lea user_Name(a0),a0
                        bra .DoNameUsi
.DoNameUserX lea qso_Name(a4),a0
.DoNameUsi      moveq #30,d0
                        bsr .SpaceUpTo
                        lea qso_ConnectTime(a4),a0
                        bsr .TimeAgoing
                        move.b #" ",(A3)+
                        lea qso_ActivityTime(a4),a0
                        bsr .TimeAgoing
                        move.b #$d,(a3)+
                        clr.b (a3)+
                        
                        
                        
.Channel_Done           lea csta_Output(a6),a0
                        move.l csta_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
.Next_Channel           addq.l #1,d7
                        bra .Main_Loop

.SpaceUpTo              tst.l d0
                        ble .SpaceUpTo_End
                        tst.b (a0)
                        beq .SpaceUpTo_Do
                        subq.l #1,d0
                        move.b (a0)+,(a3)+
                        bra .SpaceUpTo
.SpaceUpTo_Do           tst.l d0
                        ble .SpaceUpTo_End
                        subq.l #1,d0
                        move.b #" ",(a3)+
                        bra .SpaceUpTo_Do
.SpaceUpTo_End          rts
                        
.TimeAgoing             GOQSO GetSecondsAgo
                        move.l a6,-(sp)
                        move.l ppb_UtilityBase(a5),a6
                        move.l d0,d6
                        move.l #3600,d1
                        jsr _LVOUDivMod32(a6)
                        cmp.l #99,d0
                        bgt .Time_Agoing_Over
                        tst.l d0
                        blt .Time_Agoing_Over
                        divu #10,d0
                        or.l #$00300030,d0
                        move.b d0,(a3)+
                        swap d0
                        move.b d0,(A3)+
                        move.b #":",(A3)+
                        move.l d1,d0
                        moveq #60,d1
                        jsr _LVOUDivMod32(a6)
                        divu #10,d0
                        or.l #$00300030,d0
                        move.b d0,(A3)+
                        swap d0
                        move.b d0,(A3)+
                        move.b #":",(A3)+
                        move.l d1,d0
                        divu #10,d0
                        or.l #$00300030,d0
                        move.b d0,(A3)+
                        swap d0
                        move.b d0,(A3)+
                        move.l (sp)+,a6
                        rts
.Time_Agoing_Over       move.b #"*",(a3)+
                        move.b #"*",(a3)+
                        move.b #":",(a3)+
                        move.b #"*",(a3)+
                        move.b #"*",(a3)+
                        move.b #":",(a3)+
                        move.b #"*",(a3)+
                        move.b #"*",(a3)+
                        move.l (sp)+,a6
                        rts
                        

.Server_Success         bsr CSTA_Cleanup
                        movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l csta_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr CSTA_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        

CSTA_Cleanup            move.l csta_OldServer(a6),d0
                        move.l csta_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #CSTA_Functions-CSTA_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

CSTA_ConnectProced      rts

CSTA_ReceivePacket      rts

CSTA_TerminalInput      rts     

CSTA_AbortServer                rts

CSTA_GetServerType      moveq #64,d0
                        rts

CSTA_Nop                        rts

                        
CSTA_FunctionsBegin     
                        AJUMP GEN_AskAudioPass                  ;-54
                        AJUMP CSTA_AbortServer          ;-48
                        AJUMP CSTA_GetServerType                ;-42
                        AJUMP CSTA_TerminalInput                ;-36
                        AJUMP CSTA_ReceivePacket                ;-30
                        AJUMP CSTA_Nop                  ;-24
                        AJUMP CSTA_ConnectProced                ;-18
                        AJUMP CSTA_Cleanup              ;-12
                        AJUMP CSTA_Init                 ;-6
CSTA_Functions          
                        
                        even
                        
                        
                        rsreset
csta_ThisQSO            rs.l 1
csta_Channel            rs.l 1
csta_OldServer          rs.l 1
csta_QSOBase            rs.l 1
csta_Parameter          rs.l 1
csta_Output             rs.b 256
csta_Size               rs.b 0


INCH_Head               dc.l INCH_Name
                        dc.l 1
                        dc.l INCH_Init
                        dc.l MHRD_Head
                        dc.l 64                 ;Subtype (3=General)
                        
INCH_Name               dc.b "Interlink Channel",0
                        even
INCH_Init               movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #INCH_Functions-INCH_FunctionsBegin,d0
                        move.l #inch_Size,d1
                        lea INCH_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,inch_QSOBase(a6)
                        move.l d7,inch_OldServer(A6)
                        move.l d6,inch_Channel(a6)
                        move.l a2,inch_Parameter(a6)
                        move.l a4,inch_ThisQSO(a6)
                        move.l a6,qso_Server(a4)
                        
                        cmpa.l #0,a2
                        beq .Invalid_Parameters
                        tst.b (A2)
                        beq .Invalid_Parameters
                        
                        moveq #0,d0
                        move.b (a2),d0
                        and.b #$f,d0
                        lea 2(a2),a0
                        tst.b 1(a2)
                        beq .Single_Digit
                        moveq #0,d1
                        move.b 1(a2),d1
                        and.b #$f,d1
                        mulu #10,d0
                        add.l d1,d0
                        lea 3(a2),a0
                        tst.b 2(a2)
                        bne .Invalid_Parameters
                                                
.Single_Digit           tst.b (a0)
                        beq .Invalid_Parameters
                        move.l a0,a4
                        move.l d0,d7
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Invalid_Channel
                        move.l d0,a3
                        tst.l qso_Server(a3)
                        beq .Not_Connected
                        
                        cmp.l inch_Channel(a6),d7
                        beq .Roger_Channel
                        move.l a6,-(sp)
                        move.l qso_Server(a3),a6
                        jsr -42(a6)
                        move.l (sp)+,a6
                        tst.l d0
                        bne .File_Transferring
                        
.Roger_Channel          move.l inch_ThisQSO(a6),a2
                        lea inch_Output(a6),a1
                        move.b #"{",(a1)+
                        move.l inch_Channel(a6),d0
                        divu #10,d0
                        or.l #$00300030,d0
                        cmp.b #$30,d0
                        beq .Inch_FirstCh
                        move.b d0,(a1)+
.Inch_FirstCh           swap d0
                        move.b d0,(a1)+
                        move.b #":",(a1)+
                        lea qso_Call(a2),a0
.Inch_CopCall           tst.b (a0)
                        beq .Call_Coped
                        move.b (a0)+,(a1)+
                        bra .Inch_CopCall
.Call_Coped             move.b #"}",(a1)+
                        move.b #" ",(A1)+
                        
                        
                        
                        move.l a4,a0
.Loop                   move.b (a0)+,(a1)+
                        tst.b -1(a0)
                        bne .Loop
                        subq.l #1,a1
                        move.b #$d,(a1)+
                        clr.b (a1)+
                        
                        lea inch_Output(a6),a0
                        move.l d7,d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        move.l inch_ThisQSO(a6),a0
                        clr.l qso_SendPrompt(a0)
.Server_Success         bsr INCH_Cleanup
                        movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        

.File_Transferring      moveq #4,d0
                        bra .Abort_With_Text
.Not_Connected          moveq #3,d0
                        bra .Abort_With_Text
.Invalid_Channel        moveq #2,d0
                        bra .Abort_With_Text
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l inch_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr INCH_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        

INCH_Cleanup            move.l inch_OldServer(a6),d0
                        move.l inch_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #INCH_Functions-INCH_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

INCH_ConnectProced      rts

INCH_ReceivePacket      rts

INCH_TerminalInput      rts     

INCH_AbortServer                rts

INCH_GetServerType      moveq #64,d0
                        rts

INCH_Nop                        rts

                        
INCH_FunctionsBegin     
                        AJUMP GEN_AskAudioPass                  ;-54
                        AJUMP INCH_AbortServer          ;-48
                        AJUMP INCH_GetServerType                ;-42
                        AJUMP INCH_TerminalInput                ;-36
                        AJUMP INCH_ReceivePacket                ;-30
                        AJUMP INCH_Nop                  ;-24
                        AJUMP INCH_ConnectProced                ;-18
                        AJUMP INCH_Cleanup              ;-12
                        AJUMP INCH_Init                 ;-6
INCH_Functions          
                        
                        even
                        
                        
                        rsreset
inch_ThisQSO            rs.l 1
inch_Channel            rs.l 1
inch_OldServer          rs.l 1
inch_QSOBase            rs.l 1
inch_Parameter          rs.l 1
inch_Output             rs.b 1024
inch_Size               rs.b 0



MHRD_Head               dc.l MHRD_Name
                        dc.l 1
                        dc.l MHRD_Init
                        dc.l CONN_Head
                        dc.l 64                 ;Subtype (6=Interlink)
                        
MHRD_Name               dc.b "MH",$1,"EARD",0
                        even
MHRD_Init               movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #MHRD_Functions-MHRD_FunctionsBegin,d0
                        move.l #mhrd_Size,d1
                        lea MHRD_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,mhrd_QSOBase(a6)
                        move.l d7,mhrd_OldServer(A6)
                        move.l d6,mhrd_Channel(a6)
                        move.l a2,mhrd_Parameter(a6)
                        move.l a4,mhrd_ThisQSO(a6)
                        move.l a6,qso_Server(a4)
                        
                        move.l a2,a0
                        GOQSO ParseComLine
                        tst.l d0
                        blt .Invalid_Parameters
                        cmp.l #1,d0
                        bgt .Invalid_Parameters
                        tst.l d0
                        beq .MHeard_Short
                        move.l mhrd_Parameter(A6),a0
                        cmp.b #"l",(a0)
                        beq .MHeard_Long
                        cmp.b #"L",(a0)
                        beq .MHeard_Long
.MHeard_Short           moveq #5,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l mhrd_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        
                        moveq #0,d7
                        moveq #0,d6
.Main_Loop              move.l d7,d0
                        lea mhrd_Output(A6),a0
                        GOQSO MHeardLine
                        cmp.l #-1,d0
                        beq .Server_Success_R
                        tst.l d0
                        beq .Next_Line
                        add.l #1,d6
                        divu #3,d6
                        swap d6
                        ext.l d6
                        tst.l d6
                        bne .Line_NotDone
                        lea mhrd_Output(A6),a0
.Line_Scan              tst.b (A0)+
                        bne .Line_Scan
                        move.b #$D,-1(a0)
                        clr.b (a0)+
.Line_NotDone           lea mhrd_Output(a6),a0
                        move.l mhrd_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        


.Next_Line              addq.l #1,d7
                        bra .Main_Loop

.MHeard_Long            moveq #6,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l mhrd_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        
                        moveq #0,d7
                        moveq #0,d6
.Main_Loop_Long         cmp.l #20,d7
                        bge .Server_Success
                        move.l d7,d0
                        lea mhrd_Output(A6),a0
                        GOQSO MHeardLineLong
                        cmp.l #-1,d0
                        beq .Server_Success
                        tst.l d0
                        beq .Long_NextLine
                        lea mhrd_Output(a6),a0
                        move.l mhrd_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
.Long_NextLine          addq.l #1,d7
                        bra .Main_Loop_Long
                        
                        

.Server_Success_R       tst.l d6
                        beq .NoTerminate_CR
                        move.l #$0d000000,-(a7)
                        move.l a7,a0
                        move.l mhrd_Channel(A6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        addq.l #4,a7
.NoTerminate_CR         
.Server_Success         bsr MHRD_Cleanup
                        movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l mhrd_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr MHRD_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        

MHRD_Cleanup            move.l mhrd_OldServer(a6),d0
                        move.l mhrd_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #MHRD_Functions-MHRD_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

MHRD_ConnectProced      rts

MHRD_ReceivePacket      rts

MHRD_TerminalInput      rts     

MHRD_AbortServer                rts

MHRD_GetServerType      moveq #64,d0
                        rts

MHRD_Nop                        rts

                        
MHRD_FunctionsBegin     
                        AJUMP GEN_AskAudioPass                  ;-54
                        AJUMP MHRD_AbortServer          ;-48
                        AJUMP MHRD_GetServerType                ;-42
                        AJUMP MHRD_TerminalInput                ;-36
                        AJUMP MHRD_ReceivePacket                ;-30
                        AJUMP MHRD_Nop                  ;-24
                        AJUMP MHRD_ConnectProced                ;-18
                        AJUMP MHRD_Cleanup              ;-12
                        AJUMP MHRD_Init                 ;-6
MHRD_Functions          
                        
                        even
                        
                        
                        rsreset
mhrd_ThisQSO            rs.l 1
mhrd_Channel            rs.l 1
mhrd_OldServer          rs.l 1
mhrd_QSOBase            rs.l 1
mhrd_Parameter          rs.l 1
mhrd_Output             rs.b 256
mhrd_Size               rs.b 0



CONN_Head               dc.l CONN_Name
                        dc.l 1
                        dc.l CONN_Init
                        dc.l CONN_Head_2
                        dc.l 256                        ;Subtype (8=Connect Command)
                        
CONN_Name               dc.b "C",$1,"ONNECT",0
                        even
CONN_Head_2             dc.l CONN_Name_2
                        dc.l 1
                        dc.l CONN_InitTarget
                        dc.l 0
                        dc.l 256                        ;Subtype (8=Connect Command)
                        
CONN_Name_2             dc.b "Interlink Target Server",0
                        even

CONN_Init               movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #CONN_Functions-CONN_FunctionsBegin,d0
                        move.l #conn_Size,d1
                        lea CONN_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,conn_QSOBase(a6)
                        move.l d7,conn_OldServer(A6)
                        move.l d6,conn_Channel(a6)
                        move.l a2,conn_Parameter(a6)
                        move.l a4,conn_ThisQSO(a6)
                        move.l #1,conn_SourceChannel(a6)
                        move.l #"CONN",conn_ServerID(a6)
                        clr.l conn_PartnerChannel(a6)
                        move.l a6,qso_Server(a4)
                        
                        move.l a2,a0
                        GOQSO ParseComLine
                        tst.l d0
                        ble .Invalid_Parameters
                        move.l d0,d7
                        move.l conn_Parameter(a6),a4
                        move.l conn_ThisQSO(a6),a0
                        move.l qso_HardwareUnit(a0),conn_HardUnit(a6)
                        tst.b (a4)
                        beq .Invalid_Parameters
                        cmp.b #"_",1(A4)
                        bne .No_HardGiven
                        move.b (a4),d0
                        cmp.b #$31,d0
                        blt .Invalid_Parameters
                        cmp.b #$34,d0
                        bgt .Invalid_Parameters
                        sub.b #$31,d0
                        and.l #$ff,d0
                        move.l d0,conn_HardUnit(a6)
                        addq.l #2,a4
.No_HardGiven           tst.b (a4)
                        beq .Invalid_Parameters
                        lea conn_ConnectCommand(a6),a3
                        move.b #"C",(A3)+
                        move.b #" ",(a3)+
                        moveq #7,d6
.Looping_CallCopy       tst.l d7
                        beq .Path_Done
                        subq.l #1,d7
                        tst.b (a4)
                        beq .Invalid_Parameters
                        moveq #12,d5
.Copy_Calls             tst.b (a4)
                        beq .CallEnd
                        move.b (a4)+,(a3)+
                        dbf d5,.Copy_Calls
                        bra .Invalid_Parameters
.CallEnd                addq.l #1,a4
                        tst.l d7
                        beq .Path_Done
                        move.b #" ",(A3)+
                        dbf d6,.Looping_CallCopy
                        bra .Invalid_Parameters
.Path_Done              lea conn_ConnectCommand(a6),a0
                        sub.l a0,a3
                        move.l a3,conn_ConnectComLen(a6)
                        
                        move.l conn_HardUnit(a6),d0
                        GOQSO FindMatchChannel
                        tst.l d0
                        beq .No_FreeChannel
                        move.l d0,conn_PartnerChannel(a6)
                        
                        move.l conn_Channel(a6),d0
                        GOQSO UncompressLink
                        
                        lea CONN_Name_2,a0
                        GOQSO SearchSpecialServer
                        tst.l d0
                        beq .No_FreeChannel
                        move.l d0,a0
                        sub.l a1,a1
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO StartServer
                        tst.l d0
                        bne .No_FreeChannel
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .No_FreeChannel
                        move.l d0,a0
                        tst.l qso_Server(a0)
                        beq .No_FreeChannel
                        move.l qso_Server(a0),a1
                        move.l conn_HardUnit(a6),conn_HardUnit(a1)
                        move.l conn_Channel(a6),conn_PartnerChannel(a1)
                        
                        move.l conn_ThisQSO(a6),a0
                        lea qso_Call(a0),a0
                        sub.l #16,a7
                        move.l (a0),2(a7)
                        move.l 4(a0),6(a7)
                        move.w 8(a0),10(a7)
                        move.w #"I ",(a7)
                        lea 2(a7),a0
                        moveq #0,d1
                        sub.l a1,a1
.CI_Look_For_SSID       tst.b (a0)
                        beq .CI_Look_For_SSID_End
                        cmp.b #"-",(a0)
                        beq .CI_SSID_String
                        addq.l #1,a0
                        bra .CI_Look_For_SSID
.CI_SSID_String         addq.l #1,a0
                        move.l a0,a1
                        tst.b (a0)
                        beq .CI_Look_For_SSID_End
                        cmp.b #$30,(a0)
                        blt .CI_Look_For_SSID_End
                        cmp.b #$39,(a0)
                        bgt .CI_Look_For_SSID_End
                        move.b (a0),d0
                        and.l #$f,d0
                        move.l d0,d1
                        tst.b 1(a0)
                        beq .CI_Look_For_SSID_End
                        cmp.b #$30,1(a0)
                        blt .CI_Look_For_SSID_End
                        cmp.b #$39,1(a0)
                        bgt .CI_Look_For_SSID_End
                        move.b 1(a0),d0
                        and.l #$f,d0
                        mulu #10,d1
                        add.l d0,d1
                        tst.b 2(a0)
                        bne .CI_Look_For_SSID_Err
                        cmp.l #15,d1
                        bgt .CI_Look_For_SSID_Err
                        bra .CI_Look_For_SSID_End
.CI_Look_For_SSID_Err   moveq #0,d1
.CI_Look_For_SSID_End   moveq #15,d0
                        sub.l d1,d0
                        cmpa.l #0,a1
                        bne .CI_SSID_Already_Here
                        lea 2(a7),a0
.CI_SSID_Create         tst.b (a0)+
                        bne .CI_SSID_Create
                        subq.l #1,a0
                        move.b #"-",(a0)+
                        move.l a0,a1
.CI_SSID_Already_Here   tst.l d0
                        bne .CI_SSID_IsAny
                        clr.b -1(a1)
                        sub.l a1,a1
                        bra .CI_SSID_IsNothing
                        
.CI_SSID_IsAny          divu #10,d0
                        move.l a1,a0
                        tst.b d0
                        beq .CI_SSID_NoHigh
                        or.b #$30,d0
                        move.b d0,(a0)+
.CI_SSID_NoHigh         swap d0
                        or.b #$30,d0
                        move.b d0,(a0)+
                        clr.b (a0)+
.CI_SSID_IsNothing      move.l a7,a0
                        moveq #-1,d0
.NewCallCount           addq.l #1,d0
                        tst.b (a0)+
                        bne .NewCallCount
                        move.l conn_PartnerChannel(a6),d1
                        move.l a7,a0
                        GOQSO TransmitCommand
                        
                        add.l #16,a7
                        move.l conn_ConnectComLen(a6),d0
                        lea conn_ConnectCommand(a6),a0
                        move.l conn_PartnerChannel(a6),d1
                        GOQSO TransmitCommand
                        move.l conn_ThisQSO(a6),a0
                        clr.l qso_CompressedMode(a0)
                        clr.l qso_SysopMode(a0)
                        bsr CONN_DisplayMsg
                        bra .Server_Active
                        
                        
.Server_Success         bsr CONN_Cleanup
.Server_Active          movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts



.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        
.No_FreeChannel         moveq #7,d0
                        bra .Abort_With_Text
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l conn_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr CONN_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        

CONN_InitTarget         movem.l a6/a2-a4/d2-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #CONN_Functions-CONN_FunctionsBegin,d0
                        move.l #conn_Size,d1
                        lea CONN_Functions,a0
                        move.l ppb_Global(a6),a5
                        jsr _QVOCreateServerBase(A6)
                        tst.l d0
                        beq .Cannot_Serve
                        move.l d0,a6
                        move.l a3,a5
                        move.l a3,conn_QSOBase(a6)
                        move.l d7,conn_OldServer(A6)
                        move.l d6,conn_Channel(a6)
                        move.l a2,conn_Parameter(a6)
                        move.l a4,conn_ThisQSO(a6)
                        clr.l conn_SourceChannel(a6)
                        clr.l conn_PartnerChannel(a6)
                        clr.l conn_OldLinkStat(a6)
                        clr.l conn_NothingPolls(a6)
                        move.l #"CONN",conn_ServerID(a6)
                        move.l a6,qso_Server(a4)
                        movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d2-d7
                        moveq #-1,d0
                        rts

.No_User_Possible       moveq #1,d0
                        bra .Abort_With_Text
                        
.Invalid_Parameters     moveq #0,d0
.Abort_With_Text        bsr Get_Text
                        move.l d0,a0
                        move.l conn_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr CONN_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d2-d7
                        moveq #0,d0
                        rts
                        


CONN_Cleanup            move.l conn_PartnerChannel(a6),d0
                        tst.l d0
                        beq .No_PartnerShutter
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .No_PartnerShutter
                        move.l d0,a0
                        move.l qso_Server(a0),a0
                        cmpa.l #0,a0
                        beq .No_PartnerShutter
                        cmp.l #"CONN",conn_ServerID(a0)
                        bne .No_PartnerShutter
                        move.l a6,-(sp)
                        exg.l a6,a0
                        bsr CONN_PartnerShutup
                        move.l (sp)+,a6
.No_PartnerShutter      
CONN_Cleanup_NoPart     move.l conn_Channel(a6),-(sp)
                        move.l conn_OldServer(a6),-(sp)
                        move.l conn_OldServer(a6),d0
                        move.l conn_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #CONN_Functions-CONN_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        move.l (sp)+,a6
                        move.l (Sp)+,d0
                        cmpa.l #0,a6
                        beq .Exit
                        jsr _SVOReceivePacket(A6)
.Exit                   moveq #0,d0
                        rts
CONN_PartnerShutup      tst.l conn_SourceChannel(A6)
                        beq .Conn_CloseDown
                        cmp.l #1,conn_OldLinkStat(a0)
                        bgt .Conn_Reconnected
.Failure_With           lea conn_ConnectCommand(a6),a0
                        bsr CONN_Insert_MyCall
                        move.b #"F",(a0)+
                        move.b #"a",(a0)+
                        move.b #"i",(a0)+
                        move.b #"l",(a0)+
                        move.b #"u",(a0)+
                        move.b #"r",(a0)+
                        move.b #"e",(a0)+
                        move.b #" ",(a0)+
                        move.b #"w",(a0)+
                        move.b #"i",(a0)+
                        move.b #"t",(a0)+
                        move.b #"h",(a0)+
                        move.b #" ",(a0)+
                        bsr CONN_Insert_Call
                        bra .Send_Message
.Conn_Reconnected       lea conn_ConnectCommand(a6),a0
                        bsr CONN_Insert_MyCall
                        move.b #"R",(a0)+
                        move.b #"e",(a0)+
                        move.b #"c",(a0)+
                        move.b #"o",(a0)+
                        move.b #"n",(a0)+
                        move.b #"n",(a0)+
                        move.b #"e",(a0)+
                        move.b #"c",(a0)+
                        move.b #"t",(a0)+
                        move.b #"e",(a0)+
                        move.b #"d",(a0)+
                        move.b #" ",(a0)+
                        move.b #"t",(a0)+
                        move.b #"o",(a0)+
                        move.b #" ",(a0)+
                        bsr CONN_Insert_MyCall2
.Send_Message           move.b #$d,(a0)+
                        move.l a0,d0
                        lea conn_ConnectCommand(A6),a0
                        sub.l a0,d0
                        move.l conn_Channel(a6),d1
                        movem.l d0/a0,-(sp)
                        GOQSO TransmitData
                        movem.l (sp)+,d0/a0
                        move.l d2,-(sp)
                        move.l conn_Channel(A6),d1
                        moveq #2,d2
                        GOQSO WriteTerminalUni
                        move.l (sp)+,d2
.Conn_Done              bsr CONN_Cleanup_NoPart
                        rts
                        
.Conn_CloseDown         move.l #"DDDD",-(a7)
                        move.l a7,a0
                        moveq #1,d0
                        move.l conn_Channel(a6),d1
                        GOQSO TransmitCommand
                        move.l (Sp)+,d0
                        bsr CONN_Cleanup_NoPart
                        rts

CONN_ConnectProced      moveq #0,d0
                        rts

CONN_ReceivePacket      movem.l d2-d7/a2-a6,-(sp)
                        bsr CONN_DoPoll
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Exit
                        move.l d0,a4
                        move.l qso_Server(A4),a0
                        cmpa.l #0,a0
                        beq .Exit
                        cmp.l #"CONN",conn_ServerID(a0)
                        bne .Exit
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO ForceTransmit
.Loop                   move.l conn_ThisQSO(a6),a0
                        GOQSO TestServBuffer
                        tst.l d0
                        beq .Exit_FT
                        cmp.l #256,d0
                        blt .No_GagaPac
                        move.l #256,d0
.No_GagaPac             move.l conn_ThisQSO(A6),a1
                        lea conn_PacketBuffer(a6),a0
                        GOQSO ReadServBuffer
                        lea conn_PacketBuffer(a6),a0
                        move.l conn_PartnerChannel(a6),d1
                        GOQSO TransmitDataDirect
                        bra .Loop
.Exit_FT                move.l conn_PartnerChannel(a6),d0       
                        GOQSO ForceTransmit
.Exit                   movem.l (sp)+,d2-d7/a2-a6
                        rts

CONN_TerminalInput      rts     

CONN_AbortServer        tst.l conn_SourceChannel(a6)
                        beq .Right_Channel
                        movem.l d2-d7/a2-a6,-(sp)
                        bsr CONN_DoPoll
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Exit
                        move.l d0,a4
                        move.l qso_Server(A4),a0
                        cmpa.l #0,a0
                        beq .Exit
                        move.l a0,a6
                        jsr _SVOAbortServer(a6)
.Exit                   movem.l (sp)+,d2-d7/a2-a6
                        rts
                        
.Right_Channel          move.l #"DDDD",-(a7)
                        move.l a7,a0
                        moveq #1,d0
                        move.l conn_Channel(a6),d1
                        GOQSO TransmitCommand
                        move.l (Sp)+,d0
                        bsr CONN_Cleanup
                        rts

CONN_DoPoll             tst.l conn_SourceChannel(a6)
                        bne .Exit
                        move.l conn_ThisQSO(a6),a0
                        move.l conn_OldLinkStat(a6),d0
                        cmp.l qso_LinkStatus(a0),d0
                        beq .LinkStatNoChange
                        cmp.l #1,d0
                        bgt .LinkStatNoChange
                        move.l qso_LinkStatus(a0),d0
                        cmp.l #1,d0
                        beq .Link_Setup
                        bra .Connected_To
.Send_Message           move.b #$d,(a0)+
                        move.l a0,d0
                        lea conn_ConnectCommand(A6),a0
                        sub.l a0,d0
                        move.l conn_PartnerChannel(a6),d1
                        movem.l d0/a0,-(sp)
                        GOQSO TransmitData
                        movem.l (sp)+,d0/a0
                        move.l d2,-(sp)
                        move.l conn_PartnerChannel(A6),d1
                        moveq #2,d2
                        GOQSO WriteTerminalUni
                        move.l (sp)+,d2
                        bra .LinkStatus_Changed
.Link_Setup             move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .LinkStatus_Changed
                        move.l d0,a0
                        move.l qso_Server(a0),a0
                        cmpa.l #0,a0
                        beq .LinkStatus_Changed
                        cmp.l #"CONN",conn_ServerID(a0)
                        bne .LinkStatus_Changed
                        move.l a0,a1
                        lea conn_ConnectCommand(a1),a0
                        move.l conn_ConnectComLen(a1),d0
                        cmp.b #"C",(a0)
                        bne .LinkStatus_Changed
                        cmp.b #" ",1(a0)
                        bne .LinkStatus_Changed
                        subq.l #2,d0
                        addq.l #2,a0
                        lea conn_TargetCall(a6),a1
.LS_CopyCall            tst.l d0
                        beq .LS_CopyCallEnd
                        cmp.b #" ",(a0)
                        beq .LS_CopyCallEnd
                        move.b (a0)+,d1
                        cmp.b #"a",d1
                        blt .LS_CopyCall_NS
                        cmp.b #"z",d1
                        bgt .LS_CopyCall_NS
                        sub.b #32,d1
.LS_CopyCall_NS         move.b d1,(a1)+
                        subq.l #1,d0
                        bra .LS_CopyCall
.LS_CopyCallEnd         clr.b (A1)+
                        lea conn_ConnectCommand(a6),a0
                        bsr CONN_Insert_MyCall
                        move.b #"L",(a0)+
                        move.b #"i",(a0)+
                        move.b #"n",(a0)+
                        move.b #"k",(a0)+
                        move.b #" ",(a0)+
                        move.b #"s",(a0)+
                        move.b #"e",(a0)+
                        move.b #"t",(a0)+
                        move.b #"u",(a0)+
                        move.b #"p",(a0)+
                        move.b #" ",(a0)+
                        
                        bsr CONN_Insert_Call
                        bra .Send_Message
.Connected_To           bsr CONN_DisplayMsg
                        move.l conn_ThisQSO(a6),a0
                        lea conn_TargetCall(a6),a1
                        lea qso_Call(a0),a0
                        cmp.b #"-",(a0)
                        beq .Exit
                        move.l (a0),(a1)
                        move.l 4(a0),4(a1)
                        move.w 8(a0),8(a1)
                        lea conn_ConnectCommand(a6),a0
                        bsr CONN_Insert_MyCall
                        move.b #"C",(a0)+
                        move.b #"o",(a0)+
                        move.b #"n",(a0)+
                        move.b #"n",(a0)+
                        move.b #"e",(a0)+
                        move.b #"c",(a0)+
                        move.b #"t",(a0)+
                        move.b #"e",(a0)+
                        move.b #"d",(a0)+
                        move.b #" ",(a0)+
                        move.b #"t",(a0)+
                        move.b #"o",(a0)+
                        move.b #" ",(a0)+
                        bsr CONN_Insert_Call
                        bra .Send_Message
                        
.LinkStatus_Changed     move.l conn_ThisQSO(a6),a0
                        move.l qso_LinkStatus(a0),conn_OldLinkStat(a6)
                        move.l qso_LinkStatus(a0),d0
.LinkStatNoChange       tst.l d0
                        bne .Exit
                        add.l #1,conn_NothingPolls(a6)
                        cmp.l #50,conn_NothingPolls(a6)
                        blt .Exit
                        bsr CONN_Cleanup
                        
                        
.Exit
                        rts
                        
CONN_Insert_MyCall      move.l a4,-(sp)
                        move.l a0,a4
                        move.l conn_ThisQSO(a6),a0
                        tst.l conn_SourceChannel(a6)
                        bne .This_MyChannel
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Exit
                        move.l d0,a0
.This_MyChannel         lea qso_MyCall(a0),a0
.Copy_MyCall            tst.b (a0)
                        beq .Copy_MyCallEnd
                        move.b (a0)+,(a4)+
                        bra .Copy_MyCall
.Copy_MyCallEnd         move.b #"}",(a4)+
                        move.b #" ",(A4)+                       
.Exit                   move.l a4,a0
                        move.l (sp)+,a4
                        moveq #0,d0
                        rts
CONN_Insert_MyCall2     move.l a4,-(sp)
                        move.l a0,a4
                        move.l conn_ThisQSO(a6),a0
                        tst.l conn_SourceChannel(a6)
                        bne .This_MyChannel
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Exit
                        move.l d0,a0
.This_MyChannel         lea qso_MyCall(a0),a0
.Copy_MyCall            tst.b (a0)
                        beq .Copy_MyCallEnd
                        move.b (a0)+,(a4)+
                        bra .Copy_MyCall
.Copy_MyCallEnd         
.Exit                   move.l a4,a0
                        move.l (sp)+,a4
                        moveq #0,d0
                        rts

CONN_Insert_Call        move.l a4,-(sp)
                        move.l a0,a4
                        move.l conn_ThisQSO(a6),a0
                        tst.l conn_SourceChannel(a6)
                        beq .This_MyChannel
                        move.l conn_PartnerChannel(a6),d0
                        GOQSO GetChannelQSO
                        tst.l d0
                        beq .Exit
                        move.l d0,a0
.This_MyChannel         tst.l qso_Server(a0)
                        beq .Exit
                        move.l qso_Server(a0),a0
                        cmp.l #"CONN",conn_ServerID(a0)
                        bne .Exit
                        lea conn_TargetCall(a0),a0
.Copy_MyCall            tst.b (a0)
                        beq .Copy_MyCallEnd
                        move.b (a0)+,(a4)+
                        bra .Copy_MyCall
.Copy_MyCallEnd         
.Exit                   move.l a4,a0
                        move.l (sp)+,a4
                        moveq #0,d0
                        rts


CONN_GetServerType      move.l #256,d0
                        rts

CONN_Nop                rts

CONN_DisplayMsg         movem.l d2-d7/a2-a6,-(sp)
                        sub.l #64,a7
                        move.l a7,a4
                        move.l conn_ThisQSO(a6),a3
.This_MyChannel         lea qso_MyCall(a3),a0
                        move.l a7,a1
                        tst.l conn_SourceChannel(A6)
                        beq .Copy_MyCall
                        lea conn_ConnectCommand(a6),a0
                        lea 2(a0),a0
.Copy_MyCall            tst.b (a0)
                        beq .MyCallEnd
                        move.b (a0)+,d0
                        cmp.b #"a",d0
                        blt .Copy_MCL
                        cmp.b #"z",d0
                        bgt .Copy_MCL
                        sub.b #32,d0
.Copy_MCL               move.b d0,(a1)+
                        bra .Copy_MyCall
.MyCallEnd              move.b #" ",(a1)+
                        move.b #"(",(a1)+
                        move.l conn_PartnerChannel(a6),d0
                        divu #10,d0
                        or.l #$300030,d0
                        move.b d0,(A1)+
                        swap d0
                        move.b d0,(a1)+
                        move.b #")",(A1)+
                        move.b #" ",(a1)+
                        move.b #"-",(A1)+
                        move.b #"-",(A1)+
                        move.b #">",(a1)+
                        move.b #" ",(A1)+
                        lea qso_Call(a3),a0
.Copy_Call              tst.b (a0)
                        beq .CallEnd
                        move.b (a0)+,(a1)+
                        bra .Copy_Call
.CallEnd                move.b #$d,(A1)+
                        sub.l a7,a1
                        move.l a1,d0
                        move.l conn_Channel(a6),d1
                        moveq #3,d2
                        move.l a7,a0
                        GOQSO WriteTerminalUni
.Exit                   add.l #64,a7
                        movem.l (sp)+,d2-d7/a2-a6
                        rts
                        

CONN_AskAudio           moveq #-1,d0
                        rts
                        
CONN_FunctionsBegin     
                        AJUMP CONN_AskAudio                  ;-54
                        AJUMP CONN_AbortServer          ;-48
                        AJUMP CONN_GetServerType                ;-42
                        AJUMP CONN_TerminalInput                ;-36
                        AJUMP CONN_ReceivePacket                ;-30
                        AJUMP CONN_DoPoll                       ;-24
                        AJUMP CONN_ConnectProced                ;-18
                        AJUMP CONN_Cleanup              ;-12
                        AJUMP CONN_Init                 ;-6
CONN_Functions          

                        
                        even
                        

                        
                        rsreset
conn_ThisQSO            rs.l 1
conn_Channel            rs.l 1
conn_OldServer          rs.l 1
conn_QSOBase            rs.l 1
conn_Parameter          rs.l 1
conn_ServerID           rs.l 1
conn_SourceChannel      rs.l 1
conn_PartnerChannel     rs.l 1
conn_HardUnit           rs.l 1
conn_ConnectComLen      rs.l 1
conn_OldLinkStat        rs.l 1
conn_NothingPolls       rs.l 1
conn_ConnectCommand     rs.b 256
conn_PacketBuffer       rs.b 256
conn_TargetCall         rs.b 16
conn_Size               rs.b 0





Get_Text                lea _InterlinkCatalog(pc),a0
                        move.l conn_ThisQSO(a6),a1
                        move.l a2,-(sp)
                        lea _InterlinkCatalogName(pc),a2
                        GOQSO GetText
                        move.l (sp)+,a2
                        rts

GEN_AskAudioPass move.l a6,-(sp)
                        move.l conn_OldServer(a6),a6
                        cmpa.l #0,a6
                        beq .NoServer
                        jsr _SVOAskAudio(a6)
.NoServer       move.l (sp)+,a6
                        rts


                        include "/Catalogs/Sources/Interlink.s"


