Metropoli BBS
VIEWER: ne-login.pps MODE: TEXT (CP437)
;-----------------------------------------------------------------------------
;            .____________.                                     .____________.
;.___________|─          ¬:_______________________________/\____|─          ¬:
;:─         ¬\           :|─      __________ _             \\  ¬\           :|
;|:          \           ||      _____)_________ |          ∙\  \           ||
;||          |\___________|__________________  /_____________/  |\___________|
;l___________|-------------------------------\/yop l____________|---------.
;-  - - -- -- --- ----] nEON uTiLS sECTiON[-------------------------------'
;
;   iSDN^lOGiN vERSiON o.8 ^ sOURCE cODE ^ fEATURES cALLER^iD iDENTIFICATION
;        cODED bY mIGHTY j!^uSiNG cFOS rOUTiNES bY m.wINKLER/c.lUEDERS
;
;-----------------------------------------------------------------------------
;        [ pLEASE cHECK tHE fILE NE-LOGiN.DOX fOR fURTHER iNFORMATiONS ]

;=================================================[ VARIABLES & FUNCTIONS ]===

Word    NameXCoordinate
Word    NameYCoordinate
Word    PasswordXCoordinate
Word    PasswordYCoordinate
Word    UInfoXCoordinate
Word    UInfoYCoordinate
Word    LastCallXCoordinate
Word    LastCallYCoordinate
Word    CallsXCoordinate
Word    CallsYCoordinate
Word    InfoBoxXCoordinate
Word    InfoBoxYCoordinate
Word    MessageConf
String  DefaultColor
String  NormalColorBar
String  HiLightColorBar
String  ContinueString
String  ReenterString
String  DisconnectString
Boolean AskSystemPassword
Word    SystemPasswordTries
String  SystemPasswordPrompt
String  SystemPasswordDot
String  SystemPassword
String  SystemPasswordFalseString
String  SystemPasswordOkString
Boolean ShowPassword
Word    PasswordTries
String  PasswordDot
Word    StatusYCoordinate
String  StatusAskHandle
String  StatusAskPassword
String  StatusWrongPassword
String  StatusDisconnect
String  StatusWelcome
Boolean BroadcastMessage
String  BroadcastMessageText
String  ISDNRegistrationPrompt
String  ISDNYesPrompt
String  ISDNNoPrompt
Word    ISDNNumberYCoordinate
String  ISDNNumberText
Word    ISDNStatusYCoordinate
String  ISDNFoundText
String  ISDNNotFoundText
Boolean ISDNStuffCR
Boolean ISDNAskSystemPassword
Boolean ISDNEnabled
Boolean MailSysopOnNumChg
Boolean KickUserOnNumChg
String  ISDNNumberChangedText
Boolean AllowNumChange
String  UserName
String  UserPassword
String  TempStr
String  TempNum
String  Buffer
String  Ch
Word    Counter
Word    Position
Boolean NewUser
String  Number
Boolean ModemOk
String  ModemInfo
String  NumberCRC
Boolean UserInDatabase
String  OldPos
String  Password
String  CrLf

Declare Procedure GetISDNData()
Declare Function NE_Input(String Mask, String St, Int MaxLen, Boolean WordWarp, String HideChar) String
Declare Procedure PrintCenter(String St, Word YPosition)
Declare Procedure UpDateInfo(String Entered)
Declare Function PW_Input(Int MaxLen, String PWChar) String
Declare Function CheckSum(String Data) String

;==========================================================[ MAIN PROGRAM ]===

Begin

;------------------------------------------------------[ READ CONFIG FILE ]---
  
  CrLf=Chr(13)+Chr(10)
  KbdFlush
  If (Exist(PPEPath()+"NE-LOGIN.CFG")=False) Then
    PrintLn "@X04THE NEON iSDN^LOGiN CONFIG FILE IS MISSING! HALTING SYSTEM!@X07"
    Wait
    DTROff
    HangUp
    End
  EndIf
  FOpen 1,PPEPath()+"NE-LOGIN.CFG",o_rd,s_dn
  FGet 1,NameXCoordinate
  FGet 1,NameYCoordinate
  FGet 1,PasswordXCoordinate
  FGet 1,PasswordYCoordinate
  FGet 1,UInfoXCoordinate
  FGet 1,UInfoYCoordinate
  FGet 1,LastCallXCoordinate
  FGet 1,LastCallYCoordinate
  FGet 1,CallsXCoordinate
  FGet 1,CallsYCoordinate
  FGet 1,DefaultColor
  FGet 1,NormalColorBar
  FGet 1,HiLightColorBar
  FGet 1,ContinueString
  FGet 1,ReenterString
  FGet 1,DisconnectString
  FGet 1,TempStr
  AskSystempassword=(Upper(Left(TempStr,1))="Y")
  FGet 1,SystemPasswordTries
  FGet 1,SystemPasswordPrompt
  FGet 1,TempStr
  SystemPasswordDot=Left(TempStr,1)
  FGet 1,SystemPassword
  FGet 1,SystemPasswordFalseString
  FGet 1,SystemPasswordOkString
  FGet 1,TempStr
  ShowPassword=(Upper(Left(TempStr,1))="Y")
  FGet 1,PasswordTries
  FGet 1,TempStr
  PasswordDot=Left(TempStr,1)
  FGet 1,StatusYCoordinate
  FGet 1,StatusAskHandle
  FGet 1,StatusAskPassword
  FGet 1,StatusWrongPassword
  FGet 1,StatusDisconnect
  FGet 1,StatusWelcome
  FGet 1,TempStr
  BroadcastMessage=(Upper(Left(TempStr,1))="Y")
  FGet 1,BroadcastMessageText
  FGet 1,ISDNRegistrationPrompt
  FGet 1,ISDNYesPrompt
  FGet 1,ISDNNoPrompt
  FGet 1,ISDNNumberYCoordinate
  FGet 1,ISDNNumberText
  FGet 1,ISDNStatusYCoordinate
  FGet 1,ISDNFoundText
  FGet 1,ISDNNotFoundText
  FGet 1,InfoBoxXCoordinate
  FGet 1,InfoBoxYCoordinate
  FGet 1,TempStr
  ISDNEnabled=(Upper(Left(TempStr,1))="Y")
  FGet 1,TempStr
  ISDNStuffCR=(Upper(Left(TempStr,1))="Y")
  FGet 1,TempStr
  ISDNAskSystemPassword=(Upper(Left(TempStr,1))="Y")
  FGet 1,TempStr  
  If (Upper(Left(TempStr,1))="M") Then
    MailSysopOnNumChg=True
    KickUserOnNumChg=False
  ElseIf (Upper(Left(TempStr,1))="L") Then
    MailSysopOnNumChg=True
    KickUserOnNumChg=True
  Else
    MailSysopOnNumChg=False
    KickUserOnNumChg=False
  EndIf  
  FGet 1,MessageConf
  FGet 1,ISDNNumberChangedText
  FClose 1

;--------------------------------------------------[ ISDN PRELOGIN SYSTEM ]---

  UserInDatabase=False
  GetISDNData()
  If ((ModemOk)&(Number<>0)) Then 
    DispFile PPEPath()+"ISDN.PCB",defs
    PrintCenter(ReplaceStr(ISDNNumberText,"%NUMBER%",Number),ISDNNumberYCoordinate)
    If (!Exist(PPEPath()+"NE-ISDN.USR")) Then
      PrintCenter(ISDNNotFoundText,ISDNStatusYCoordinate)
      Delay 10
      Cls
      Goto SystemPasswordLogin
    EndIf
    FOpen 1,PPEPath()+"NE-ISDN.USR",o_rd,s_dn
    While ((FErr(1)=0)&(NumberCRC<>CheckSum(Number))) Do
      FGet 1,NumberCRC
      FGet 1,TempStr
    EndWhile
    FClose 1
    If (NumberCRC=CheckSum(Number)) Then
      PrintCenter(ISDNFoundText,ISDNStatusYCoordinate)
      UserName=Upper(TempStr)
      UserInDatabase=True
    Else
      PrintCenter(ISDNNotFoundText,ISDNStatusYCoordinate)
      Delay 10
      Cls
      Goto SystemPasswordLogin
    EndIf
    Delay 10
    Cls
    If (!ISDNAskSystemPassword) Goto MainLogin
  EndIf

;----------------------------------------[ ASK SYSTEM PASSWORD IF ENABLED ]---

;  *$Include:IEMSI.PPS
 
 :SystemPasswordLogin
  If (AskSystemPassword) Then
    Counter=0
   :GetSystemPassword
    Inc Counter
    Print SystemPasswordPrompt+"@POFF@"
   :AgainSystemPassword
    TempStr=""
    TempStr=Upper(NE_Input(Mask_Ascii(),"",70,False,SystemPasswordDot))
    If (TempStr="") Goto AgainSystemPassword
    PrintLn
    If (TempStr<>SystemPassword) Then
      PrintLn CrLf+SystemPasswordFalseString+CrLf
      If (Counter=SystemPasswordTries) Then
        PrintLn
        DTROff
        HangUp
        End
      EndIf
      Goto GetSystemPassword
    EndIf
    PrintLn CrLf+SystemPasswordOkString
  EndIf

;-------------------------------------------------[ MAIN LOGIN PROCEDURES ]---

  
  UserName=""
 :MainLogin 
  NewUser=False
  DispFile PPEPath()+"Welcome.PCB",Defs
  Print "@POFF@"
 :GetName 
  PrintCenter(StatusAskHandle,StatusYCoordinate)
  Print DefaultColor
  AnsiPos NameXCoordinate,NameYCoordinate
  If ((UserInDataBase)&(ISDNStuffCR)) Then
    Print UserName
  Else
    UserName=Upper(NE_Input(Mask_Ascii(),UserName,25,False,""))
  EndIf
  If (U_RecNum(UserName)=-1) Then
    AnsiPos 1,StatusYCoordinate
    ClrEol
    Position=40-((Len(ContinueString)+Len(ReenterString)+Len(DisconnectString)+6)/2)
    Counter=2
   :AskIt 
    AnsiPos Position-1,StatusYCoordinate
    Print NormalColorBar+Chr(32)+ContinueString+Chr(32)+DefaultColor
    AnsiPos Position+Len(ContinueString)+2,StatusYCoordinate
    Print NormalColorBar+Chr(32)+ReenterString+Chr(32)+DefaultColor
    AnsiPos Position+Len(ContinueString)+Len(ReenterString)+5,StatusYCoordinate
    Print NormalColorBar+Chr(32)+DisconnectString+Chr(32)+DefaultColor
    If (Counter=1) Then
      AnsiPos Position-1,StatusYCoordinate
      Print HiLightColorBar+Chr(32)+ContinueString+Chr(32)+DefaultColor
    ElseIf (Counter=2) Then
      AnsiPos Position+Len(ContinueString)+2,StatusYCoordinate
      Print HiLightColorBar+Chr(32)+ReenterString+Chr(32)+DefaultColor
    ElseIf (Counter=3) Then
      AnsiPos Position+Len(ContinueString)+Len(ReenterString)+5,StatusYCoordinate
      Print HiLightColorBar+Chr(32)+DisconnectString+Chr(32)+DefaultColor
    EndIf
   :AskItKey
    Ch=InKey()
    If (Ch="LEFT") Then
      Dec Counter
      If (Counter<1) Counter=3
      Goto AskIt
    ElseIf (Ch="RIGHT") Then
      Inc Counter
      If (Counter>3) Counter=1
      Goto AskIt
    ElseIf (Ch=Chr(13)) Then
      If (Counter=1) Then
        NewUser=True
      ElseIf (Counter=2) Then
        Goto  GetName
      ElseIf (Counter=3) Then
        Cls
        HangUp
        End
      EndIf 
    Else 
      Goto AskItKey
    EndIf
  EndIf
  GetAltUser (U_RecNum(UserName))
  AnsiPos NameXCoordinate,NameYCoordinate
  Print Upper(UserName)  
  AnsiPos UInfoXCoordinate,UInfoYCoordinate
  Print U_City
  AnsiPos LastCallXCoordinate,LastCallYCoordinate
  Print U_LDate()                          
  AnsiPos CallsXCoordinate,CallsYCoordinate
  Print U_TimeOn()
  Counter=0
  TempStr=""
 :GetPassword
  If (U_Pwd="") Goto DonePassword
  Inc Counter
  PrintCenter(StatusAskPassword,StatusYCoordinate)
  Print DefaultColor
  AnsiPos PasswordXCoordinate,PasswordYCoordinate
  Print Space(30)
  AnsiPos PasswordXCoordinate,PasswordYCoordinate
 :AgainPassword
  TempStr=""
  OldPos="["+String(GetY())+";"+String(GetX())+"H"
  SPrint "["+String(InfoBoxYCoordinate)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "┌────────────────────────────────┐"
  SPrint "["+String(InfoBoxYCoordinate+1)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "│ UserName: "+Left(UserName,21)+"│"
  SPrint "["+String(InfoBoxYCoordinate+2)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "│ UserLvl : "+Left(U_Sec ,21)+"│"
  SPrint "["+String(InfoBoxYCoordinate+3)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "│ Password:                      │"
  SPrint "["+String(InfoBoxYCoordinate+4)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "│ Entered :                      │"
  SPrint "["+String(InfoBoxYCoordinate+5)+";"+String(InfoBoxXCoordinate)+"H"
  SPrintLn "└────────────────────────────────┘"
  
  AnsiPos PasswordXCoordinate,PasswordYCoordinate
  TempStr=PW_Input(20,PasswordDot)
  If (TempStr="") Goto AgainPassword
  If ((TempStr<>U_Pwd)&(!NewUser)) Then
    If (Counter=PasswordTries) Then
      PrintCenter(StatusDisconnect,StatusYCoordinate)
      Delay 10
      Print DefaultColor
      HangUp
      End
    Else
      PrintCenter(StatusWrongPassword,StatusYCoordinate)
      Print DefaultColor
    EndIf
    Delay 10
    Goto GetPassword
  EndIf
  PrintCenter(StatusWelcome,StatusYCoordinate)
  Print Chr(13)+Chr(10)+"@X08iSDN^lOGiN vERSiON o.8 wAS cODED bY mIGHTY j/nE0N@X07"
  ; ^ aNYONE cHANGiNG tHIS lINE oR iTS mEANS iS *REALLY* nEAR tO dEATH ^
 :DonePassword 
  Cls
  FCreate 1,PPEPath()+"NE-LOGPW."+String(PCBNode()),o_rw,s_dn
  FPutLn 1,TempStr
  FPutLn 1,"THiS FiLE iS CREATED FOR GiViNG THE PASSWORD FROM NE-LOGiN TO NE-PW ONLY!"
  FPutLn 1,"iT WiLL BE DELETED AFTER CALLiNG NE-PW!"
  FClose 1
  AllowNumChange=True
  If ( (Exist(PPEPath()+"NE-ISDN.USR")) & ((MailSysOpOnNumChg)|(KickUserOnNumChg))  & (ModemOk) & (Number<>0)) Then
    If (Exist(PPEPath()+"NE-ISDN.EXC")) Then
      FOpen 1,PPEPath()+"NE-ISDN.EXC",o_rw,s_dn
      While ((Upper(TempStr)<>Upper(UserName))&(Upper(TempStr)<>"[EOF]")) Do
        FGet 1,TempStr
      EndWhile
      FClose 1    
    EndIf
    If (TempStr<>Upper(UserName)) Then
      FOpen 1,PPEPath()+"NE-ISDN.USR",o_rw,s_dn
      While ((Upper(TempStr)<>Upper(UserName))&(FErr(1)=0)) Do
        FGet 1,TempNum
        FGet 1,TempStr
      EndWhile
      FClose 1
      If ((TempNum<>CheckSum(Number))&(Upper(TempStr)=Upper(UserName))) Then
        AllowNumChange=False
        FOpen 1,PPEPath()+"NE-ISDN.MSG",o_rw,s_dn
        FCreate 2,PPEPath()+"NE-ISDN.TMP",o_rw,s_dn
        While (FErr(1)=0) Do
          FGet 1,TempStr
          TempStr=ReplaceStr(TempStr,"%USER%",UserName)
          TempStr=ReplaceStr(TempStr,"%NUMBER%",Number)
          FPutLn 2,TempStr
        EndWhile
        FClose 2
        FClose 1
        Message MessageConf,"SYSOP",U_NAME(),"NEON LOGiN","R",0,FALSE,TRUE,PPEPATH()+"NE-ISDN.TMP"
        If (Exist(PPEPath()+"NE-ISDN.TMP")) Delete PPEPath()+"NE-ISDN.TMP"
        If (KickUserOnNumChg) Then
          DispFile PPEPath()+"KICK.PCB",Defs
          Wait
          DTROff        
          HangUp
          End
        Else
          PrintLn ISDNNumberChangedText
        EndIf
      EndIf
    EndIf
  EndIf
  
  
  
  If ((ModemOk)&(Number<>0)&(!UserInDatabase)) Then
    Print ReplaceStr(ISDNRegistrationPrompt,"%NUMBER%",Number)
   :AskISDNNumber 
    Ch=Upper(InKey())
    If ((Ch<>"Y")&(Ch<>"N")&(Ch<>Chr(13))) Goto AskISDNNumber
    If (Ch<>"N") Then
      PrintLn ISDNYesPrompt
      If (Exist(PPEPath()+"NE-ISDN.USR")) Then
        If (AllowNumChange) Then
          FAppend 1,PPEPath()+"NE-ISDN.USR",o_rw,s_dn
        Else
          If (Exist(PPEPath()+"NE-ISDN.TMP")) Delete PPEPath()+"NE-ISDN.TMP"
          Rename PPEPath()+"NE-ISDN.USR",PPEPath()+"NE-ISDN.TMP"
          FOpen 2,PPEPath()+"NE-ISDN.TMP",o_rw,s_dn
          FCreate 1,PPEPath()+"NE-ISDN.USR",o_rw,s_dn
          While (FErr(2)=0) Do
            FGet 2,TempNum
            FGet 2,TempStr
            If ((Upper(TempStr)<>Upper(UserName))&(TempStr<>"")) Then
              FPutLn 1,TempNum
              FPutLn 1,TempStr
            EndIf
          EndWhile
          FClose 2
          If (Exist(PPEPath()+"NE-ISDN.TMP")) Delete PPEPath()+"NE-ISDN.TMP"
        EndIf
      Else
        FCreate 1,PPEPath()+"NE-ISDN.USR",o_rw,s_dn
      EndIf
      FPutLn 1,CheckSum(Number)
      FPutLn 1,UserName
      FClose 1
    Else
      PrintLn ISDNNoPrompt
    EndIf
    Cls
  EndIf
  If (BroadcastMessage) Then
    TempStr=ReplaceStr(BroadcastMessageText,"%USER%",UserName)
    TempStr=ReplaceStr(TempStr,"%NODE%",String(PCBNode()))
    BroadCast 0,MaxNode(),TempStr
  EndIf
  KbdFlush
  KBDStuff UserName+Chr(13)
End

Procedure PrintCenter(String St, Word YPosition)
  Begin
    AnsiPos 1,YPosition
    ClrEol
    AnsiPos 40-(Len(StripAtx(St))/2),YPosition
    Print St
  EndProc

Function NE_Input(String Mask, String St, Int MaxLen, Boolean WordWarp, String HideChar) String
  Int     Pos
  Int     Count
  Int     BreakPos
  String  Ch
  Boolean Ok  

  Begin
    KbdFlush
    MdmFlush
    St=Buffer+St
    For Count=1 To Len(st)
      If (HideChar="") Then
        Print Mid(St,Count,1)
      Else
        Print HideChar
      EndIf
    Next
    Pos=Len(st)
    Ok=False
    BreakPos=0
    While (Ok=False) Do
      Ch=InKey()
      If (Ch=Chr(13)) Then
        Ok=True 
        Buffer=""
      ElseIf (Ch=Chr(8)) Then
        If (Len(St)>0) Then
          Print Chr(8)+Chr(32)+Chr(8)
          St=Mid(St,1,Len(St)-1)
          Dec Pos
        EndIf
      ElseIf ((Ch=Chr(9))&(BreakPos>0)) then
        BreakPos=0
        For Count=1 To Len(St)-1
          If (Mid(St,Count,1)=Chr(32)) BreakPos=Count
        Next 
        If (BreakPos<>0) Then
         For Count=1 To (Len(St)-BreakPos)+1
           Print Chr(8)+Chr(32)+Chr(8)     
         Next 
         St=Mid(St,1,BreakPos-1)
        EndIf
      ElseIf ((InStr(Mask,Ch)<>0)&(Len(St)<MaxLen)) Then
        Inc Pos
        St=St+Ch 
        If (HideChar="") Then
          Print Ch+Mid(St,Pos+1,Len(st)-Pos-1)
        Else
          Print HideChar
        EndIf
        If ((WordWarp=True)&(Len(St)=MaxLen)) Then
          BreakPos=0
          For Count=1 To Len(St)-1
            If (Mid(St,Count,1)=Chr(32)) BreakPos=Count
          Next 
          If (BreakPos<>0) Then
            For Count=1 To (Len(st)-BreakPos)+1
              Print Chr(8)+Chr(32)+Chr(8)     
            Next
            Buffer=Mid(St,BreakPos+1,Len(St)-BreakPos)
            St=Mid(St,1,BreakPos-1)
            Ok=True
          Else
            Ok=True
            Buffer=""
          EndIf
        EndIf
      EndIf
    EndWhile
    NE_Input=St
  EndFunc

Procedure GetISDNData()
  DWord   Record(17)
  Word    RecordOff
  Word    RecordSeg
  Integer RecordAddr
  Integer NumAddr
  Word    Count
  Word    Port
  String  ModemData

  Begin
    ModemData=Upper(ReadLine("PCBOARD.DAT",52))
    ModemOk=False
    If (ModemData="NONE") Then
      ModemInfo="LOCAL PORT"
      Port=0
      Goto EndDetect
    ElseIf (Mid(ModemData,1,4)="PORT") Then
      If (Right(ModemData,1)="F") Then
        Port=Mid(ModemData,5,Len(ModemData)-5)-1
        ModemInfo="FOSSIL DETECTED"
      Else
        Port=Mid(ModemData,5,Len(ModemData)-4)-1
        ModemInfo="COMM-DRV OR OS/2 DETECTED"
      EndIf
      ModemOk=True
    ElseIf (Mid(ModemData,1,3)="COM") Then
      ModemInfo="ASYNC PORT DETECTED"
      Port=Mid(ModemData,4,1)-1
      Goto EndDetect
    Else  
      ModemInfo="PORT DECTION FAILURE"
      Goto EndDetect
    EndIf
    DoIntr 014h,09000h,0,0,0,0,0,0,0,0
    If ((RegAx()<>01969h)|(ModemOk=False)) Then
      Number="CFOS NOT DETECTED"
      Goto EndDetect
    EndIf
    VarOff Record(1),RecordOff
    VarSeg Record(1),RecordSeg
    DoIntr 014h,09002h,RecordOff,17,Port,0,0,0,0,RecordSeg
    If (RegAx()<>0) Then
      Number="CFOS ERROR/NO CFOS PORT"
      Goto EndDetect
    EndIf
    RecordAddr=MkAddr(RecordSeg,RecordOff)
    NumAddr=MkAddr(PeekW(RecordAddr+2),PeekW(RecordAddr+4))
    Count=0
    Number=""
    While (PeekB(NumAddr+Count)<>0) Do
      Number=Number+Chr(PeekB(NumAddr+Count))
      Inc Count
    EndWhile
    If (Number="") Number="NOT DETECTED"
   :EndDetect
    If (!ISDNEnabled) ModemOk=False
  EndProc

Procedure UpDateInfo(String Entered)
  Begin 
    OldPos="["+String(GetY())+";"+String(GetX())+"H"
    If (ShowPassword=True) Then
      SPrint "["+String(3+InfoBoxYCoordinate)+";"+String(12+InfoBoxXCoordinate)+"H"+Left(U_Pwd,20)
      If (U_Pwd=Entered) Then
        SPrint "["+String(4+InfoBoxYCoordinate)+";"+String(12+InfoBoxXCoordinate)+"H"+Left(Entered,20)
      Else
        SPrint "["+String(4+InfoBoxYCoordinate)+";"+String(12+InfoBoxXCoordinate)+"H"+Left(Entered,20)
      EndIf
    Else          
      SPrint "["+String(3+InfoBoxYCoordinate)+";"+String(12+InfoBoxXCoordinate)+"HDiSABLED            "
      SPrint "["+String(4+InfoBoxYCoordinate)+";"+String(12+InfoBoxXCoordinate)+"HDiSABLED            "
    EndIf
    SPrint ""+OldPos
  EndProc

Function PW_Input(Int MaxLen, String PWChar) String
  Boolean Ok
  String  St
  String  ChK
  String  Ch

  Begin
    KbdFlush
    MdmFlush
    St=""
    UpDateInfo(st)
    Ok=False
    While (Ok=False) Do
      Ch=Upper(MInkey())
      ChK=Upper(KInkey())
      If (ChK="ALT W") Then
        ShowPassword=!ShowPassword
        UpDateInfo(st)
      Else
        If (Ch="") Ch=ChK
      EndIf
      If ((Ch=Chr(13))&(Len(St)>0)) Then
        Ok=True
      ElseIf (Ch=Chr(8)) Then
        If (Len(St)>0) Then
          St=Mid(St,1,Len(St)-1)
          Print Chr(8)+" "+Chr(8)
        EndIf
        UpDateInfo(st)
      ElseIf ((Len(St)<MaxLen)&(InStr(Mask_Ascii(),Ch)<>0)) Then
        St=St+Ch
        Print DefaultColor+PWChar
        UpDateInfo(st)
      EndIf
    EndWhile
    PW_Input=St
  EndFunc

Function CheckSum(String Data) String
  Begin
    CheckSum=CRC32(CRC_Str,Data)
    ;--------^^^^^^^^^^^^^^^^^^^----------------------------------------------
    ; YOU MAY CHANGE THiS BY ADDiNG OR SUBSTiNG SOMETHiNG OR DO SOMETHiNG
    ; CRAZY TO HAVE A DiFFRENT ROUTiNE - DELETE PPS AFTER ALL!
    ;-------------------------------------------------------------------------
  EndFunc


;==============================================================[ THE END? ]===

[ RETURN TO DIRECTORY ]