;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"

                                
_Nil                    moveq #0,d0
                        rts
                        dc.b "ProfCmds"
                
                
                        dc.l PDIR_Name
                        dc.l 1
                        dc.l PDIR_Init
                        dc.l NAM_Head
                        dc.l 16                 ;Subtype (4=User Settings)
                        
PDIR_Name                dc.b "PRIVDIR",$01,"ECTORY",0
                        even
PDIR_Init                movem.l a6/a2-a4/d5-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #PDIR_Functions-PDIR_FunctionsBegin,d0
                        move.l #pdir_Size,d1
                        lea PDIR_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,pdir_QSOBase(a6)
                        move.l d7,pdir_OldServer(A6)
                        move.l d6,pdir_Channel(a6)
                        move.l a2,pdir_Parameter(a6)
                        move.l a4,pdir_ThisQSO(a6)
                        move.l a6,qso_Server(a4)
                        
                        move.l a2,a0
                        GOQSO ParseComLine
                        tst.l d0
                        bne .Invalid_Parameters

                        moveq #15,d0
                        move.l pdir_ThisQSO(a6),a0
                        tst.l qso_SysopMode(a0)
                        beq .Abort_With_Text
                        moveq #14,d0
                        move.l qso_User(a0),a1
                        cmpa.l #0,a1
                        beq .Abort_With_Text
                        tst.b user_PrivateDir(a1)
                        beq .Abort_With_Text
                        eor.l #1,qso_PrivateDir(a0)
                        clr.b qso_CurrentDir(a0)
                        moveq #12,d0
                        tst.l qso_PrivateDir(a0)
                        bne .Abort_With_Text
                        moveq #13,d0
                        bra .Abort_With_Text

.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d5-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 pdir_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr PDIR_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d5-d7
                        moveq #0,d0
                        rts
                        

PDIR_Cleanup             move.l pdir_OldServer(a6),d0
                        move.l pdir_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #PDIR_Functions-PDIR_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

PDIR_ConnectProced       rts

PDIR_ReceivePacket       rts

PDIR_TerminalInput       rts

PDIR_AbortServer         rts

PDIR_GetServerType       moveq #16,d0
                        rts

PDIR_Nop                 rts

                        
PDIR_FunctionsBegin
                        AJUMP GEN_AskAudioPass          ;-54
                        AJUMP PDIR_AbortServer           ;-48
                        AJUMP PDIR_GetServerType         ;-42
                        AJUMP PDIR_TerminalInput         ;-36
                        AJUMP PDIR_ReceivePacket         ;-30
                        AJUMP PDIR_Nop                   ;-24
                        AJUMP PDIR_ConnectProced         ;-18
                        AJUMP PDIR_Cleanup                       ;-12
                        AJUMP PDIR_Init                  ;-6
PDIR_Functions
                        
                        even
                        
                        
                        rsreset
pdir_ThisQSO             rs.l 1
pdir_Channel             rs.l 1
pdir_OldServer           rs.l 1
pdir_QSOBase             rs.l 1
pdir_Parameter           rs.l 1
pdir_Size                rs.b 0



NAM_Head                dc.l NAM_Name
                        dc.l 1
                        dc.l NAM_Init
                        dc.l SYSO_Head
                        dc.l 16                 ;Subtype (4=User Settings)

NAM_Name                dc.b "N",$01,"AME",0
                        even
NAM_Init                movem.l a6/a2-a4/d5-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #NAM_Functions-NAM_FunctionsBegin,d0
                        move.l #nam_Size,d1
                        lea NAM_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,nam_QSOBase(a6)
                        move.l d7,nam_OldServer(A6)
                        move.l d6,nam_Channel(a6)
                        move.l a2,nam_Parameter(a6)
                        move.l a4,nam_ThisQSO(a6)
                        move.l a6,qso_Server(a4)

                        move.l a2,a0
                        GOQSO ParseComLine
                        tst.l d0
                        blt .Invalid_Parameters
                        cmp.l #3,d0
                        bgt .Invalid_Parameters
                        move.l d0,d7
                        move.l nam_ThisQSO(a6),a0
                        tst.l qso_User(a0)
                        beq .No_User_Possible

                        move.l nam_Parameter(a6),a2
                        tst.l d7
                        beq .Param_Done
                        move.l nam_ThisQSO(A6),a0
                        move.l qso_User(a0),a0
                        GOQSO ChangeUser
                        moveq #30,d0
                        move.l nam_ThisQSO(a6),a0
                        move.l qso_User(a0),a0
                        lea user_Name(a0),a1
                        move.l a2,a0
                        move.l a1,-(sp)
