'* ------------------------------------      
'* AmBOS V2.0b 
'*           
'* (p)1993 by Volker Stepprath 
'* (c)1993 by Testaware <Public Domain>
'* 
'* AMOS V1.31 & ACmp V1.0          
'* (c)1991 by Europress Software       
'* ------------------------------------      
'
Set Buffer 56
'
'**** Variablen installieren 
Dim XDIRA$(200),XSTATUSA(200)
Dim XDIRB$(200),XSTATUSB(200)
Dim X09NAME$(9),X09$(9),XMEND$(14)
Global XDIRA$(),XSTATUSA(),XPOSA,XANZA#,XLENA#,XBARA#,XBARPOSA#
Global XDIRB$(),XSTATUSB(),XPOSB,XANZB#,XLENB#,XBARB#,XBARPOSB#
Global XDISKNAMEA$,XDISKNAMEB$,X09NAME$(),X09$(),X09A,X09B
Global XMEND$(),XMENABCD,XFILE$,XSD,XPROTECT,XHELP
X09A=0
X09B=1
XDISKNAMEA$="SYS:"
XDISKNAMEB$="SYS:"
XMEND$(14)="CREATE="
'
'**** AmBOS installieren       
Request Off 
Set Dir 30,""
Key Speed 10,2
_INSTALLAMBOS
_INSTALLSCREEN
Amos To Front 
'
If Exist("SYS:S/.ambosmenu")
   Open In 1,"SYS:S/.ambosmenu"
      For I=0 To 13
         Input #1,XMEND$(I)
      Next I
   Close 1
End If 
'
'
'**** Hauptschleife
Do 
   Ink 1,0
   Clear Key 
   Every 3000 Proc _MEMTIME
   _MEMTIME
   Repeat 
      MK=Mouse Click
      X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
      TASTE$=Upper$(Inkey$)
      If XHELP=0
         XHELP=Scancode
         If XHELP=95
            _TXT["Please choose option you want to explain <Links=Deutsch / Right=English> !"]
         Else 
            XHELP=0
         End If 
      End If 
      If Asc(TASTE$)=13 Then _INSTALLSCREEN
      If Asc(TASTE$)=65 Then MK=True : X=564 : Y=210
      If Asc(TASTE$)=66 Then MK=True : X=584 : Y=210
      If Asc(TASTE$)=67 Then MK=True : X=604 : Y=210
      If Asc(TASTE$)=68 Then MK=True : X=624 : Y=210
      Multi Wait 
   Until MK
   Every Off 
   '
'**** Datenfelder scrollen 
   If X>301 and X<317 and Y>151 and Y<165
      _G[301,152,317,164,1]
      While Mouse Key : _SCROLLDOWN[0] : Wend 
      _G[301,152,317,164,0]
   End If 
   If X>301 and X<319 and Y>165 and Y<179
      _G[301,166,317,178,1]
      While Mouse Key : _SCROLLUP[0] : Wend 
      _G[301,166,317,178,0]
   End If 
   If X>322 and X<339 and Y>151 and Y<165
      _G[322,152,338,164,1]
      While Mouse Key : _SCROLLDOWN[1] : Wend 
      _G[322,152,338,164,0]
   End If 
   If X>321 and X<339 and Y>165 and Y<179
      _G[322,166,338,178,1]
      While Mouse Key : _SCROLLUP[1] : Wend 
      _G[322,166,338,178,0]
   End If 
   If X>300 and X<318 and Y>29 and Y<151
      _SCROLLPAGE[0,Y]
   End If 
   If X>321 and X<339 and Y>29 and Y<151
      _SCROLLPAGE[1,Y]
   End If 
   If X>300 and X<318 and Y>179 and Y<193
      _G[301,180,317,192,1]
      _SCROLLTOPBUTTOM[0,MK]
      _G[301,180,317,192,0]
   End If 
   If X>321 and X<339 and Y>179 and Y<193
      _G[322,180,338,192,1]
      _SCROLLTOPBUTTOM[1,MK]
      _G[322,180,338,192,0]
   End If 
   '
'**** Device 
   If Y>14 and Y<28
      If X>0 and X<53
         _G[0,15,52,27,1] : _GETDEVICES[0]
      End If 
      If X>366 and X<420
         _G[367,15,419,27,1] : _GETDEVICES[1]
      End If 
      '
'**** Update 
      If X>53 and X<105
         _G[55,15,107,27,1] : _LESEDISK[XDISKNAMEA$,0]
      End If 
      If X>421 and X<475
         _G[422,15,474,27,1] : _LESEDISK[XDISKNAMEB$,1]
      End If 
      '
'**** Parent 
      If X>109 and X<163
         _G[110,15,162,27,1]
         If XDISKNAMEA$<>""
            If Exist(XDISKNAMEA$)
               Dir$=XDISKNAMEA$ : Parent : XDISKNAMEA$=Dir$
               _LESEDISK[XDISKNAMEA$,0]
            End If 
         End If 
      End If 
      If X>475 and X<527
         _G[477,15,529,27,1]
         If XDISKNAMEB$<>""
            If Exist(XDISKNAMEB$)
                Dir$=XDISKNAMEB$ : Parent : XDISKNAMEB$=Dir$
                _LESEDISK[XDISKNAMEB$,1]
            End If 
         End If 
      End If 
      '
'**** All / Clear
      If X>164 and X<218
         _G[165,15,217,27,1] : _ALL[0]
      End If 
      If X>219 and X<273
         _G[220,15,272,27,1] : _CLEAR[0]
      End If 
      If X>532 and X<585
         _G[532,15,584,27,1] : _ALL[1]
      End If 
      If X>586 and X<640
         _G[587,15,639,27,1] : _CLEAR[1]
      End If 
      '
'**** 0 - 9 / <- * ->
      If X>273 and X<299
         If MK=1 : Add X09A,1,0 To 9 Else Add X09A,-1,0 To 9 : End If 
         _G[275,15,298,27,1] : _X09AB[0] : _SCROLLBAR[0] : _G[275,15,298,27,0]
      End If 
      If X>342 and X<365
         If MK=1 : Add X09B,1,0 To 9 Else Add X09B,-1,0 To 9 : End If 
         _G[341,15,364,27,1] : _X09AB[1] : _SCROLLBAR[1] : _G[341,15,364,27,0]
      End If 
      If X>300 and X<339
         _G[301,15,338,27,1] : _SOURCEDEST : _G[301,15,338,27,0]
      End If 
   End If 
   '
'**** Files selektieren
   If Y>31 and Y<178
      If X>0 and X<299
         _SELEKTION[0,MK,Y]
      End If 
      If X>340 and X<640
         _SELEKTION[1,MK,Y]
      End If 
   End If 
   '
'**** MenÜoptionen 
   If Y>194 and Y<208
      X=X/80
      _G[X*80+1,195,X*80+78,207,1]
      If XHELP=0
         If XMENABCD=0
            On X+1 Proc _COPY,_COPYTO,_MOVE,_MOVETO,_DELETE,_MAKEDIR,_RENAME,_PROTECT
         End If 
         If XMENABCD=1
            On X+1 Proc _SORT,_MERGE,_COMPARE,_SAVEMEM,_PACK,_UNPACK,_CHECKVEC,_CLEARSYS
         End If 
         If XMENABCD=2
            On X+1 Proc _VALUE,_COLOURS,_GETDAY,_OPENWB,_CLOSEWB,_CLOSE,_ABOUT,_EDITOR
         End If 
         If XMENABCD=3
            _CALLCOMMAND[X]
         End If 
         Erase 7
      Else 
         _HELP[MK,X,0]
      End If 
   End If 
   If X<558 and Y>209 and Y<223
      X=X/80
      _G[X*80+1,210,X*80+78,222,1]
      If XHELP=0
         If XMENABCD=0
            On X+1 Proc _COMMENT,_READ,_HEXREAD,_SHOWIFF,_EXECUTE,_SIZE,_INFO
         End If 
         If XMENABCD=1
            On X+1 Proc _CONVASM,_CONVBAS,_CONVASC,_CONVPBK,_PLAYABK,_PLAYMED,_PLAYMOD
         End If 
         If XMENABCD=2
            On X+1 Proc _DISKCOPY,_FORMAT,_VERIFY,_INSTALL,_BLKDAT,_DATBLK,_EXIT
         End If 
         If XMENABCD=3
            _CALLCOMMAND[X+8]
         End If 
         Erase 7
      Else 
         _HELP[MK,X,1]
      End If 
   End If 
   '
'**** A|B|C|D
   If X>563 and X<636 and Y>209 and Y<223
      Add X,-564 : X=X/20 : XMENABCD=X
      _NEWMENU[XMENABCD]
      _MENU[XMENABCD]
   End If 
   '
   While Mouse Key<>0 : Wend 
   Fix(0)
   _NEWGG[0] : _NEWGG[1] : _OPTIONOFF
Loop 
'
'**** MenÜ A 
Procedure _COPY
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   '
   If XSD=0
      A=XANZA#
      A$=XDISKNAMEA$
      B$=XDISKNAMEB$
   Else 
      A=XANZB#
      A$=XDISKNAMEB$
      B$=XDISKNAMEA$
   End If 
   '
   If A$=B$
      _TXT["Sourcedrive & Destinationdrive are the same !"]
      Pop Proc
   End If 
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N and Instr(N$,"[DIR]")=0
         _REALNAME[N$]
         If Exist(A$+XFILE$)
            _KOPIEREN[A$+XFILE$,B$+XFILE$]
         End If 
      End If 
   Next I
   '
   If XSD=0
      _LESEDISK[XDISKNAMEB$,1]
      _CLEAR[0]
   Else 
      _LESEDISK[XDISKNAMEA$,0]
      _CLEAR[1]
   End If 
End Proc
Procedure _COPYTO
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   '
   If XSD=0
      A=XANZA#
      A$=XDISKNAMEA$
      B$=XDISKNAMEB$
   Else 
      A=XANZB#
      A$=XDISKNAMEB$
      B$=XDISKNAMEA$
   End If 
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N and Instr(N$,"[DIR]")=0
         _REALNAME[N$]
         N$=XFILE$
         If Exist(A$+N$)
            _TXT["Old filename: "+N$]
            _TXT["New filename:"]
            _EINGABE[15]
            If XFILE$<>""
               _KOPIEREN[A$+N$,B$+XFILE$]
            Else 
               _TXT[N$+" not copied !"]
            End If 
         End If 
      End If 
   Next I
   '
   If XSD=0
      _LESEDISK[XDISKNAMEB$,1]
      _CLEAR[0]
   Else 
      _LESEDISK[XDISKNAMEA$,0]
      _CLEAR[1]
   End If 
End Proc
Procedure _MOVE
   If XSD=0
      A=XANZA#
      A$=XDISKNAMEA$
      B$=XDISKNAMEB$
   Else 
      A=XANZB#
      A$=XDISKNAMEB$
      B$=XDISKNAMEA$
   End If 
   '    
   If A$=B$
      _TXT["Sourcedrive & Destinationdrive are the same !"]
      Pop Proc
   End If 
   '
   N$=Left$(A$,Instr(A$,":"))
   N2$=Left$(B$,Instr(B$,":"))
   If N$<>N2$
      _TXT["It`s not possible to MOVE across two different drives !"]
      Pop Proc
   End If 
   '    
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      _REALNAME[N$]
      If N
         _TXT["Moving..."+XFILE$+" !"]
         Rename A$+XFILE$ To B$+XFILE$
         If XE : Pop Proc : End If 
      End If 
   Next I
   '
   _LESEDISK[XDISKNAMEB$,1]
   _LESEDISK[XDISKNAMEA$,0]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _MOVETO
   If XSD=0
      A=XANZA#
      A$=XDISKNAMEA$
      B$=XDISKNAMEB$
   Else 
      A=XANZB#
      A$=XDISKNAMEB$
      B$=XDISKNAMEA$
   End If 
   If A$=B$
      _TXT["Sourcedrive & Destinationdrive are the same !"]
      Pop Proc
   End If 
   '
   N$=Left$(A$,Instr(A$,":"))
   N2$=Left$(B$,Instr(B$,":"))
   If N$<>N2$
      _TXT["It`s not possible to MOVE across two different drives !"]
      Pop Proc
   End If 
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      _REALNAME[N$]
      If N
         _TXT["Moving..."+XFILE$+" !"]
         N$=XFILE$
         _TXT["Enter new name:"]
         _EINGABE[17]
         If XFILE$<>""
            Rename A$+N$ To B$+XFILE$
            If XE : Pop Proc : End If 
         Else 
            _TXT["File not moved !"]
         End If 
      End If 
   Next I
   '
   _LESEDISK[XDISKNAMEB$,1]
   _LESEDISK[XDISKNAMEA$,0]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _DELETE
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      _REALNAME[N$]
      If N
         _TXT["Deleting... "+XFILE$+" !"]
         Kill B$+XFILE$
      End If 
   Next I
   If XSD=0
      _LESEDISK[XDISKNAMEB$,1]
   Else 
      _LESEDISK[XDISKNAMEA$,0]
   End If 
   Pop Proc
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _RENAME
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      _REALNAME[N$]
      If N
         _TXT["Rename "+XFILE$+" as:"]
         N$=XFILE$
         _EINGABE[13+Len(XFILE$)]
         XFILE$=Left$(XFILE$,27)
         If XFILE$<>""
            Rename B$+N$ To B$+XFILE$
         End If 
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[XDISKNAMEB$,1] Else _LESEDISK[XDISKNAMEA$,0]
Pop Proc
   '
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _MAKEDIR
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   Do 
      _TXT["Enter new directory:"]
      _EINGABE[22]
      Exit If XFILE$=""
      XFILE$=Left$(XFILE$,27)
      Mkdir B$+XFILE$
   Loop 
   '
   If XSD=0 Then _LESEDISK[XDISKNAMEB$,1] Else _LESEDISK[XDISKNAMEA$,0]
