home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 67 / af067a.adf / ACCESS.DMS / ACCESS.adf / Disc_Manager.AMOS / Disc_Manager.amosSourceCode < prev   
AMOS Source Code  |  1993-03-16  |  49KB  |  1,679 lines

  1. '----------------------------------  
  2. ' AMOS Professional Disc Manager   
  3. ' by Fran�ois Lionet 
  4. ' (c) 1992 Europress Software Ltd. 
  5. '----------------------------------
  6.  
  7. ' Set bigger buffer for better speed 
  8. Set Buffer 80
  9.  
  10. VER$="1.1"
  11.  
  12. ' Maximum number of files looked for 
  13. Global MXFF
  14. MXFF=2000
  15.  
  16. ' Maximum number of files in displayed directory 
  17. Global MXFILE
  18. MXFILE=350
  19.  
  20. ' Never break out of the program!
  21. Break Off 
  22.  
  23. ' More memory! 
  24. Close Editor 
  25.  
  26. Dim MN$(55),FLAG(5),XDIR(1),XSLI(1),FILE$(1,MXFILE),SIZE(1,MXFILE),FLAG$(1)
  27. Dim SDIR(1),PDIR(1),OPDIR(1),PATH$(1),XFILE(1),SSL(1),ESL(1),DFRI(1),DNAME$(1)
  28. Dim OK(1),FILT$(1)
  29. Dim FF$(MXFF)
  30. Dim D$(12),R$(12)
  31.  
  32. Global MN$(),NMN,FLAG(),YMN,MNDOWN
  33. Global FILE$(),SIZE(),FLAG$()
  34. Global XDIR(),YDIR,SXDIR,SYDIR,SDIR(),PDIR(),DFRI(),DNAME$(),OK()
  35. Global XFILE(),YFILE,SXFILE,NLINE,LFILE
  36. Global XSLI(),YSLI,SXSLI,SYSLI,SSL(),ESL()
  37. Global PATH$(),XPATH,YPATH,SXPATH,SYPATH,FILT$()
  38. Global XINF,YINF,SXINF,SYINF
  39. Global MX,MY,MZ,MK
  40. Global C0,C1,C2,C3,C4,C5,C6,C7,CA,CNA,ACT
  41. Global SYWORK,DEV$,ACT,NFILT$
  42. Global FFERR,FF$(),NFF,PFF,NDD,NSP,TSIZE
  43. Global BLOC,ALERT,PAL$
  44. Global DBANK
  45.  
  46. DBANK=11
  47.  
  48. Global SREAD,BUF_L,LINE_END,SCR_TY,SCR_TL,SCR_V,PTEXTE,SCR_Y,Y_BASE
  49. BUF_L=2000 : Y_BASE=45 : SREAD=4
  50.  
  51. SYWORK=256 : If Ntsc : SYWORK=200 : End If 
  52. CA=5 : CNA=4
  53. C0=2 : C1=6 : C2=2 : C3=1 : C4=3 : C5=4 : C6=7 : C7=5
  54. SAMSP=10169
  55. Request Off 
  56. Resource Bank 16
  57.  
  58. BPIC=10 : MN1=15 : MNDOWN=41
  59. N=20 : Repeat : N=N+1 : Read MN$(N) : Until MN$(N)="End" : NMN=N-1 : _SET_FLAGS
  60. Data "A 01000004288016_Act","a 03352004288016_Act","  02288004064016_MnQuit"
  61. Data "  90000020272016_Path","  05272020016008_Dn0","  06272028016008_Up0","  07288020032016_Par0","  07320020032016_Par1","  05352020016008_Dn1","  06352028016008_Up1","  91368020272016_Path"
  62. Data "/ 00_Name","/ 00_Name","/ 00_Sl","/ 00_Sl"
  63. Data "  11288037032012_All"
  64. Data "  12320037032012_Clear"
  65. Data "FA13288049032012_DInfo"
  66. Data "FB14320049032012_Sizes"
  67. Data "  15288061032012_Flip"
  68. Data "  16320061032012_Infos"
  69. Data "  17288073064012_Copy"
  70. Data "  18288085064012_Ren"
  71. Data "  19288097064012_Del"
  72. Data "  20288109064012_MDir"
  73. Data "  21288121064012_OBig"
  74. Data "  22288133064012_Exam"
  75. Data "  24288145064012_Format"
  76. Data "  25288157064012_DCopy"
  77. Data "End"
  78.  
  79. _DIA0: Data 100,3,"End"
  80. _DIA1: Data 100,3,"  28552016064012_DOut","End"
  81. _DIA4: Data 92,5,"  19360032064012_DGo","  29424032064012_DGo","  34488032064012_DGo","  30552032064012_DOut","End"
  82. _DIAD: Data 100,3,"  30552016064012","End"
  83. _DIA2: Data 92,5,"  17488032064012","  30552032064012","End"
  84. _DIA1B: Data 100,4,"  30552024064012","End"
  85. _DIA2B: Data 92,3,"  26488016064012","  27552016064012","End"
  86.  
  87. _FNAME$="Empty" : FLAG(2)=1
  88. SDRV$="Df0:" : SDRV=0 : DDRV$="Df0:" : DDRV=0
  89. LFILE=48 : NFLT$=".info/*.info/*.*.info/*.*.*.info"
  90. NFILT$=NFLT$ : If FLAG(0) : NFILT$="" : End If : Set Dir LFILE,NFILT$
  91. ACT=-1 : _INIT_WORK
  92. _DISPLAY_ACT[0]
  93.  
  94. ' Main loop
  95. Timer=999
  96. ACT=1 : MK=2 : MZ=32 : MX=480 : Gosub _NAME
  97. ACT=0 : MK=2 : MZ=32 : MX=160 : Gosub _NAME
  98. Do 
  99.    Repeat 
  100.       _MOUSE
  101.       If FMK : MK=FMK : MZ=FMZ : MX=FMX : MY=FMY : FMK=FMK2 : FMK2=0 : FMZ=FMZ2 : End If 
  102.       If ALERT
  103.          ALERT=ALERT-1
  104.          If ALERT=0 : _DISPLAY_INF[ACT] : End If 
  105.       End If 
  106.    Until MK<>0 and MZ<>0
  107.    MFLAG=0
  108.    Do 
  109.       
  110.       MFLAG=MFLAG+1
  111.       
  112.       If MZ<>0 and MFLAG=1
  113.          If MZ<=NMN
  114.             A$=Left$(MN$(MZ),1) : B$="" : Z=MZ
  115.             If A$<>"/"
  116.                If A$=" "
  117.                   If BREL<>MZ : BREL=MZ : _DISPLAY_MN[MZ,1] : End If 
  118.                Else 
  119.                   C$=Upper$(A$) : D$=Lower$(A$)
  120.                   If(C$<>A$) or(D$<>A$)
  121.                      If A$="F" : B$="f" : STATE=0 : End If 
  122.                      If A$="f" : B$="F" : STATE=1 : End If 
  123.                      If B$=""
  124.                         B$=C$
  125.                         For N=1 To NMN
  126.                            If Left$(MN$(N),1)=C$
  127.                               Left$(MN$(N),1)=D$ : _DISPLAY_MN[N,0]
  128.                            End If 
  129.                         Next 
  130.                      End If 
  131.                   End If 
  132.                End If 
  133.                If B$<>"" : Left$(MN$(MZ),1)=B$ : _DISPLAY_MN[MZ,-1] : End If 
  134.                G$="" : P=Instr(MN$(MZ),"_") : If P : G$=Mid$(MN$(MZ),P) : End If 
  135.                If G$<>"" : Gosub G$ : End If 
  136.             Else 
  137.                G$="" : P=Instr(MN$(MZ),"_") : If P : G$=Mid$(MN$(MZ),P) : End If 
  138.                If G$<>"" : Gosub G$ : End If 
  139.             End If 
  140.             If G$<>"_Name" : DCLICK=-1 : FCLICK=-1 : End If 
  141.          End If 
  142.       End If 
  143.       
  144.       OMK=MK : OMZ=MZ : _MOUSE
  145.       If MK=0 : Exit : End If 
  146.       If MZ<>OMZ : Exit : End If 
  147.       
  148.    Loop 
  149.    If BREL : _DISPLAY_MN[BREL,0] : BREL=0 : End If 
  150. Loop 
  151.  
  152. _DBUG:
  153. Default : CPT=0
  154. _BIG: Pop : CPT=CPT+1 : Goto _BIG
  155.  
  156. _MNQUIT:
  157. _WAIT_NOMK : R=1
  158. If MK=1
  159.    D$(2)=Resource$(89) : Restore _DIA2B : Gosub _DIALOG
  160.    Repeat : Gosub _DODIALOG : Until R
  161. End If 
  162. If R=1
  163.    Fade 1 : Wait 16 : Screen Close 0
  164.    Request On 
  165.    Edit 
  166. End If 
  167. _ERASE_DIALOG
  168. Return 
  169.  
  170. ' Infos
  171. _INFOS:
  172. Restore _DIAI : D$(2)=Resource$(80)+VER$ : D$(4)=Resource$(81) : D$(5)=Resource$(82) : D$(7)=Resource$(83) : _WAIT_NOMK : Goto _DIALOG
  173. _DIAI: Data 80,8,"  28552056064012_DOut","End"
  174.  
  175. ' Disk copy  
  176. _DCOPY:
  177. _WAIT_NOMK
  178. Restore _DIAC : D$(1)=Resource$(69) : D$(3)=Resource$(70) : D$(5)=Resource$(71) : Gosub _DIALOG : YC=Y Curs-2 : Gosub _CPM
  179. FMK=1 : FMZ=1+SDRV : FMK2=1 : FMZ2=4+DDRV
  180. If FLAG(2) : Left$(MN$(9),1)="F" : _DISPLAY_MN[9,-1] : End If : Return 
  181. _DIAC:
  182. Data 92,8
  183. Data "z 31160017064012_sDf0","z 32224017064012_sDf1","z 33288017064012_sDf2"
  184. Data "y 31160034064012_dDf0","y 32224034064012_dDf1","y 33288034064012_dDf2"
  185. Data "  05024052016008_Cpup","  06040052016008_Cpdn"
  186. Data "fC23384056064012_SFlag","  25488056064012_DCop","  30552056064012_DOut","End"
  187. _DDF0: DDRV=0 : DDRV$="Df0:" : Return 
  188. _DDF1: DDRV=1 : DDRV$="Df1:" : Return 
  189. _DDF2: DDRV=2 : DDRV$="Df2:" : Return 
  190. _CPUP: MULT=MULT+1 : Goto _CPM
  191. _CPDN: If MULT : MULT=MULT-1 : End If 
  192. _CPM: Locate 9,YC : Print Resource$(77);MULT+1;"  "; : Return 
  193. _DCOP:
  194. Gosub _DOUT : D$(1)=Resource$(72)+SDRV$+Resource$(73)+DDRV$+Resource$(6) : Gosub _IDISC : YN=Y Curs-5
  195. E=79
  196. _TRACK_OPEN[0,SDRV]
  197. If Param=0
  198.    _TRACK_OPEN[1,DDRV]
  199.    If Param=0
  200.       _DISK_BUSY[SDRV,True] : If SDRV<>DDRV : _DISK_BUSY[DDRV,True] : End If 
  201.       E=0 : TR=0 : TTW=0 : LP=0
  202.       Repeat 
  203.          If LP=0 or SDRV=DDRV
  204.             Centre At(,YN)+Resource$(74)+SDRV$+Resource$(76)
  205.             Bell : _WAIT_MK : If Param$=Chr$(27) : E=90 : Exit : End If 
  206.             Centre String$(" ",72)
  207.             Wait 50
  208.          End If 
  209.          _TRACK_MOTOR[0,1]
  210.          Repeat 
  211.             T=TR : Ink C7,C7,C7 : Gosub _DDISC
  212.             _TRACK_READ[0,TR] : If Param : E=79 : Exit 2 : End If 
  213.             _TRACK_STORE[0,TR] : Exit If Param
  214.             TR=TR+1
  215.             If Chip Free+Fast Free<16*1024 : Exit : End If 
  216.             If Inkey$=Chr$(27) : E=90 : Exit 2 : End If 
  217.          Until TR=160
  218.          _TRACK_MOTOR[0,0]
  219.          For CD=0 To MULT
  220.             TW=TTW
  221.             If LP=0 or SDRV=DDRV or MULT<>0
  222.                Centre At(,YN)+Resource$(75)+DDRV$+Resource$(76)
  223.                If MULT
  224.                   Centre At(,YN+1)+Resource$(78)+Str$(CD+1)+"!"
  225.                End If 
  226.                Bell : _WAIT_MK : Centre At(,YN)+String$(" ",72) : Centre At(,YN+1)+String$(" ",72)
  227.                If Param$=Chr$(27) : E=90 : Exit 2 : End If 
  228.                Wait 50
  229.             End If 
  230.             If MULT : Ink C7,C7,C7 : For T=TTW To TR-1 : Gosub _DDISC : Next : End If 
  231.             _TRACK_MOTOR[1,1]
  232.             Repeat 
  233.                _TRACK_USTORE[1,TW]
  234.                If TW=80
  235.                   Loke Start(_TDB+1)+106*4,Timer : Loke Start(_TDB+1)+107*4,Timer : _TRACK_CHECKSUM[1]
  236.                End If 
  237.                For ESS=0 To 2
  238.                   _TRACK_FORMAT[1,TW]
  239.                   E=0 : If Param : E=79 : End If 
  240.                   If E=0
  241.                      If FLAG(2)
  242.                         T=TW : Ink C1,C1,C1 : Gosub _DDISC
  243.                         _TRACK_VERIFY[1,TW] : If Param : E=67 : End If 
  244.                      End If 
  245.                      If E=0 : Exit : End If 
  246.                   End If 
  247.                Next 
  248.                If E : Exit 3 : End If 
  249.                T=TW : Ink C4,C4,C4 : Gosub _DDISC
  250.                If Inkey$=Chr$(27) : Bell : E=90 : Exit 3 : End If 
  251.                TW=TW+1
  252.             Until TW=TR
  253.             _TRACK_MOTOR[1,0]
  254.          Next 
  255.          TTW=TW : _TRACK_FREE
  256.          LP=1
  257.       Until TR=_TDTRACKS
  258.       _TRACK_FREE
  259.       _TRACK_MOTOR[0,0] : _TRACK_MOTOR[1,0]
  260.       _DISK_BUSY[SDRV,False] : If SDRV<>DDRV : _DISK_BUSY[DDRV,False] : End If 
  261.    End If 
  262.    _TRACK_CLOSE[0] : _TRACK_CLOSE[1]
  263. End If 
  264. Erase 13 : Erase 14
  265. If E
  266.    Gosub _DOUT : D$(2)=Resource$(E) : Restore _DIA1 : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  267. End If 
  268. Gosub _DOUT : Goto _DCOPY
  269.  
  270. ' Format 
  271. _FORMAT:
  272. _WAIT_NOMK
  273. Restore _DIAF : D$(1)="*"+Resource$(65) : Gosub _DIALOG
  274. XN=12 : YN=Y Curs-3 : Print At(XN,YN);_FNAME$;
  275. FMK=1 : FMZ=2+SDRV
  276. If FLAG(2) : Left$(MN$(5),1)="F" : _DISPLAY_MN[5,-1] : End If 
  277. If FLAG(3) : Left$(MN$(6),1)="F" : _DISPLAY_MN[6,-1] : End If : Return 
  278. _DIAF: Data 92,5,"  35024017064012_FName","Z 31024032064012_sDf0","z 32088032064012_sDf1","z 33152032064012_sDf2","fC23280032064012_SFlag","fD40344032064012_SFlag","  24488032064012_FFor","  30552032064012_DOut","End"
  279. _DIAZ: Data 84,6,"End"
  280. _SDF0: SDRV=0 : SDRV$="Df0:" : Return 
  281. _SDF1: SDRV=1 : SDRV$="Df1:" : Return 
  282. _SDF2: SDRV=2 : SDRV$="Df2:" : Return 
  283. _FNAME:
  284. Locate XN,YN : Pen C4 : _LEDIT[_FNAME$,640,XN,YN,77-X Curs,0]
  285. If Param$<>"_Esc_" and(Param$<>"") and Instr(Param$,":")=0 : _FNAME$=Left$(Param$,31) : End If 
  286. Pen C3 : Print At(XN,YN);String$(" ",77-X Curs);
  287. Print At(XN,YN);_FNAME$ : Return 
  288. _FFOR:
  289. Gosub _DOUT : D$(2)=Resource$(68)+SDRV$+Resource$(6) : Gosub _IDISC
  290. E=0 : SYS=0 : If FLAG(3) : SYS=512*3 : End If 
  291. _TRACK_OPEN[0,SDRV]
  292. If Param=0
  293.    _DISK_BUSY[SDRV,-1]
  294.    _TRACK_MOTOR[0,1] : E=0 : AMS$="@@@@"
  295.    For T=0 To _TDTRACKS-1
  296.       Ink C4,C4,C4 : Gosub _DDISC
  297.       If Inkey$=Chr$(27) : Bell : E=91 : Exit : End If 
  298.       Fill Start(_TDB) To Start(_TDB)+_TDSIZE,Leek(Varptr(AMS$))
  299.       If T=0 : Copy Start(9)+SYS,Start(9)+SYS+512 To Start(_TDB) : End If 
  300.       If T=80
  301.          Copy Start(9)+SYS+512,Start(9)+SYS+512+1024 To Start(_TDB)
  302.          Loke Start(_TDB)+106*4,Timer : Loke Start(_TDB)+123*4,Timer
  303.          Poke Start(_TDB)+108*4,Len(_FNAME$) : For N=1 To Len(_FNAME$) : Poke Start(_TDB)+108*4+N,Asc(Mid$(_FNAME$,N,1)) : Next 
  304.          _TRACK_CHECKSUM[0]
  305.       End If 
  306.       For ESS=0 To 2
  307.          _TRACK_FORMAT[0,T]
  308.          E=0 : If Param : E=66 : End If 
  309.          If E=0
  310.             If FLAG(2)
  311.                _TRACK_VERIFY[0,T] : If Param : E=67 : End If 
  312.             End If 
  313.             If E=0 : Exit : End If 
  314.          End If 
  315.       Next 
  316.       If E : Exit : End If 
  317.    Next 
  318.    _TRACK_MOTOR[0,0]
  319.    _DISK_BUSY[SDRV,0]
  320.    _TRACK_CLOSE[0]
  321.    Erase 13 : Erase 14
  322. End If 
  323. If E
  324.    Gosub _DOUT : D$(2)=Resource$(E) : Restore _DIA1 : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  325. End If 
  326. Gosub _DOUT : Goto _FORMAT
  327.  
  328. _IDISC:
  329. Restore _DIAZ : Gosub _DIALOG : YY=Y Curs*8-18 : XX=40
  330. SXX=80*7 : SYY=16
  331. Ink C3,C2,C3 : Set Pattern 1 : Set Paint 1 : BBAR[0,XX,YY,XX+SXX,YY+SYY]
  332. Dec SXX
  333. Return 
  334. _DDISC:
  335. X1=(T*SXX)/_TDTRACKS : X2=((T+1)*SXX)/_TDTRACKS
  336. BBAR[0,XX+X1+1,YY+1,XX+X2,YY+SYY-1] : Return 
  337.  
  338. ' Examine
  339. _EXAM:
  340. If OK(ACT)=0 : Return : End If 
  341. D=ACT : Gosub _ASK_DISC : If R : Return : End If : _GET_SELECTED_FILES
  342.  
  343. _EXNXT:
  344. On Error Goto _EXERR0
  345. Repeat 
  346.    _GET_FF[" -.",ACT] : FF$=Param$
  347.    A$=Left$(FF$(PFF),1) : If A$="." or(A$=" ") : _UNLIGHT_FILE[PFF,1] : End If 
  348. Until A$<>"."
  349. If FF$<>""
  350.    D$(2)=Resource$(40)+Right$(FF$,60)
  351.    Open In 1,FF$ : LF=Lof(1) : A$=Input$(1,Min(LF,$440)) : Close 1
  352.    Restore _HEAD
  353.    Do 
  354.       Read PEX
  355.       Do 
  356.          Read H$
  357.          If PEX=0
  358.          If H$<>"" : F=0 : Gosub H$ Else F=-1 : End If 
  359.          Else 
  360.             L=Len(H$) : B$=Mid$(A$,PEX,L)
  361.             F=H$=B$
  362.          End If 
  363.          If F=0 : Exit : End If 
  364.          Read PEX
  365.          If PEX<0
  366.             PEX=-PEX : Read G$,D,G$ : D$(3)=Resource$(D) : Restore G$ : Goto _DIALOG
  367.          End If 
  368.       Loop 
  369.       Do : Read P : If P=-100 : Exit : End If : Read G$ : Loop 
  370.    Loop 
  371.    _EXOUT: MZ=0 : Gosub _DOUT
  372. End If 
  373. Return 
  374. _EXNX: Gosub _DOUT : Goto _EXNXT
  375. _EXERR:
  376. Gosub _DOUT
  377. _EXERR0:
  378. Close : Erase 5 : D$(2)=Resource$(56)+Right$(FF$,40) : Restore _DIAD : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  379. Resume _EXNX
  380.  
  381. ' HEAR 
  382. _EXHEAR:
  383. Volume 63
  384. Gosub _DOUT : D$(2)=Resource$(20)+Right$(FF$,60) : Restore _DIA0 : Gosub _DIALOG
  385. Timer=0 : On PEX Goto _EXMUS,_EXSAM,_EXSAM,_EXSAMB,_EXTR,_EXBT,_EXTMED
  386. _EXBT:
  387. On Error Goto _EXERR : Load FF$,3 : Track Play 3 : Goto _EXM2
  388. _EXTR:
  389. On Error Goto _EXERR : Track Load FF$,3 : Track Play : Goto _EXM2
  390. _EXTMED:
  391. On Error Goto _EXERR : Med Load FF$,3 : Med Play : Goto _EXM2
  392. _EXMUS:
  393. On Error Goto _EXERR : Load FF$,3 : Music 1
  394. _EXM2:
  395. While Timer<25 : Wend 
  396. Gosub _DOUT : D$(2)=Resource$(60)+Right$(FF$,60) : Restore _DIA1 : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  397. Music Off : Track Stop : Med Stop : Erase 3 : Goto _EXNX
  398. _EXSAMB:
  399. On Error Goto _EXERR
  400. Load FF$,5 : Sam Bank 5 : NSAM=Deek(Start(5))
  401. While Timer<25 : Wend 
  402. Gosub _DOUT : D$(2)="     "+Resource$(60)+Right$(FF$,60)
  403. Restore _SAMB : Gosub _DIALOG : YS=Y Curs-3 : PSAM=-1
  404. _SAMBP: PSAM=PSAM+1 : If PSAM>NSAM-1 : PSAM=NSAM-1 : End If : Goto _GSAM
  405. _SAMBM: If PSAM : PSAM=PSAM-1 : End If 
  406. _GSAM: AA=Start(5)+Leek(Start(5)+2+PSAM*4)
  407. A$=String$(" ",8) : Copy AA,AA+8 To Varptr(A$)
  408. SAMSP=Deek(AA+8) : LL=Leek(AA+10)
  409. Print At(8,YS);Resource$(63);PSAM+1;" : ";A$;"        ";
  410. Goto _SAMPLAY
  411. _EXSAM:
  412. On Error Goto _EXERR
  413. Open In 1,FF$ : LL=Lof(1) : Close : Reserve As Chip Work 5,LL : Bload FF$,Start(5)
  414. AA=Start(5) : If LL>65534 : LL=65534 : End If 
  415. If PEX=3 : SAMSP=Deek(Start(5)+32) : AA=AA+40 : LL=LL-40 : End If 
  416. While Timer<25 : Wend 
  417. Gosub _DOUT : D$(2)="     "+Resource$(60)+Right$(FF$,60)
  418. Restore _SAM : Gosub _DIALOG : YS=Y Curs-3 : Goto _SAMPLAY
  419. _SAMP: SAMSP=SAMSP+1000 : Goto _SAMPLAY
  420. _SAMM: If SAMSP>1999 : SAMSP=SAMSP-1000 : End If 
  421. _SAMPLAY:
  422. Print At(8,YS+1);Resource$(61);Str$(SAMSP);"   ";
  423. _WAIT_NOMK : Sam Raw 15,AA,LL,SAMSP : Return 
  424. _SAMOUT: Volume 0 : Sam Raw 15,Start(5),1024,10000 : Volume 63 : Erase 5 : MZ=0 : Goto _EXNX
  425. _SAM: Data 92,5,"  05024028016008_SAMp","  06040028016008_SAMm","  37488032064012_SAMPlay","  30552032064012_SAMout","End"
  426. _SAMB: Data 92,5,"  05024020016008_SAMbp","  06040020016008_SAMbm","  05024028016008_SAMp","  06040028016008_SAMm","  37488032064012_SAMPlay","  30552032064012_SAMout","End"
  427.  
  428.  
  429. ' Picture loading
  430. _EXPIC:
  431. Gosub _DOUT : D$(2)=Resource$(20)+Right$(FF$,60) : Restore _DIA0 : Gosub _DIALOG
  432. Timer=0 : On PEX Goto _PIFF,_SPBK,_PCBK,_ANIM
  433.  
  434. _ANIM:
  435. On Error Goto _EXERR
  436. Iff Anim FF$ To 1
  437. Screen 0 : Gosub _DOUT
  438. Screen Close 1
  439. Goto _EXNXT
  440.  
  441. _PCBK:
  442. On Error Goto _EXERR : Load FF$,5
  443. While Timer<25 : Wend 
  444. If Leek(Start(5))=$12031990
  445.    Unpack 5 To 1
  446. Else 
  447.    SX=Deek(Start(5)+8)*8 : SY=Deek(Start(5)+10)*Deek(Start(5)+12) : NP=Deek(Start(5)+14)
  448.    NC=1 : For N=1 To NP : NC=NC*2 : Next 
  449. If SX>480 and NC<=16 : Screen Open 1,SX,SY,NC,Hires Else Screen Open 1,SX,SY,NC,Lowres : End If 
  450.    Curs Off : Flash Off : Unpack 5,0,0
  451. End If 
  452. Erase 5 : Goto _EPC
  453.  
  454. _PIFF:
  455. On Error Goto _EXERR : Load Iff FF$,1
  456. While Timer<25 : Wend 
  457. _EPC: Screen Hide 0 : Wait Vbl : Screen 0 : Gosub _DOUT
  458. Repeat : Until Mouse Key : _WAIT_NOMK : Screen Close 1 : Screen Show 0
  459. Goto _EXNXT
  460.  
  461. _SPBK:
  462. _LOAD_BANK[FF$] : NS=Param
  463. While Timer<25 : Wend 
  464. NP=Dreg(4) : NC=1 : For N=1 To NP : NC=NC*2 : Next 
  465. Screen Open 1,288,SYWORK,NC,Lowres : Screen Display 1,128,,,
  466. Reserve Zone 3 : Curs Off : Cls 0
  467. Flash Off : For C=0 To 31 : Colour C,Deek(Varptr(PAL$)+C*2) : Next 
  468. DS=1
  469. Do 
  470.    Gosub _DSP
  471.    Repeat : MK=Mouse Key : MZ=Mouse Zone : Until MK<>0 and MZ<>0
  472.    If MZ=1 : DS=DS-NN : End If 
  473.    If MZ=2 : Exit : End If 
  474.    If MZ=3 : DS=DS+NN : End If 
  475.    _WAIT_NOMK
  476. Loop 
  477. _DEL_BANK : Screen 0 : Gosub _DOUT : Screen Close 1 : Goto _EXNXT
  478. _DSP:
  479. Cls 0 : For Z=1 To 3 : Reset Zone Z : Next 
  480. Ink 1,0,1 : Set Paint 1 : BTEXT[2,Resource$(58),118,SYWORK-12]
  481. If DS>1 : BTEXT[1,Resource$(57),62,SYWORK-12] : End If 
  482. SX=48 : SY=52 : NN=0
  483. For YY=0 To SYWORK/(SY+8)-1
  484.    Y=(SY+8)*YY+1
  485.    For XX=0 To 320/(SX+8)-1
  486.       X=(SX+8)*XX+8
  487.       If DS+NN>0 and DS+NN<=NS
  488.          Box X-1,Y To X+SX,Y+SY-9 : Box X-1,Y+SY-9 To X+SX,Y+SY : Text X+8,Y+SY-8+Text Base,Str$(DS+NN)
  489.          _REDUCE_BOB[DS+NN,X+1,Y+1,SX,SY-9]
  490.       End If 
  491.       NN=NN+1
  492.    Next 
  493. Next 
  494. If DS+NN<NS : BTEXT[3,Resource$(59),174,SYWORK-12] : End If 
  495. Return 
  496.  
  497. ' ASCII checking 
  498. _EXASC:
  499. C=0
  500. For N=1 To Len(A$)
  501.    A=Asc(Mid$(A$,N,1)) : If A>=32 or A=10 or A=9 : C=C+1 : End If 
  502. Next 
  503. P=(C*100)/Len(A$) : If P>95 : F=-1 : End If 
  504. Return 
  505. _EXREAD:
  506. Gosub _DOUT : Trap Read Text FF$
  507. If Errtrap
  508.    D$(2)=Resource$(24) : Restore _DIAD : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  509. End If 
  510. Goto _EXNX
  511. _EXPRINT:
  512. Gosub _DOUT : D$(2)=Resource$(53) : Restore _DIAP : Goto _DIALOG
  513. _PPRT:
  514. Gosub _DOUT : D$(2)=Resource$(54)+Right$(FF$,60) : Restore _DIAD : Gosub _DIALOG
  515. On Error Goto _PRERR
  516. Open In 1,FF$ : Set Input 10,-1
  517. While Not Eof(1)
  518.    Line Input #1,A$ : Lprint A$
  519.    _MOUSE : If MK=1 and MZ=1 : Close 1 : _DISPLAY_MN[1,1] : _WAIT_NOMK : Goto _EXPRINT : End If 
  520. Wend 
  521. Close 1
  522. _POUT: Gosub _DOUT : Goto _EXNX
  523. _PRERR:
  524. Close : Gosub _DOUT : D$(2)=Resource$(55)+FF$ : Restore _DIAD : Gosub _DIALOG : Repeat : Gosub _DODIALOG : Until R
  525. Resume _EXNX
  526. _DIAP: Data 92,4,"  39488024064012_PPRT","  30552024064012_POUT","End"
  527. '
  528. _HEAD:
  529. Data 1,"FORM",9,"ILBM",-1,"",41,"_DexI",-100
  530. Data 1,"FORM",9,"SMUS",-2,"",42,"_DexR",-100
  531. Data 1,"FORM",9,"8SVX",-3,"",43,"_DexH",-100
  532. Data 1,"FORM",9,"ANIM",-4,"",96,"_DexI",-100
  533. Data 1,"AmSp",-2,"",44,"_DexI",-100
  534. Data 1,"AmIc",-5,"",45,"_DexI",-100
  535. Data 1,"AmBk",13,"Music",-1,"",46,"_DexH",-100
  536. Data $439,"M.K.",-5,"",84,"_DexH",-100
  537. Data $439,"FLT4",-5,"",84,"_DexH",-100
  538. Data 1,"MMD1",-7,"",95,"_DexH",-100
  539. Data 1,"MMD0",-7,"",95,"_DexH",-100
  540. Data 1,"AmBk",13,"Tracker",-6,"",85,"_DexH",-100
  541. Data 1,"AmBk",13,"Pac.Pic.",-3,"",47,"_DexI",-100
  542. Data 1,"AmBk",13,"Samples",-4,"",62,"_DexH",-100
  543. Data 1,"AmBs",-8,"",48,"_DexR",-100
  544. Data 1,Chr$(0)+Chr$(0)+Chr$(3)+Chr$($F3),-9,"",49,"_DexR",-100
  545. Data 1,"AMOS Basic",-1,"",64,"_DexR",-100
  546. Data 1,"AMOS Pro",-1,"",94,"_DexR",-100
  547. Data 0,"_ExAsc",-9,"",50,"_DexL",-100
  548. Data 0,"",-2,"",51,"_DexH",-100
  549. _DEXR: Data 92,5,"  29488032064012_ExNx","  30552032064012_ExOut","End"
  550. _DEXI: Data 92,5,"  36424032064012_ExPic","  29488032064012_ExNx","  30552032064012_ExOut","End"
  551. _DEXH: Data 92,5,"  37424032064012_ExHear","  29488032064012_ExNx","  30552032064012_ExOut","End"
  552. _DEXL: Data 92,5,"  38360032064012_ExRead","  39424032064012_ExPrint","  29488032064012_ExNx","  30552032064012_ExOut","End"
  553.  
  554. ' Copy 
  555. _COPY:
  556. Restore _DIA1
  557. If DNAME$(0)="" or OK(0)=0 Then Return 
  558. If DNAME$(1)="" or OK(1)=0 Then Return 
  559. If DNAME$(0)=DNAME$(1) Then If PATH$(0)=PATH$(1) Then D$(2)=Resource$(30) : Goto _DIALOG
  560.  
  561. OACT=ACT : _DISPLAY_ACT[0]
  562. D=ACT : Gosub _ASK_DISC : If R : _NOT_DONE : Return : End If : _GET_SELECTED_FILES
  563. If NFF=0 Then Return 
  564.  
  565. D$(2)=Str$(NFF-NSP-NDD)+Resource$(1)+Str$(NDD)+Resource$(2)+Str$(TSIZE)+Resource$(28)
  566. If TSIZE/1024>DFRI(1) : D$(3)=Resource$(29) : End If 
  567. Restore _DIA2 : Gosub _DIALOG
  568. Repeat : Gosub _DODIALOG : Until R
  569. If R=2 : Return : End If 
  570.  
  571. MB=Fast Free+Chip Free
  572. If MB<42*1024 Then Restore _DIA1 : D$(2)=Resource$(24) : Goto _DIALOG
  573.  
  574. On Error Goto _CERR
  575. _GET_FF["+",1]
  576. If Param$<>""
  577.    D=1 : Gosub _ASK_DISC : If R : _NOT_DONE : Return : End If 
  578.    While Param$<>""
  579.       F$=Param$
  580.       If Exist(F$)=0
  581.          _ALERT[Resource$(31)+Right$(F$,50),1] : Mkdir F$
  582.       End If 
  583.       _GET_FF["+",1]
  584.    Wend 
  585. End If 
  586.  
  587. On Error Goto _CERR
  588. PFF=-1 : PF=0 : BK=1000 : BSTEP=4*1024
  589. Repeat 
  590.    PBK=-1
  591.    Do 
  592.       
  593.       If PF=0
  594.          Repeat 
  595.             _GET_FF[" -.",0]
  596.             A$=Left$(FF$(PFF),1)
  597.             If A$="." or(A$=" ") : _UNLIGHT_FILE[PFF,1] : End If 
  598.          Until A$<>"."
  599.          
  600.          NS$=Param$ : If NS$="" : PF=-1 : Exit : End If 
  601.          PFF=PFF-1 : _GET_FF[" -",1] : ND$=Param$
  602.          
  603.       End If 
  604.       
  605.       _ALERT[Resource$(20)+Right$(NS$,60),1]
  606.       D=0 : Gosub _ASK_DISC : If R : _NOT_DONE : Exit 2 : End If 
  607.       
  608.       Open In 1,NS$ : LF=Lof(1) : Pof(1)=PF
  609.       Inc PBK : Reserve As Work BK+PBK,128
  610.       Poke$ Start(BK+PBK)-1,"N"
  611.       Loke Start(BK+PBK),PF : Poke$ Start(BK+PBK)+4,ND$+Chr$(0)
  612.       Repeat 
  613.          L=Min(BSTEP,LF-PF)
  614.          Inc PBK : Trap Reserve As Work BK+PBK,L+4
  615.          Exit If Errtrap,2
  616.          Poke$ Start(BK+PBK)-1,"D"
  617.          Sload 1 To Start(BK+PBK),L
  618.          Add PF,L
  619.          Trap Reserve As Chip Work BK-1,1024*16
  620.          Exit If Errtrap,2
  621.          Erase BK-1
  622.       Until PF>=LF
  623.       Close 
  624.       PF=0
  625.       
  626.    Loop 
  627.    Close 
  628.    
  629.    PBK=0
  630.    Do 
  631.       Exit If Length(BK+PBK)=0
  632.       PFS=Leek(Start(BK+PBK))
  633.       N$=Peek$(Start(BK+PBK)+4,128,Chr$(0))
  634.       _ALERT[Resource$(21)+Right$(N$,60),1]
  635.       D=1 : Gosub _ASK_DISC : If R : _NOT_DONE : Exit 2 : End If 
  636.       If PFS=0
  637.          Open Out 1,N$
  638.       Else 
  639.          Append 1,N$
  640.       End If 
  641.       Inc PBK
  642.       Do 
  643.          L=Length(BK+PBK) : Exit If L=0,2
  644.          A$=Peek$(Start(BK+PBK)-1,1) : Exit If A$<>"D"
  645.          Add L,-4
  646.          If L
  647.             Ssave 1,Start(BK+PBK) To Start(BK+PBK)+L
  648.          End If 
  649.          Inc PBK
  650.       Loop 
  651.       Close 
  652.    Loop 
  653.    Close : Erase Temp 
  654. Until PF<0
  655. Close : Erase Temp 
  656.  
  657. _CBYE:
  658. _DISPLAY_ACT[OACT] : _NO_FILES
  659. D=1 : Gosub _ASK_DISC : _NEW_DIR[1]
  660. Return 
  661.  
  662. _CERR:
  663. Close : Erase Temp 
  664. D$(2)=Resource$(32)+Right$(N$,50)+"!" : D$(3)=Resource$(33) : Restore _DIA1B : Gosub _DIALOG
  665. Repeat : Gosub _DODIALOG : Until R
  666. Resume _CBYE
  667.  
  668. _ASK_DISC:
  669. R=0
  670. If Exist(DNAME$(D))=0
  671.    D$(2)=Resource$(25)+DNAME$(D)+Resource$(26) : Restore _DIAD : Gosub _DIALOG
  672.    Repeat 
  673.       Wait 5 : Gosub _DODIALOG
  674.    Until R<>0 or Exist(DNAME$(D))
  675.    Gosub _DOUT
  676. End If 
  677. Return 
  678.  
  679. ' Rename 
  680. _REN:
  681. If OK(ACT)=0 : Return : End If 
  682. NR=0 : _WAIT_NOMK
  683. For F=1 To SDIR(ACT)
  684.    If Mid$(FLAG$(ACT),F,1)="1"
  685.       _UNPACK_DIALOG[100,3]
  686.       D=15 : If SIZE(ACT,F)>=0 : D=14 : End If 
  687.       Pen C3 : Centre Resource$(D)+" "+Resource$(88)
  688.       Print At(3,Y Curs+2);Resource$(16);
  689.       _NOSPACE[FILE$(ACT,F)] : F$=Param$
  690.       Pen C4 : _LEDIT[F$,640,X Curs,Y Curs,77-X Curs,0] : FF$=Param$
  691.       E=0 : If FF$="_Esc_" : FF$="" : E=-1 : End If 
  692.       If F$<>FF$
  693.          If FF$<>""
  694.             On Error Goto _RNERR
  695.             Rename PATH$(ACT)+F$ To PATH$(ACT)+FF$
  696.             FILE$(ACT,F)=String$(" ",LFILE) : Left$(FILE$(ACT,F),LFILE)=FF$
  697.             NR=-1
  698.          End If 
  699.       End If 
  700.       _ERASE_DIALOG
  701.       If E : Exit : End If 
  702.       Mid$(FLAG$(ACT),F,1)="0"
  703.       If F>=PDIR(ACT) and F<=PDIR+NLINE : _DISPLAY_FILE[ACT,F-PDIR(ACT)] : End If 
  704.    End If 
  705. Next 
  706. If NR : _NEW_DIR[ACT] : End If 
  707. _RNEX: On Error : Return 
  708. _RNERR:
  709. Pen C4 : Print At(3,);Resource$(17);'"';Right$(F$,60);'"!';String$(" ",77-X Curs);
  710. _WAIT_NOMK : _WAIT_MK
  711. _ERASE_DIALOG : Resume _RNEX
  712.  
  713. ' Delete 
  714. _DEL:
  715. If OK(ACT)=0 : Return : End If 
  716. D=ACT : Gosub _ASK_DISC : If R : Return : End If : _GET_SELECTED_FILES
  717. If NFF=0 : Return : End If 
  718. D$(1)="*"+Str$(NDD)+Resource$(8)+Str$(NFF-NSP-NDD)+Resource$(9)
  719. Restore _DIA4 : R$(1)="_dlok" : R$(2)="_dlnx" : R$(3)="_dlgo" : R$(4)="_dlout"
  720. Gosub _DIALOG : YDEL=Y Curs-3 : FLG=0 : Goto _DLNX
  721. _DLOK:
  722. On Error Goto _DLERR : Kill FF$ : _UNLIGHT_FILE[PFF,0] : FLG=FLG+1 : Goto _DLNX
  723. _DLGO: _WAIT_NOMK : On Error Goto _DLERR
  724. Repeat 
  725.    If Mouse Key : _WAIT_NOMK : Return : End If 
  726.    Kill FF$ : _UNLIGHT_FILE[PFF,0] : FLG=FLG+1
  727.    _GET_FF[" .-*",ACT] : FF$=Param$ : Gosub _DLP : Wait 2
  728. Until FF$=""
  729. MZ=4 : Goto _DOUT
  730. _DLOUT: _NO_FILES
  731. If FLG
  732.    _NEW_DIR[ACT] : _ALERT[Str$(FLG)+Resource$(11),100]
  733. Else 
  734.    _ALERT[Resource$(12),100]
  735. End If 
  736. Return 
  737.  
  738. _DLERR:
  739. Print At(3,YDEL);Resource$(13);Right$(FF$,55);"!";String$(" ",77-X Curs)
  740. _WAIT_NOMK : _WAIT_MK
  741. Resume _DLNX
  742.  
  743. _DLNX:
  744. _GET_FF[" .-*",ACT] : FF$=Param$ : If Param$="" : MZ=4 : Goto _DOUT : End If 
  745. _DLP: Print At(3,YDEL);Resource$(10);Right$(FF$,55);String$(" ",77-X Curs); : Return 
  746.  
  747. ' Make dir 
  748. _MDIR:
  749. If OK(ACT)
  750.    _WAIT_NOMK
  751.    _UNPACK_DIALOG[100,3]
  752.    Centre Resource$(4+ACT)+Resource$(6) : Print At(3,Y Curs+2);Resource$(7);
  753.    _LEDIT[PATH$(ACT),100,X Curs,Y Curs,60,Len(PATH$(ACT))]
  754.    _ERASE_DIALOG
  755.    On Error Goto _MDERR
  756.    If Param$<>"_Esc_"
  757.       If Param$<>PATH$(ACT)
  758.          Mkdir Param$ : _NEW_DIR[ACT]
  759.       End If 
  760.    End If 
  761.    _MDEND:
  762.    On Error 
  763. End If 
  764. Return 
  765. _MDERR:
  766. _UNPACK_DIALOG[100,5]
  767. Centre At(,Y Curs+1)+Resource$(92)+'"'+Right$(PATH$(ACT),60)+'"'
  768. Centre At(,Y Curs+2)+Resource$(87)
  769. _WAIT_NOMK : _WAIT_MK : _ERASE_DIALOG
  770. Resume _MDEND
  771.  
  772. ' How big? 
  773. _OBIG:
  774. If OK(ACT)
  775.    D=ACT : Gosub _ASK_DISC : If R : Return : End If : _GET_SELECTED_FILES
  776.    _NO_FILES
  777.    D$(2)=Str$(NFF-NSP-NDD)+Resource$(1)+Str$(NDD)+Resource$(2)+Str$(TSIZE)+Resource$(3)
  778.    Restore _DIA1 : Goto _DIALOG
  779. End If 
  780. Return 
  781.  
  782. ' Dialog box 
  783. _DIALOG:
  784. If BREL : _DISPLAY_MN[BREL,0] : BREL=0 : End If 
  785. Read Y,SY : _UNPACK_DIALOG[Y,SY] : YMN=Param : Pen C3 : Paper C1
  786. For N=1 To SY
  787.    If D$(N)<>""
  788.    If Left$(D$(N),1)<>"*" : Print At(3,);D$(N); Else Centre Mid$(D$(N),2) : End If 
  789.    End If 
  790.    Print 
  791. Next 
  792. N=0 : Repeat : N=N+1 : Read MN$(N) : Until MN$(N)="End" : DNM=N
  793. For N=1 To DNM : _DISPLAY_MN[N,0] : Next 
  794. Set Zone DNM+1,0,0 To 639,SYWORK-1
  795. Return 
  796. _DODIALOG:
  797. _MOUSE : R=0
  798. If MK=1 and MZ<>0
  799.    If MN$(MZ)<>""
  800.       _DISPLAY_MN[MZ,1] : _WAIT_NOMK : _DISPLAY_MN[MZ,0] : R=MZ : Goto _DOUT
  801.    End If 
  802. End If 
  803. Return 
  804. _DOUT:
  805. R$=R$(MZ)
  806. _WAIT_NOMK : _ERASE_DIALOG
  807. For N=1 To 19 : Reset Zone N : MN$(N)="" : Next : YMN=0 : BREL=0
  808. For N=0 To 12 : D$(N)="" : R$(N)="" : Next 
  809. If R$<>"" Then Goto R$
  810. Return 
  811. _DGO: If R$(MZ)<>"" Then Goto R$(MZ)
  812. Return 
  813.  
  814. ' Click dans le path   
  815. _PATH:
  816. Gosub _SIDE : If A : Return : End If 
  817. _WAIT_NOMK : _DISPLAY_MN[BREL,0] : BREL=0
  818. X=(MX-XDIR(D))/8
  819. _LEDIT[PATH$(D)+FILT$(D),X,XFILE(D),YPATH/8,SXFILE,0]
  820. If Param$<>"_Esc_"
  821.    _FIND_FILTER[Param$]
  822.    PATH$(D)=Left$(Param$,Param-1) : FILT$(D)=Mid$(Param$,Param)
  823.    A$=Right$(PATH$(D),1) : If A$<>"" and(A$<>":") and(A$<>"/") : PATH$(D)=PATH$(D)+"/" : End If 
  824.    _NEW_DIR[D] : If OK(D)=0 : _ALERT[Resource$(93),250] : End If 
  825. End If 
  826. _DISPLAY_PATH[D]
  827. Return 
  828.  
  829. ' Show sizes?
  830. _SIZES: Gosub _SFLAG
  831. For D=0 To 1 : If OK(D) : _DISPLAY_DIR[D] : End If : Next 
  832. Return 
  833.  
  834. ' Show info? 
  835. _DINFO:
  836. Gosub _SFLAG
  837. NFILT$=NFLT$ : If FLAG(0) : NFILT$="" : End If : Set Dir LFILE,NFILT$
  838. _REDIR: For D=0 To 1 : If OK(D) : _NEW_DIR[D] : End If : Next 
  839. Return 
  840. _SFLAG: _SET_FLAG[MN$(MZ)] : Return 
  841.  
  842. ' ALL / CLEAR / FLIP 
  843. _FLIP:
  844. For N=0 To MXFILE
  845.    A$=FILE$(0,N) : FILE$(0,N)=FILE$(1,N) : FILE$(1,N)=A$
  846.    A=SIZE(0,N) : SIZE(0,N)=SIZE(1,N) : SIZE(1,N)=A
  847. Next 
  848. A$=FLAG$(0) : FLAG$(0)=FLAG$(1) : FLAG$(1)=A$
  849. A$=FILT$(0) : FILT$(0)=FILT$(1) : FILT$(1)=A$
  850. A$=DNAME$(0) : DNAME$(0)=DNAME$(1) : DNAME$(1)=A$
  851. A$=PATH$(0) : PATH$(0)=PATH$(1) : PATH$(1)=A$
  852. A=SDIR(0) : SDIR(0)=SDIR(1) : SDIR(1)=A
  853. A=PDIR(0) : PDIR(0)=PDIR(1) : PDIR(1)=A
  854. A=DFRI(0) : DFRI(0)=DFRI(1) : DFRI(1)=A
  855. A=OK(0) : OK(0)=OK(1) : OK(1)=A
  856. MX=325-D*10 : ACT=-1
  857. _DISPLAY_DIR[0] : _DISPLAY_PATH[0]
  858. _DISPLAY_DIR[1] : _DISPLAY_PATH[1]
  859. Goto _SIDE
  860.  
  861. _CLEAR: F1$="1" : F2$="0" : Goto _A
  862. _ALL: F1$="0" : F2$="1"
  863. _A:
  864. For P=1 To Len(FLAG$(ACT))
  865.    If Mid$(FLAG$(ACT),P,1)=F1$ : Mid$(FLAG$(ACT),P,1)=F2$ : End If 
  866. Next 
  867. _DISPLAY_DIR[ACT]
  868. Return 
  869.  
  870. ' Activate side
  871. _ACT:
  872. D=0 : If MX>320 : D=1 : End If 
  873. _DISPLAY_ACT[D] : Return 
  874. _SIDE:
  875. D=0 : If MX>320 : D=1 : End If 
  876. A=0 : If ACT<>D : FMK=1 : FMX=MX : FMY=MY : FMZ=21+D : A=-1 : End If 
  877. If DCLICK>=0 and Timer<50
  878.    Z=(MY-YDIR)/8 : F=PDIR(D)+Z
  879.    G=-1 : If D=DSIDE and DCLICK<>F : G=0 : End If 
  880.    If G
  881.       Mid$(FLAG$(DSIDE),DCLICK)="0" : _DISPLAY_FILE[DSIDE,DCLICK-PDIR(DSIDE)]
  882.       _NOSPACE[FILE$(DSIDE,DCLICK)]
  883.       PATH$(D)=PATH$(DSIDE)+Param$+"/" : _NEW_DIR[D]
  884.       A=-1
  885.    End If 
  886. End If 
  887. DCLICK=-1
  888. Return 
  889.  
  890. ' Click into names 
  891. _NAME:
  892. Gosub _SIDE : If A : Return : End If 
  893. If MK=2
  894.    If Left$(FLAG$(D),1)<>"D"
  895.       A$=Dev First$("**") : S=1
  896.       OPDIR(D)=PDIR(D) : PDIR(D)=1
  897.       While A$<>""
  898.          For F=SDIR(D)+1 To S+1 Step -1
  899.             FILE$(D,F)=FILE$(D,F-1) : SIZE(D,F)=SIZE(D,F-1)
  900.          Next 
  901.          FLAG$(D)=Left$(FLAG$(D),S-1)+"D"+Mid$(FLAG$(D),S)
  902.          FILE$(D,S)=Mid$(A$,2) : SIZE(D,S)=-1
  903.          S=S+1 : SDIR(D)=SDIR(D)+1
  904.          A$=Dev Next$
  905.       Wend 
  906.    Else 
  907.       L=Len(FLAG$(D)) : FLAG$(D)=FLAG$(D)-"D" : L=L-Len(FLAG$(D))
  908.       SDIR(D)=SDIR(D)-L : PDIR(D)=OPDIR(D)
  909.       For F=1 To SDIR(D)
  910.          FILE$(D,F)=FILE$(D,F+L) : SIZE(D,F)=SIZE(D,F+L)
  911.       Next 
  912.    End If 
  913.    _DISPLAY_DIR[D]
  914. Else 
  915.    OF=-1 : X$=""
  916.    Z=(MY-YDIR)/8 : F=PDIR(D)+Z
  917.    If FCLICK=F and Timer<20
  918.       Mid$(FLAG$(D),F)=FX$ : _DISPLAY_FILE[D,Z]
  919.       A$=FILE$(D,F) : _NOSPACE[A$]
  920.       NFF=1 : PFF=-1 : FF$(0)="    "+Param$
  921.       Gosub _EXNXT : FCLICK=-1 : Return 
  922.    End If 
  923.    If Z>=0 and Z<NLINE
  924.       A$=Mid$(FLAG$(D),F,1)
  925.       If A$="0" : X$="1" : End If 
  926.       If A$="1" : X$="0" : End If 
  927.       If X$<>""
  928.          If SIZE(D,F)<0 : DCLICK=F : DSIDE=D : End If 
  929.          If SIZE(D,F)>0 : FCLICK=F : FX$=Mid$(FLAG$(D),F) : End If 
  930.       End If 
  931.       If A$="D"
  932.          A$=FILE$(D,F) : _NOSPACE[A$] : PATH$(D)=Param$ : _NEW_DIR[D]
  933.       End If 
  934.    End If 
  935.    If X$<>""
  936.       Repeat 
  937.          If F<>OF
  938.             If Z=-1 and PDIR(D)>1 : _SCROLL_DOWN[D] : Z=0 : End If 
  939.             If Z=NLINE and PDIR(D)+NLINE<=SDIR(D) : _SCROLL_UP[D] : Z=Z-1 : End If 
  940.             If Z>=0 and Z<NLINE
  941.                If OF>=0 : DCLICK=-1 : End If 
  942.                If OF<0 or Abs(F-OF)=1
  943.                   A$=Mid$(FLAG$(D),F,1)
  944.                   If(A$="0") or(A$="1") : Mid$(FLAG$(D),F)=X$ : _DISPLAY_FILE[D,Z] : End If 
  945.                Else 
  946.                   S=Sgn(F-OF)
  947.                   For G=OF+S To F Step S
  948.                      A$=Mid$(FLAG$(D),G,1)
  949.                      If(A$="0") or(A$="1") : Mid$(FLAG$(D),G)=X$ : _DISPLAY_FILE[D,G-PDIR(D)] : End If 
  950.                   Next 
  951.                End If 
  952.                OF=F
  953.             End If 
  954.          End If 
  955.          _MOUSE
  956.          Z=(MY-YDIR)/8 : F=PDIR(D)+Z
  957.       Until MK=0
  958.       _DISPLAY_INF[D]
  959.       Timer=0
  960.    End If 
  961. End If 
  962. Return 
  963.  
  964. ' Parent 
  965. _PAR0: D=0 : Goto _PAR
  966. _PAR1: D=1
  967. _PAR:
  968. If PATH$(D)<>""
  969.    For N=Len(PATH$(D))-1 To 1 Step -1
  970.       A$=Mid$(PATH$(D),N,1)
  971.       If(A$="/") or(A$=":") : PATH$(D)=Left$(PATH$(D),N) : Exit : End If 
  972.    Next 
  973.    _NEW_DIR[D]
  974. End If 
  975. Return 
  976.  
  977. ' File sliders 
  978. _SL:
  979. D=0 : If MX>320 : D=1 : End If 
  980. If MY<SSL(D) or MY>ESL(D)
  981.    If MY<SSL(D) : If PDIR(D)>1 : _SCROLL_DOWN[D] : End If : End If 
  982.    If MY>ESL(D) : If PDIR(D)<=SDIR(D)-NLINE : _SCROLL_UP[D] : End If : End If 
  983.    If MK=2 : MFLAG=0 : End If 
  984. Else 
  985.    DY=MY-SSL(D) : _DISPLAY_SLIDER[D,C7]
  986.    Repeat 
  987.       _MOUSE
  988.       Y=MY-YSLI-DY : P=(Y*(SDIR(D)+1))/SYSLI+1
  989.       If P<=0 : P=1 : End If 
  990.       If P>SDIR(D)-NLINE+1 : P=SDIR(D)-NLINE+1 : End If 
  991.       If P<>PDIR(D) : PDIR(D)=P : _DISPLAY_SLIDER[D,C7] : End If 
  992.    Until MK=0
  993.    _DISPLAY_DIR[D]
  994. End If 
  995. Return 
  996.  
  997. ' Scrolling icons
  998. _UP0: D=0 : Goto _UP
  999. _UP1: D=1
  1000. _UP: If PDIR(D)+NLINE<=SDIR(D) : _SCROLL_UP[D] : End If : MFLAG=0 : Return 
  1001. _DN0: D=0 : Goto _DN
  1002. _DN1: D=1
  1003. _DN: If PDIR(D)>1 : _SCROLL_DOWN[D] : End If : MFLAG=0 : Return 
  1004.  
  1005. Procedure _NEW_DIR[D]
  1006.    If PATH$(D)=""
  1007.       PATH$(D)=Dir$
  1008.    End If 
  1009.    _DISPLAY_PATH[D]
  1010.    _GET_DIR[D]
  1011. End Proc
  1012. Procedure _CLEAR_DIR[D]
  1013.    PDIR(D)=1 : SDIR(D)=0 : FLAG$(D)="" : DNAME$(D)="" : DFRI(D)=0
  1014.    For N=1 To MXFILE : FILE$(D,N)="" : SIZE(D,N)=0 : Next 
  1015.    OK(D)=0 : _DISPLAY_DIR[D]
  1016. End Proc
  1017. Procedure _GET_DIR[D]
  1018.    Change Mouse 3 : _CLEAR_DIR[D] : _ALERT[Resource$(35),1]
  1019.    On Error Goto _ERR
  1020.    A$=Dir First$(PATH$(D)+FILT$(D))
  1021.    While A$<>""
  1022.       N=N+1
  1023.       If Left$(A$,1)<>"*"
  1024.          FILE$(D,N)=Mid$(Left$(A$,Len(A$)-8),2)
  1025.          SIZE(D,N)=Val(Right$(A$,8))
  1026.       Else 
  1027.          FILE$(D,N)=Mid$(A$,2)
  1028.          SIZE(D,N)=-1
  1029.       End If 
  1030.       A$=Dir Next$
  1031.    Wend 
  1032.    SDIR(D)=N : FLAG$(D)=String$("0",N)
  1033.    DNAME$(D)="" : DFRI(D)=0
  1034.    A$=Disc Info$(PATH$(D))
  1035.    DNAME$(D)=Left$(A$,Len(A$)-10)
  1036.    DFRI(D)=Val(Right$(A$,10))/1024
  1037.    OK(D)=1 : _DISPLAY_DIR[D]
  1038.    _BYE: Change Mouse 1 : Pop Proc
  1039.    _ERR: Resume _BYE
  1040. End Proc
  1041. Procedure _DISPLAY_ACT[D]
  1042.    If ACT<>D
  1043.       ACT=D
  1044.       _DISPLAY_PATH[0] : _DISPLAY_PATH[1] : _DISPLAY_INF[D]
  1045.    End If 
  1046. End Proc
  1047. Procedure _DISPLAY_DIR[D]
  1048.    Cls C1,XDIR(D),YDIR To XDIR(D)+SXDIR,YDIR+SYDIR
  1049.    For N=0 To NLINE-1 : _DISPLAY_FILE[D,N] : Next 
  1050.    Wait Vbl : _DISPLAY_SLIDER[D,C6] : _DISPLAY_INF[D]
  1051. End Proc
  1052. Procedure _DISPLAY_FILE[D,N]
  1053.    F=PDIR(D)+N
  1054.    If F<=SDIR(D)
  1055.       Locate XFILE(D),YFILE+N
  1056.       A$=Mid$(FLAG$(D),F,1)
  1057.       If A$="D"
  1058.          Paper C5 : Pen C3
  1059.       Else 
  1060.       If SIZE(D,F)>=0 : Pen C3 Else Pen C4 : End If 
  1061.       If A$="1" : Paper C2 Else Paper C1 : End If 
  1062.       End If 
  1063.       If FLAG(1)
  1064.          Print Left$(FILE$(D,F),SXFILE-7);
  1065.          If SIZE(D,F)>=0
  1066.             Print Using " ######";SIZE(D,F);
  1067.          Else 
  1068.          If A$<>"D" : Print "  (Dir)"; Else Print "  (Dev)"; : End If 
  1069.          End If 
  1070.       Else 
  1071.          If SIZE(D,F)>=0
  1072.             Print Left$(FILE$(D,F),SXFILE);
  1073.          Else 
  1074.             Print Left$(FILE$(D,F),SXFILE-7);
  1075.          If A$<>"D" : Print "  (Dir)"; Else Print "  (Dev)"; : End If 
  1076.          End If 
  1077.       End If 
  1078.    End If 
  1079. End Proc
  1080. Procedure _DISPLAY_PATH[D]
  1081.    A=C1 : B=C3
  1082.    If D=ACT : A=C2 : B=C3 : End If 
  1083.    Cls A,XDIR(D),YPATH To XDIR(D)+SXDIR,YPATH+SYPATH
  1084.    Paper A : Pen B
  1085.    Locate XFILE(D),YPATH/8 : Print Right$(PATH$(D)+FILT$(D),SXFILE);
  1086. End Proc
  1087. Procedure _SCROLL_UP[D]
  1088.    Screen Copy 0,XDIR(D),YDIR+8,XDIR(D)+SXDIR,YDIR+SYDIR To 0,XDIR(D),YDIR
  1089.    Cls C1,XDIR(D),YDIR+SYDIR-8 To XDIR(D)+SXDIR,YDIR+SYDIR
  1090.    PDIR(D)=PDIR(D)+1 : _DISPLAY_FILE[D,NLINE-1] : _DISPLAY_SLIDER[D,C6]
  1091. End Proc
  1092. Procedure _SCROLL_DOWN[D]
  1093.    Screen Copy 0,XDIR(D),YDIR,XDIR(D)+SXDIR,YDIR+SYDIR-8 To 0,XDIR(D),YDIR+8
  1094.    Cls C1,XDIR(D),YDIR To XDIR(D)+SXDIR,YDIR+8
  1095.    PDIR(D)=PDIR(D)-1 : _DISPLAY_FILE[D,0] : _DISPLAY_SLIDER[D,C6]
  1096. End Proc
  1097. Procedure _DISPLAY_SLIDER[D,C]
  1098.    Reset Zone 34+D
  1099.    Cls C0,XSLI(D),YSLI To XSLI(D)+SXSLI,YSLI+SYSLI
  1100.    If SDIR(D)>=NLINE
  1101.       SSL(D)=YSLI+(SYSLI*(PDIR(D)-1))/SDIR(D)
  1102.       ESL(D)=Min(YSLI+SYSLI,SSL(D)+(SYSLI*NLINE)/(SDIR(D)))
  1103.       Cls C,XSLI(D),SSL(D) To XSLI(D)+SXSLI,ESL(D)
  1104.       Set Zone 34+D,XSLI(D),YSLI To XSLI(D)+SXSLI,YSLI+SYSLI
  1105.    End If 
  1106. End Proc
  1107. Procedure _DISPLAY_INF[D]
  1108.    If D=ACT
  1109.       Cls C1,XINF,YINF To XINF+SXINF,YINF+SYINF
  1110.       Paper C1 : Pen C3 : Locate ,YINF/8
  1111.       If OK(D)>0
  1112.          S=0 : T=0 : ND=0 : NF=0
  1113.          For F=1 To SDIR(D)
  1114.             If SIZE(D,F)>=0
  1115.                T=T+SIZE(D,F)
  1116.                If Mid$(FLAG$(D),F,1)="1" : S=S+SIZE(D,F) : End If 
  1117.                NF=NF+1
  1118.             Else 
  1119.                ND=ND+1
  1120.             End If 
  1121.          Next 
  1122.          S=(S+1023)/1024 : T=(T+1023)/1024
  1123.          A$=Right$(DNAME$(D),20)
  1124.          A$=A$+Str$(NF)+" file" : If SDIR(D)>1 : A$=A$+"s" : End If 
  1125.          A$=A$+" -"+Str$(T)+"k listed"
  1126.          A$=A$+" -"+Str$(S)+"k selected"
  1127.          A$=A$+" -"+Str$(DFRI(D))+"k free"
  1128.          Centre A$
  1129.       End If 
  1130.    End If 
  1131. End Proc
  1132. Procedure _ALERT[A$,N]
  1133.    Cls C1,XINF,YINF To XINF+SXINF,YINF+SYINF
  1134.    Paper C1 : Pen C3 : Locate ,YINF/8
  1135.    If A$<>"" : Centre A$ : End If 
  1136.    ALERT=N
  1137. End Proc
  1138. Procedure _INIT_WORK
  1139.    Screen Open 0,640,SYWORK,8,Hires
  1140.    Curs Off : Flash Off 
  1141.    For C=0 To 7 : Colour C,0 : Next : Wait Vbl 
  1142.    Cls 0 : Cls C1,288,4 To 352,SYWORK-4
  1143.    
  1144.    _UNPACK[8,0,37] : _UNPACK[9,272,37] : _UNPACK[9,352,37] : _UNPACK[8,368,37]
  1145.    N=(SYWORK-72)/8 : Screen Copy 0,0,48,640,56 To 0,0,47+N*8
  1146.    For Y=1 To N : Screen Copy 0,0,40,640,48 To 0,0,40+Y*8 : Next 
  1147.    _UNPACK[10,0,52+N*8]
  1148.    
  1149.    XDIR(0)=8 : XDIR(1)=376 : YDIR=40 : SXDIR=256 : SYDIR=N*8+8 : NLINE=N+1
  1150.    XFILE(0)=XDIR(0)/8 : XFILE(1)=XDIR(1)/8 : YFILE=YDIR/8 : SXFILE=SXDIR/8
  1151.    YPATH=24 : SYPATH=8
  1152.    XSLI(0)=276 : XSLI(1)=356 : YSLI=40 : SXSLI=8 : SYSLI=SYDIR+2
  1153.    XINF=8 : YINF=56+N*8 : SXINF=624 : SYINF=8
  1154.    
  1155.    Reserve Zone NMN
  1156.    Set Zone 32,XDIR(0),YDIR To XDIR(0)+SXDIR,YDIR+SYDIR
  1157.    Set Zone 33,XDIR(1),YDIR To XDIR(1)+SXDIR,YDIR+SYDIR
  1158.    
  1159.    YMN=0
  1160.    For N=1 To NMN
  1161.       _DISPLAY_MN[N,0]
  1162.       A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : _DISPLAY_MN[N,1] : End If 
  1163.    Next 
  1164.    
  1165.    If SYWORK>220 : _UNPACK[41,288,169] : End If 
  1166.    
  1167.    For D=0 To 1 : _CLEAR_DIR[D] : _DISPLAY_DIR[0] : Next 
  1168.    Fade 1,$0,$FFB,$77,$FFF,$C00,$DD,$AA,$FF3
  1169.    Limit Mouse X Hard(0),Y Hard(4) To X Hard(640),Y Hard(SYWORK-4)
  1170.    
  1171. End Proc
  1172. Procedure _UNPACK_DIALOG[Y,N]
  1173.    Y=(Y/8)*8-4
  1174.    Get Block 1,0,Y-2,640,N*8+16 : BLOC=1
  1175.    Cls 0,14,Y-1 To 626,Y+N*8+9
  1176.    _UNPACK[8,16,Y]
  1177.    Screen Copy 0,16,Y,288,Y+16 To 0,352,Y
  1178.    Screen Copy 0,32,Y,256,Y+16 To 0,256,Y
  1179.    If N>1
  1180.       Screen Copy 0,16,Y+12,624,Y+16 To 0,16,Y+4+N*8
  1181.       For NN=1 To N
  1182.          Screen Copy 0,16,Y+4,624,Y+12 To 0,16,Y-4+NN*8
  1183.       Next 
  1184.    End If 
  1185.    Locate 3,Y/8+1 : Pen C3 : Paper C1
  1186. End Proc[Y]
  1187. Procedure _ERASE_DIALOG
  1188.    If BLOC : Put Block 1 : Del Block 1 : BLOC=0 : End If 
  1189. End Proc
  1190. Procedure _DISPLAY_MN[N,F]
  1191.    If MN$(N)<>""
  1192.       If F<0
  1193.          F=0 : A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : F=1 : End If 
  1194.       End If 
  1195.       I=Val(Mid$(MN$(N),3,2))
  1196.       X=Val(Mid$(MN$(N),5,3)) : Y=Val(Mid$(MN$(N),8,3))+YMN
  1197.       TX=Val(Mid$(MN$(N),11,3)) : TY=Val(Mid$(MN$(N),14,3))
  1198.       If I
  1199.          If F=0
  1200.             If I<90
  1201.                _UNPACK[I,X,Y]
  1202.             Else 
  1203.                G$="_D"+Mid$(Str$(I),2) : Gosub G$
  1204.             End If 
  1205.          Else 
  1206.             If I<90
  1207.                _UNPACK[I+MNDOWN,X,Y]
  1208.             Else 
  1209.                Screen Copy 0,X+2,Y+1,X+TX,Y+TY To 0,X,Y
  1210.                Cls 0,X+TX-2,Y To X+TX,Y+TY
  1211.                Cls 0,X,Y+TY-1 To X+TX,Y+TY
  1212.             End If 
  1213.          End If 
  1214.          Set Zone N,X,Y To X+TX,Y+TY
  1215.       End If 
  1216.    End If 
  1217.    Pop Proc
  1218.    _D90: _UNPACK[4,X,Y] : _DISPLAY_PATH[0] : Return 
  1219.    _D91: _UNPACK[4,X,Y] : _DISPLAY_PATH[1] : Return 
  1220. End Proc
  1221. Procedure _UNPACK[N,X,Y]
  1222.    Global BPIC
  1223.    A=Start(BPIC)+Deek(Start(BPIC)+2*(N-1))
  1224.    Unpack A,X,Y
  1225. End Proc
  1226. Procedure _MOUSE
  1227.    Multi Wait 
  1228.    MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse) : MZ=Zone(MS,MX,MY)
  1229.    MK=Mouse Key : If MK>3 : MK=3 : End If 
  1230. End Proc
  1231. Procedure _WAIT_NOMK
  1232.    While Inkey$<>"" : Wend 
  1233.    If FWT
  1234.       Wait FWT : FWT=0
  1235.    Else 
  1236.       Wait Vbl : While Mouse Key : Wend 
  1237.    End If 
  1238. End Proc
  1239. Procedure _WAIT_MK
  1240.    _WAIT_NOMK
  1241.    Repeat : _MOUSE : A$=Inkey$ : Until A$<>"" or MK<>0
  1242. End Proc[A$]
  1243. Procedure _NOSPACE[A$]
  1244.    For N=Len(A$) To 1 Step -1
  1245.       If Mid$(A$,N,1)<>" " : Exit : End If 
  1246.    Next 
  1247.    A$=Left$(A$,N)
  1248. End Proc[A$]
  1249. Procedure _SET_FLAGS
  1250.    For N=1 To NMN : If Upper$(Left$(MN$(N),1))="F" : _SET_FLAG[MN$(N)] : End If : Next 
  1251. End Proc
  1252. Procedure _SET_FLAG[A$]
  1253.    V=Asc(Mid$(A$,2,1))-65
  1254.    FLAG(V)=0 : If Left$(A$,1)="F" : FLAG(V)=1 : End If 
  1255. End Proc
  1256. Procedure _LEDIT[ED$,XC,XX,YY,SX,MN]
  1257.    
  1258.    While Inkey$<>"" : Wend 
  1259.    
  1260.    PX=0 : L=Len(ED$) : If L>=SX : PX=L-SX : End If 
  1261.    XC=Max(0,XC) : XC=Min(XC,L)
  1262.    Curs On 
  1263.    Do 
  1264.       Gosub _DED
  1265.       Repeat 
  1266.          A$=Inkey$ : S=Scancode
  1267.          If Mouse Key=1
  1268.             X=(X Screen(X Mouse))/8-XX
  1269.             If X>=MN and X<=L : XC=X : Gosub _DED : Wait Vbl : End If 
  1270.          End If 
  1271.       Until A$<>""
  1272.       F=1
  1273.       If A$=Chr$(13) : Exit : End If 
  1274.       If A$=Chr$(27) : ED$="_Esc_" : Exit : End If 
  1275.       If S=65 and XC+PX>MN
  1276.          ED$=Left$(ED$,XC+PX-1)+Mid$(ED$,PX+XC+1) : E=1 : L=L-1
  1277.          S=79
  1278.       End If 
  1279.       If S=70 and XC+PX<L
  1280.          ED$=Left$(ED$,XC+PX)+Mid$(ED$,PX+XC+2) : E=1 : L=L-1 : F=0
  1281.       End If 
  1282.       If S=79 and PX+XC>MN
  1283.          F=0
  1284.          If XC=0
  1285.             PX=PX-1
  1286.          Else 
  1287.             XC=XC-1
  1288.          End If 
  1289.       End If 
  1290.       If S=78 and PX+XC<L
  1291.          F=0
  1292.          If XC=SX
  1293.             PX=PX+1
  1294.          Else 
  1295.             XC=XC+1
  1296.          End If 
  1297.       End If 
  1298.       If F
  1299.          If A$>=" "
  1300.             ED$=Left$(ED$,PX+XC)+A$+Mid$(ED$,PX+XC+1) : L=L+1
  1301.             If L>SX
  1302.                If XC>=SX
  1303.                   PX=PX+1
  1304.                Else 
  1305.                   XC=XC+1
  1306.                End If 
  1307.             Else 
  1308.                XC=XC+1
  1309.             End If 
  1310.          End If 
  1311.       End If 
  1312.    Loop 
  1313.    Curs Off 
  1314.    Goto _END
  1315.    
  1316.    _DED:
  1317.    Locate XX,YY : Print Mid$(ED$,PX+1,SX);
  1318.    If E : If X Curs<XX+SX : Print " "; : E=0 : End If : End If 
  1319.    Locate Min(XX+XC,XX+SX-1),YY
  1320.    Return 
  1321.    
  1322.    _END:
  1323. End Proc[ED$]
  1324. Procedure _FIND_FILTER[A$]
  1325.    F=Len(A$)+1
  1326.    For N=Len(A$) To 0 Step -1
  1327.       B$=Mid$(A$,N,1)
  1328.       If B$="/" or(B$=":") or N=0
  1329.          For M=N+1 To Len(A$)
  1330.             B$=Mid$(A$,M,1) : If B$="*" or(B$="?") : F=N+1 : Exit 2 : End If 
  1331.          Next 
  1332.       End If 
  1333.    Next 
  1334. End Proc[F]
  1335. Procedure _NO_FILES
  1336.    For N=0 To MXFF : FF$(N)="" : Next 
  1337. End Proc
  1338. Procedure _UNLIGHT_FILE[F,G]
  1339.    F=Val("$"+Mid$(FF$(F),2,3))
  1340.    Mid$(FLAG$(ACT),F,1)="0"
  1341.    If G
  1342.       If F>=PDIR(ACT) and F-PDIR(ACT)<NLINE : _DISPLAY_FILE[ACT,F-PDIR(ACT)] : End If 
  1343.    End If 
  1344. End Proc
  1345. Procedure _GET_SELECTED_FILES
  1346.    Change Mouse 3 : _ALERT[Resource$(35),1]
  1347.    NFF=0 : PFF=-1 : NDD=0 : NSP=0 : TSIZE=0 : FFERR=0
  1348.    Set Dir LFILE,""
  1349.    On Error Goto _ERR
  1350.    
  1351.    For F=1 To SDIR(ACT)
  1352.       A$=Mid$(FLAG$(ACT),F,1)
  1353.       If A$="1"
  1354.          If SIZE(ACT,F)>=0
  1355.             A$=FILE$(ACT,F) : Gosub _NSPACE
  1356.             FF$(NFF)="    "+A$
  1357.             TSIZE=TSIZE+SIZE(ACT,F)
  1358.             NFF=NFF+1
  1359.          Else 
  1360.             A$=FILE$(ACT,F) : Gosub _NSPACE
  1361.             _GET_FILES[A$,FILT$(ACT)] : If FFERR : Exit : End If 
  1362.             Left$(FF$(NFF-1),1)="."
  1363.          End If 
  1364.          Mid$(FF$(NFF-1),2,3)=Mid$(Hex$(F,3),2)
  1365.       End If 
  1366.    Next 
  1367.    _END:
  1368.    If FFERR=11
  1369.       _UNPACK_DIALOG[100,3] : Centre Resource$(86) : Locate ,Y Curs+2 : Centre Resource$(87) : _WAIT_MK : _ERASE_DIALOG
  1370.    End If 
  1371.    If FFERR : NFF=0 : PFF=-1 : NDD=0 : NSP=0 : TSIZE=0 : End If 
  1372.    Change Mouse 1 : _DISPLAY_INF[ACT]
  1373.    Set Dir LFILE,NFILT$
  1374.    Pop Proc
  1375.    
  1376.    _NSPACE: For N=Len(A$) To 1 Step -1 : If Mid$(A$,N,1)<>" " : Exit : End If : Next : A$=Left$(A$,N) : Return 
  1377.    _ERR: For N=0 To MXFF : FF$(N)="" : Next : FFERR=Errn : Resume _END
  1378. End Proc
  1379. Procedure _GET_FILES[P$,F$]
  1380.    
  1381.    If FFERR : Pop Proc : End If 
  1382.    On Error Goto _ERR
  1383.    
  1384.    FF$(NFF)="+   "+P$ : NFF=NFF+1 : NSP=NSP+1 : PDEB=NFF
  1385.    
  1386.    A$=Dir First$(PATH$(ACT)+P$+"/"+F$)
  1387.    While A$<>""
  1388.       If Left$(A$,1)="*"
  1389.          A$=Mid$(A$,2) : Gosub _NSPACE
  1390.          FF$(NFF)="&   "+P$+"/"+A$ : NFF=NFF+1
  1391.          NDOS=NDOS+1
  1392.       Else 
  1393.          TSIZE=TSIZE+Val(Mid$(A$,Len(A$)-10))
  1394.          A$=Left$(A$,Len(A$)-10) : Gosub _NSPACE
  1395.          FF$(NFF)="-   "+P$+"/"+Mid$(A$,2)
  1396.          NFF=NFF+1
  1397.       End If 
  1398.       A$=Dir Next$
  1399.    Wend 
  1400.    
  1401.    If NFF>PDEB
  1402.       For N=PDEB To NFF-1
  1403.          If Left$(FF$(N),1)="&"
  1404.             _GET_FILES[Mid$(FF$(N),5),F$]
  1405.             FF$(N)="" : NSP=NSP+1
  1406.          End If 
  1407.       Next 
  1408.    End If 
  1409.    
  1410.    FF$(NFF)="*   "+P$ : NFF=NFF+1 : NDD=NDD+1
  1411.    Pop Proc
  1412.    
  1413.    _NSPACE: For N=Len(A$) To 1 Step -1 : If Mid$(A$,N,1)<>" " : Exit : End If : Next : A$=Left$(A$,N) : Return 
  1414.    _ERR: For N=0 To MXFF : FF$(N)="" : Next : FFERR=Errn : Resume _END
  1415.    _END:
  1416. End Proc
  1417. Procedure _GET_FF[F$,D]
  1418.    Do 
  1419.       PFF=PFF+1 : If PFF>=NFF : Exit : End If 
  1420.       A$=Left$(FF$(PFF),1)
  1421.       If Instr(F$,A$) : Exit : End If 
  1422.    Loop 
  1423.    If PFF<NFF
  1424.       G$=PATH$(D)+Mid$(FF$(PFF),5)
  1425.    End If 
  1426. End Proc[G$]
  1427. Procedure _NOT_DONE
  1428.    _ALERT[Resource$(27),100]
  1429. End Proc
  1430. Procedure _LOAD_BANK[N$]
  1431.    
  1432.    On Error Goto _END
  1433.    
  1434.    Reserve As Work 13,512*4 : Fill Start(13) To Start(13)+Length(13),0
  1435.    Areg(1)=Start(13) : Dreg(1)=512 : Dreg(0)=0 : Call 12
  1436.    
  1437.    Open In 1,N$
  1438.    A$=Input$(1,4) : A$=Input$(1,2) : NN=Deek(Varptr(A$))
  1439.    NB=0
  1440.    For N=1 To NN
  1441.       Dreg(1)=N : Dreg(0)=3 : Call 12
  1442.       If Dreg(0)=0
  1443.          A$=Input$(1,10) : A=Varptr(A$)
  1444.          SX=Deek(A) : SY=Deek(A+2) : NP=Deek(A+4) : SZ=SX*2*SY*NP
  1445.          Dreg(2)=SX*16 : Dreg(3)=SY : Dreg(4)=NP
  1446.          Dreg(5)=Deek(A+6) : Dreg(6)=Deek(A+8)
  1447.          Dreg(7)=0 : Dreg(0)=1 : Call 12
  1448.          If Dreg(0) : Stop : End If 
  1449.          AC=Areg(0) : P=0
  1450.          While P<SZ
  1451.             L=Min(1024,SZ-P)
  1452.             A$=Input$(1,L)
  1453.             Copy Varptr(A$),Varptr(A$)+L To AC+P
  1454.             P=P+L
  1455.          Wend 
  1456.          NB=NB+1
  1457.       End If 
  1458.    Next 
  1459.    PAL$=Input$(1,64)
  1460.    Close 1
  1461.    Dreg(0)=2 : Dreg(1)=1 : Dreg(7)=0 : Areg(0)=Screen Base : Call 12
  1462.    Goto _END
  1463.    
  1464.    _ERR: _DEL_BANK : NB=0
  1465.    _END:
  1466. End Proc[NB]
  1467. Procedure _REDUCE_BOB[N,X,Y,SX,SY]
  1468.    Dreg(0)=7 : Areg(0)=Screen Base
  1469.    Dreg(1)=N : Dreg(2)=X : Dreg(3)=Y : Dreg(4)=SX : Dreg(5)=SY
  1470.    Call 12
  1471. End Proc
  1472. Procedure _DEL_BANK
  1473.    If Length(13)
  1474.       Dreg(0)=6 : Call 12
  1475.       Erase 13
  1476.    End If 
  1477. End Proc
  1478. Procedure BTEXT[Z,A$,X,Y]
  1479.    Set Pattern 1 : BBAR[Z,X,Y,X+Len(A$)*8+4,Y+10]
  1480.    Text X+3,Y+Text Base+2,A$
  1481. End Proc
  1482. Procedure BBAR[Z,X,Y,XX,YY]
  1483.    Bar X,Y To XX,YY
  1484.    If Z : Set Zone Z,(X+1),Y To XX,YY : End If 
  1485. End Proc
  1486.  
  1487.  
  1488. Procedure _DISK_BUSY[S,D]
  1489.    
  1490.    D$="Df"+Chr$(48+S)+":"+Chr$(0)
  1491.    
  1492.    Dreg(1)=Varptr(D$) : DEV=Doscall(Lvo("DeviceProc"))
  1493.    
  1494.    If DEV
  1495.       
  1496.       Areg(1)=0 : TSK=Execall(Lvo("FindTask"))
  1497.       PRT=TSK+Equ("pr_MsgPort")
  1498.       
  1499.       _RESFREEBANK[Equ("dp_SIZEOF")] : B=Param : S=Start(B)
  1500.       PKT=S+Equ("sp_Pkt") : MSG=S+Equ("sp_Msg")
  1501.       Struc(MSG,"LN_NAME")=PKT
  1502.       Struc(PKT,"dp_Link")=MSG
  1503.       Struc(PKT,"dp_Port")=PRT
  1504.       Struc(PKT,"dp_Type")=Equ("ACTION_INHIBIT")
  1505.       Struc(PKT,"dp_Arg1")=D
  1506.       
  1507.       Areg(0)=DEV : Areg(1)=MSG : A=Execall(Lvo("PutMsg"))
  1508.       Areg(0)=PRT : A=Execall(Lvo("WaitPort"))
  1509.       Areg(0)=PRT : A=Execall(Lvo("GetMsg"))
  1510.       
  1511.       Erase B
  1512.       Wait 50
  1513.       
  1514.    End If 
  1515.    
  1516. End Proc
  1517. Procedure _TRACK_OPEN[S,D]
  1518.    
  1519.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1520.    
  1521.    _TDB=1000 : E=1
  1522.    
  1523.    Trap Dev Open S,"trackdisk.device",Equ("IOTD_SIZE"),D,0
  1524.    If Errtrap=0
  1525.       
  1526.       _TDNUMSEC=Equ("NUMSECS")
  1527.       _TDSECTOR=Equ("TD_SECTOR")
  1528.       
  1529.       Trap Lib Open 3,"intuition.library",36
  1530.       If Errtrap=0
  1531.          Lib Close 3
  1532.          _RESFREEBANK[Equ("dg_SIZEOF")] : B=Param : A=Start(B)
  1533.          Struc(Dev Base(S),"IO_DATA")=A
  1534.          Dev Do S,Equ("TD_GETGEOMETRY")
  1535.          _TDSECTOR=Struc(A,"dg_SectorSize")
  1536.          _TDNUMSEC=Struc(A,"dg_TrackSectors")
  1537.          Erase B
  1538.       End If 
  1539.       
  1540.       _TDSIZE=_TDNUMSEC*_TDSECTOR
  1541.       
  1542.       Dev Do S,Equ("TD_GETNUMTRACKS")
  1543.       _TDTRACKS=Struc(Dev Base(S),"IO_ACTUAL")
  1544.       
  1545.       Reserve As Chip Work _TDB+S,_TDSIZE
  1546.       Reserve As Work _TDB+4,_TDSIZE*2
  1547.       E=0
  1548.    End If 
  1549.    
  1550. End Proc[E]
  1551. Procedure _TRACK_CLOSE[S]
  1552.  
  1553.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1554.  
  1555.    Dev Close S
  1556.    Erase _TDB+S
  1557.    Erase _TDB+4
  1558.    
  1559. End Proc
  1560. Procedure _TRACK_PROTECTED[S]
  1561.    
  1562.    Trap Dev Do S,Equ("TD_PROTSTATUS")
  1563.    P=-1
  1564.    If Errtrap=0
  1565.       P=Sgn(Struc(Dev Base(S),"IO_ACTUAL"))
  1566.    End If 
  1567.    
  1568. End Proc[P]
  1569. Procedure _TRACK_MOTOR[S,M]
  1570.    
  1571.    Struc(Dev Base(S),"IO_LENGTH")=M
  1572.    Trap Dev Do S,Equ("TD_MOTOR")
  1573.    P=-1
  1574.    If Errtrap=0
  1575.       P=Sgn(Struc(Dev Base(S),"IO_ACTUAL"))
  1576.    End If 
  1577.    
  1578. End Proc[P]
  1579. Procedure _TRACK_READ[S,T]
  1580.    
  1581.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1582.    
  1583.    T=_TDSIZE*T
  1584.    Struc(Dev Base(S),"IO_DATA")=Start(_TDB+S)
  1585.    Struc(Dev Base(S),"IO_OFFSET")=T
  1586.    Struc(Dev Base(S),"IO_LENGTH")=_TDSIZE
  1587.    Trap Dev Do S,Equ("CMD_READ")
  1588.    
  1589. End Proc[Errtrap]
  1590. Procedure _TRACK_WRITE[S,T]
  1591.    
  1592.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1593.    
  1594.    T=_TDSIZE*T
  1595.    Struc(Dev Base(S),"IO_DATA")=Start(_TDB+S)
  1596.    Struc(Dev Base(S),"IO_OFFSET")=T
  1597.    Struc(Dev Base(S),"IO_LENGTH")=_TDSIZE
  1598.    Trap Dev Do S,Equ("CMD_WRITE")
  1599.    
  1600. End Proc[Errtrap]
  1601. Procedure _TRACK_FORMAT[S,T]
  1602.    
  1603.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1604.    
  1605.    T=_TDSIZE*T
  1606.    Struc(Dev Base(S),"IO_DATA")=Start(_TDB+S)
  1607.    Struc(Dev Base(S),"IO_OFFSET")=T
  1608.    Struc(Dev Base(S),"IO_LENGTH")=_TDSIZE
  1609.    Trap Dev Do S,Equ("TD_FORMAT")
  1610.    
  1611. End Proc[Errtrap]
  1612. Procedure _TRACK_CHECKSUM[S]
  1613.    
  1614.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1615.    
  1616.    A=Start(_TDB+S)
  1617.    Loke A+20,0
  1618.    C=0
  1619.    For B=A To A+_TDSECTOR-4 Step 4
  1620.       Add C,-Leek(B)
  1621.    Next 
  1622.    Loke A+20,C
  1623.    
  1624. End Proc
  1625. Procedure _TRACK_VERIFY[S,T]
  1626.    
  1627.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1628.    E=1
  1629.    A=Start(_TDB+S) : B=Start(_TDB+4) : Copy A,A+_TDSIZE To B
  1630.    _TRACK_READ[S,T]
  1631.    If Param=0
  1632.       Repeat 
  1633.          For C=0 To _TDSIZE-4 Step 4
  1634.             Exit If Leek(A+C)<>Leek(B+C),2
  1635.          Next 
  1636.          E=0
  1637.       Until True
  1638.    End If 
  1639.    
  1640. End Proc[E]
  1641. Procedure _TRACK_STORE[S,T]
  1642.    
  1643.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1644.    
  1645.    _CRUNCHIT[0,_TDSIZE,Start(_TDB+S),Start(_TDB+4)] : L=Param
  1646.    Trap Reserve As Work _TDB+5+T,L
  1647.    If Errtrap=0
  1648.       Copy Start(_TDB+4),Start(_TDB+4)+L To Start(_TDB+5+T)
  1649.    End If 
  1650. End Proc[Errtrap]
  1651. Procedure _TRACK_USTORE[S,T]
  1652.    
  1653.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1654.    
  1655.    If Length(_TDB+4+T)
  1656.       _CRUNCHIT[1,0,Start(_TDB+5+T),Start(_TDB+S)]
  1657.    Else 
  1658.       Fill Start(_TDB+S) To Start(_TDB+S)+Length(_TDB+S),0
  1659.    End If 
  1660. End Proc
  1661. Procedure _TRACK_FREE
  1662.    
  1663.    Global _TDB,_TDNUMSEC,_TDSECTOR,_TDTRACKS,_TDSIZE
  1664.    
  1665.    For B=_TDB+5 To _TDB+5+_TDTRACKS
  1666.       Erase B
  1667.    Next 
  1668.    
  1669. End Proc
  1670. Procedure _RESFREEBANK[S]
  1671.    
  1672.    For B=65535 To 0 Step -1 : Exit If Length(B)=0 : Next 
  1673.    Reserve As Work B,S
  1674.    Fill Start(B) To Start(B)+Length(B),0
  1675.    
  1676. End Proc[B]
  1677. Procedure _CRUNCHIT[A,B,C,D]
  1678.    ' COMPILED PROCEDURE -- can't convert this to AMOS code
  1679. End Proc