.Copy_Name_1            move.b (a0)+,(a1)+
                        tst.b -1(a1)
                        beq .Copy_Name_1_End
                        dbf d0,.Copy_Name_1
                        clr.b (A1)+
.Copy_Name_1_ParseEnd   tst.b (a0)+
                        bne .Copy_Name_1_ParseEnd
.Copy_Name_1_End        move.l a0,a2
                        move.l (sp)+,a1
                        move.l nam_ThisQSO(A6),a0
                        lea qso_Name(a0),a0
.Copy_Name_2            move.b (a1)+,(a0)+
                        tst.b -1(a1)
                        bne .Copy_Name_2
                        move.l nam_ThisQSO(a6),a0
                        lea qso_Name(a0),a0
                        GOQSO ConvertToAmiga
                        cmp.l #1,d7
                        beq .Param_Done
                        moveq #30,d0
                        move.l nam_ThisQSO(a6),a0
                        move.l qso_User(a0),a0
                        lea user_QTH(a0),a1
                        move.l a2,a0
.Copy_QTH_1             move.b (a0)+,(a1)+
                        tst.b -1(a1)
                        beq .Copy_QTH_1_End
                        dbf d0,.Copy_QTH_1
                        clr.b (A1)+
.Copy_QTH_1_ParseEnd    tst.b (a0)+
                        bne .Copy_QTH_1_ParseEnd
.Copy_QTH_1_End         move.l a0,a2

                        cmp.l #2,d7
                        beq .Param_Done

                        move.l a2,a0
                        GOQSO ValidateLocator
                        tst.l d0
                        bne .Invalid_Locator
                        moveq #5,d0
                        move.l nam_ThisQSO(a6),a0
                        move.l qso_User(a0),a0
                        lea user_Locator(a0),a1
                        move.l a2,a0
.Copy_Locator           move.b (a0)+,(a1)+
                        dbf d0,.Copy_Locator
                        clr.b (a1)+
                        bra .Param_Done


.Invalid_Locator        moveq #2,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l nam_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
.Param_Done             move.l nam_Channel(a6),d0
                        GOQSO ChangeChannel
                        move.l nam_ThisQSO(A6),a0
                        move.l qso_User(a0),a0
                        bsr Display_User








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


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d5-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 nam_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr NAM_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d5-d7
                        moveq #0,d0
                        rts


NAM_Cleanup             move.l nam_OldServer(a6),d0
                        move.l nam_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #NAM_Functions-NAM_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

NAM_ConnectProced       rts

NAM_ReceivePacket       rts

NAM_TerminalInput       rts

NAM_AbortServer         rts

NAM_GetServerType       moveq #16,d0
                        rts

NAM_Nop                 rts


NAM_FunctionsBegin
                        AJUMP GEN_AskAudioPass          ;-54
                        AJUMP NAM_AbortServer           ;-48
                        AJUMP NAM_GetServerType         ;-42
                        AJUMP NAM_TerminalInput         ;-36
                        AJUMP NAM_ReceivePacket         ;-30
                        AJUMP NAM_Nop                   ;-24
                        AJUMP NAM_ConnectProced         ;-18
                        AJUMP NAM_Cleanup                       ;-12
                        AJUMP NAM_Init                  ;-6
NAM_Functions

                        even


                        rsreset