Pop Proc
   '
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _INFO
   If XSD=0 Then DEV$=XDISKNAMEB$ Else DEV$=XDISKNAMEA$
   '
   If DEV$="" Then _TXT["No drive selected !"] : Pop Proc
   If Not Exist(DEV$) Then _TXT[DEV$+" not available !"] : Pop Proc
   '
   Dir$=DEV$
   DEV$=Dir$
   DEV$=DEV$+Chr$(0)
   '
   Repeat 
      INFO$=Space$(40)+Chr$(0)
      IN=Varptr(INFO$)
      Dreg(1)=Varptr(DEV$)
      Dreg(2)=-2
      LVOLOCK=Doscall(-84)
      Dreg(1)=LVOLOCK
      Dreg(2)=IN
      LVOINFO=Doscall(-114)
      LVOUNLOCK=Doscall(-90)
   Until Leek(IN+8)<84
   '
   N=Leek(IN+4)
   If N=-1 Then N0$="RAM:" Else N0$="DF"+Str$(N)-" "+":"
   N1$=Str$(Leek(IN+16))-" "
   N1$=Space$(4-Len(N1$))+N1$
   N=Leek(IN+12)-Leek(IN+16)
   N2$=Str$(N)-" "
   N2$=Space$(4-Len(N2$))+N2$
   N3$=Str$(Dfree)-" "
   N3$=Space$(8-Len(N3$))+N3$
   N4$=Str$(Int(100-(100.0/856928.0)*Dfree))-" "
   N4$=Space$(3-Len(N4$))+N4$+"%"
   N5$=Str$(Leek(IN))-" "
   N5$=Space$(3-Len(N5$))+N5$
   N=Leek(IN+8)
   If N=80 Then N6$="Read Only   "
   If N=81 Then N6$="Validating  "
   If N=82 Then N6$="Read/Write  "
   N=Instr(DEV$,":")
   DEV$=Left$(DEV$,Min(17,N-1))
   N$="    "
   _TXT["Unit    Used    Free    Bytes    Full    Errs    Status     Name"]
   _TXT[String$("-",76)]
   _TXT[N0$+N$+N1$+N$+N2$+" "+N3$+N$+N4$+N$+N5$+"    "+N6$+DEV$]
End Proc
Procedure _SIZE
   If XSD=0
      For I=0 To XANZB#
         N$=XDIRB$(I)
         N=XSTATUSB(I)
         Gosub _SIZE
      Next I
   Else 
      For I=0 To XANZA#
         N$=XDIRA$(I)
         N=XSTATUSA(I)
         Gosub _SIZE
      Next I
   End If 
   _TXT["Dirs :"+Str$(N1)+" /"+Str$(N0)]
   _TXT["Files:"+Str$(N5)+" /"+Str$(N2)]
   _TXT["Bytes:"+Str$(N4)+" /"+Str$(N6)]
Pop Proc
'
_SIZE:
   If Len(N$)>35
      If Instr(N$,"[DIR]")
         Inc N0
         If N>0 : Inc N1 : End If 
      Else 
         Inc N2
         N3=Val(Right$(N$,8))
         Add N6,N3
         If N>0 : Add N4,N3 : Inc N5 : End If 
      End If 
   End If 
Return 
End Proc
Procedure _READ
   If XSD=0 Then B$=XDISKNAMEB$ : B=XANZB# Else B$=XDISKNAMEA$ : B=XANZA#
   '
   On Error Goto _FEHLER
   '
   Fix(2)
   For I=0 To B
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 Then Gosub _LESEN : Erase 7
   Next I
   If XSD=0 Then _CLEAR[1] Else _CLEAR[0]
Pop Proc
'
_LESEN:
   If Instr(N$,"[DIR]") Then Return 
   '
   N=Val(Right$(N$,8))
   _REALNAME[N$]
   '    
   Ink 1
   _TXT["Loading "+XFILE$+" !"]
   I2=0
   I3=0
   N1=0
   N2=0
   N3=0
   XE=0
   N$=""
   '
   Reserve As Data 7,N
   If XE Then Return 
   Bload B$+XFILE$,7
   If XE Then Return 
   '
   Ink 0
   Bar 0,15 To 640,222
   '
   Ink 1
   _TXT["File : "+B$+XFILE$]
   _TXT["Lines:"]
   _TXT["Read :"]
   Gosub _INFO
   '    
   Repeat 
      Repeat 
         N1=Peek(Start(7)+N2)
         If N1<>10 and N2<N
            N$=N$+Chr$(N1)
         End If 
         Inc N2
         Inc N3
      Until N1=10 or N3=80
      '
      Text 0,21+I2*8,N$
      Inc I2
      Inc I3
      N3=0
      N$=""
      '
      If I2=26 or N2=>N
         Gosub _INFO
         Repeat 
            A=Asc(Inkey$)
         Until A<>0
         I2=0
         Ink 0
         Bar 0,15 To 640,222
         Ink 1
         Clear Key 
         If A=27
            Exit 
         End If 
      End If 
   Until N2=>N
   _INSTALLSCREEN
Return 
'
_INFO:
   N2=Min(N2,N)
   Text 72,242,Str$(I3)
   Text 72,250,Str$(100.0/N*N2)+"%  ("+Str$(N2)+" of"+Str$(N)+" Bytes )"
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _HEXREAD
   If XSD=0 Then B$=XDISKNAMEB$ : B=XANZB# Else B$=XDISKNAMEA$ : B=XANZA#
   '
   On Error Goto _FEHLER
   '
   Fix(2)
   For I=0 To B
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Pop Proc
      If N Then Gosub _LESEN : Erase 7
   Next I
   '
   If XSD=0 Then _CLEAR[1] Else _CLEAR[0]
Pop Proc
'
_LESEN:
   If Instr(N$,"[DIR]") Then Return 
   '
   N=Val(Right$(N$,8))
   _REALNAME[N$]
   '    
   Ink 1
   _TXT["Loading "+XFILE$+" !"]
   I2=0
   I3=0
   N1=0
   N2=0
   N3=-16
   XE=0
   N$=""
   '
   Reserve As Data 7,N
   If XE Then Return 
   Bload B$+XFILE$,7
   If XE Then Return 
   '
   Ink 0
   Bar 0,15 To 640,222
   '
   FILE$=XFILE$
   Ink 1
   Gosub _SCROLL
   Gosub _INFO
   '    
   Repeat 
      For A=0 To 15
         N1=Peek(Start(7)+N2)
         If N2<N
            If N1<16
               N0$=Hex$(N1,2)
            Else 
               N0$=Hex$(N1)
            End If 
            If N1<32 or(N1>127 and N1<161)
               N1=46
            End If 
            N$=N$+Chr$(N1)
            N1$=N1$+" "+N0$-"$"
         Else 
            N1$=N1$+"   "
         End If 
         Inc N2
         Inc N3
      Next A
      '
      Text 0,21+I2*8,Hex$(N3,8)+":  "+N1$+"    "+N$ : N$="" : N1$=""
      Inc I2
      Inc I3
      '
      If I2=26 or N2=>N
         Gosub _INFO
         Repeat 
            A=Asc(Inkey$)
         Until A<>0
         If A=13
            Gosub _LINES
            _EINGABE[13]
            I2=Val(XFILE$)
            I2=Max(0,I2)
            If I2=0
               I3=0
               N2=0
               N3=-16
            End If 
            If I2>N/16
               I2=0
               I3=0
               N2=0
               N3=-16
            End If 
            If I2>0 and I2<=N/16
               I3=I2-1
               N2=I2*16
               N3=N2-16
            End If 
            Gosub _SCROLL
         End If 
         I2=0
         Ink 0
         Bar 0,15 To 640,222
         Ink 1
         Clear Key 
         If A=27
            Exit 
         End If 
      End If 
   Until N2=>N
   _INSTALLSCREEN
Return 
'
_SCROLL:
   _TXT["File : "+B$+FILE$]
   _TXT["Lines:"]
   _TXT["Read :"]
   Gosub _INFO
Return 
'
_INFO:
   N2=Min(N2,N)
   Text 72,242,Str$(I3)
   Text 72,250,Str$(100.0/N*N2)+"%  ("+Str$(N2)+" of"+Str$(N)+" Bytes )"
Return 
'
_LINES:
   _TXT["Max. lines:"+Str$(N/16+1)]
   _TXT["Cur. lines:"+Str$(Max(1,I3-26))+" to"+Str$(I3)]
   _TXT["Enter line:"]
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _PROTECT
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N
         _REALNAME[N$]
          N$=B$+XFILE$+Chr$(0)
         _TXT["Enter flags <hsparwed> for "+XFILE$+":"]
         _EINGABE[30+Len(XFILE$)]
         Gosub _PROTECT
      End If 
   Next I
   If XSD Then _CLEAR[0] Else _CLEAR[1]
Pop Proc
'
_PROTECT:
   XFILE$=Upper$(XFILE$) : N=0
   If Instr(XFILE$,"D")=0 : Add N,1 : End If 
   If Instr(XFILE$,"E")=0 : Add N,2 : End If 
   If Instr(XFILE$,"W")=0 : Add N,4 : End If 
   If Instr(XFILE$,"R")=0 : Add N,8 : End If 
   If Instr(XFILE$,"A") : Add N,16 : End If 
   If Instr(XFILE$,"P") : Add N,32 : End If 
   If Instr(XFILE$,"S") : Add N,64 : End If 
   If Instr(XFILE$,"H") : Add N,128 : End If 
   '
   Dreg(1)=Varptr(N$)
   Dreg(2)=N
   LVOPROTECT=Doscall(-186)
   '
   If LVOPROTECT=0 Then _TXT["Can`t protect, error occured !"]
Return 
End Proc
Procedure _COMMENT
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N
         _REALNAME[N$]
          N$=B$+XFILE$+Chr$(0)
         _TXT["Enter comment for "+XFILE$+":"]
         _EINGABE[21+Len(XFILE$)]
         Gosub _COMMENT
      End If 
   Next I
   If XSD Then _CLEAR[0] Else _CLEAR[1]
Pop Proc
'
_COMMENT:
   XFILE$=XFILE$+Chr$(0)
   Dreg(1)=Varptr(N$)
   Dreg(2)=Varptr(XFILE$)
   LVOCOMMENT=Doscall(-180)
   If LVOCOMMENT=0 Then _TXT["Can`t add comment, error occured !"]
Return 
End Proc
Procedure _SHOWIFF
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
         XSTATUSB(I)=0
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
         XSTATUSA(I)=0
      End If 
      If N
         Gosub _SHOWIFF
      End If 
   Next I
   '
   If XSD=0 Then _SHOWDIR[1] Else _SHOWDIR[0]
Pop Proc
'
_SHOWIFF:
   XE=0
   If Instr(N$,"[DIR]") Then Return 
   _REALNAME[N$]
   _TXT["Showing "+B$+XFILE$+" as IFF picture !"]
   '
   Open In 1,B$+XFILE$
      If XE Then Return 
      N$=Input$(1,22)
      N$=Upper$(N$)
   Close 1
   '
   If Instr(N$,"ILBMBMHD")
      Load Iff B$+XFILE$,1
      Gosub _INFO
   Else 
      If Instr(N$,"PAC.PIC")
         _TXT[XFILE$+" is not an IFF picture !"]
         _TXT["Should I try to load as AMOS Bank <Y/N> ?:"]
         N$=XFILE$
         _EINGABE[44]
         XFILE$=Upper$(XFILE$)
         If XFILE$="Y"
            Load B$+N$,7
            Unpack 7 To 1
            Erase 7
            Gosub _INFO
         End If 
      Else 
         _TXT[XFILE$+" is not an IFF or AmBk picture !"]
      End If 
   End If 
Return 
'
_INFO:
   Screen 1
   If XE Then Return 
   Screen Hide 0
   N=Screen Height
   N0=Screen Width
   N1=Screen Colour
   While Asc(Inkey$)=0 and Mouse Key=0 : Wend 
   Screen Close 1
   Screen Show 0
   Screen 0
   _TXT["Height:"+Str$(N)+"    Width:"+Str$(N0)+"    Colours:"+Str$(N1)]
   Wait 50
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _EXECUTE
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N<>0 and Instr(N$,"[DIR]")=0
         _REALNAME[N$]
          N$=Chr$(34)+B$+XFILE$+Chr$(34)
         _TXT["Enter parameters for "+XFILE$+":"]
         _EINGABE[24+Len(XFILE$)]
         If XFILE$<>""
            XFILE$=N$+" "+XFILE$
         Else 
            XFILE$=N$
         End If 
         _RUN
      End If 
   Next I
   If XSD=0 Then _CLEAR[1] Else _CLEAR[0]
