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

  1. '------------------------------------------------------------- 
  2. ' Sample Bank Maker
  3. ' by Fran�ois Lionet 
  4. ' (c) 1992 Europress Software Ltd. 
  5. '------------------------------------------------------------- 
  6. ' If called from the editor menu (with "GRAB" as command line) 
  7. ' this program will grab the first sample bank from the
  8. ' current program, up to bank number 512 
  9. '------------------------------------------------------------- 
  10.  
  11. Set Buffer 12
  12. Close Editor 
  13. VER$="1.00"
  14.  
  15. ' Never break out of the program ! 
  16. Break Off 
  17.  
  18. Dim MN$(70),FLAG(5)
  19. Dim D$(12),R$(12),DIAL$(43)
  20.  
  21. Global MN$(),NMN,FLAG(),YMN,MNDOWN,BPIC
  22. Global DIAL$()
  23. Global XSLI,YSLI,SXSLI,SYSLI
  24. Global XINF,YINF,SXINF,SYINF
  25. Global XBANK,YBANK,SXBANK,SYBANK
  26. Global MX,MY,MZ,MK
  27. Global C0,C1,C2,C3,C4,C5,C6,C7,CA,CNA,ACT
  28. Global BLOC,ALERT,PAL$
  29. Global PBANK,LBANK,NBANK,BNAME$
  30. Global CUSAM,SELSAM
  31. Global SSL,ESL
  32. Global CHANGED,BCHANGED,BGRBBED
  33. Global CUNAME$,CUFREQ,CULEN,CUSTART,CUEND
  34. Global XWAVE,YWAVE,SXWAVE,SYWAVE
  35. Global XSTART,XEND,TITLE
  36. Global BLOC,BCU
  37.  
  38. COM$=Command Line$
  39.  
  40. C0=6 : C1=6 : C2=2 : C3=7 : C4=3 : C5=4 : C6=4 : C7=1
  41.  
  42. BCU=65502
  43. BPIC=65500 : MNDOWN=39
  44. N=20 : Repeat : N=N+1 : Read MN$(N) : Until MN$(N)="End" : NMN=N-1 : _SET_FLAGS
  45. Data "  02384016064052_GSAM","  03384068064052_PSAM"
  46. Data "/ 04624016000000_SL","  05624104016008_DN","  06624112016008_UP"
  47. Data "/ 99000016000000_SSt","/ 99192016000000_SEnd"
  48. Data "/ 99448032176088_BNAME"
  49. Data "/ 07000120000000"
  50. Data "  09000136128008_3plus","  10000144128008_2Plus","  32000152128008_1Plus","  11000160000000","  33000176128008_1Minus","  1200018412808_2Minus","  13000192128008_3Minus"
  51. Data "  14128136016016_STM","  15144136016016_STP","  16160136000000"
  52. Data "  34128152016016_ENM","  35144152016016_ENP","  36160152000000"
  53. Data "  17128168128032_Hear"
  54. Data "  18256136064032_SLoad"
  55. Data "  19320136064032_SSave"
  56. Data "  20256168064032_SName"
  57. Data "  21320168064032_SClr"
  58. Data "  22448136064032_BLoad"
  59. Data "  23512136064032_BSave"
  60. Data "  24576136064032_BSavas"
  61. Data "  25448168064032_BClr"
  62. Data "  26512168064032_BIns"
  63. Data "  27576168064032_BDel"
  64. Data "  28384136000000"
  65. Data "  29000000000000","  30384000064016_MNQUIT","  31448000000000"
  66. Data "End"
  67.  
  68. DIAL$(1)="Free chip:"
  69. DIAL$(2)="Free fast:"
  70. DIAL$(3)="Empty"
  71. DIAL$(4)="Bank: "
  72. DIAL$(5)="not named"
  73. DIAL$(6)="Current sample: "
  74. DIAL$(7)=" - Length:"
  75. DIAL$(8)=" Hertz "
  76. DIAL$(9)="St :"
  77. DIAL$(10)="End:"
  78. DIAL$(11)="Current sample not saved into bank. Continue?"
  79. DIAL$(12)="Please enter new sample name (8 letters)"
  80. DIAL$(13)="Then press <RETURN>"
  81. DIAL$(14)="Erase sample number"
  82. DIAL$(15)="Saving sample number"
  83. DIAL$(16)="Caution. Save has failed. The file on the disc is *not* valid!"
  84. DIAL$(17)="Please enter a sample bank name"
  85. DIAL$(18)=" already exists. Overwrite it? "
  86. DIAL$(19)="Please choose a sample bank"
  87. DIAL$(20)="Current bank not saved. Proceed anyway?"
  88. DIAL$(21)="No bank to save!"
  89. DIAL$(22)=">>> Loading IFF sample <<<"
  90. DIAL$(23)=">>> Loading raw data <<<"
  91. DIAL$(24)="Error while accessing disc."
  92. DIAL$(25)="No sample to save!"
  93. DIAL$(26)="Save an IFF sample"
  94. DIAL$(27)="Please choose a name"
  95. DIAL$(28)=">>> Saving IFF sample <<<"
  96. DIAL$(29)="Load an IFF or raw sample"
  97. DIAL$(30)="AMOS Professional Sample Bank Maker"
  98. DIAL$(31)="Version "+VER$
  99. DIAL$(32)="By Fran�ois Lionet"
  100. DIAL$(33)="Copyright 1992 Europress Software Ltd."
  101. DIAL$(34)="Out of memory: could not load all the samples."
  102. DIAL$(35)="This bank is not a sample bank!"
  103. DIAL$(36)="Error while loading."
  104. DIAL$(37)="Warning, low memory state!"
  105. DIAL$(38)="Out of memory."
  106. DIAL$(39)=" Press mousekey to go on."
  107. DIAL$(40)=": cannot load more samples."
  108. DIAL$(41)="- GRABBED -"
  109. DIAL$(42)="Copy bank to previous program?"
  110. DIAL$(43)="Quit Sample Bank Maker. Sure?"
  111.  
  112. Global LMBANK
  113. LMBANK=65501
  114.  
  115. _INIT_WORK
  116.  
  117. ' Some things to grab? 
  118. If COM$="GRAB"
  119.    _GRAB_FIND["Samples "]
  120.    If Param
  121.       _DEL_BANK
  122.       _GRAB_BANK[Param]
  123.       BNAME$="" : CUSAM=0 : SELSAM=0 : BCHANGED=0 : BGRBBED=1
  124.       _DISPLAY_BANK : _DISPLAY_BNAME
  125.    End If 
  126. End If 
  127.  
  128. ' Main loop
  129. ALERT=1
  130. Do 
  131.    Repeat 
  132.       _MOUSE
  133.       If FMK : MK=FMK : MZ=FMZ : MX=FMX : MY=FMY : FMK=FMK2 : FMK2=0 : FMZ=FMZ2 : End If 
  134.       If ALERT
  135.          ALERT=ALERT-1
  136.          If ALERT=0 : _INFO[""] : End If 
  137.       End If 
  138.    Until MK<>0 and MZ<>0
  139.    If TITLE : TITLE=0 : _DISPLAY_CSAM : End If 
  140.    MFLAG=0
  141.    Do 
  142.       
  143.       MFLAG=MFLAG+1
  144.       
  145.       If MZ<>0 and MFLAG=1
  146.          If MZ<=NMN
  147.             A$=Left$(MN$(MZ),1) : B$="" : Z=MZ
  148.             If A$<>"/"
  149.                If A$=" "
  150.                   If BREL<>MZ : BREL=MZ : _DISPLAY_MN[MZ,1] : End If 
  151.                Else 
  152.                   C$=Upper$(A$) : D$=Lower$(A$)
  153.                   If(C$<>A$) or(D$<>A$)
  154.                      If A$="F" : B$="f" : STATE=0 : End If 
  155.                      If A$="f" : B$="F" : STATE=1 : End If 
  156.                      If B$=""
  157.                         B$=C$
  158.                         For N=1 To NMN
  159.                            If Left$(MN$(N),1)=C$
  160.                               Left$(MN$(N),1)=D$ : _DISPLAY_MN[N,0]
  161.                            End If 
  162.                         Next 
  163.                      End If 
  164.                   End If 
  165.                End If 
  166.                If B$<>"" : Left$(MN$(MZ),1)=B$ : _DISPLAY_MN[MZ,-1] : End If 
  167.                G$="" : P=Instr(MN$(MZ),"_") : If P : G$=Mid$(MN$(MZ),P) : End If 
  168.                If G$<>"" : Gosub G$ : End If 
  169.             Else 
  170.                G$="" : P=Instr(MN$(MZ),"_") : If P : G$=Mid$(MN$(MZ),P) : End If 
  171.                If G$<>"" : Gosub G$ : End If 
  172.             End If 
  173.          End If 
  174.       End If 
  175.       
  176.       OMK=MK : OMZ=MZ : _MOUSE
  177.       If MK=0 : Exit : End If 
  178.       If MZ<>OMZ : Exit : End If 
  179.       
  180.    Loop 
  181.    If BREL : _DISPLAY_MN[BREL,0] : BREL=0 : End If 
  182. Loop 
  183. '------------------
  184. ' Quit 
  185. _MNQUIT:
  186. If BGRBBED
  187.    
  188.    _DIALOG[DIAL$(43),"",0] : F=Param
  189.    If F
  190.       _DIALOG[DIAL$(42),"",0] : F=Param
  191.       If F
  192.          _GRAB_SEND[NBANK]
  193.          If Param
  194.             PQUIT
  195.          Else 
  196.             _DIALOG[DIAL$(38),"",1]
  197.          End If 
  198.       Else 
  199.          PQUIT
  200.       End If 
  201.    End If 
  202.    
  203. Else 
  204.    
  205.    F=-1 : If BCHANGED : _DIALOG[DIAL$(20),"",0] : F=Param : End If 
  206.    If F : _DEL_BANK : PQUIT : End If 
  207.    
  208. End If 
  209. Return 
  210.  
  211. '------------------
  212. ' Transfert to work
  213. _GSAM:
  214. _LOOSE_SAM
  215. If Param
  216.    If SELSAM>0 and SELSAM<=LBANK+1
  217.       _GET_SAM[SELSAM] : Gosub _HEAR : _DISPLAY_CSAM : ALERT=1
  218.       _DISPLAY_BANK : ALERT=1
  219.    End If 
  220. End If 
  221. Return 
  222. '------------------
  223. ' Transfert to bank
  224. _PSAM:
  225. F=1
  226. If CULEN>0
  227.    If SELSAM>0 and SELSAM<=LBANK+1
  228.       If SELSAM<>CUSAM
  229.          SB_START[SELSAM]
  230.          If Param
  231.             _DIALOG[DIAL$(14)+Str$(SELSAM)+" ?","",0] : F=Param
  232.          End If 
  233.       End If 
  234.       If F
  235.          _PUT_SAM[SELSAM]
  236.          If SELSAM=LBANK+1
  237.             If LBANK<126
  238.                LBANK=LBANK+1
  239.                If SELSAM=PBANK+SYBANK-1 : PBANK=PBANK+1 : End If 
  240.                SELSAM=SELSAM+1
  241.             End If 
  242.          End If 
  243.          _DISPLAY_BANK : ALERT=1 : BCHANGED=1
  244.       End If 
  245.    End If 
  246. End If 
  247. Return 
  248. '------------------  
  249. ' Insert Empty 
  250. _BINS:
  251. If LBANK<127
  252.    If SELSAM>0 and SELSAM<LBANK+1
  253.       SB_INSERT[SELSAM]
  254.       LBANK=LBANK+1 : _DISPLAY_BANK : ALERT=1 : BCHANGED=1
  255.    End If 
  256. End If 
  257. Return 
  258. '------------------
  259. ' Delete sample
  260. _BDEL:
  261. If SELSAM>0 and SELSAM<LBANK+1
  262.    F=-1 : SB_START[SELSAM]
  263.    If Param : _DIALOG[DIAL$(14)+Str$(SELSAM),"",0] : F=Param : End If 
  264.    If F
  265.       SB_DELETE[SELSAM]
  266.       LBANK=LBANK-1 : If PBANK>1 and LBANK+1-PBANK<SYBANK : PBANK=PBANK-1 : End If 
  267.       _DISPLAY_BANK : ALERT=1 : BCHANGED=1
  268.    End If 
  269. End If 
  270. Return 
  271. '------------------
  272. ' Clr bank 
  273. _BCLR:
  274. F=-1
  275. If BCHANGED
  276.    _DIALOG[DIAL$(20),"",0] : F=Param
  277. End If 
  278. If F
  279.    _DEL_BANK : ALERT=1 : _DISPLAY_BANK : _DISPLAY_BNAME
  280. End If 
  281. Return 
  282. '------------------
  283. ' Load sample
  284. _SLOAD:
  285. F=-1 : If CULEN : _LOOSE_SAM : F=Param : End If 
  286. If F
  287.    _FSEL["**",DIAL$(29),DIAL$(27)] : F$=Param$
  288.    If F$<>""
  289.       _LOAD_CSAM[F$] : E=Param
  290.    End If 
  291. End If 
  292. _DISPLAY_CSAM
  293. If E=0 : ALERT=1 : End If 
  294. Return 
  295. '------------------
  296. ' Save sample
  297. _SSAVE:
  298. F=-1
  299. If CULEN
  300.    _FSEL["**",DIAL$(26),DIAL$(27)] : F$=Param$
  301.    If F$<>""
  302.       F=-1
  303.       If Exist(F$) : _DIALOG[Right$(F$,20)+DIAL$(18),"",0] : F=Param : End If 
  304.       If F : _SAVE_CSAM[F$] : End If 
  305.    End If 
  306. Else 
  307.    _INFO[DIAL$(25)] : ALERT=100
  308. End If 
  309. Return 
  310. '------------------
  311. ' Clr sample 
  312. _SCLR:
  313. If CULEN
  314.    _LOOSE_SAM
  315.    If Param
  316.       _CSAM_CLR : _DISPLAY_CSAM : ALERT=1
  317.    End If 
  318. End If 
  319. Return 
  320. '------------------
  321. ' Change name
  322. _SNAME:
  323. If CULEN
  324.    YY=8 : _UNPACK_DIALOG[YY*8,4]
  325.    Paper C1 : Pen C3 : Print At(5,YY+1);DIAL$(12) : Print At(5,YY+3);DIAL$(13);
  326.    Pen C4 : _LEDIT[CUNAME$,640,60,YY+2,8]
  327.    If Param$<>"_Esc_"
  328.       CUNAME$=Right$(Param$-" ",8)
  329.       If Len(CUNAME$)<8 : CUNAME$=CUNAME$+String$(" ",8-Len(CUNAME$)) : End If 
  330.    End If 
  331.    _ERASE_DIALOG : _DISPLAY_CNAME
  332. End If 
  333. Return 
  334. '------------------
  335. ' Load a bank
  336. _BLOAD:
  337. F=-1
  338. If BCHANGED
  339.    _DIALOG[DIAL$(20),"",0] : F=Param
  340. End If 
  341. If F
  342.    F=0 : _FSEL["*.Abk",DIAL$(19),""] : F$=Param$
  343.    If F$<>""
  344.       F=-1 : _DEL_BANK : _LOAD_BANK[F$,1] : If Param : BNAME$=F$ : CUSAM=0 : SELSAM=0 : BCHANGED=0 : End If 
  345.    End If 
  346. End If 
  347. If F=0 : _NOT_DONE : End If 
  348. _DISPLAY_BANK : _DISPLAY_BNAME
  349. Return 
  350.  
  351. ' Save as
  352. _BSAVAS:
  353. If LBANK
  354.    _FSEL["*.Abk",DIAL$(17),""] : F$=Param$
  355.    If F$<>""
  356.       F=-1
  357.       If Exist(F$) : _DIALOG[Right$(F$,20)+DIAL$(18),"",0] : F=Param : End If 
  358.       If F : BNAME$=F$ : _SAVE_BANK[BNAME$] : BCHANGED=0 : End If 
  359.       _DISPLAY_BNAME
  360.    End If 
  361.    If F=0 : _NOT_DONE : End If 
  362. Else 
  363.    _INFO[DIAL$(21)] : ALERT=100
  364. End If 
  365. Return 
  366.  
  367. ' Save 
  368. _BSAVE:
  369. If LBANK
  370.    ALERT=1
  371.    If BNAME$="" : _FSEL["*.Abk",DIAL$(17),""] : BNAME$=Param$ : End If 
  372. If BNAME$<>"" : _SAVE_BANK[BNAME$] : BCHANGED=0 Else _NOT_DONE : End If 
  373.    _DISPLAY_BNAME
  374. Else 
  375.    _INFO[DIAL$(21)] : ALERT=100
  376. End If 
  377. Return 
  378. '------------------
  379. ' Click into names 
  380. _BNAME:
  381. Z=MY/8-YBANK : S=PBANK+Z : SS=SELSAM
  382. If S=SS
  383.    If Timer<25 : Goto _GSAM : End If 
  384. Else 
  385.    If SS>0 : SELSAM=-1 : _DISPLAY_BSAM[SS] : End If 
  386.    If S<=LBANK+1 : SELSAM=S : _DISPLAY_BSAM[S] : End If 
  387. End If 
  388. Timer=0
  389. Return 
  390. '------------------
  391. ' Frequency
  392. _1PLUS: D=1 : Goto _PLUS
  393. _2PLUS: D=10 : Goto _PLUS
  394. _3PLUS: D=100 : Goto _PLUS
  395. _1MINUS: D=-1 : Goto _PLUS
  396. _2MINUS: D=-10 : Goto _PLUS
  397. _3MINUS: D=-100 : Goto _PLUS
  398. _PLUS:
  399. If CULEN
  400.    CUFREQ=CUFREQ+D
  401.    CUFREQ=Max(CUFREQ,600)
  402.    CUFREQ=Min(CUFREQ,32000)
  403.    If MK=2 : MFLAG=0 : End If 
  404.    _DISPLAY_CUFREQ : Gosub _HEAR
  405.    CHANGED=1
  406. End If 
  407. Return 
  408. '------------------
  409. ' Start / End of play
  410. _STP: DS=2 : DE=0 : Goto _STK
  411. _STM: DS=-2 : DE=0 : Goto _STK
  412. _ENP: DS=0 : DE=2 : Goto _STK
  413. _ENM: DS=0 : DE=-2 : Goto _STK
  414. _STK: Gosub _SUB : Gosub _HEAR : If MK=2 : MFLAG=0 : End If : Return 
  415. _SST: Z=-1 : Goto _ST
  416. _SEND: Z=0 : Goto _ST
  417. _ST:
  418. If CULEN
  419.    Repeat 
  420.       _MOUSE : X=MX-XWAVE
  421.       If Z
  422.          DS=(X*CULEN)/SXWAVE-CUSTART : DE=0
  423.       Else 
  424.          DE=(X*CULEN)/SXWAVE-CUEND : DS=0
  425.       End If 
  426.       Gosub _SUB
  427.       If MK=2 : Gosub _HEAR : End If 
  428.       Wait 5
  429.    Until MK=0
  430.    Gosub _HEAR
  431. End If 
  432. Return 
  433. _SUB:
  434. S=Max(CUSTART+DS,0) and $FFFFFFFE
  435. E=Min(CUEND+DE,CULEN) and $FFFFFFFE
  436. If E-S>256 : CUSTART=S : CUEND=E : _DISPLAY_CUSTART : CHANGED=1 : End If 
  437. Return 
  438. '------------------  
  439. ' Hear sample
  440. _HEAR:
  441. If CULEN
  442.    Sam Raw 15,Start(BCU)+CUSTART,Max(512,CUEND-CUSTART),CUFREQ
  443. End If 
  444. Return 
  445. '------------------
  446. ' Scrolling icons
  447. _UP: If PBANK+SYBANK<=LBANK+1 : _SCROLL_UP : End If : Return 
  448. _DN: If PBANK>1 : _SCROLL_DOWN : End If : Return 
  449. '--------------- 
  450. ' Bank slider  
  451. _SL:
  452. If MY<SSL or MY>ESL
  453.    If MY<SSL : If PBANK>1 : _SCROLL_DOWN : End If : End If 
  454.    If MY>ESL : If PBANK<=LBANK-SYBANK : _SCROLL_UP : End If : End If 
  455.    If MK=2 : MFLAG=0 : End If 
  456. Else 
  457.    DY=MY-SSL : _DISPLAY_SLIDER[C7]
  458.    Repeat 
  459.       _MOUSE
  460.       Y=MY-YSLI-DY : P=(Y*(LBANK+1))/SYSLI+1
  461.       If P<=0 : P=1 : End If 
  462.       If P>LBANK-SYBANK+2 : P=LBANK-SYBANK+2 : End If 
  463.       If P<>PBANK : PBANK=P : _DISPLAY_SLIDER[C7] : End If 
  464.    Until MK=0
  465.    _DISPLAY_BANK
  466. End If 
  467. Return 
  468.  
  469. Procedure _INIT_WORK
  470.    Screen Open 0,640,200,8,Hires
  471.    Curs Off : Flash Off 
  472.    For C=0 To 7 : Colour C,0 : Next : Wait Vbl 
  473.    Cls 0 : Cls C1,288,4 To 352,SYWORK-4
  474.    
  475.    XSLI=628 : YSLI=18 : SXSLI=8 : SYSLI=83
  476.    XINF=8 : YINF=124 : SXINF=624 : SYINF=8
  477.    XBANK=56 : YBANK=4 : SXBANK=22 : SYBANK=11
  478.    XWAVE=0 : YWAVE=68 : SXWAVE=384 : SYWAVE=52
  479.    
  480.    Reserve Zone NMN
  481.    
  482.    YMN=0
  483.    For N=1 To NMN
  484.       _DISPLAY_MN[N,0]
  485.       A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : _DISPLAY_MN[N,1] : End If 
  486.    Next 
  487.    
  488.    Paper C1 : Pen C4
  489.    Locate XBANK,YBANK-2 : Print " Num Name      Bytes  "
  490.    Locate XBANK,YBANK-1 : Print "----------------------"
  491.    
  492.    _DEL_BANK : _DISPLAY_BANK : _DISPLAY_BNAME
  493.    _CSAM_CLR
  494.    
  495.    Ink C3,0
  496.    Text 24,48,DIAL$(30)
  497.    Text 24,56,DIAL$(31)
  498.    Text 24,72,DIAL$(32)
  499.    Text 24,88,DIAL$(33)
  500.    TITLE=100
  501.    
  502.    Fade 1,$0,$E0E,$77,$FFF,$F00,$EE,$AA,$EEC
  503.    Limit Mouse 
  504.    
  505. End Proc
  506. Procedure _DISPLAY_MN[N,F]
  507.    If MN$(N)<>""
  508.       If F<0
  509.          F=0 : A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : F=1 : End If 
  510.       End If 
  511.       I=Val(Mid$(MN$(N),3,2))
  512.       X=Val(Mid$(MN$(N),5,3)) : Y=Val(Mid$(MN$(N),8,3))+YMN
  513.       TX=Val(Mid$(MN$(N),11,3)) : TY=Val(Mid$(MN$(N),14,3))
  514.       If I
  515.          If F=0
  516.             If I<90
  517.                _UNPACK[I,X,Y]
  518.             Else 
  519.                G$="_D"+Mid$(Str$(I),2) : Gosub G$
  520.             End If 
  521.          Else 
  522.             If I<90
  523.                _UNPACK[I+MNDOWN,X,Y]
  524.             Else 
  525.                Screen Copy 0,X+2,Y+1,X+TX,Y+TY To 0,X,Y
  526.                Cls 0,X+TX-2,Y To X+TX,Y+TY
  527.                Cls 0,X,Y+TY-1 To X+TX,Y+TY
  528.             End If 
  529.          End If 
  530.          If TX<>0 : Set Zone N,X,Y To X+TX,Y+TY : End If 
  531.       End If 
  532.    End If 
  533.    Pop Proc
  534.    _D99: Return 
  535. End Proc
  536. Procedure _UNPACK[N,X,Y]
  537.    Global BPIC
  538.    A=Start(BPIC)+Deek(Start(BPIC)+2*(N-1))
  539.    Unpack A,X,Y
  540. End Proc
  541. Procedure _MOUSE
  542.    Multi Wait 
  543.    MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse) : MZ=Zone(MS,MX,MY)
  544.    MK=Mouse Key : If MK>3 : MK=3 : End If 
  545. End Proc
  546. Procedure _WAIT_NOMK
  547.    If FWT
  548.       Wait FWT : FWT=0
  549.    Else 
  550.       Wait Vbl : While Mouse Key : Wend 
  551.    End If 
  552. End Proc
  553. Procedure _WAIT_MK
  554.    While Inkey$<>"" : Wend 
  555.    Repeat : _MOUSE : Until Inkey$<>"" or MK<>0
  556. End Proc
  557. Procedure _SET_FLAGS
  558.    For N=1 To NMN : If Upper$(Left$(MN$(N),1))="F" : _SET_FLAG[MN$(N)] : End If : Next 
  559. End Proc
  560. Procedure _SET_FLAG[A$]
  561.    V=Asc(Mid$(A$,2,1))-65
  562.    FLAG(V)=0 : If Left$(A$,1)="F" : FLAG(V)=1 : End If 
  563. End Proc
  564. Procedure _LOAD_CSAM[N$]
  565.    
  566.    On Error Proc _DISC_ERROR
  567.    Resume Label _ERR
  568.    
  569.    _CSAM_CLR : CUNAME$=""
  570.    
  571.    If Chip Free+Fast Free<32*1024
  572.       
  573.       _INFO[">>> "+DIAL$(38)+DIAL$(40)+" <<<"] : ALERT=200 : E=-1
  574.       
  575.    Else 
  576.       
  577.       A=1
  578.       Do 
  579.          B=Instr(N$,":",A)
  580.          If B=0
  581.             B=Instr(N$,"/",A) : If B=0 : Exit : End If 
  582.          End If 
  583.          A=B+1
  584.       Loop 
  585.       Repeat 
  586.          C$=Mid$(N$,A,1)
  587.          If(C$=".") or(C$="") : Exit : End If 
  588.          CUNAME$=CUNAME$+C$
  589.          A=A+1
  590.       Until Len(CUNAME$)>=8
  591.       
  592.       Open In 1,N$
  593.       A$=Input$(1,12)
  594.       If(Left$(A$,4)="FORM") and(Right$(A$,4)="8SVX")
  595.          _INFO[DIAL$(22)]
  596.          Do 
  597.             A$=Input$(1,8)
  598.             PCHUNK=Pof(1) : LCHUNK=Leek(Varptr(A$)+4)
  599.             If Left$(A$,4)="VHDR"
  600.                B$=Input$(1,LCHUNK) : A=Varptr(B$)
  601.                CULEN=Leek(A)+Leek(A+4)
  602.                CUFREQ=Deek(A+12)
  603.                LCHUNK=0
  604.             End If 
  605.             If Left$(A$,4)="NAME"
  606.                B$=Input$(1,LCHUNK) : CUNAME$=""
  607.                For N=1 To 8
  608.                   C$=Mid$(B$,N,1) : If(C$<" ") or(C$>Chr$(127)) : C$=" " : End If 
  609.                   CUNAME$=CUNAME$+C$
  610.                Next 
  611.                LCHUNK=0
  612.             End If 
  613.             If Left$(A$,4)="BODY"
  614.                Exit 
  615.             End If 
  616.             If LCHUNK : Pof(1)=PCHUNK+LCHUNK : End If 
  617.          Loop 
  618.       Else 
  619.          _INFO[DIAL$(23)]
  620.          Pof(1)=0 : CULEN=Lof(1) : CUFREQ=8363
  621.       End If 
  622.       
  623.       If CULEN
  624.          CULEN=CULEN and $FFFFFFFE
  625.          Reserve As Chip Work BCU,CULEN
  626.          SZ=CULEN : AC=Start(BCU) : P=0
  627.          While P<SZ
  628.             L=Min(1024,SZ-P)
  629.             A$=Input$(1,L)
  630.             Copy Varptr(A$),Varptr(A$)+L To AC+P
  631.             P=P+L
  632.          Wend 
  633.          CUSTART=0 : CUEND=CULEN
  634.          E=0
  635.       End If 
  636.       
  637.    End If 
  638.    Close : Goto _END
  639.    
  640.    _ERR: E=-1 : _CSAM_CLR
  641.    _END:
  642. End Proc[E]
  643. Procedure _SAVE_CSAM[N$]
  644.    
  645.    On Error Proc _DISC_ERROR
  646.    Resume Label _ERR
  647.    
  648.    _INFO[DIAL$(28)]
  649.    
  650.    Open Out 1,N$
  651.    H$="FORM"+"    "+"8SVX" : Print #1,H$;
  652.    
  653.    A$="VHDR"+String$(Chr$(0),4+20) : A=Varptr(A$) : Loke A+4,20
  654.    Loke A+8,CUEND-CUSTART : Doke A+8+12,CUFREQ
  655.    Poke A+8+14,1 : Loke A+8+16,$10000
  656.    Print #1,A$;
  657.    
  658.    A$="NAME"+String$(Chr$(0),12) : Loke Varptr(A$)+4,8
  659.    Copy Varptr(CUNAME$),Varptr(CUNAME$)+8 To Varptr(A$)+8
  660.    Print #1,A$;
  661.    
  662.    SZ=CUEND-CUSTART : A$="    BODY" : Loke Varptr(A$)+4,SZ : Print #1,A$;
  663.    P=0 : AC=Start(BCU)+CUSTART : A$=String$(" ",1024)
  664.    While P<SZ
  665.       L=Min(1024,SZ-P)
  666.       Copy AC+P,AC+P+L To Varptr(A$)
  667.       Print #1,Left$(A$,L);
  668.       P=P+L
  669.    Wend 
  670.    If(SZ and 1) : Print #1,Chr$(0); : End If 
  671.    
  672.    Loke Varptr(H$)+4,Lof(1)-8
  673.    Pof(1)=0 : Print #1,H$;
  674.    
  675.    Close : E=0 : ALERT=1 : Goto _END
  676.    
  677.    _ERR: _INFO[DIAL$(16)] : ALERT=100 : E=-1
  678.    _END:
  679. End Proc[E]
  680. Procedure _LOAD_BANK[N$,ST]
  681.    
  682.    On Error Proc _DISC_ERROR
  683.    Resume Label _ERR
  684.    
  685.    Open In 1,N$
  686.    A$=Input$(1,4) : If A$<>"AmBk" : _DIALOG[DIAL$(35),"",1] : Goto _ERR : Pop Proc : End If 
  687.    A$=Input$(1,2) : NBANK=Deek(Varptr(A$))
  688.    A$=Input$(1,6)
  689.    A$=Input$(1,8) : If A$<>"Samples " : _DIALOG[DIAL$(35),"",1] : Goto _ERR : End If 
  690.    A$=Input$(1,2) : NN=Deek(Varptr(A$))
  691.    OF$=Input$(1,4) : L=Leek(Varptr(OF$)) : If L>6 : OF$=OF$+Input$(1,L-6) : End If 
  692.    
  693.    NB=0
  694.    For N=1 To NN
  695.       _INFO[">>> Loading sample #"+Str$(N+ST-1)+" <<<"]
  696.       If Leek(Varptr(OF$)+(N-1)*4)
  697.          S$=Input$(1,14)
  698.          SZ=Leek(Varptr(S$)+10)
  699.          If Chip Free+Fast Free<32*1024 : Bell : _INFO[DIAL$(34)+DIAL$(39)] : _WAIT_MK : Exit : End If 
  700.          SB_RESERVE[N+ST-1,SZ+16,0] : If Param=0 : Bell : _INFO[DIAL$(34)+DIAL$(39)] : _WAIT_MK : Exit : End If 
  701.          AC=Param
  702.          For C=1 To 14 : Poke AC,Asc(Mid$(S$,C,1)) : AC=AC+1 : Next 
  703.          P=0
  704.          While P<SZ
  705.             L=Min(1024,SZ-P)
  706.             A$=Input$(1,L)
  707.             Copy Varptr(A$),Varptr(A$)+L To AC+P
  708.             P=P+L
  709.          Wend 
  710.       End If 
  711.       NB=NB+1
  712.    Next 
  713.    Close 1
  714.    LBANK=LBANK+NB
  715.    BCHANGED=0
  716.    Goto _END
  717.    
  718.    _ERR: Close : _DEL_BANK : NB=0
  719.    _END:
  720. End Proc[NB]
  721. Procedure _SAVE_BANK[N$]
  722.    
  723.    On Error Proc _DISC_ERROR
  724.    Resume Label _ERR
  725.    
  726.    Open Out 1,N$
  727.    
  728.    ST$=Mid$("AmBk        Samples ",1) : Print #1,ST$;
  729.    
  730.    OF$=String$(" ",LBANK*4+2) : OF=Len(OF$) : Print #1,OF$;
  731.    
  732.    For N=1 To LBANK
  733.       _INFO[">>> "+DIAL$(15)+Str$(N)+" <<<"]
  734.       SB_START[N]
  735.       If Param
  736.          Loke Varptr(OF$)+2+(N-1)*4,OF
  737.          AC=Param : SZ=Leek(AC+10)+14
  738.          P=0 : A$=String$(" ",1024)
  739.          While P<SZ
  740.             L=Min(1024,SZ-P)
  741.             Copy AC+P,AC+P+L To Varptr(A$)
  742.             Print #1,Left$(A$,L);
  743.             P=P+L
  744.          Wend 
  745.          OF=OF+SZ : If(OF and 1) : OF=OF+1 : Print #1,Chr$(0); : End If 
  746.       Else 
  747.          Loke Varptr(OF$)+2+(N-1)*4,0
  748.       End If 
  749.    Next 
  750.    
  751.    Pof(1)=0
  752.    
  753.    Doke Varptr(ST$)+4,NBANK : Doke Varptr(ST$)+6,0 : Loke Varptr(ST$)+8,$80000008+OF
  754.    Print #1,ST$;
  755.    
  756.    Doke Varptr(OF$),LBANK : Print #1,OF$;
  757.    
  758.    Close 1 : BCHANGED=0 : ALERT=1 : Goto _END
  759.    
  760.    _ERR: _INFO[DIAL$(16)] : ALERT=100
  761.    _END:
  762. End Proc
  763. Procedure _DISPLAY_SLIDER[C]
  764.    Reset Zone 23
  765.    Cls C0,XSLI,YSLI To XSLI+SXSLI,YSLI+SYSLI
  766.    If LBANK>=SYBANK
  767.       SSL=YSLI+(SYSLI*(PBANK-1))/LBANK
  768.       ESL=Min(YSLI+SYSLI,SSL+(SYSLI*SYBANK)/LBANK)
  769.       Cls C,XSLI,SSL To XSLI+SXSLI,ESL
  770.       Set Zone 23,XSLI,YSLI To XSLI+SXSLI,YSLI+SYSLI
  771.    End If 
  772. End Proc
  773. Procedure _DISPLAY_BANK
  774.    For N=PBANK To PBANK+SYBANK : _DISPLAY_BSAM[N] : Next 
  775.    _DISPLAY_SLIDER[C6]
  776. End Proc
  777. Procedure _DISPLAY_BSAM[N]
  778.    
  779.    NN=N-PBANK
  780.    If NN>=0 and NN<SYBANK
  781.       Locate XBANK,YBANK+NN
  782.       
  783.       If SELSAM<>N
  784.          Paper C1
  785.       Else 
  786.          Paper C2
  787.       End If 
  788.       
  789.       Print "                      ";
  790.       Pen C4 : Locate XBANK+1, : Print Mid$(Str$(N),2);
  791.       
  792.       If N<=LBANK+1
  793.          
  794.          Pen C3 : Locate XBANK+5,YBANK+NN
  795.          SB_START[N] : A=Param
  796.          If A
  797.             A$=String$(" ",8) : Copy A,A+8 To Varptr(A$) : Print A$;
  798.             L=Leek(A+10) : Locate XBANK+14, : Print L;
  799.          Else 
  800.             Print DIAL$(3);
  801.          End If 
  802.          
  803.       End If 
  804.    End If 
  805.    
  806. End Proc
  807. Procedure _DISPLAY_BNAME
  808.    A$=DIAL$(4)
  809.    If BGRBBED
  810.       A$=A$+DIAL$(41)
  811.    Else If BNAME$=""
  812.       A$=A$+DIAL$(5)
  813.    Else 
  814.       A$=A$+Right$(BNAME$,16)
  815.    End If 
  816.    Cls C1,472,4 To 636,12
  817.    Ink C3,C1 : Text 456,10,A$
  818. End Proc
  819. Procedure _LOOSE_SAM
  820.    
  821.    F=-1
  822.    If CHANGED
  823.       _DIALOG[DIAL$(11),"",0]
  824.       If Param=0 : _NOT_DONE : F=0 : End If 
  825.    End If 
  826.    
  827. End Proc[F]
  828. Procedure _NOT_DONE
  829.    _INFO[">>> Not done <<<"] : ALERT=100
  830. End Proc
  831. Procedure _GET_SAM[S]
  832.    _CSAM_CLR
  833.    SB_START[S] : A=Param
  834.    If A
  835.       CUNAME$=""
  836.       For C=0 To 7
  837.          P=Peek(A+C) : If P<32 or P>127 : P=32 : End If 
  838.          CUNAME$=CUNAME$+Chr$(P)
  839.       Next 
  840.       CUFREQ=Deek(A+8)
  841.       CUSTART=0 : CULEN=Leek(A+10) and $FFFFFFFE : CUEND=CULEN
  842.       Erase BCU : Reserve As Chip Work BCU,CULEN
  843.       Copy A+14,A+14+CULEN To Start(BCU)
  844.    End If 
  845.    CUSAM=S : CHANGED=0
  846. End Proc
  847. Procedure _PUT_SAM[N]
  848.    S=CUEND-CUSTART
  849.    If Chip Free+Fast Free<32*1024 : _DIALOG[DIAL$(38),"",1] : Pop Proc : End If 
  850.    If S
  851.       SB_RESERVE[N,S+16,0] : A=Param
  852.       If A
  853.          Copy Varptr(CUNAME$),Varptr(CUNAME$)+8 To A
  854.          Doke A+8,CUFREQ : Loke A+10,S
  855.          Copy Start(BCU)+CUSTART,Start(BCU)+CUEND To A+14
  856.          CHANGED=0
  857.       Else 
  858.          Bell : _WAIT_NOMK
  859.          _INFO[">>> "+DIAL$(38)+DIAL$(39)+" <<<"] : _WAIT_MK : ALERT=1
  860.       End If 
  861.    End If 
  862. End Proc
  863. Procedure _CSAM_CLR
  864.    Sam Stop : Erase BCU
  865.    CUNAME$="Empty   "
  866.    CULEN=0 : CUFREQ=0 : CUSTART=0 : CUEND=0
  867.    XSTART=-1 : XEND=-1
  868.    CHANGED=0
  869. End Proc
  870. Procedure _DISPLAY_CSAM
  871.    _DISPLAY_CNAME
  872.    _DISPLAY_CUFREQ : _DISPLAY_CUSTART
  873.    _DISPLAY_WAVE
  874. End Proc
  875. Procedure _DISPLAY_CNAME
  876.    Cls C1,8,4 To 380,12
  877.    If CULEN
  878.       A$=DIAL$(6)+CUNAME$+DIAL$(7)+Str$(CULEN)
  879.       Ink C3,C1 : Text 188-Len(A$)*4,10,A$
  880.    End If 
  881. End Proc
  882. Procedure _DISPLAY_WAVE
  883.    Cls 0,XWAVE,YWAVE-SYWAVE To XWAVE+SXWAVE+1,YWAVE+SYWAVE
  884.    XSTART=-1 : XEND=-1
  885.    If CULEN
  886.       Ink C3,C3 : Draw XWAVE,YWAVE To XWAVE+SXWAVE,YWAVE
  887.       AD=Start(BCU)
  888.       S=(CULEN*64)/SXWAVE
  889.       Plot XWAVE,YWAVE : A=0
  890.       Repeat 
  891.          P=Peek(AD+A/256)
  892.          X=XWAVE+((A/256)*SXWAVE)/CULEN
  893.          If P<128
  894.             Draw To X,YWAVE+(P*SYWAVE)/128
  895.          Else 
  896.             Draw To X,YWAVE+((P-256)*SYWAVE)/128
  897.          End If 
  898.          A=A+S
  899.       Until A/256>CULEN
  900.    End If 
  901. End Proc
  902. Procedure _DISPLAY_CUFREQ
  903.    Cls C1,8,164 To 124,172
  904.    If CULEN
  905.       A$=Str$(CUFREQ)+DIAL$(8)
  906.       Ink C3,C1 : Text 64-Len(A$)*4,170,A$
  907.    End If 
  908. End Proc
  909. Procedure _DISPLAY_CUSTART
  910.    Set Zone 26,XWAVE,YWAVE To XWAVE+SXWAVE/2,YWAVE+SYWAVE
  911.    Set Zone 27,XWAVE+SXWAVE/2,YWAVE To XWAVE+SXWAVE,YWAVE+SYWAVE
  912.    If XSTART>=0 : Put Block 2 : Del Block 2 : XSTART=-1 : End If 
  913.    If XEND>=0 : Put Block 3 : Del Block 3 : XEND=-1 : End If 
  914.    If CULEN
  915.       If CUSTART>0
  916.          XSTART=XWAVE+(CUSTART*SXWAVE)/CULEN : Get Block 2,XSTART,YWAVE-SYWAVE,16,SYWAVE*2
  917.       End If 
  918.       If CUEND<CULEN
  919.          XEND=XWAVE+(CUEND*SXWAVE)/CULEN : Get Block 3,XEND,YWAVE-SYWAVE,16,SYWAVE*2
  920.       End If 
  921.       Ink C2
  922.       If XSTART>=0
  923.          Draw XSTART,YWAVE-SYWAVE To XSTART,YWAVE+SYWAVE-1
  924.          Set Zone 26,XSTART,YWAVE-SYWAVE To XSTART+2,YWAVE+SYWAVE-1
  925.       End If 
  926.       If XEND>=0
  927.          Draw XEND,YWAVE-SYWAVE To XEND,YWAVE+SYWAVE-1
  928.          Set Zone 27,XEND,YWAVE-SYWAVE To XEND+2,YWAVE+SYWAVE-1
  929.       End If 
  930.       Ink C3,C1
  931.       A$=DIAL$(9)+Str$(CUSTART) : Text 168,146,A$+String$(" ",Max(0,10-Len(A$)))
  932.       A$=DIAL$(10)+Str$(CULEN-CUEND)+" " : Text 168,162,A$+String$(" ",Max(0,10-Len(A$)))
  933.    Else 
  934.       Cls C1,168,140 To 168+80,148
  935.       Cls C1,168,156 To 168+80,156+8
  936.    End If 
  937. End Proc
  938.  
  939. Procedure _DEL_BANK
  940.    SB_ERASALL : LBANK=0 : PBANK=1 : SELSAM=-1 : BNAME$=""
  941. End Proc
  942. Procedure _INFO[A$]
  943.    Cls C1,XINF,YINF To XINF+SXINF,YINF+SYINF
  944.    Ink C3,C1
  945.    If A$=""
  946.       A$=DIAL$(1)+Str$(Chip Free)+" - "+DIAL$(2)+Str$(Fast Free)
  947.       If Chip Free+Fast Free<32*1024
  948.          A$=A$+" - "+DIAL$(37)
  949.       End If 
  950.    End If 
  951.    Text 320-Len(A$)*4,YINF+6,A$
  952. End Proc
  953. Procedure _FSEL[F$,T1$,T2$]
  954.    If Chip Free>32000
  955.       F$=Fsel$(F$,"",T1$,T2$)
  956.    Else 
  957.       Screen Open 7,640,24,2,Hires
  958.       Colour 1,$FFF
  959.       Centre ">>> Low-memory file selector! <<<"
  960.       Centre At(,1)+"You *MUST* free some memory now!"
  961.       Centre At(,2)+"...press any key..."
  962.       Wait Key 
  963.       Cls : Centre At(,0)+T1$ : Locate 0,1 : Input "Enter name >";F$
  964.       Screen Close 7
  965.    End If 
  966. End Proc[F$]
  967. Procedure _SCROLL_UP
  968.    Screen Copy 0,XBANK*8,YBANK*8+8,(XBANK+SXBANK)*8,(YBANK+SYBANK)*8 To 0,XBANK*8,YBANK*8
  969.    PBANK=PBANK+1 : _DISPLAY_BSAM[PBANK+SYBANK-1]
  970.    _DISPLAY_SLIDER[C6]
  971. End Proc
  972. Procedure _SCROLL_DOWN
  973.    Screen Copy 0,XBANK*8,YBANK*8,(XBANK+SXBANK)*8,(YBANK+SYBANK-1)*8 To 0,XBANK*8,YBANK*8+8
  974.    PBANK=PBANK-1 : _DISPLAY_BSAM[PBANK]
  975.    _DISPLAY_SLIDER[C6]
  976. End Proc
  977. Procedure _DIALOG[A1$,A2$,F]
  978.    YY=48 : _UNPACK_DIALOG[YY,4]
  979.    Ink C3,C1
  980.    If A2$=""
  981.       Text 48,YY+22,A1$
  982.    Else 
  983.       Text 48,YY+18,A1$ : Text 48,YY+26,A2$
  984.    End If 
  985.    If F
  986.       MN$(1)="  39528052064032" : _DISPLAY_MN[1,0]
  987.    Else 
  988.       MN$(1)="  37464052064032" : MN$(2)="  38528052064032" : _DISPLAY_MN[1,0] : _DISPLAY_MN[2,0]
  989.    End If 
  990.    Wait 20 : _WAIT_NOMK
  991.    Do 
  992.       _MOUSE
  993.       If MK=1 and MZ>0 and MZ<3
  994.          _DISPLAY_MN[MZ,1] : _WAIT_NOMK : _DISPLAY_MN[MZ,0] : R=2-MZ : Exit 
  995.       End If 
  996.    Loop 
  997.    Reset Zone 1 : Reset Zone 2
  998.    _ERASE_DIALOG
  999. End Proc[R]
  1000. Procedure _UNPACK_DIALOG[Y,N]
  1001.    Get Block 1,16,Y-2,624,Y+N*8+9 : BLOC=1
  1002.    Cls 0,30,Y-1 To 610,Y+N*8+9
  1003.    _UNPACK[29,32,Y]
  1004.    Screen Copy 0,48,Y,384+32,Y+16 To 0,240,Y
  1005.    If N>1
  1006.       Screen Copy 0,32,Y+12,608,Y+16 To 0,32,Y+4+N*8
  1007.       For NN=1 To N
  1008.          Screen Copy 0,32,Y+4,608,Y+12 To 0,32,Y-4+NN*8
  1009.       Next 
  1010.    End If 
  1011.    Locate 3,Y/8+1
  1012. End Proc[Y]
  1013. Procedure _ERASE_DIALOG
  1014.    If BLOC : Put Block 1 : Del Block 1 : BLOC=0 : End If 
  1015. End Proc
  1016. Procedure _LEDIT[ED$,XC,XX,YY,SX]
  1017.    
  1018.    While Inkey$<>"" : Wend 
  1019.    
  1020.    PX=0 : L=Len(ED$) : If L>=SX : PX=L-SX : End If 
  1021.    XC=Max(0,XC) : XC=Min(XC,L)
  1022.    Curs On 
  1023.    Do 
  1024.       Gosub _DED
  1025.       Repeat 
  1026.          A$=Inkey$ : S=Scancode
  1027.          If Mouse Key=1
  1028.             X=(X Screen(X Mouse))/8-XX
  1029.             If X>=0 and X<=L : XC=X : Gosub _DED : Wait Vbl : End If 
  1030.          End If 
  1031.       Until A$<>""
  1032.       F=1
  1033.       If A$=Chr$(13) : Exit : End If 
  1034.       If A$=Chr$(27) : ED$="_Esc_" : Exit : End If 
  1035.       If S=65 and XC+PX>0
  1036.          ED$=Left$(ED$,XC+PX-1)+Mid$(ED$,PX+XC+1) : E=1 : L=L-1
  1037.          S=79
  1038.       End If 
  1039.       If S=70 and XC+PX<L
  1040.          ED$=Left$(ED$,XC+PX)+Mid$(ED$,PX+XC+2) : E=1 : L=L-1 : F=0
  1041.       End If 
  1042.       If S=79 and PX+XC>0
  1043.          F=0
  1044.          If XC=0
  1045.             PX=PX-1
  1046.          Else 
  1047.             XC=XC-1
  1048.          End If 
  1049.       End If 
  1050.       If S=78 and PX+XC<L
  1051.          F=0
  1052.          If XC=SX
  1053.             PX=PX+1
  1054.          Else 
  1055.             XC=XC+1
  1056.          End If 
  1057.       End If 
  1058.       If F
  1059.          If A$>=" "
  1060.             ED$=Left$(ED$,PX+XC)+A$+Mid$(ED$,PX+XC+1) : L=L+1
  1061.             If L>SX
  1062.                If XC>=SX
  1063.                   PX=PX+1
  1064.                Else 
  1065.                   XC=XC+1
  1066.                End If 
  1067.             Else 
  1068.                XC=XC+1
  1069.             End If 
  1070.          End If 
  1071.       End If 
  1072.    Loop 
  1073.    Curs Off 
  1074.    Goto _END
  1075.    
  1076.    _DED:
  1077.    Locate XX,YY : Print Mid$(ED$,PX+1,SX);
  1078.    If E : If X Curs<XX+SX : Print " "; : E=0 : End If : End If 
  1079.    Locate Min(XX+XC,XX+SX-1),YY
  1080.    Return 
  1081.    
  1082.    _END:
  1083. End Proc[ED$]
  1084. Procedure _DISC_ERROR
  1085.    Close : Bell : _DIALOG[DIAL$(24),"",1]
  1086.    Resume Label 
  1087. End Proc
  1088.  
  1089. Procedure SB_RESERVE[N,L,F]
  1090.    Dreg(0)=2 : Dreg(1)=N : Dreg(2)=L : Dreg(3)=F : Call Start(LMBANK)
  1091. End Proc[Dreg(0)]
  1092. Procedure SB_ERASE[N]
  1093.    Dreg(0)=3 : Dreg(1)=N : Call Start(LMBANK)
  1094. End Proc
  1095. Procedure SB_START[N]
  1096.    Dreg(0)=0 : Dreg(1)=N : Call Start(LMBANK)
  1097. End Proc[Dreg(0)]
  1098. Procedure SB_LENGTH[N]
  1099.    Dreg(0)=1 : Dreg(1)=N : Call Start(LMBANK)
  1100. End Proc[Dreg(0)]
  1101. Procedure SB_ERASALL
  1102.    Dreg(0)=4 : Call Start(LMBANK)
  1103. End Proc
  1104. Procedure SB_INSERT[N]
  1105.    Dreg(0)=5 : Dreg(1)=N : Call Start(LMBANK)
  1106. End Proc
  1107. Procedure SB_DELETE[N]
  1108.    Dreg(0)=6 : Dreg(1)=N : Call Start(LMBANK)
  1109. End Proc
  1110.  
  1111. Procedure _GRAB_FIND[C$]
  1112.    
  1113.    If Prg Under
  1114.       
  1115.       For B=1 To 512
  1116.          If Blength(B)
  1117.             If Peek$(Bstart(B)-8,8)=C$
  1118.                BB=B : Exit 
  1119.             End If 
  1120.          End If 
  1121.       Next 
  1122.       
  1123.    End If 
  1124.    
  1125. End Proc[BB]
  1126. Procedure _GRAB_BANK[B]
  1127.    
  1128.    ST=1
  1129.    
  1130.    NBANK=B
  1131.    AB=Bstart(NBANK) : NN=Deek(AB)
  1132.    AO=AB+2
  1133.    
  1134.    NB=0
  1135.    For N=0 To NN-1
  1136.       _INFO[">>> Grabbing sample #"+Str$(N+ST)+" <<<"]
  1137.       If Leek(AO+N*4)
  1138.          AG=AB+Leek(AO+N*4)
  1139.          SZ=Leek(AG+10)
  1140.          If Chip Free+Fast Free<32*1024 : Bell : _INFO[DIAL$(34)+DIAL$(39)] : _WAIT_MK : Exit : End If 
  1141.          SB_RESERVE[N+ST,SZ+16,0] : If Param=0 : Bell : _INFO[DIAL$(34)+DIAL$(39)] : _WAIT_MK : Exit : End If 
  1142.          AC=Param
  1143.          Copy AG,AG+14 To AC : AC=AC+14
  1144.          Copy AG,AG+SZ To AC
  1145.       End If 
  1146.       Inc NB
  1147.    Next 
  1148.    
  1149.    LBANK=LBANK+NB
  1150.    BCHANGED=0
  1151.    
  1152. End Proc[NB]
  1153. Procedure _GRAB_SEND[B]
  1154.    
  1155.    If LBANK
  1156.       
  1157.       S=2+LBANK*4
  1158.       For N=1 To LBANK
  1159.          SB_START[N] : If Param : Add S,Leek(Param+10)+14 : End If 
  1160.       Next 
  1161.       
  1162.       Trap Reserve As Chip Data B,S
  1163.       
  1164.       If Errtrap : Pop Proc[0] : End If 
  1165.  
  1166.       AB=Start(B)
  1167.       Poke$ AB-8,"Samples "
  1168.       Doke AB,LBANK
  1169.       AO=AB+2 : AG=AB+2+LBANK*4
  1170.  
  1171.       For N=0 To LBANK-1
  1172.          SB_START[N+1]
  1173.          If Param
  1174.             Loke AO+N*4,AG-AB
  1175.             AC=Param : SZ=Leek(AC+10) : Copy AC,AC+14+SZ To AG
  1176.             Add AG,14+SZ
  1177.          Else 
  1178.             Loke AO+N*4,0
  1179.          End If 
  1180.       Next 
  1181.       
  1182.    End If 
  1183.    
  1184.    Trap Bsend B
  1185.    Trap Erase B
  1186.    
  1187. End Proc[-1]
  1188. Procedure PQUIT
  1189.  
  1190.    Trap Fade 1 : Wait 16
  1191.    Trap Screen Close 0
  1192.    Erase BCU
  1193.    Edit 
  1194.    
  1195. End Proc