nam_ThisQSO             rs.l 1
nam_Channel             rs.l 1
nam_OldServer           rs.l 1
nam_QSOBase             rs.l 1
nam_Parameter           rs.l 1
nam_Size                rs.b 0



                
                
SYSO_Head               dc.l SYSO_Name
                        dc.l 1
                        dc.l SYSO_Init
                        dc.l SYSO_Head2
                        dc.l 3                  ;Subtype (3=General)
SYSO_Head2              dc.l SYSO_Name_2
                        dc.l 1
                        dc.l SYSO_Init_2
                        dc.l LANG_Head
                        dc.l 3

SYSO_Name               dc.b "PRIV",$01,"ILEGE",0
SYSO_Name_2             dc.b "Sysop_BBS",0
                        even
SYSO_Init_2             moveq #1,d1
                        bra SYSO_Init_Gen
SYSO_Init               moveq #0,d1
SYSO_Init_Gen           movem.l a6/a2-a4/d5-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l d1,d5
                        move.l a3,a6
                        move.l #SYSO_Functions-SYSO_FunctionsBegin,d0
                        move.l #syso_Size,d1
                        lea SYSO_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,syso_QSOBase(a6)
                        move.l d7,syso_OldServer(A6)
                        move.l d6,syso_Channel(a6)
                        move.l a2,syso_Parameter(a6)
                        move.l a4,syso_ThisQSO(a6)
                        move.l d5,syso_BBSMode(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
                        move.l d0,d7
                        clr.l syso_Status(a6)
                        
                        
                        sub.l a0,a0
                        tst.l d7
                        beq .Sysop_NoArgum
                        move.l syso_Parameter(A6),a0
.Sysop_NoArgum          move.l syso_Channel(a6),d0
                        move.l syso_Status(a6),d1
                        GOQSO AskPassword
                        move.l d0,syso_Status(a6)
                        bsr SYSO_PrintStatMsg
                        
                        tst.l syso_Status(a6)
                        beq .Server_Success
                        cmp.l #1,syso_Status(a6)
                        beq .Server_GoToSysop                   
                        bra .Server_HoldIn
.Server_GoToSysop       move.l syso_ThisQSO(a6),a0
                        move.l #1,qso_SysopMode(a0)                     
.Server_Success         bsr SYSO_Cleanup
                        bra .Server_NoHoldIn
.Server_HoldIn          bsr SYSO_ReceivePacket
.Server_NoHoldIn        movem.l (sp)+,a6/a2-a4/d5-d7
                        moveq #0,d0
                        rts


.Cannot_Serve           movem.l (sp)+,a6/a2-a4/d5-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 syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bsr SYSO_Cleanup
                        movem.l (Sp)+,a6/a2-a4/d5-d7
                        moveq #0,d0
                        rts
                        

SYSO_Cleanup            move.l syso_OldServer(a6),d0
                        move.l syso_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #SYSO_Functions-SYSO_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts


SYSO_ConnectProced      rts


SYSO_ReceivePacket      movem.l d2-d7/a2-a6,-(Sp)
.Loop                   move.l syso_ThisQSO(a6),a0
                        GOQSO TestServBufferLin
                        tst.l d0
                        beq .Exit
                        lea syso_Buffer(a6),a0
                        move.l syso_ThisQSO(a6),a1
                        move.l d0,-(sp)
                        GOQSO ReadServBuffer
                        move.l (sp)+,d0
                        move.l d0,-(sp)
                        lea syso_Buffer(a6),a0
                        move.l syso_Channel(A6),d1
                        GOQSO WriteTerminal
                        move.l (sp)+,d0
                        lea syso_Buffer(a6),a0
                        add.l d0,a0
                        cmp.b #$d,-1(A0)
                        bne .Exit
                        clr.b -1(a0)
                        lea syso_Buffer(a6),a0
                        tst.b (a0)
                        beq .Exit
                        move.l syso_Channel(a6),d0
                        move.l syso_Status(a6),d1
                        GOQSO AskPassword
                        move.l d0,syso_Status(a6)
                        bsr SYSO_PrintStatMsg
                        
                        tst.l syso_Status(a6)
                        beq .Exit_WholeServer
                        cmp.l #1,syso_Status(a6)
                        beq .Server_GoToSysop                   
                        bra .Loop
.Server_GoToSysop       tst.l syso_BBSMode(a6)
                        bne .Server_BBSOK
                        move.l syso_ThisQSO(a6),a0
                        move.l #1,qso_SysopMode(a0)                     
                        bra .Exit_WholeServer
.Server_BBSOK           clr.l syso_BBSMode(a6)
                        bra .Exit_WholeServer

.Exit_WholeServer       move.l syso_ThisQSO(a6),a0
                        GOQSO TestServBuffer
                        tst.l syso_BBSMode(a6)
                        bne .Exit_BBSEXA
                        move.l d0,-(sp)
                        move.l syso_OldServer(a6),-(sp)
                        bsr SYSO_Cleanup
                        move.l (sp)+,a6
                        move.l (Sp)+,d0
                        cmpa.l #0,a6
                        beq .Exit
                        jsr _SVOReceivePacket(A6)
.Exit                   movem.l (sp)+,d2-d7/a2-a6
                        rts
.Exit_BBSEXA            bsr SYSO_Cleanup
                        bra .Exit

SYSO_TerminalInput
                        move.l syso_Channel(A6),d1

                        movem.l d0/d1/a0,-(sp)
                        GOQSO TransmitData
                        movem.l (sp)+,d0/d1/a0
                        moveq #2,d2
                        GOQSO WriteTerminalUni

                        rts     



SYSO_AbortServer        bsr SYSO_Cleanup
                        rts

SYSO_GetServerType      moveq #8,d0
                        rts

SYSO_PrintStatMsg       move.l syso_Status(a6),d0
                        tst.l d0
                        beq .STD
                        cmp.l #1,d0
                        beq .SYSOP
                        cmp.l #2,d0
                        beq .PW
                        cmp.l #3,d0
                        beq .SYS
                        cmp.l #6,d0
                        beq .Ent_PW

                        rts
.PW                     moveq #4,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_BBSMode(a6),d1
                        eor.l #1,d1
                        move.l syso_Channel(a6),d0
                        moveq #0,d2
                        GOQSO TransmitText
                        rts
.SYS                    moveq #5,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        move.l syso_BBSMode(a6),d1
                        eor.l #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        rts
.SYSOP                  tst.l syso_BBSMode(a6)
                        bne .SYSOP_BBS
                        moveq #6,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        rts
.Ent_PW                 moveq #16,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        move.l syso_BBSMode(a6),d1
                        eor.l #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        rts

.SYSOP_BBS              sub.l #4,a7
                        move.l #$4f6b210d,(a7)
                        moveq #4,d0
                        move.l syso_Channel(a6),d1
                        move.l a7,a0
                        GOQSO TransmitData
                        addq.l #4,a7
                        rts

.STD                    moveq #7,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        move.l syso_BBSMode(a6),d1
                        eor.l #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        rts
                        

SYSO_Nop                        rts

                        
SYSO_FunctionsBegin     
                        AJUMP GEN_AskAudioPass                  ;-54
                        AJUMP SYSO_AbortServer          ;-48
                        AJUMP SYSO_GetServerType                ;-42
                        AJUMP SYSO_TerminalInput                ;-36
                        AJUMP SYSO_ReceivePacket                ;-30
                        AJUMP SYSO_Nop                  ;-24
                        AJUMP SYSO_ConnectProced                ;-18
                        AJUMP SYSO_Cleanup                      ;-12
                        AJUMP SYSO_Init                 ;-6
SYSO_Functions          
                        
                        even
                        
                        
                        rsreset
syso_ThisQSO            rs.l 1
syso_Channel            rs.l 1
syso_OldServer          rs.l 1
syso_QSOBase            rs.l 1
syso_Parameter          rs.l 1
syso_Status             rs.l 1
syso_BBSMode            rs.l 1
syso_Buffer             rs.b 256
syso_Size               rs.b 0

LANG_Head               dc.l LANG_Name
                        dc.l 1
                        dc.l LANG_Init
                        dc.l 0
                        dc.l 16                 ;Subtype (4=User Settings)
                        
LANG_Name               dc.b "LANG",$01,"UAGE",0
                        even
LANG_Init               movem.l a6/a2-a4/d5-d7,-(sp)
                        move.l a0,a4
                        move.l a1,d7
                        move.l d0,d6
                        move.l a3,a6
                        move.l #LANG_Functions-LANG_FunctionsBegin,d0
                        move.l #lang_Size,d1
                        lea LANG_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,lang_QSOBase(a6)
                        move.l d7,lang_OldServer(A6)
                        move.l d6,lang_Channel(a6)
                        move.l a2,lang_Parameter(a6)
                        move.l a4,lang_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
                        move.l d0,d7
                        move.l lang_ThisQSO(a6),a0
                        tst.l qso_User(a0)
                        beq .No_User_Possible
                        
                        move.l lang_Parameter(a6),a2
                        tst.l d7
                        beq .No_Parameters
                        GOQSO GetLanguageTable
                        move.l d0,a4
.Find_LangLoop          move.l 16(a4),a0
                        move.l a2,a1
.Compare_Lang           move.b (a0)+,d0
                        move.b (a1)+,d1
                        cmp.b #$61,d0
                        blt .Compare_G1
                        cmp.b #$7a,d0
                        bgt .Compare_G1
                        sub.b #$20,d0
.Compare_G1             cmp.b #$61,d1
                        blt .Compare_G2
                        cmp.b #$7a,d1
                        bgt .Compare_G2
                        sub.b #$20,d1
.Compare_G2             cmp.b d0,d1
                        bne .Next_Lang
                        tst.b d0
                        bne .Compare_Lang
                        bra .Select_Language
                        
.Next_Lang              move.l (a4),a4
                        cmpa.l #0,a4
                        bne .Find_LangLoop
                        moveq #10,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bra .Done_Me
.Select_Language        move.l lang_ThisQSO(a6),a0
                        move.l qso_User(a0),a0
                        move.l 4(a4),d0
                        move.w d0,user_Language(a0)
                        move.l lang_ThisQSO(A6),a0
                        move.l qso_User(a0),a0
                        GOQSO ChangeUser
                        moveq #11,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        bra .Done_Me

                        
                        
                        
.No_Parameters          moveq #9,d0
                        bsr Get_Text
                        move.l d0,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        sub.l #256,a7
                        GOQSO GetLanguageTable
                        move.l d0,a4
.Print_Avail_Loop       move.l a7,a0
                        move.l 16(a4),a1
                        moveq #6,d0
.Print_Short_L          tst.b (a1)
                        beq .Print_Short_E
                        subq.l #1,d0
                        move.b (a1)+,(a0)+
                        bra .Print_Short_L
.Print_Short_E          tst.l d0
                        ble .Print_Short_SE
                        subq.l #1,d0
                        move.b #" ",(a0)+
                        bra .Print_Short_E
.Print_Short_SE         move.b #":",(a0)+
                        move.b #" ",(a0)+
                        move.l 12(a4),a1
.Print_Long_L           tst.b (a1)
                        beq .Print_Long_E
                        move.b (a1)+,(a0)+
                        bra .Print_Long_L
.Print_Long_E           move.b #$d,(a0)+
                        clr.b (a0)+
                        move.l a7,a0
                        GOQSO ConvertToPC
                        move.l a7,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText
                        
.Next_Language_Print    move.l (a4),a4
                        cmpa.l #0,a4
                        bne .Print_Avail_Loop
                        move.l a7,a0
                        move.b #$0d,(a0)+
                        clr.b (a0)+
                        move.l a7,a0
                        move.l syso_Channel(a6),d0
                        moveq #1,d1
                        moveq #0,d2
                        GOQSO TransmitText                                              
                        add.l #256,a7

.Done_Me                bsr LANG_Cleanup
                        movem.l (sp)+,a6/a2-a4/d5-d7
                        moveq #0,d0
                        rts


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

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

LANG_Cleanup            move.l lang_OldServer(a6),d0
                        move.l lang_ThisQSO(a6),a0
                        move.l d0,qso_Server(a0)
                        move.l a6,a1
                        move.l ppb_ExecBase(a5),a6
                        sub.l #LANG_Functions-LANG_FunctionsBegin,a1
                        jsr _LVOFreeVec(A6)
                        moveq #0,d0
                        rts

LANG_ConnectProced      rts

LANG_ReceivePacket      rts

LANG_TerminalInput      rts     

LANG_AbortServer                rts

LANG_GetServerType      moveq #16,d0
                        rts

LANG_Nop                        rts

                        
LANG_FunctionsBegin     
                        AJUMP GEN_AskAudioPass                  ;-54
                        AJUMP LANG_AbortServer          ;-48
                        AJUMP LANG_GetServerType                ;-42
                        AJUMP LANG_TerminalInput                ;-36
                        AJUMP LANG_ReceivePacket                ;-30
                        AJUMP LANG_Nop                  ;-24
                        AJUMP LANG_ConnectProced                ;-18
                        AJUMP LANG_Cleanup              ;-12
                        AJUMP LANG_Init                 ;-6
LANG_Functions          
                        
                        even
                        
                        
                        rsreset
lang_ThisQSO            rs.l 1
lang_Channel            rs.l 1
lang_OldServer          rs.l 1
lang_QSOBase            rs.l 1
lang_Parameter          rs.l 1
lang_Size               rs.b 0


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


                     

Display_User            movem.l a3/a4,-(sp)
                        sub.l #256,a7
                        move.l a7,a3
                        sub.l #48,a7
                        move.l a7,a4
                        move.l a4,a1
                        move.l a0,-(sp)
                        clr.b (A1)
                        tst.b user_Locator(a0)
                        beq .No_ClearLoc
                        move.b #"(",(a1)+
                        move.b #" ",(A1)+
                        lea user_Locator(a0),a0
                        GOQSO LocatorToClear
                        move.l a4,a0
.Search_EndClearLoc     tst.b (a0)+
                        bne .Search_EndClearLoc
                        subq.l #1,a0
                        move.b #" ",(a0)+
                        move.b #")",(a0)+
                        clr.b (A0)+
                        move.l a4,a0
                        GOQSO ConvertToPC
.No_ClearLoc            moveq #3,d0
                        bsr Get_Text
                        move.l (sp)+,a0
                        move.l a4,-(sp)
                        lea user_Locator(a0),a1
                        move.l a1,-(sp)
                        lea user_QTH(a0),a1
                        move.l a1,-(sp)
                        lea user_Name(a0),a1
                        move.l a1,-(sp)
                        lea user_Call(a0),a1
                        move.l a1,-(Sp)
                        move.l d0,a0
                        move.l a7,a1
                        lea .PutCode(pc),a2
                        move.l a6,-(sp)
                        move.l ppb_ExecBase(A5),a6
                        jsr _LVORawDoFmt(a6)
                        move.l (sp)+,a6
                        add.l #68,a7
                        move.l a7,a0
                        move.l nam_Channel(a6),d0
                        moveq #1,d1
                        move.l d2,-(sp)
                        moveq #0,d2
                        GOQSO TransmitText
                        move.l (sp)+,d2
                        add.l #256,a7
                        movem.l (sp)+,a3/a4
                        rts
                        
.PutCode                move.b d0,(a3)+
                        clr.b (a3)
                        rts

Get_Text                lea _UserSettingsCatalog(pc),a0
                        move.l syso_ThisQSO(a6),a1
                        move.l a2,-(sp)
                        lea _UserSettingsCatalogName(pc),a2
                        GOQSO GetText
                        move.l (sp)+,a2
                        rts

                        include "/Catalogs/Sources/UserSettings.s"