End Proc
'
'**** MenÜ B 
Procedure _SORT
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N and Instr(N$,"[DIR]")=0
         XFILE$=N$
         _ORDNEN[B$]
         Erase 7
      End If 
   Next I
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
End Proc
Procedure _MERGE
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then A$=XDISKNAMEA$ : B$=XDISKNAMEB$ : A=XANZA# Else A$=XDISKNAMEB$ : B$=XDISKNAMEA$ : A=XANZB#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N and Instr(N$,"[DIR]")=0
         FGR=FGR+Val(Right$(N$,8))
      End If 
   Next I
   '
   If FGR<>0 and Exist(A$)
      Reserve As Data 7,FGR
      If XE
         Erase 7
         Pop Proc
      End If 
      _TXT["Enter new filename:"]
      _EINGABE[21]
      If XFILE$<>""
         N1$=B$+XFILE$
         '    
         FGR=Start(7)
         For I=0 To A
            If XSD=0
               N$=XDIRA$(I)
               N=XSTATUSA(I)
            Else 
               N$=XDIRB$(I)
               N=XSTATUSB(I)
            End If 
            If N and Instr(N$,"[DIR]")=0
               N=Val(Right$(N$,8))
               _REALNAME[N$]
               _TXT["Merging... "+A$+XFILE$+" !"]
               If Exist(A$+XFILE$)
                  Bload A$+XFILE$,FGR
                  Add FGR,N
               Else 
                  _TXT[B$+XFILE$+" not found !"]
                  _TXT["Merging aborted !"]
                  Erase 7
                  Pop Proc
               End If 
            End If 
         Next I
         _TXT["Saving files to "+N1$+" !"]
         Bsave N1$,Start(7) To FGR
         Erase 7
         If XSD=0
            _CLEAR[0]
            _LESEDISK[B$,1]
         End If 
      Else 
         _TXT["Merging aborted !"]
         Erase 7
      End If 
   End If 
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _COMPARE
   On Error Goto _FEHLER
   A=Max(XANZA#,XANZB#)
   For I=0 To A
      If XSTATUSA(I) and Instr(XDIRA$(I),"[DIR]")=0
         N0$=XDIRA$(I)
         I=A
      End If 
   Next I
   For I=0 To A
      If XSTATUSB(I) and Instr(XDIRB$(I),"[DIR]")=0
         N1$=XDIRB$(I)
         I=A
      End If 
   Next I
   '
   If N0$="" or(N1$="") Then _TXT["Two files needed to compare !"] : Pop Proc
   '
   N=Max(Val(Right$(N0$,8)),Val(Right$(N1$,8)))
   N2=Min(Val(Right$(N0$,8)),Val(Right$(N1$,8)))
   '
   _REALNAME[N0$]
   N0$=XDISKNAMEA$+XFILE$
   _REALNAME[N1$]
   N1$=XDISKNAMEB$+XFILE$
   '
   Reserve As Data 7,N
   If XE Then Pop Proc
   Reserve As Data 8,N
   If XE Then Pop Proc
   '
   Bload N0$,7
   If XE Then Pop Proc
   Bload N1$,8
   If XE Then Pop Proc
   '
   Ink 0
   Bar 0,15 To 640,222
   N0$=Left$(N0$,38)
   N0$=N0$+Space$(38-Len(N0$))
   N1$=Left$(N1$,38)
   N1$=N1$+Space$(38-Len(N1$))
   A=0
   Ink 2,1
   Text 0,20,Left$(N0$,38)
   Text 336,20,Left$(N1$,38)
   Ink 1,0
   _TXT["# of different bytes: 0"]
   '
   For I=0 To N2 Step 38
      For I2=0 To 37
         N0=Peek(Start(7)+I+I2)
         N1=Peek(Start(8)+I+I2)
         If I+I2<N2
            If N0<>N1
               Ink 2
               Inc N3
            Else 
               Ink 1
            End If 
            Text 0+I2*8,29+I3*8,Chr$(N0)
            Text 336+I2*8,29+I3*8,Chr$(N1)
         End If 
      Next I2
      Add I3,1
      If I3=25 or I=>N2
         Ink 1
         Text 190,250,Str$(N3)
         Clear Key 
         Repeat 
            A=Asc(Inkey$)
         Until A<>0
         If A=27
            Exit 
         End If 
         I3=0
         A=0
         Ink 0
         Bar 0,23 To 640,222
      End If 
   Next I
   Ink 1
   Text 190,250,Str$(N3)
   If A=0 Then Wait Key 
   Erase 7
   Erase 8
   _INSTALLSCREEN
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Erase 7
   Erase 8
   Resume Next 
End Proc
Procedure _SAVEMEM
   If XSD=0 Then B$=XDISKNAMEB$ Else B$=XDISKNAMEA$
   '
   On Error Goto _FEHLER
   '
   _TXT["Enter startaddress:"]
   _EINGABE[21]
   N0=Abs(Val(XFILE$))
   _TXT["Enter endaddress..:"]
   _EINGABE[21]
   N1=Abs(Val(XFILE$))
   '
   _TXT["Enter outputfile..:"]
   _EINGABE[21]
   If XFILE$="" Then _TXT["Save memory aborted !"] : Pop Proc
   '
   If N0>N1 Then Swap N0,N1
   '
   Bsave B$+XFILE$,N0 To N1
   If XE=88 Then Kill B$+XFILE$
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _PACK
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 and Instr(N$,"[DIR]")=0
         XFILE$=N$
         Gosub _PACK
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
Pop Proc
'
_PACK:
   XE=0
   N=Val(Right$(XFILE$,8))
   _REALNAME[XFILE$]
   '
   Reserve As Data 7,N
   If XE Then Return 
   Bload B$+XFILE$,7
   If XE Then Return 
   '
   _TXT["Packing "+B$+XFILE$+" !"]
   _TXT["Press CTRL + C to terminate the packing !"]
   '
   C=Squash(Start(7),N,-1,512,19)
   '
   If C=-1 Then _TXT["Sorry... it`s impossible to pack "+XFILE$+" !"]
   If C=-2 Then _TXT["Packing of "+XFILE$+" aborted !"]
   If C>0
      _TXT["Normal length:"+Str$(N)]
      _TXT["Packed length:"+Str$(C)]
      _TXT["Gained.......:"+Str$(100-(100*C)/N)+"% ="+Str$(N-C)+" bytes"]
      Bsave B$+XFILE$,Start(7) To Start(7)+C
   End If 
   Wait 50
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _UNPACK
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 and Instr(N$,"[DIR]")=0
         XFILE$=N$
         Gosub _UNPACK
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
Pop Proc
'
_UNPACK:
   XE=0
   N=Val(Right$(XFILE$,8))
   _REALNAME[XFILE$]
   '
   Reserve As Work 7,200000
   If XE Then Return 
   Bload B$+XFILE$,7
   If XE Then Return 
   '
   _TXT["Unpacking "+XFILE$+"... !"]
   C=Unsquash(Start(7),N)
   _TXT["Unpacked length:"+Str$(C)+" bytes !"]
   '
   If XFILE$<>""
      Bsave B$+XFILE$,Start(7) To Start(7)+C
   End If 
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _CHECKVEC
   For I=0 To 4
      Read N$,N
      _TXT["Checking... "+N$]
      Add N,Leek(4)
      N=Leek(N)
      If N Then Exit 
   Next 
   If N
      _TXT["Be carefull... "+N$+" is abnormal ( "+Hex$(N,8)+" ) !"]
   Else 
      _TXT["No abnormal pointer of any vector !"]
   End If 
Data "ColdCapture",$2A
Data "CoolCapture",$2E
Data "WarmCapture",$32
Data "KickMemPtr",$222
Data "KickTagPtr",$226
End Proc
Procedure _CLEARSYS
   _TXT["Are you sure to clear & reset your system <Y/N> ?:"]
   _EINGABE[52]
   If Upper$(XFILE$)<>"Y" Then Pop Proc
   For I=1 To 88
      Read N
      N$=N$+Chr$(N)
   Next 
   Call Varptr(N$)
Data 51,252,64,0,0,223,240,154,44,121,0,0,0,4,34,60,170,170
Data 187,187,45,65,0,36,45,65,0,38,45,65,0,62,45,65,0,78
Data 45,65,0,82,45,65,2,42,12,110,0,36,0,20,109,4,78,238
Data 253,42,75,250,0,8,78,174,255,226,0,0,32,124,1,0,0,0
Data 145,232,255,236,32,104,0,4,85,136,78,112,78,208,0,0
End Proc
Procedure _CONVASM
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZA# Else B$=XDISKNAMEA$ : A=XANZB#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N<0 Then Pop Proc
      If N and Instr(N$,"[DIR]")=0
         XFILE$=N$
         _KONVERTIEREN[";","Save as assembler source:",Chr$(9)+"DC."]
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
End Proc
Procedure _CONVBAS
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then A$=XDISKNAMEA$ : B$=XDISKNAMEB$ : A=XANZA# Else A$=XDISKNAMEB$ : B$=XDISKNAMEA$ : A=XANZB#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N<0 Then Pop Proc
      If N and Instr(N$,"[DIR]")=0
         XFILE$=N$
         _KONVERTIEREN["Rem ","Save as basic source....:","Data "]
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
End Proc
Procedure _CONVASC
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then A$=XDISKNAMEA$ : B$=XDISKNAMEB$ : A=XANZA# Else A$=XDISKNAMEB$ : B$=XDISKNAMEA$ : A=XANZB#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N<0 Then Pop Proc
      If N and Instr(N$,"[DIR]")=0
         XFILE$=N$
         _KONVERTIERENASCPBK[0]
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
End Proc
Procedure _CONVPBK
   _DPROTECT
   If XPROTECT<82 Then Pop Proc
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZA# Else B$=XDISKNAMEA$ : A=XANZB#
   '
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N<0 Then Pop Proc
      If N and Instr(N$,"[DIR]")=0
         XFILE$=N$
         _KONVERTIERENASCPBK[1]
         Erase 7
      End If 
   Next I
   '
   If XSD=0 Then _LESEDISK[B$,1] Else _LESEDISK[B$,0]
End Proc
Procedure _PLAYABK
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   On Error Goto _FEHLER
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 and Instr(N$,"[DIR]")=0
         XE=0
         _REALNAME[N$]
         _TXT["Loading "+XFILE$+" as AMOS Music Bank !"]
         Load B$+XFILE$,3
         If XE=0
            Music 1
            If XE=0
               _LEDONOFF
               Music Off 
            End If 
         End If 
         Erase 3
      End If 
   Next I
   '
   If XSD=0 Then _CLEAR[1] Else _CLEAR[0]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _PLAYMED
   If XSD=0
      A=XANZB#
      B$=XDISKNAMEB$
   Else 
      A=XANZA#
      B$=XDISKNAMEA$
   End If 
   '
   MEDNAME$="medplayer.library"+Chr$(0)
   Areg(1)=Varptr(MEDNAME$)
   Dreg(0)=0
   LVOMEDBASE=Execall(-552)
   If LVOMEDBASE=0
      _TXT["Sorry, medplayer.library not available !"]
      Pop Proc
   End If 
   '
   For I=0 To A
      If XSD=0
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      Else 
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      End If 
      If N=-2 Then Goto _CLOSELIB
      If N=1 and Instr(N$,"[DIR]")=0
         _REALNAME[N$]
         N$=B$+XFILE$+Chr$(0)
         Gosub _PLAYMED
      End If 
   Next I
   '
   If XSD=0 Then _CLEAR[1] Else _CLEAR[0]
   '
_CLOSELIB:
   Areg(1)=LVOMEDBASE
   LVOCLOSELIBRARY=Execall(-414)
Pop Proc
'
_PLAYMED:
   _TXT["Load... "+XFILE$+" as MED module !"]
   '
   MEDADR=Varptr(N$)
   Call LVOMEDBASE-$1E
   Areg(0)=MEDADR
   Call LVOMEDBASE-$48
   MEDADR=Dreg(0)
   If MEDADR=0 Then _TXT["Can`t load "+XFILE$+" as MED module !"] : Return 
   Areg(0)=MEDADR
   Call LVOMEDBASE-$2A
   '
   _LEDONOFF
   '
   Call LVOMEDBASE-$36
   Areg(0)=MEDADR
   Call LVOMEDBASE-$4E
   Call LVOMEDBASE-$24
Return 
End Proc
Procedure _PLAYMOD
   On Error Goto _FEHLER
   '
   If XSD
      A=XANZA#
      A$=XDISKNAMEA$
   Else 
      A=XANZB#
      A$=XDISKNAMEB$
   End If 
   '
   For I=0 To A
      If XSD
         N=XSTATUSA(I)
         N$=XDIRA$(I)
      Else 
         N=XSTATUSB(I)
         N$=XDIRB$(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 and Instr(N$,"[DIR]")=0
         _REALNAME[N$]
         _TXT["Loading... "+XFILE$+" as Tracker module !"]
         Track Load A$+XFILE$,7
         If XE=0
            Track Play 
            Track Loop On 
            _LEDONOFF
            Track Stop 
         End If 
         Erase 7
      End If 
   Next I
   '
   If XSD Then _CLEAR[0] Else _CLEAR[1]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
'
'**** MenÜ C 
Procedure _VALUE
   _TXT["Enter value:"]
   _EINGABE[14]
   N=Val(XFILE$)
   _TXT["DEC:"+Str$(N)+"      HEX: "+Hex$(N,8)+"      BIN: "+Bin$(N,32)]
End Proc
Procedure _COLOURS
   Ink 0 : Bar 3,228 To 635,253
   For I=0 To 3
      Ink I : Bar 15+I*50,228 To 55+I*50,253
      _G[15+I*50,228,55+I*50,253,0]
   Next I
   _G[216,228,476,235,0]
   _G[216,237,476,244,0]
   _G[216,246,476,253,0]
   _G[504,228,563,240,0]
   _G[566,228,625,240,0]
   _G[504,241,625,253,0]
   Text 522,237,"Def"
   Text 584,237,"Sys"
   Text 556,250,"Use"
   Gosub PFN
   Do 
      While Mouse Key=0 : Wend 
      X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
      '
      If Y>227 and Y<253
         '
         If X>15 and X<205
            P=Point(X,Y)
            Gosub PFN
         End If 
         '
         If X>215 and X<477
            Add X,-216
            X=X/17
            If Y>227 and Y<236 : X0$=Hex$(X)-"$" : End If 
            If Y>236 and Y<245 : X1$=Hex$(X)-"$" : End If 
            If Y>245 and Y<254 : X2$=Hex$(X)-"$" : End If 
            Colour P,Val("$"+X0$+X1$+X2$)
            Gosub PFN
         End If 
         '
         If X>503 and X<564 and Y>227 and Y<241
            _G[504,228,563,240,1]
            Colour 0,$77A
            Colour 1,$124
            Colour 2,$CCE
            Colour 3,$557
            Gosub PFN
            Wait 15
            _G[504,228,563,240,0]
         End If 
         If X>565 and X<626 and Y>227 and Y<241
            _G[566,228,625,240,1]
            N$=Space$(232)+Chr$(0)
            Areg(0)=Varptr(N$)
            Dreg(0)=232
            LVOGETPREFS=Intcall(-132)
            Colour 0,Deek(LVOGETPREFS+110)
            Colour 1,Deek(LVOGETPREFS+112)
            Colour 2,Deek(LVOGETPREFS+114)
            Colour 3,Deek(LVOGETPREFS+116)
            Gosub PFN
            Wait 15
            _G[566,228,625,240,0]
         End If 
         '
         If X>503 and X<626 and Y>240 and Y<256
            _G[504,241,625,253,1]
            Wait 20
            _G[504,241,625,253,0]
            Wait 20
            Ink 0 : Bar 9,228 To 635,253
            Pop Proc
         End If 
      End If 
   Loop 
   '
PFN:
   N$=Hex$(Colour(P),3)-"$"
   X0$=Mid$(N$,1,1)
   X1$=Mid$(N$,2,1)
   X2$=Mid$(N$,3,1)
   Text 486,234,X0$
   Text 486,243,X1$
   Text 486,252,X2$
   X0=Val("$"+X0$)
   X1=Val("$"+X1$)
   X2=Val("$"+X2$)
   Ink 0
   For I=0 To 2 : Bar 217,229+I*9 To 475,234+I*9 : Next I
   Ink 1
   Bar 217,230 To 218+X0*17,233
   Bar 217,239 To 218+X1*17,242
   Bar 217,248 To 218+X2*17,251
   _G[15+P2*50,228,55+P2*50,253,0]
   P2=P
   _G[15+P*50,228,55+P*50,253,1]
   Colour Back Colour(0)
   Screen Show 
   Repeat : Until Mouse Key=0
Return 
End Proc
Procedure _GETDAY
   X=2000
   Y=6
   FILE$=Space$(10)
   _TXT["Enter state of day..:"]
   _EINGABE[23]
   S=Val(XFILE$)
   '
   _TXT["Enter state of month:"]
   _EINGABE[23]
   M=Val(XFILE$)
   '
   _TXT["Enter state of year.:"]
   _EINGABE[23]
   H=Val(XFILE$)
   '
   If S<32 and S>0 and M<13 and M>0 and H>1581 and H<2001 Then Else _TXT["Please use this format: DD.MM.YYYY  <Year min. 1582 - Year max. 2000> !"] : Pop Proc
   '
   For I=X-1 To H Step -1
      If I mod 400=0 or I mod 4=0
         Add Y,-2 : I2=1
      Else 
         Dec Y : I2=0
      End If 
      If I mod 100=0 and I mod 400<>0 Then Inc Y : I2=0
      If Y<1 Then Add Y,7
   Next I
   '
   Restore MT
   '
   For I=1 To M-1
      Read A
      Add N,A
   Next I
   '
   Add N,S-1
   If I2=1 and M>2 Then Inc N
   Add Y,(N mod 7) : If Y>7 Then Add Y,-7
   If I2=0 and M=2 and S>28 : _TXT["The date of "+Str$(S)-" "+"."+Str$(M)-" "+"."+Str$(H)-" "+" doesn`t exist !"] : Pop Proc : End If 
   Restore WT
   For I=1 To Y : Read N$ : Next I
   _TXT["The day of "+Str$(S)-" "+"."+Str$(M)-" "+"."+Str$(H)-" "+" is a "+N$]
   '
MT: Data 31,28,31,30,31,30,31,31,30,31,30,31
WT: Data "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
End Proc
Procedure _OPENWB
   LVOOPENWORKBENCH=Intcall(-210)
   If LVOOPENWORKBENCH=0
      _TXT["Can`t open Workbench, not enough memory"]
   Else 
      _TXT["Workbench is opened !"]
   End If 
End Proc
Procedure _CLOSEWB
   LVOCLOSEWORKBENCH=Intcall(-78)
   If LVOCLOSEWORKBENCH=0
      _TXT["Can`t close Workbench !"]
   Else 
      _TXT["Workbench is closed !"]
   End If 
End Proc
Procedure _CLOSE
   _TXT["Press left AMIGA + A to come back to AmBOS !"]
   Wait 90
   Amos To Back 
   Screen Close 0
   Repeat 
      Multi Wait 
   Until Amos Here
   _INSTALLAMBOS
   _INSTALLSCREEN
End Proc
Procedure _ABOUT
   Wait 20
   Ink 0 : Bar 0,15 To 640,222
   For I=1 To 18
      Read Y,N$
      X=Text Length(N$)
      If X<97 Then Ink 2 Else Ink 1
      Text 320-X/2,Y,N$
   Next I
   While Asc(Inkey$)=0 and Mouse Key=0 : Wend 
   _INSTALLSCREEN
Data 22,"About"
Data 33,"AmBOS V2.0b is written in AMOS V1.31 and compiled with ACmp V1.0 !"
Data 49,"Greatings to"
Data 60,"Frank, Jork, Karsten, Silke, Halime, Ursel, Melanie, Hermann, Momo"
Data 68,"Jens (Falderi Faldera), Axel, Detlef (Wurzelsepp), Richy, Christina"
Data 76,"Anja, Jennifer, Giofranco, Wolli, Bernd (Bänger), Jesus, Robbi, Sonja"
Data 84,"Jaquline, Jörg, Fracois, and last but not least Big Humphrey the rabbit"
Data 100,"Thanx"
Data 111,"`Kaffee KrÜmmel' and `Rocknacht' for its great atmosphere !"
Data 119,"`Al Bundy and the rest' for being so incredible cool, cool, cool !"
Data 135,"Important"
Data 146,"If you found some bugs or have some good ideas and you are able to"
Data 154,"program in AMOS, so you can change it like you need it !  The only"
Data 162,"I beg for is to send me the latest update of the new version of AmBOS."
Data 179,"Write to"
Data 190,"Volker Stepprath, Spandauerstrasse 4, 40789 Monheim, Germany"
Data 206,"PS"
Data 217,"Press the Help key and one menuoption to explain it !"
End Proc
Procedure _EDITOR
   On Error Goto _FEHLER
   If XSD=0
      A$=XDISKNAMEA$
      B$=XDISKNAMEB$
      A=XANZA#
   Else 
      A$=XDISKNAMEB$
      B$=XDISKNAMEA$
      A=XANZB#
   End If 
   For I=0 To A
      If XSD=0
         N$=XDIRA$(I)
         N=XSTATUSA(I)
      Else 
         N$=XDIRB$(I)
         N=XSTATUSB(I)
      End If 
      If N=-2 Then Pop Proc
      If N=1 and Instr(N$,"[DIR]")=0
         FGR=Val(Right$(N$,8))
         _REALNAME[N$]
         NF$=XFILE$
         Reserve As Data 7,FGR
         If XE : Pop Proc : End If 
         Bload A$+NF$,7
         If XE
            Erase 7
            Pop Proc
         End If 
         _EDIT[B$,NF$,FGR]
         Erase 7
         I2=True
      End If 
   Next I
   If I2=False
      FGR=1920
      NF$="NoNamed"
      Reserve As Data 7,1920
      _EDIT[B$,NF$,FGR]
      Erase 7
   End If 
   '
   _INSTALLSCREEN
   If XSD=0 Then _CLEAR[0] Else _CLEAR[1]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
Resume Next 
End Proc
Procedure _DISKCOPY
   _TXT["Sourcedrive (0-3):"]
   _EINGABE[20]
   XSOURCE=Abs(Val(XFILE$))
   N0$="DF"+Str$(XSOURCE)-" "+":"
   If Drive(N0$)=0
      _TXT[N0$+" not available !"]
      Pop Proc
   End If 
   '
   _TXT["Targetdrive (0-3):"]
   _EINGABE[20]
   XTARGET=Abs(Val(XFILE$))
   N1$="DF"+Str$(XTARGET)-" "+":"
   If Drive(N1$)=0
      _TXT[N1$+" not available !"]
      Pop Proc
   End If 
   '
   If XSOURCE=XTARGET
      _TXT["Sourcedrive & Targetdrive must be different !"]
      Pop Proc
   End If 
   '
   _TXT["Insert sourcedisk in drive "+N0$+" !"]
   _TXT["Insert targetdisk in drive "+N1$+" !"]
   _TXT["Press any key to start diskcopy <ESC = Abort> !"]
   Repeat 
      N=Asc(Inkey$)
   Until N
   If N=27 Then _TXT["Diskcopy aborted !"] : Pop Proc
   _TXT[""]
   '    
   Reserve As Chip Data 7,5632
   DISKREP$=Space$(40)+Chr$(0)
   DEVNAME$="trackdisk.device"+Chr$(0)
   DISKREP=Varptr(DISKREP$)
   IOREQ$=Space$(80)+Chr$(0)
   IOREQADR=Varptr(IOREQ$)
   IOREQ2$=Space$(80)+Chr$(0)
   IOREQADR2=Varptr(IOREQ2$)
   Areg(0)=0
   Areg(1)=0
   Dreg(0)=0
   Dreg(1)=0
   LVOFINDTASK=Execall(-294)
   Loke DISKREP+$10,LVOFINDTASK
   Areg(0)=Varptr(DEVNAME$)
   '
   Areg(1)=IOREQADR
   Dreg(0)=XSOURCE
   LVOOPENDEVICE=Execall(-444)
   '
   Areg(1)=IOREQADR2
   Dreg(0)=XTARGET
   LVOOPENDEVICE=Execall(-444)
   '
   Loke IOREQADR+14,DISKREP
   Doke IOREQADR+28,2
   Loke IOREQADR+36,5632
   Loke IOREQADR+40,Start(7)
   Loke IOREQADR2+14,DISKREP
   Doke IOREQADR2+28,11
   Loke IOREQADR2+36,5632
   Loke IOREQADR2+40,Start(7)
   '
   Gosub _DISKCOPY
   '
   Areg(1)=IOREQADR
   Doke IOREQADR+28,9
   Loke IOREQADR+36,0
   LVODOIO=Execall(-456)
   '
   Areg(1)=IOREQADR2
   Doke IOREQADR2+28,9
   Loke IOREQADR2+36,0
   LVODOIO=Execall(-456)
   '
   Areg(1)=IOREQADR
   LVOCLOSEDEVICE=Execall(-450)
   Areg(1)=IOREQADR2
   LVOCLOSEDEVICE=Execall(-450)
   '
   Erase 7
Pop Proc
'
_DISKCOPY:
   For TRACK=0 To 159
      Text 22,250,"Reading cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
      Areg(1)=IOREQADR
      Loke IOREQADR+44,TRACK*5632
      LVODOIO=Execall(-456)
      If LVODOIO=29
         _TXT["No disk in drive "+N0$+" !"]
         Return 
      End If 
      If LVODOIO<>0
         Text 22,250,"TDERR #"+Str$(LVODOIO)-" "+" occured while reading cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
         _TXT[""]
      End If 
      '
      Text 22,250,"Writing cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
      Areg(1)=IOREQADR2
      Loke IOREQADR2+44,TRACK*5632
      LVODOIO=Execall(-456)
      If LVODOIO=28
         _TXT["Disk in drive "+N1$+" is write protected !"]
         Return 
      End If 
      If LVODOIO=29
         _TXT["No disk in drive "+N1$+" !"]
         Return 
      End If 
      '    
      If Asc(Inkey$)=27
         _TXT["Diskcopy aborted !"]
         Return 
      End If 
      '
      Add I,I2
      Add I2,1,0 To 1
   Next TRACK
   _TXT["Diskcopy finished !"]
Return 
End Proc
Procedure _FORMAT
   _DISKIT[1]
End Proc
Procedure _VERIFY
   _DISKIT[5]
End Proc
Procedure _INSTALL
   _DISKIT[2]
End Proc
Procedure _BLKDAT
   _DISKIT[3]
End Proc
Procedure _DATBLK
   _DISKIT[4]
End Proc
Procedure _EXIT
   If Exist("SYS:") Then Dir$="SYS:"
   Request On 
   Wait 30
   End 
End Proc
'
'**** MenÜ D 
Procedure _CREATE
   On Error Goto _FEHLER
   Do 
      _TXT["Select gadget for new command <CREATE=Save/Abort>"]
      Repeat : Until Mouse Key=0
      While Mouse Key=0 : Wend 
      X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
      '
      If Y>194 and Y<208
         X=X/80 : Y=195
         _G[X*80+1,195,X*80+78,207,1]
      End If 
      If X<558 and Y>209 and Y<223
         X=X/80 : Y=210
         _G[X*80+1,210,X*80+78,222,1]
         Add X,8
      End If 
      '
      If X>13 and Y>209 and Y<223 Then Clear Key : Exit 
      I2=True
      '
      Ink 1 : _TXT["Enter menuname:"]
      _EINGABE[17]
      N$=XFILE$
      Ink 1 : _TXT["Enter commandline:"]
      _EINGABE[20]
      N$=N$+"="+XFILE$
      If N$="=" Then N$=""
      For I=0 To 31 : N$=N$-Chr$(I) : Next I
      XMEND$(X)=N$
      '
      _MENU[3]
      If X>7 Then Add X,-8
      _G[X*80+1,Y,X*80+78,Y+12,0]
   Loop 
   '
   If I2
      If Exist("SYS:S/")
         Open Out 1,"SYS:S/.ambosmenu"
            If XE : Pop Proc : End If 
            For I=0 To 13
               Print #1,XMEND$(I)
            Next I
         Close 1
      Else 
         _TXT["SYS:S/ not available !"]
      End If 
   End If 
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
'
'**** Unterfunktionen
Procedure _ALL[N]
   If N=0
      For I=0 To XANZA#
         If XSTATUSA(I)<>-2 : XSTATUSA(I)=1 : End If 
      Next I
      _SHOWDIR[0]
   Else 
      For I=0 To XANZB#
         If XSTATUSB(I)<>-2 : XSTATUSB(I)=1 : End If 
      Next I
      _SHOWDIR[1]
   End If 
End Proc
Procedure _CALLCOMMAND[N]
   Wait 15
   N$=XMEND$(N)
   If N$="" Then Pop Proc
   If N$="CREATE=" Then _CREATE : Pop Proc
   N=Instr(N$,"=")
   N$=Mid$(N$,N+1,Len(N$)-N)+Chr$(0)
   XFILE$=N$
   _RUN
End Proc
Procedure _CLEAR[N]
   If N=0
      For I=0 To XANZA#
         If XSTATUSA(I)<>-2 : XSTATUSA(I)=0 : End If 
      Next I
      _SHOWDIR[0]
   Else 
      For I=0 To XANZB#
         If XSTATUSB(I)<>-2 : XSTATUSB(I)=0 : End If 
      Next I
      _SHOWDIR[1]
   End If 
End Proc
Procedure _DISKIT[N]
   If XSD=0 Then B$=XDISKNAMEB$ : A=XANZB# Else B$=XDISKNAMEA$ : A=XANZA#
   '
   On Error Goto _FEHLER
   '
   If N<3
      _TXT["Targetdrive (0-3):"]
      _EINGABE[20]
      XTARGET=Abs(Val(XFILE$))
      N1$="DF"+Str$(XTARGET)-" "+":"
      If Drive(N1$)=0
         _TXT[N1$+" not available !"]
         Pop Proc
      End If 
   End If 
   '
   If N=1
      _TXT["Insert targetdisk in drive "+N1$+" !"]
      _TXT["Press any key when ready <ESC = Abort> !"]
      Repeat 
         N0=Asc(Inkey$)
      Until N0
      If N0=27
         _TXT["Process aborted !"]
         Pop Proc
      End If 
   End If 
   '
   If N=3
      _TXT["Sourcedrive (0-3):"]
      _EINGABE[20]
      XTARGET=Abs(Val(XFILE$))
      N0$="DF"+Str$(XTARGET)-" "+":"
      If Drive(N0$)=0
         _TXT[N0$+" not available !"]
         Pop Proc
      End If 
      _TXT["Startblock (0-1758):"]
      _EINGABE[22]
      N0=Abs(Val(XFILE$))
      N0=Min(1758,N0)
      _TXT["Endblock ("+Str$(N0)-" "+"-1759):"]
      _EINGABE[18+Len(Str$(N0))]
      N1=Abs(Val(XFILE$))
      N1=Min(1759,N1)
      If N0>N1 : Swap N0,N1 : End If 
      _TXT["Filename:"]
      _EINGABE[11]
      If XFILE$=""
         _TXT["Block to file aborted !"]
         Pop Proc
      End If 
   End If 
   '
   If N=4
      If XSD=0
         B$=XDISKNAMEA$
         A=XANZA#
      Else 
         B$=XDISKNAMEB$
         A=XANZB#
      End If 
      '
      For I=0 To A
         If XSD=0
            N$=XDIRA$(I)
            B=XSTATUSA(I)
         Else 
            N$=XDIRB$(I)
            B=XSTATUSB(I)
         End If 
         If B=-2
            Pop Proc
         End If 
         If B=1 and Instr(N$,"[DIR]")=0
            FGR=Val(Right$(N$,8))
            _REALNAME[N$]
            N$=B$+XFILE$
            I=A
         End If 
      Next I
      If B=0
         _TXT["No file selected !"]
         Pop Proc
      End If 
      _TXT["Targetdrive (0-3):"]
      _EINGABE[20]
      XTARGET=Abs(Val(XFILE$))
      N0$="DF"+Str$(XTARGET)-" "+":"
      If Drive(N0$)=0
         _TXT[N0$+" not available !"]
         Pop Proc
      End If 
      _TXT[N$+" to block (0-1759):"]
      _EINGABE[21+Len(N$)]
      N0=Abs(Val(XFILE$))
      N0=Min(1759,N0)
   End If 
   '
   If N=5
      _TXT["Sourcedrive (0-3):"]
      _EINGABE[20]
      XTARGET=Abs(Val(XFILE$))
      N0$="DF"+Str$(XTARGET)-" "+":"
      If Drive(N0$)=0
         _TXT[N0$+" not available !"]
         Pop Proc
      End If 
   End If 
   '
   Reserve As Chip Data 7,5632
   DISKREP$=Space$(40)+Chr$(0)
   DEVNAME$="trackdisk.device"+Chr$(0)
   IOREQ$=Space$(80)+Chr$(0)
   DISKREP=Varptr(DISKREP$)
   IOREQADR=Varptr(IOREQ$)
   Areg(0)=0
   Areg(1)=0
   Dreg(0)=0
   Dreg(1)=0
   XFINDTASK=Execall(-294)
   Loke DISKREP+$10,XFINDTASK
   Areg(0)=Varptr(DEVNAME$)
   Areg(1)=IOREQADR
   Dreg(0)=XTARGET
   Dreg(1)=0
   LVOOPENDEVICE=Execall(-444)
   '
   Loke IOREQADR+14,DISKREP
   Loke IOREQADR+40,Start(7)
   Doke IOREQADR+28,11
   Loke IOREQADR+36,5632
   '
   On N Gosub _FORMAT,_INSTALL,_BLKDAT,_DATBLK,_VERIFY
   '
   Doke IOREQADR+28,9
   Loke IOREQADR+36,0
   LVODOIO=Execall(-456)
   LVOCLOSEDEVICE=Execall(-450)
   '
   Erase 7
Pop Proc
'
_FORMAT:
   _TXT[""]
   For TRACK=0 To 159
      Text 22,250,"Formatting cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
      Loke IOREQADR+44,TRACK*5632
      LVODOIO=Execall(-456)
      If LVODOIO
         _TXT["TDERR #"+Str$(LVODOIO)+" occured !"]
         Return 
      End If 
      If Asc(Inkey$)=27 Then _TXT["Format aborted !"] : Return 
      Add I,I2
      Add I2,1,0 To 1
   Next TRACK
   N=Start(7)
   For I=$204 To $2DF
      Poke N+I,$FF
   Next I
   Doke N+2,$2
   Poke N+15,$48
   Loke N+20,$A661AEF3
   Doke N+$13A,$1
   Doke N+$13E,$371
   Poke N+$1B0,$5
   Poke N+$1B1,$45
   Poke N+$1B2,$4D
   Poke N+$1B3,$50
   Poke N+$1B4,$54
   Poke N+$1B5,$59
   Poke N+$1FF,$1
   Loke N+$200,$C000C037
   Poke N+$272,$3F
   Poke N+$2DC,$3F
   Doke IOREQADR+28,11
   Loke IOREQADR+44,$6E000
   LVODOIO=Execall(-456)
   Gosub _INSTALLII
   _TXT["Please remove disk to inform validator !"]
Return 
'
_INSTALL:
   _TXT["What bootblock ?"]
   _TXT["[N]oBoot / [D]osBoot / [Q]uartexBoot:"]
   _EINGABE[39]
   N$=Upper$(XFILE$)
   If N$="" Then _TXT["Install aborted !"] : Return 
_INSTALLII:
   If N$<>"N" and(N$<>"Q") Then N$="D"
   For I=0 To 1024 : Poke Start(7)+I,0 : Next I
   If N$="N"
      Read N : Loke Start(7),N
   End If 
   If N$="D"
      Restore _DOSBOOT
      For I=0 To 12 : Read N : Loke Start(7)+I*4,N : Next I
   End If 
   If N$="Q"
      Restore _QUARTEXBOOT
      For I=0 To 255 : Read N : Loke Start(7)+I*4,N : Next I
   End If 
   '
   Doke IOREQADR+28,3
   Loke IOREQADR+36,1024
   Loke IOREQADR+44,0
   LVODOIO=Execall(-456)
   Doke IOREQADR+28,4
   LVODOIO=Execall(-456)
   If LVODOIO<>0 Then _TXT["TDERR #"+Str$(LVODOIO)-" "+" occured !"]
Return 
'
_BLKDAT:
   Open Out 1,B$+XFILE$
      If XE Then Return 
   Close 1
   Doke IOREQADR+28,2
   Loke IOREQADR+36,512
   N$=B$+XFILE$+Chr$(0)
   Dreg(1)=Varptr(N$)
   Dreg(2)=1006
   LVOOPEN=Doscall(-30)
   _TXT["Working block:"]
   For I=N0 To N1
      Text 134,250,Str$(I)
      Loke IOREQADR+44,I*512
      LVODOIO=Execall(-456)
      If LVODOIO<>0
         _TXT["TDERR #"+Str$(LVODOIO)-" "+" occured !"]
         I=N1
      End If 
      Dreg(1)=LVOOPEN
      Dreg(2)=Start(7)
      Dreg(3)=512
      LVOWRITE=Doscall(-48)
      If LVOWRITE<>512
         _TXT["DOS error occured !"]
         I=N1
      End If 
   Next I
   Dreg(1)=LVOOPEN
   LVOCLOSE=Doscall(-36)
   If XSD=0
      _LESEDISK[B$,1]
   Else 
      _LESEDISK[B$,0]
   End If 
Return 
'
_DATBLK:
   Open In 1,N$
      If XE Then Return 
   Close 1
   _TXT["Blocks used: 0"]
   _TXT["Installed..: 0%   ( 0 bytes )"]
   N$=N$+Chr$(0)
   Dreg(1)=Varptr(N$)
   Dreg(2)=1005
   LVOOPEN=Doscall(-30)
   Dreg(1)=LVOOPEN
   Dreg(2)=Start(7)
   Dreg(3)=512
   Loke IOREQADR+36,512
   For I=0 To FGR Step 512
      LVOREAD=Doscall(-42)
      Doke IOREQADR+28,3
      Loke IOREQADR+44,N0*512+I
      LVODOIO=Execall(-456)
      If LVODOIO<>0
         _TXT["TDERR #"+Str$(LVODOIO)-" "+" occured !"]
         I=FGR
      Else 
         Text 118,242,Str$(I/512)
         Text 118,250,Str$(100.0/FGR*(I+LVOREAD))+"%"+"   ("+Str$(I+LVOREAD)+" bytes )"
      End If 
      If LVOREAD<512 Then I=FGR
      If Asc(Inkey$)=27 Then I=FGR
   Next I
   Doke IOREQADR+28,4
   LVODOIO=Execall(-456)
   Dreg(1)=LVOOPEN
   LVOCLOSE=Doscall(-36)
Return 
'
_VERIFY:
   _TXT[""]
   Doke IOREQADR+28,2
   For TRACK=0 To 159
      Text 22,250,"Verifying cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
      If Asc(Inkey$)=27 Then _TXT["Verify aborted !"] : Return 
      Loke IOREQADR+44,TRACK*5632
      LVODOIO=Execall(-456)
      If LVODOIO=29 Then _TXT["No disk in drive !"] : Return 
      If LVODOIO<>0
         Text 22,250,"TDERR #"+Str$(LVODOIO)-" "+" on cylinder #"+Str$(I)-" "+" , head"+Str$(I2)+" !"
         If I<79 : _TXT[""] : End If 
         Inc I3
      End If 
      Add I,I2
      Add I2,1,0 To 1
   Next TRACK
   _TXT["# of diskerrors:"+Str$(I3)+" !"]
Return 
'
_NOBOOT:
Data $444F5300
_DOSBOOT:
Data $444F5300,$C0200F19,$370,$43FA0018,$4EAEFFA0,$4A80670A,$20402068
Data $167000,$4E7570FF,$60FA646F,$732E6C69,$62726172,$79000000
_QUARTEXBOOT:
Data $444F5300,$1C2238A9,$370,$48E7FF7E,$70026100,$22E7009,$42A90024
Data $6100023A,$41FA03CC,$22690014,$20A9003C,$22690038,$2F0943FA,$2B8303C
Data $4E20222E,$3E0481,$80004,$6B043340,$1E4AAE,$4E6704,$3340000A
Data $43FA02B6,$207A0394,$41E80034,$4A986604,$33400008,$4A986604,$33400012
Data $4A986604,$3340001C,$4AAE002A,$660C4AAE,$2E6606,$4AAE022A,$671A43FA
Data $3237020,$1340001A,$12C012BC,$4145FA,$2D424FC,$56495249,$43F90007
Data $80002449,$4299B3FC,$7F000,$66F62C57,$33FC01A0,$DFF096,$43FA01CE
Data $2D490032,$41F90007,$1000214A,$87001,$223C0000,$300243C,$100
Data $4EAEFE7A,$43F90007,$11004EAE,$FF3A43F9,$71100,$237C0007,$10000004
Data $70014EAE,$FEAA4BFA,$1C87800,$7632181D,$672E610E,$6830000,$1806106
Data $4BED001F,$60E843F9,$71100,$20032204,$4EAEFF10,$43F90007,$1100204D
Data $701F4EAE,$FFC44E75,$33FC8380,$DFF096,$283C000F,$F0002C78,$45384
Data $670000B8,$43FA025A,$C110041,$661243FA,$1663011,$2400F00,$6400100
Data $32805284,$4BF900BF,$E0010815,$66700,$8E102D,$C00422D,$C004600
Data $B03C00A0,$670000D4,$B03C00A2,$660A203C,$80000,$600000C8,$B03C00A4
Data $66164BF9,$FC00D0,$42AE0026,$4EAEFFE2,$41F80002,$4E704ED0,$B03C00A6
Data $6738B03C,$A86606,$4BFAFFEA,$60DEB03C,$AA6756,$B03C00AC,$66040855
Data $1B03C,$AE6612,$47FA020C,$32130841,$53681,$33C100DF,$F1DC6000
Data $FF52207A,$1F241E8,$3470FF,$20C020C0,$20806112,$43FA01E6,$4EAEFFA0
Data $20402068,$167000,$4E75205F,$588F4CDF,$7EFF2F08,$4E7561F2,$700541F9
Data $50000,$610C7003,$61087004,$61046000,$FDCC41F9,$30000,$23480028
Data $237C0000,$4000024,$42A9002C,$3340001C,$4EAEFE38,$4E75202E,$3E204E
Data $4BF900FC,$2800C65,$21FC66FA,$99CC4DF8,$6762640,$43F900DF,$F096203C
Data $7FFF7FFF,$22C022C0,$4EE8FFE2,$1002200,$1020001,$920020,$9400D8
Data $8E3000,$9030FF,$E00007,$E28870,$E40007,$E688A0,$1860AAA
Data $1840EEE,$1820777,$1800002,$FFFFFFFE,$223C3C3C,$3C3C3C20,$5554494C
Data $49545920,$424F4F54,$2056322E,$30203E3E,$3E3E3E3E,$35464153,$544D454D
Data $3A4F4646,$20202020,$20203120,$4D454720,$43484950,$3A4F4646,$2C202044
Data $46313A4F,$46462020,$20444632,$3A4F4646,$20202044,$46333A4F,$46462020
Data $43463120,$46415354,$4D454D20,$4F464620,$46322043,$4849502F,$46415354
Data $204F4646,$4C463320,$414C4C20,$4D454D20,$4F4E2020,$4634204B,$494C4C20
Data $44524956,$45532120,$55463520,$48415244,$20524553,$45542020,$46362049
Data $4E535441,$4C4C2042,$4F4F5420,$5E463720,$544F4747,$4C45204C,$45442020
Data $46382054,$4F472050,$414C2F4E,$54534320,$6C20204E,$4F205649,$52555320
Data $48415320,$4245454E,$20444554,$45435445,$44212020,$75424F4F,$54204259
Data $20204E2E,$4F2E4D2E,$412E4420,$204F4620,$51554152,$54455821,$0
Data $0,$646F732E,$6C696272,$61727900
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
Resume Next 
End Proc
Procedure _DPROTECT
   If XSD=0 Then DEV$=XDISKNAMEB$ Else DEV$=XDISKNAMEA$
   '
   XPROTECT=0
   If DEV$="" Then _TXT["No drive selected !"] : Pop Proc
   If Not Exist(DEV$) Then _TXT[DEV$+" not available !"] : Pop Proc
   '
   Dir$=DEV$
   DEV$=Dir$
   DEV$=DEV$+Chr$(0)
   Repeat 
      INFO$=Space$(40)+Chr$(0)
      IN=Varptr(INFO$)
      Dreg(1)=Varptr(DEV$)
      Dreg(2)=-2
      LVOLOCK=Doscall(-84)
      Dreg(1)=LVOLOCK
      Dreg(2)=IN
      LVOINFO=Doscall(-114)
      LVOUNLOCK=Doscall(-90)
   Until Leek(IN+8)<84
   '
   XPROTECT=Leek(IN+8)
   If XPROTECT=80 Then _TXT["Disk is write protected !"]
   If XPROTECT=81 Then _TXT["Error occured... disk is not validated !"]
End Proc
Procedure _EDIT[B$,NF$,FGR]
   On Error Goto _FEHLER
   FGR2=FGR/80
   HELP$="Name: "+NF$+"     Size:"+Str$(FGR)+"     Lines max:"+Str$(FGR2)
   _TXT[HELP$]
   Ink 0 : Bar 0,15 To 640,223
   Ink 1
   Text 7,219,"Asc: 000   Hex: $00   Line: 00000   Pos: 000000   Search   Save as   ?   Abort"
   Gosub _G0
   Gosub _SHOW
   '
   Do 
      A$=Inkey$
      MK=Mouse Key
      If A$<>"" Then Gosub _TASTE
      If MK<>0
         Gosub _MAUS
         Gosub _G0
      End If 
   Loop 
   '
_TASTE:
   N=Asc(A$)
   If N=13 and I4<FGR2
      Add I3,1920
      I3=Min(I3,FGR-80)
      I3=Max(0,I3)
      If I4<FGR2 : Gosub _SHOW : End If 
      Clear Key 
      Return 
   End If 
   If N=27
      I3=Max(0,I3-1920)
      I4=Max(0,I4-48)
      Gosub _SHOW
      Clear Key 
      Return 
   End If 
   If N>27 and N<32 Then Gosub _ASCHEX : Return 
   If N>31 Then Gosub _POKE : Clear Key 
Return 
'
_MAUS:
   X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
   If Y>209 and Y<223
      If X>174 and X<278
         _G[175,210,277,222,1]
         _TXT["Enter linenumber:"]
         _EINGABE[19]
         I4=Abs(Val(XFILE$))
         I4=Min(I4,FGR2)
         I3=I4*80
         Gosub _SHOW
      End If 
      If X<81
         _G[0,210,80,222,1]
         _TXT["Enter ASCII value:"]
         _EINGABE[20]
         N=Min(255,Abs(Val(XFILE$)))
         Gosub _POKE
      End If 
      If X>87 and X<167
         _G[88,210,166,222,1]
         _TXT["Enter HEX value: $"]
         _EINGABE[19]
         XFILE$=Left$(XFILE$,2)
         XFILE$=Upper$(XFILE$)
         N=Val("$"+XFILE$)
         Gosub _POKE
      End If 
      If X>285 and X<391
         _G[286,210,390,222,1]
         _TXT["Enter position:"]
         _EINGABE[17]
         N=Min(FGR-1,Abs(Val(XFILE$)))
         CX=N mod 80
         I4=N/80
         I3=I4*80+CX
         Gosub _SHOW
      End If 
      If X>397 and X<464
         _G[398,210,463,222,1]
         _TXT["String to search:"]
         _EINGABE[19]
         If XFILE$=""
            _TXT["Search aborted !"]
            Return 
         End If 
         N$=XFILE$
         _TXT["Startaddress:"]
         _EINGABE[15]
         N=Abs(Val(XFILE$))
         If N-Len(N$)=>FGR
            _TXT["Illegal value of address !"]
            Return 
         End If 
         N=Hunt(Start(7)+N To Start(7)+FGR,N$)
         If N
            Add N,-Start(7)
            CX=N mod 80
            I4=N/80
            I3=I4*80+CX
            Gosub _SHOW
         Else 
            _TXT["String  » "+N$+" «  not found !"]
            Return 
         End If 
      End If 
      If X>469 and X<545
         _G[470,210,544,222,1]
         _TXT["From address <Return for start>:"]
         _EINGABE[34]
         N=Abs(Val(XFILE$))
         N=Min(N,FGR-1)
         _TXT["To address <Return for end>....:"]
         _EINGABE[34]
         C=Abs(Val(XFILE$))
         If C=0 : C=FGR : End If 
         C=Min(C,FGR)
         If N=>C
            _TXT["Illegal values for start- endaddress !"]
            Return 
         End If 
         _TXT["Filename <Return for old name> :"]
         _EINGABE[34]
         If XFILE$=""
            XFILE$=NF$
         End If 
         _TXT["Writing datas to "+B$+XFILE$+" !"]
         Bsave B$+XFILE$,Start(7)+N To Start(7)+C
      End If 
      If X>551 and X<575
         _G[552,210,574,222,1]
         _TXT[HELP$]
      End If 
      If X>581 and X<639
         _G[582,210,638,222,1]
         Wait 50
         Pop Proc
      End If 
   End If 
Return 
'
_POKE:
   Poke Start(7)+I3+CX+CY*80,N
   If N<32 or(N>127 and N<160)
      N=46
   End If 
   Ink 1 : Text CX*8,CY*8+22,Chr$(N)
   Gosub _ASCHEX
   N=28
   Gosub _ASCHEX
Return 
'
_SHOW:
   Ink 0 : Bar 0,15 To 640,209
   Ink 1
   For I=0 To 23
      For I2=0 To 79
         If I*80+I2+I3<FGR
            C=Peek(Start(7)+I*80+I2+I3)
            If C<32 or(C>127 and C<160)
               C=46
            End If 
            XLINE$=XLINE$+Chr$(C)
         End If 
      Next I2
      Inc I4
      Text 0,I*8+22,XLINE$
      XLINE$=""
   Next I
   CX=0
   CY=0
   CXALT=0
   CYALT=0
   LINE=I4-1
   Add LINE,-23
   LINE=Max(0,LINE)
   Gosub _ASCHEX
Return 
'
_ASCHEX:
   C=I3+CX+CY*80
   If N=28 and CX<79 and C+1<FGR Then Inc CX
   If N=29 and CX>0 Then Dec CX
   If N=30 and CY>0 Then Dec CY : Dec LINE
   If N=31 and CY<23 and C+80<FGR Then Inc CY : Inc LINE
   C=Peek(Start(7)+I3+CX+CY*80)
   C$=" 000"
   C0$=Str$(C)-" "
   Right$(C$,Len(C0$))=C0$
   Text 47,219,C$-" "
   Text 135,219,Hex$(C,2)
   C$=" 000000"
   C0$=Str$(I3+CX+CY*80)-" "
   Right$(C$,Len(C0$))=C0$
   Text 335,219,C$-" "
   C$=" 00000"
   Right$(C$,Len(Str$(LINE))-1)=Str$(LINE)-" "
   Text 231,219,C$-" "
   If C<32 or(C>127 and C<161) Then C=46
   Ink 1,0 : Text CXALT*8,CYALT*8+22,Chr$(CALT)
   Ink 1,2 : Text CX*8,CY*8+22,Chr$(C)
   Ink 1,0
   CALT=C
   CXALT=CX
   CYALT=CY
Return 
'
_G0:
   _G[0,210,80,222,0]
   _G[88,210,166,222,0]
   _G[175,210,277,222,0]
   _G[286,210,390,222,0]
   _G[398,210,463,222,0]
   _G[470,210,544,222,0]
   _G[552,210,574,222,0]
   _G[582,210,638,222,0]
Return 
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
Resume Next 
End Proc
Procedure _EINGABE[N]
   N=N*8+8
   XFILE$=""
   Ink 2,0
   Do 
      Repeat : I=Asc(Inkey$) : Until I
      Exit If I=13
      If I<>8 and Len(XFILE$)<61
         XFILE$=XFILE$+Chr$(I)
      End If 
      If I=8 and Len(XFILE$)>0
         XFILE$=Left$(XFILE$,Len(XFILE$)-1)
      End If 
      Text 6+N,250,XFILE$+" "
      Clear Key 
   Loop 
   Ink 1
End Proc
Procedure _ERROR[XE]
   If XE=11 Then N$="Out of variable space"
   If XE=24 Then N$="Out of memory"
   If XE=47 Then N$="Screen not opened"
   If XE=79 Then N$="File already exist"
   If XE=81 Then N$="File not found"
   If XE=82 Then N$="Illegal file name"
   If XE=84 Then N$="Disk is write protected"
   If XE=85 Then N$="Directory not empty"
   If XE=86 Then N$="Device not available"
   If XE=88 Then N$="Disc full"
   If XE=89 Then N$="File is protected against deletation"
   If XE=94 Then N$="I/O error"
   If XE=95 Then N$="File format not recognised"
   If N$="" Then N$="Illegal function call"
   _TXT[N$+" !  « AMOS error #"+Str$(XE)-" "+" »"]
End Proc
Procedure _G[X,Y,X2,Y2,S]
   If S=0 Then C1=2 : C2=3 Else C1=3 : C2=2
   Ink C1 : Draw X,Y To X2-1,Y : Draw X,Y To X,Y2
   Ink C2 : Draw X+1,Y2 To X2,Y2 : Draw X2,Y To X2,Y2 : Ink 1,0
End Proc
Procedure _GETDEVICES[N]
   Dim XDEV$(50)
   Gosub L003
   If N=0
      Ink 0 : Bar 1,31 To 297,177
      For I2=0 To I
         XDIRA$(I2)=XDEV$(I2) : XSTATUSA(I2)=-2
      Next I2
      XPOSA=0 : XANZA#=I
      _SHOWDIR[0]
   Else 
      Ink 0 : Bar 342,31 To 638,177
      For I2=0 To I
         XDIRB$(I2)=XDEV$(I2) : XSTATUSB(I2)=-2
      Next I2
      XPOSB=0 : XANZB#=I
      _SHOWDIR[1]
   End If 
   Pop Proc
L003:
   If Drive("DF0:") Then XDEV$(0)="DF0:" : Inc I
   If Drive("DF1:") Then XDEV$(I)="DF1:" : Inc I
   If Drive("DF2:") Then XDEV$(I)="DF2:" : Inc I
   If Drive("DF3:") Then XDEV$(I)="DF3:" : Inc I
   If Drive("DH0:") Then XDEV$(I)="DH0:" : Inc I
   If Drive("VD0:") Then XDEV$(I)="VD0:" : Inc I
   XDEV$(I)="RAM:" : Inc I
   XDEV$(I)=Dev First$("")
   Do 
      If XDEV$(I)="" Then Dec I : Exit 
      I2=Instr(XDEV$(I),":")
      XDEV$(I)=Left$(XDEV$(I),I2)
      XDEV$(I)=Right$(XDEV$(I),I2-1)
      Inc I
      XDEV$(I)=Dev Next$
   Loop 
   Return 
End Proc
Procedure _HELP[MK,X,N]
   On Error Goto _FEHLER
   '
   XHELP=0
   If N=1 Then Add X,8
   If XMENABCD<3
      If Exist("SYS:LIBS/AmBOS.Lib")
         Restore Str$(XMENABCD)-" "
         For I=1 To X+1
            Read XPOS,XANZ
         Next I
         Set Input 10,-1
         I2=True
         Dec MK
         Open In 1,"SYS:LIBS/AmBOS.Lib"
            Pof(1)=XPOS*76+MK*7068
            If XE
               Goto _ENDOFHELP
            End If 
            For I=1 To XANZ
               Inc I2
               If I2=3 : I2=0 : Wait Key : End If 
               Line Input #1,N$
               _TXT[N$-"*"]
            Next I
         _ENDOFHELP:
         Close 1
      Else 
         _TXT["Can`t open SYS:LIBS/AmBOS.Lib !"]
      End If 
   Else 
      If X<14
         N$=XMEND$(X)
         If N$<>""
            _TXT[N$]
         Else 
            If MK=1
               _TXT["MenÜoption wurde noch nicht definiert !"]
            Else 
               _TXT["Menuoption is not defined yet !"]
            End If 
         End If 
      Else 
         If MK=1
            _TXT["Definiert eine Option mit einem CLI-Befehl !"]
         Else 
            _TXT["Defines an option with a CLI command !"]
         End If 
      End If 
   End If 
Pop Proc
'
0 Data 0,1
  Data 1,2
  Data 3,2
  Data 5,2
  Data 7,1
  Data 8,1
  Data 9,1
  Data 10,2
  Data 12,1
  Data 13,2
  Data 15,2
  Data 17,2
  Data 19,2
  Data 21,2
  Data 23,1
1 Data 24,1
  Data 25,2
  Data 27,2
  Data 29,1
  Data 30,1
  Data 31,3
  Data 34,4
  Data 38,2
  Data 40,2
  Data 42,2
  Data 44,1
  Data 45,2
  Data 47,1
  Data 48,2
  Data 50,1
2 Data 51,2
  Data 53,2
  Data 55,1
  Data 56,2
  Data 58,2
  Data 60,2
  Data 62,1
  Data 63,18
  Data 81,2
  Data 83,1
  Data 84,1
  Data 85,3
  Data 88,1
  Data 89,2
  Data 91,1
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _INSTALLAMBOS
   Screen Open 0,640,256,4,Hires
   Flash Off 
   Curs Off 
   Palette $77A,$124,$CCE,$557
   Colour Back $77A
   Colour 17,$FFF
   Colour 18,$0
   Colour 19,$E00
End Proc
Procedure _INSTALLSCREEN
   '* Pfeile
   '* ------
   Cls 0 : Ink 3 : For I=0 To 4 : Draw 5-I,1+I To 5+I,1+I : Next I : Bar 4,6 To 6,9 : Get Block 1,0,0,10,9,0 : Cls 0
   Put Block 1,304,154 : Put Block 1,325,154 : Vrev Block 1 : Put Block 1,304,169 : Put Block 1,325,169 : Del Block 1
   '
   '* Oben
   '* ----
   _G[110,0,529,12,0] : _G[0,0,107,12,0] : _G[532,0,639,12,0]
   '
   '* S Oben    
   '* ------
   _NEWGG[0] : _NEWGG[1]
   '
   _G[275,15,298,27,0] : _G[301,15,338,27,0] : _G[341,15,364,27,0]
   Ink 3 : Bar 307,19 To 312,23 : Bar 305,20 To 314,22
   Bar 318,20 To 332,22 : Draw 329,17 To 329,25 : Draw 330,18 To 330,24 : Draw 331,19 To 331,23 : Plot 333,21
   If XSD=1 Then XSD=0 : _SOURCEDEST
   Ink 2 : Text 283,24,Str$(X09A)-" " : Text 349,24,Str$(X09B)-" "
   '
   '* Balken
   '* ------
   _G[301,30,317,150,0] : _SCROLLBAR[0] : _G[301,152,317,164,0] : _G[301,166,317,178,0]
   _G[322,30,338,150,0] : _SCROLLBAR[1] : _G[322,152,338,164,0] : _G[322,166,338,178,0]
   _G[301,180,317,192,0] : Ink 3 : Bar 306,184 To 311,188 : Bar 304,185 To 313,187
   _G[322,180,338,192,0] : Ink 3 : Bar 327,184 To 332,188 : Bar 325,185 To 334,187
   '
   '* Dateifenster
   '* ------------
   _G[0,30,298,178,0] : _G[341,30,639,178,0]
   '
   _G[0,180,298,192,0] : _G[1,181,297,191,1]
   _G[341,180,639,192,0] : _G[342,181,638,191,1]
   '
   _OPTIONOFF
   _NEWMENU[XMENABCD]
   '
   _G[0,225,639,255,0] : _G[1,226,638,254,1]
   Ink 1,0 : For I=0 To 12 : Read X,Y,N$ : Text X,Y,N$ : Next I
   '
   _SHOWDIR[0] : _SHOWDIR[1] : Ink 1,0 : _SHOWNAME[0] : _SHOWNAME[1]
   '
   Def Scroll 1,2,34 To 296,178,0,-1
   Def Scroll 2,345,34 To 638,178,0,-1
   Def Scroll 3,2,31 To 296,176,0,1
   Def Scroll 4,345,31 To 638,176,0,1
   Def Scroll 5,6,229 To 636,253,0,-1
   '
   _MENU[XMENABCD]
   _MEMTIME
   Limit Mouse X Hard(0),Y Hard(0) To X Hard(639),Y Hard(255)
   '
   Data 6,9,"Mem:",542,9,"Time:",120,9,"AmBOS V2.0b (r) May, 29th 1993 by Volker Stepprath"
   Data 2,24,"Device",57,24,"Update",112,24,"Parent",180,24,"All",227,24,"Clear"
   Data 369,24,"Device",424,24,"Update",479,24,"Parent",547,24,"All",594,24,"Clear"
End Proc
Procedure _KONVERTIEREN[XREM$,XASSOURCE$,XDAT$]
   On Error Goto _FEHLER
   If XSD=0 Then A$=XDISKNAMEA$ : B$=XDISKNAMEB$ Else A$=XDISKNAMEB$ : B$=XDISKNAMEA$
   '
   N0=-1
   N$=XFILE$
   N=Val(Right$(N$,8))
   _REALNAME[N$]
   N$=A$+XFILE$
   '
   _TXT["Binary data file to read: "+N$-B$]
   Reserve As Data 7,N
   If XE Then Pop Proc
   Bload N$,Start(7)
   If XE Then Pop Proc
   '    
   _TXT[XASSOURCE$]
   _EINGABE[27]
   If XFILE$="" Then _TXT["Converting aborted !"] : Pop Proc Else N$=B$+XFILE$
   '
   _TXT["[L]ong / [W]ord / [B]yte:"]
   _EINGABE[27]
   N0$=Upper$(XFILE$)
   If N0$="L" Then N0=3
   If N0$="W" Then N0=1
   If N0$="B" Then N0=0
   If N0<0 Then _TXT["Illegal value... converting aborted !"] : Pop Proc
   If Instr(XDAT$,"DC.") Then XDAT$=XDAT$+N0$+" "
   '
   _TXT["# of data items per line:"]
   _EINGABE[27]
   N1=Val(XFILE$)
   If N1=0 Then _TXT["Converting aborted !"] : Pop Proc
   '    
   _TXT["Percent converted: 0   %"]
   '
   C$=""
   Open Out 1,N$
      If XE Then Pop Proc
      Print #1,XREM$+"*"+Str$(N/(N0+1))+" datas *";
      For I2=0 To N
         Text 166,250,Str$(100.0/N*I2)
         If Mouse Key<>0 Then I2=N : N=0
         If I2<N
            If N0=0 : C0$=Hex$(Peek(Start(7)+I2),2) : End If 
            If N0=1 : C0$=Hex$(Deek(Start(7)+I2),4) : End If 
            If N0=3 : C0$=Hex$(Leek(Start(7)+I2),8) : End If 
            C$=C$+C0$+","
            Add I2,N0
            Inc I4
            If I4=N1
                Print #1,Chr$(10)+XDAT$+Left$(C$,Len(C$)-1);
                C$=""
                I4=0
            End If 
         End If 
      Next I2
      If N
         Text 174,250,"100"
         C$=Left$(C$,Len(C$)-1)
         If C$<>"" and(C$<>"$") : Print #1,Chr$(10)+XDAT$+C$; : End If 
         Print #1,Chr$(10);
      Else 
         _TXT["Converting aborted !"]
      End If 
   Close 1
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _KONVERTIERENASCPBK[N]
   If XSD=0 Then A$=XDISKNAMEA$ : B$=XDISKNAMEB$ Else A$=XDISKNAMEB$ : B$=XDISKNAMEA$
   On Error Goto _FEHLER
   '
   A=Val(Right$(XFILE$,8))
   _REALNAME[XFILE$]
   N$=B$+XFILE$
   '
   _TXT["Binary data file to read: "+XFILE$]
   If N=0
      Reserve As Data 7,A
      If XE : Pop Proc : End If 
      Bload N$,Start(7)
      If XE : Pop Proc : End If 
   Else 
      Pload N$,7
      If XE
         Pop Proc
      End If 
      A=Length(7)
   End If 
   '    
   _TXT["Save as converted source:"]
   _EINGABE[27]
   If XFILE$="" Then _TXT["Converting aborted !"] : Pop Proc
   N$=A$+XFILE$
   '
   _TXT["# of data items per line:"]
   _EINGABE[27]
   B=Val(XFILE$)
   If B<=0 Then _TXT["Converting aborted !"] : Pop Proc
   Dec A
   Dec B
   '
   Open Out 1,N$
      If XE Then Pop Proc
      _TXT["Percent converted: 0   %"]
      Print #1,"Rem *"+Str$(A+1)+" datas *";
      For I=0 To A
         N0$=""
         For I2=0 To B
            If I+I2<=A
               N0$=N0$+Str$(Peek(Start(7)+I+I2))+","
            End If 
         Next I2
         Add I,B
         Text 166,250,Str$(Min(100,100.0/A*(I+I2)))
         If Mouse Key<>0 : _TXT["Converting aborted !"] : I=A : End If 
         Print #1,Chr$(10)+"Data "+Left$(N0$,Len(N0$)-1)-" ";
      Next I
      Print #1,Chr$(10);
   Close 1
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _KOPIEREN[N$,N2$]
   If Upper$(N$)=Upper$(N2$)
      _TXT["Illegal filename !"]
      Pop Proc
   End If 
   '
   On Error Goto _FEHLER
   '
   Open Out 1,N2$
      If XE Then Pop Proc
   Close 1
   '
   _TXT["Copying... "+N$]
   '
   Reserve As Data 7,10000
   '
   N$=N$+Chr$(0)
   N2$=N2$+Chr$(0)
   '
   Dreg(1)=Varptr(N$)
   Dreg(2)=1005
   LVOOPENA=Doscall(-30)
   '
   Dreg(1)=Varptr(N2$)
   Dreg(2)=1006
   LVOOPENB=Doscall(-30)
   '
   Repeat 
      '
      Dreg(1)=LVOOPENA
      Dreg(2)=Start(7)
      Dreg(3)=10000
      LVOREAD=Doscall(-42)
      '
      Dreg(1)=LVOOPENB
      Dreg(2)=Start(7)
      Dreg(3)=LVOREAD
      LVOWRITE=Doscall(-48)
      '
   Until LVOREAD<10000
   '
   Dreg(1)=LVOOPENA
   LVOCLOSE=Doscall(-36)
   '
   Dreg(1)=LVOOPENB
   LVOCLOSE=Doscall(-36)
   '
   Erase 7
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _LEDONOFF
   _TXT["Press the SPACE BAR for filter On / Off !"]
   Repeat 
      If Inkey$=" "
         If N=1
            N=0
            Led Off 
         Else 
            N=1
            Led On 
         End If 
         Clear Key 
      End If 
   Until Mouse Key
End Proc
Procedure _LESEDISK[N$,N]
   If N$=Chr$(255) Then Pop Proc
   If N$="" Then Pop Proc
   If Exist(N$)=False Then Pop Proc
   '
   If N=0
      For I2=0 To 200
         XDIRA$(I2)=Chr$(255) : XSTATUSA(I2)=0
      Next I2
   Else 
      For I2=0 To 200
         XDIRB$(I2)=Chr$(255) : XSTATUSB(I2)=0
      Next I2
   End If 
   '
   Dir$=N$
   '
   XFILE$=Dir First$("")
   If XFILE$="" Then I=-1
   Do 
      If N=0
         If XFILE$<>"" : XDIRA$(I)=XFILE$ : End If 
      Else 
         If XFILE$<>"" : XDIRB$(I)=XFILE$ : End If 
      End If 
      XFILE$=Dir Next$
      If XFILE$="" or I=200 Then Exit Else Inc I
   Loop 
   Ink 0
   If N=0
      Bar 1,31 To 297,177
      XANZA#=I : XPOSA=0 : N=0
      XLENA#=115/Max(1,XANZA#) : XBARA#=Min(115,115/Max(1,XANZA#/18))-XLENA#
      XDISKNAMEA$=Dir$
      X09NAME$(X09A)=XDISKNAMEA$
   Else 
      Bar 342,31 To 638,177
      XANZB#=I : XPOSB=0 : N=1
      XLENB#=115/Max(1,XANZB#) : XBARB#=Min(115,115/Max(1,XANZB#/18))-XLENB#
      XDISKNAMEB$=Dir$
      X09NAME$(X09B)=XDISKNAMEB$
   End If 
   _MAKENAME[N]
   _SHOWDIR[N]
   _SHOWNAME[N]
   _SCROLLBAR[N]
End Proc
Procedure _MAKENAME[N]
   If N=0
      X09$(X09A)=""
      If XDIRA$(0)<>Chr$(255)
         For I=0 To XANZA#
            N$=XDIRA$(I)
            XSTATUSA(I)=0
            Gosub L001
            XDIRA$(I)=N$
            X09$(X09A)=X09$(X09A)+N$
         Next I
      End If 
   Else 
      X09$(X09B)=""
      If XDIRB$(0)<>Chr$(255)
         For I=0 To XANZB#
            N$=XDIRB$(I)
            XSTATUSB(I)=0
            Gosub L001
            XDIRB$(I)=N$
            X09$(X09B)=X09$(X09B)+N$
         Next I
      End If 
   End If 
   Pop Proc
L001:
   N2$=Right$(N$,8)
   N$=N$-N2$
   N2$=N2$-" "
   N$=Left$(N$,29)
   If N2$="" Then N2$="[DIR]" : N$=N$+Space$(29-Len(N$))
   N2$=Space$(8-Len(N2$))+N2$
   N$=Right$(N$,Len(N$)-1)
   N$=Left$(N$,28)+N2$
   Return 
End Proc
Procedure _MEMTIME
   N$=Str$(Chip Free+Fast Free)
   Text 36,9,N$
   '
   N$=Space$(12)
   Dreg(1)=Varptr(N$)
   LVODATESTAMP=Doscall(-192)
   H=Leek(Varptr(N$)+4)
   M=H mod 60
   H=H/60
   H$=" 00" : Right$(H$,Len(Str$(H))-1)=Str$(H)-" "
   M$=" 00" : Right$(M$,Len(Str$(M))-1)=Str$(M)-" "
   Text 590,9,(H$+":"+M$)-" "
   '
   Every On 
End Proc
Procedure _MENU[N]
   If N<3
      Restore Chr$(65+N)
      For I=0 To 7
         Read N$
         Ink 0 : Bar I*80+3,196 To I*80+77,206
         N=Text Length(N$)
         Ink 1 : Text I*80+40-N/2,204,N$
      Next I
      For I=0 To 6
         Read N$
         Ink 0 : Bar I*80+3,211 To I*80+77,221
         N=Text Length(N$)
         Ink 1 : Text I*80+40-N/2,219,N$
      Next I
   Else 
      For I=0 To 7
         Ink 0 : Bar I*80+3,196 To I*80+77,206
         N$=XMEND$(I)
         If N$<>""
            N=Instr(N$,"=")
            N$=Left$(N$,Min(N-1,9))
            N=Text Length(N$)
            Ink 2 : Text I*80+40-N/2,204,N$
         End If 
      Next I
      For I=0 To 6
         Ink 0 : Bar I*80+3,211 To I*80+77,221
         N$=XMEND$(I+8)
         If N$<>""
            N=Instr(N$,"=")
            N$=Left$(N$,Min(N-1,9))
            N=Text Length(N$)
            If I+8<14 : Ink 2 Else Ink 1 : End If 
            Text I*80+40-N/2,219,N$
         End If 
      Next I
   End If 
A: Data "COPY","COPY TO","MOVE","MOVE TO","DELETE","MAKE DIR","RENAME","PROTECT"
   Data "COMMENT","READ","HEX READ","SHOW IFF","EXECUTE","SIZE","INFO"
B: Data "SORT","MERGE","COMPARE","SAVE MEM","PACK","UNPACK","CHECK VEC","CLEAR SYS"
   Data "CONV ASM","CONV BAS","CONV ASC","CONV PBK","PLAY ABK","PLAY MED","PLAY MOD"
C: Data "VALUE","COLOURS","GET DAY","OPEN WB","CLOSE WB","CLOSE","ABOUT","EDITOR"
   Data "DISKCOPY","FORMAT","VERIFY","INSTALL","BLK DAT","DAT BLK","EXIT"
End Proc
Procedure _NEWGG[N]
   If N Then N=367
   For I=0 To 4 : _G[I*55+N,15,I*55+52+N,27,0] : Next I
End Proc
Procedure _NEWMENU[N]
   For I=0 To 3
      _G[I*20+561,210,I*20+577,222,0]
      Ink 2 : Text I*20+566,219,Chr$(65+I)
   Next I
   _G[N*20+561,210,N*20+577,222,1]
End Proc
Procedure _ORDNEN[B$]
   On Error Goto _FEHLER
   '
   FGR=Val(Right$(XFILE$,8))
   _REALNAME[XFILE$]
   '
   Reserve As Data 7,FGR
   If XE Then Pop Proc
   Bload B$+XFILE$,7
   If XE Then Pop Proc
   '
   _TXT["Sorting "+XFILE$+" ... !"]
   For X=0 To FGR
      F=Hunt(Start(7)+X To Start(7)+FGR,Chr$(10))
      If F Then Inc I2 : X=F-Start(7)
   Next X
   I6#=I2
   _TXT["Lines..............:"+Str$(I2)]
   '
   If I2<1
      _TXT["Sorry... can`t sort "+FILE$+" !"]
      Erase 7
      Pop Proc
   End If 
   '
   Dec I2
   Dim SF$(I2)
   For X=0 To I2
      SF$(X)=Chr$(255)
   Next X
   '
   _TXT["Calculating line...:"+Str$(I5)]
   For X=0 To FGR
      F=Hunt(Start(7)+X To Start(7)+FGR,Chr$(10))
      If F
         I3=Start(7)+X
         If Free<1000
            _ERROR[11]
            Pop Proc
         End If 
         For I4=I3 To F
            C=Peek(I4) : X$=X$+Chr$(C)
            If Mouse Key<>0
               _TXT["Sorting of "+XFILE$+" aborted !"]
               Pop Proc
            End If 
         Next I4
         X$=X$-Chr$(10)
         If Len(X$)>0
            SF$(I5)=X$+Chr$(10)
            Inc I5
         End If 
         X=F-Start(7)
         X$=""
         Text 182,250,Str$(I5)
      End If 
   Next X
   '
   Sort SF$(0)
   '
   For X=0 To I2
      If SF$(X)=Chr$(255) Then Dec I2
   Next X
   '
   _TXT["Lines after sorting:"+Str$(I2+1)]
   '
   Open Out 1,B$+XFILE$
      For I=0 To I2
         Print #1,SF$(I);
         SF$(I)=""
      Next I
   Close 1
   '
   _TXT["Sorting of "+XFILE$+" finished !"]
Pop Proc
'
_FEHLER:
   XE=Errn
   _ERROR[XE]
   Resume Next 
End Proc
Procedure _OPTIONOFF
   For I=0 To 7 : _G[1+I*80,195,(I+1)*80-2,207,0] : Next I
   For I=0 To 6 : _G[1+I*80,210,(I+1)*80-2,222,0] : Next I
End Proc
Procedure _REALNAME[N$]
   N$=N$-Right$(N$,8)
   For I=28 To 1 Step -1
      If Mid$(N$,I,1)<>" " Then N=I : I=1
   Next I
   XFILE$=Left$(N$,N)
End Proc
Procedure _RUN
   LVOOPENWORKBENCH=Intcall(-210)
   Wait Vbl 
   Amos To Back 
   Screen Close 0
   If Exist("SYS:") Then Dir$="SYS:"
   XFILE$=XFILE$+Chr$(0)
   '
   N2$="CON:0/0/640/200/PRESS LEFT AMIGA + A TO COME BACK !"+Chr$(0)
   Dreg(1)=Varptr(N2$)
   Dreg(2)=1006
   LVOOPEN=Doscall(-30)
   '
   Dreg(1)=Varptr(XFILE$)
   Dreg(2)=0
   Dreg(3)=LVOOPEN
   LVOEXECUTE=Doscall(-222)
   '
   Repeat 
      Multi Wait 
   Until Amos Here
   '
   Dreg(1)=LVOOPEN
   LVOCLOSE=Doscall(-36)
   '
   _INSTALLAMBOS
   _INSTALLSCREEN
End Proc
Procedure _TXT[N$]
   For I=0 To 7
      Wait Vbl : Scroll 5
   Next I
   Text 6,250,"> "+N$
End Proc
Procedure _SCROLLBAR[N]
   If N=0
      Ink 0 : Bar 306,32 To 312,149
      XBARPOSA#=XPOSA*XLENA#
      If XANZA#<18 : XBARA#=148 : XBARPOSA#=0 : End If 
      Ink 1 : Bar 306,32+XBARPOSA# To 312,Min(148,33+XBARPOSA#+XBARA#)
   Else 
      Ink 0 : Bar 327,32 To 333,149
      XBARPOSB#=XPOSB*XLENB#
      If XANZB#<18 : XBARB#=148 : XBARPOSB#=0 : End If 
      Ink 1 : Bar 327,32+XBARPOSB# To 333,Min(148,33+XBARPOSB#+XBARB#)
   End If 
End Proc
Procedure _SCROLLDOWN[N]
   If N=0
      If XPOSA>0
         Dec XPOSA
         For I=0 To 7 : Scroll 3 : Next I
         If XSTATUSA(XPOSA)=1 : Ink 2,1 : Else Ink 1,0 : End If 
         Text 5,39,XDIRA$(XPOSA)
         _SCROLLBAR[0]
      End If 
   Else 
      If XPOSB>0
         Dec XPOSB
         For I=0 To 7 : Scroll 4 : Next I
         If XSTATUSB(XPOSB)=1 : Ink 2,1 Else Ink 1,0 : End If 
         Text 346,39,XDIRB$(XPOSB)
         _SCROLLBAR[1]
      End If 
   End If 
End Proc
Procedure _SCROLLPAGE[N,Y]
   If N=0
      If XBARPOSA#<Y-32
         For I=1 To 17 : _SCROLLUP[0] : Next I
      Else 
         For I=1 To 17 : _SCROLLDOWN[0] : Next I
      End If 
   Else 
      If XBARPOSB#<Y-32
         For I=1 To 17 : _SCROLLUP[1] : Next I
      Else 
         For I=1 To 17 : _SCROLLDOWN[1] : Next I
      End If 
   End If 
End Proc
Procedure _SCROLLTOPBUTTOM[N,MK]
   If N=0
      If MK=1 : XPOSA=0 Else XPOSA=Max(0,XANZA#-17) : End If 
      _SCROLLBAR[0]
      _SHOWDIR[0]
   Else 
      If MK=1 : XPOSB=0 Else XPOSB=Max(0,XANZB#-17) : End If 
      _SCROLLBAR[1]
      _SHOWDIR[1]
   End If 
End Proc
Procedure _SCROLLUP[N]
   If N=0
      If XPOSA+17<200 and XPOSA+17<XANZA#
         Inc XPOSA
         For I=0 To 7 : Scroll 1 : Next I
         If XSTATUSA(XPOSA+17)=1 : Ink 2,1 Else Ink 1,0 : End If 
         Text 5,175,XDIRA$(XPOSA+17)
        _SCROLLBAR[0]
      End If 
   Else 
      If XPOSB+17<200 and XPOSB+17<XANZB#
         Inc XPOSB
         For I=0 To 7 : Scroll 2 : Next I
         If XSTATUSB(XPOSB+17)=1 : Ink 2,1 Else Ink 1,0 : End If 
         Text 346,175,XDIRB$(XPOSB+17)
         _SCROLLBAR[1]
      End If 
   End If 
End Proc
Procedure _SELEKTION[N,MK,Y]
   Y=(Y-32)/8
   If N=0
      If XSTATUSA(Y+XPOSA)=-2
         Ink 2,1 : Text 6,39+Y*8,XDIRA$(Y+XPOSA)+Space$(36-Len(XDIRA$(Y+XPOSA)))
         _LESEDISK[XDIRA$(Y+XPOSA),0]
         Pop Proc
      End If 
      If XSTATUSA(Y+XPOSA)=0
         XSTATUSA(Y+XPOSA)=1
      Else 
         XSTATUSA(Y+XPOSA)=0
      End If 
      _SHOWDIR[0]
      If MK=2 and(Right$(XDIRA$(Y+XPOSA),5)="[DIR]")
         N$=XDIRA$(Y+XPOSA)
         Gosub L002
         N$=XDISKNAMEA$+N$
         _LESEDISK[N$,0]
      End If 
   Else 
      If XSTATUSB(Y+XPOSB)=-2
         Ink 2,1 : Text 346,39+Y*8,XDIRB$(Y+XPOSB)+Space$(36-Len(XDIRB$(Y+XPOSB)))
         _LESEDISK[XDIRB$(Y+XPOSB),1]
         Pop Proc
      End If 
      If XSTATUSB(Y+XPOSB)=0
         XSTATUSB(Y+XPOSB)=1
      Else 
         XSTATUSB(Y+XPOSB)=0
      End If 
      _SHOWDIR[1]
      If MK=2 and(Right$(XDIRB$(Y+XPOSB),5)="[DIR]")
         N$=XDIRB$(Y+XPOSB)
         Gosub L002
         N$=XDISKNAMEB$+N$
         _LESEDISK[N$,1]
      End If 
   End If 
Pop Proc
'
L002:
   N$=Left$(N$,31)
   N=30
   For I=29 To 1 Step -1
      If Mid$(N$,I,1)=" " Then Dec N Else I=1
   Next I
   N$=Left$(N$,N-1)
Return 
End Proc
Procedure _SHOWDIR[N]
   If N=0
      If XDIRA$(0)=Chr$(255) : Pop Proc : End If 
      For I=0 To 17
         If XSTATUSA(I+XPOSA)=1 : Ink 2,1 Else Ink 1,0 : End If 
         If I+XPOSA<=XANZA# : Text 5,39+I*8,XDIRA$(I+XPOSA) : End If 
      Next I
   Else 
      If XDIRB$(0)=Chr$(255) : Pop Proc : End If 
      For I=0 To 17
         If XSTATUSB(I+XPOSB)=1 : Ink 2,1 Else Ink 1,0 : End If 
         If I+XPOSB<=XANZB# : Text 346,39+I*8,XDIRB$(I+XPOSB) : End If 
      Next I
   End If 
End Proc
Procedure _SHOWNAME[N]
   Ink 1,0
   If N=0
      Text 5,188,Space$(36) : Text 5,188,Left$(XDISKNAMEA$,36)
   Else 
      Text 346,188,Space$(36) : Text 346,188,Left$(XDISKNAMEB$,36)
   End If 
End Proc
Procedure _SOURCEDEST
   Add XSD,1,0 To 1
   Get Block 1,302,16,36,10,1
   Ink 0 : Bar 302,16 To 337,26
   Hrev Block 1
   Put Block 1,288,16
   Del Block 1
   Wait 5
End Proc
Procedure _X09AB[N]
   If N=0
      XANZA#=Max(0,Len(X09$(X09A))/36-1) : XPOSA=0
      XLENA#=115/Max(1,XANZA#) : XBARA#=Min(115,115/Max(1,XANZA#/18))-XLENA#
      For I=0 To 200
         XDIRA$(I)=Chr$(255)
         XSTATUSA(I)=0
      Next I
      For I=0 To XANZA#
         N$=Mid$(X09$(X09A),I*36+1,36)
         XDIRA$(I)=N$
      Next I
      XDISKNAMEA$=X09NAME$(X09A)
      Ink 0 : Bar 1,31 To 297,177
      _SHOWDIR[0]
      _SHOWNAME[0]
      Ink 2,0 : Text 283,24,Str$(X09A)-" "
   Else 
      XANZB#=Max(0,Len(X09$(X09B))/36-1) : XPOSB=0
      XLENB#=115/Max(1,XANZB#) : XBARB#=Min(115,115/Max(1,XANZB#/18))-XLENB#
      For I=0 To 200
         XDIRB$(I)=Chr$(255)
         XSTATUSB(I)=0
      Next I
      For I=0 To XANZB#
         N$=Mid$(X09$(X09B),I*36+1,36)
         XDIRB$(I)=N$
      Next I
      XDISKNAMEB$=X09NAME$(X09B)
      Ink 0 : Bar 342,31 To 638,177
      _SHOWDIR[1]
      _SHOWNAME[1]
      Ink 2,0 : Text 349,24,Str$(X09B)-" "
   End If 
End Proc
