home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 3 / MA_Cover_3.iso / maksiu / tools / samplebankedit.lha / SampleBankEditor.AMOS / SampleBankEditor.amosSourceCode < prev    next >
Encoding:
AMOS Source Code  |  1993-02-25  |  58.1 KB  |  1,796 lines

  1. '************************************************************    
  2. '**  Sample Bank Editor V1.1 - By Paul Hickman ï¿½ Oct 1993  **    
  3. '**                                                        **
  4. '** Based On The AMOS Sample Bank Maker by Francois Lionet **
  5. '** & Peter Hickman (No Relation)                          **
  6. '************************************************************
  7. '
  8. ' You may increase the storage capacity of this program by changing
  9. ' the size of the text buffer. You can also increase the maximum number
  10. ' of samples per bank by changing MXSAM. 
  11. '
  12. '
  13. '
  14. Set Buffer 150
  15. Close Editor : Screen Close 0
  16. Global MXSAM,ACK$
  17. MXSAM=200 : VER$="1.1" : RV$="1.0"
  18. ACK$="Acknowledged"
  19. '
  20. '
  21. '
  22. '
  23. '
  24. '
  25. '
  26. Dim S$(MXSAM),F$(MXSAM),F(MXSAM),TYPE(MXSAM),TYPE$(4)
  27. Dim ERR$(12),EXERR$(10),PLF(10)
  28. NSAM=0 : L0ADED_SAMPLES=False
  29. Global S$(),F$(),F(),TYPE(),L0ADED_SAMPLES,SELMODE,SELPOS,TYPE$(),MSIM
  30. Global X1,X2,Y1,Y2,FR_REQ$,MXREQS,SCY,HSC,WINOFF,YL,NSAM,PLF(),TITLESTR$
  31. MXREQS=4 : Dim REQS(MXREQS,2),REQS$(MXREQS,2),REQC(MXREQS,3)
  32. FR_REQ$=Space$(MXREQS) : RGE$=" "
  33. Global REQS(),REQS$(),REQC(),DFILE$,PATH$,REQ,REQ$,REQDX,REQDY
  34. FSELWIDTH=50 : SCY=44 : WINOFF=0 : NSAM=0 : MSIM=5
  35. TYPE$(1)="RAW"
  36. TYPE$(2)="STOS"
  37. TYPE$(3)="IFF"
  38. TYPE$(4)="AMOS"
  39. TITLESTR$="New-Bank"
  40. For A=2 To 10 : Read PLF(A) : Next 
  41. Data 1024,2048,4096,6144,8192,12288,16384,32768,10000
  42. MAKE_RAM
  43. SETUP_IO_ERRORS
  44. SET_UP_SCREEN
  45. MOUSE_BUSY[True]
  46. DISPLAY_SAMS
  47. ED_INFO
  48. FADIN
  49. ABOUT
  50. MAIN
  51. '
  52. '
  53. '
  54. Procedure MAIN
  55.    Shared MESSAGE,_MESSAGE$
  56.    '
  57.    'Install general error handler 
  58.    '
  59.    Goto BEGIN
  60.    RESTART:
  61.    BEGIN:
  62.    On Error Proc GENERAL_ERROR
  63.    Resume Label RESTART
  64.    '
  65.    '
  66.    '
  67.    Do 
  68.       K$=Inkey$ : S=Scancode : SS=Scanshift : MK=0 : C=0 : A=0
  69.       If(K$="") or(Mouse Key>0)
  70.          MOUSE_READY
  71.          Repeat 
  72.             Multi Wait : Inc A
  73.             If(Timer>MESSAGE) and(MESSAGE>0) : MESSAGE=0 : A=50 : End If 
  74.             If A=50 : ED_INFO : End If 
  75.             Menu On 
  76.             MK=Mouse Key : Z=Mouse Zone : C=Choice
  77.             K$=Inkey$ : S=Scancode : SS=Scanshift
  78.          Until(K$<>"") or(MK<>0) or(C<>0)
  79.       End If 
  80.       Curs Off 
  81.       '
  82.       '
  83.       If(MK=1) and(Z=1)
  84.          SLIDER_READ[1,WINOFF,Max(0,NSAM-YL),YL,3]
  85.          WINOFF=Param#
  86.          DISPLAY_SAMS
  87.       End If 
  88.       '
  89.       If C
  90.          Menu Off : SELMODE=0
  91.          MESSAGE=0 : MOUSE_BUSY[False]
  92.          ED_INFO
  93.          On Choice(1) Gosub ED_PROJECT,ED_SAMPLE,ED_PROP
  94.          K=0 : K$="" : S=0 : ED_INFO
  95.       End If 
  96.       '
  97.       If(MK=1) and(Z>1) and(Z<NSAM+2)
  98.          Screen Copy Screen, Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z) To Screen, Extension_16_0006(Z), Extension_16_001C(Z),%110000
  99.          Repeat : Exit If Mouse Zone<>Z : Until Mouse Key=0
  100.          Screen Copy Screen, Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z) To Screen, Extension_16_0006(Z), Extension_16_001C(Z),%110000
  101.          If Mouse Zone=Z
  102.             SELPOS=Z-1+WINOFF
  103.             On SELMODE Proc _INCLUDE_SAMPLE,_REMOVE1,_MOVE1,_MOVE2,_ED_NAME,_ED_FREQ,AP_BANK,PL_SAMPLE
  104.          End If 
  105.       End If 
  106.    Loop 
  107.    '
  108.    ED_PROJECT:
  109.    On Choice(2) Proc CLEAR,OPEN,SVE,SVE_AS,IN_BANK,AP_BANK,NULL,ABOUT,ICONIFY,HELP,PQUIT
  110.    Clear Key : Return 
  111.    ED_SAMPLE:
  112.    On Choice(2) Proc _APPEND_SAMPLE,_INSERT_SAMPLE,_REMOVE_SAMPLE,_MOVE_SAMPLE,_PLAY_SAMPLE
  113.    Clear Key : Return 
  114.    ED_PROP:
  115.    On Choice(2) Proc _EDIT_NAME,_EDIT_FREQ
  116.    Clear Key : Return 
  117. End Proc
  118. Procedure NULL
  119. End Proc
  120. Procedure DISPLAY_SAMS
  121.    Paper 1 : Pen 3
  122.    Under On 
  123.    If L0ADED_SAMPLES
  124.       If(NSAM-WINOFF<YL) and(WINOFF>0)
  125.          WINOFF=Max(0,NSAM-YL)
  126.       End If 
  127.       Y=3
  128.       For LOP=WINOFF+1 To WINOFF+Min(NSAM-WINOFF,YL)
  129.          Print At(0,Y);"   |        |                        |            |             |        |   ";
  130.          Print At(6,Y);" ";LOP;At(14,Y);Left$(F$(LOP),21);At(40,Y); Using "#######";Len(S$(LOP))
  131.          Print At(54,Y); Using "#####";F(LOP);"Hz"
  132.          Print At(67,Y);TYPE$(TYPE(LOP))
  133.          Inc Y
  134.       Next LOP
  135.       If Y<=YL+3
  136.          Cls 1,0,Y*8 To 616,24+YL*8
  137.       End If 
  138.    Else 
  139.       Cls 1,0,24 To 616,24+YL*8
  140.    End If 
  141.    Under Off 
  142.    SLIDER_DRAW[1,WINOFF,Max(0,NSAM-YL),YL,1]
  143. End Proc
  144. Procedure SET_UP_SCREEN
  145.    HSC=250 : If Ntsc Then HSC=200
  146.    YL=(HSC-2)/8
  147.    Screen Open 1,640,HSC,4,Hires
  148.    Screen Display 1,,160,,0 : Flash Off 
  149.    Flash 2,"(000,2)(440,2)(880,2)(BB0,2)(DD0,2)(EE0,2)(FF2,2)(FF8,2)(FFC,2)(AAF,2)(88B,2)(448,2)(226,2)(004,2)(001,2)"
  150.    Palette 0,0,0,0 : Bob Update Off 
  151.    Colour Back Colour(0)
  152.    Cls 1
  153.    Limit Mouse 128,SCY To 446,SCY+HSC
  154.    MOUSE_BUSY[True]
  155.    Menu Del : Set Paint 0
  156.    Paper 3 : Pen 0
  157.    '
  158.    Menu Static 1 : Menu Static 2 : Menu Static 3
  159.    Menu$(1)=" Project "
  160.    Menu$(1,1)=" Clear Buffer    N (LO116,0:BO3:LO0,0) " : Menu Key(1,1) To 51,128
  161.    Menu$(1,2)=" Open Bank       O (LO116,0:BO3:LO0,0) " : Menu Key(1,2) To 24,128
  162.    Menu$(1,3)=" Save Bank       S (LO116,0:BO3:LO0,0) " : Menu Key(1,3) To 33,128
  163.    Menu$(1,4)=" Save Bank As    A (LO116,0:BO3:LO0,0) " : Menu Key(1,4) To 32,128
  164.    Menu$(1,5)=" Include Bank    I (LO116,0:BO3:LO0,0) " : Menu Key(1,5) To 23,128
  165.    Menu$(1,6)=" Append  Bank    E (LO116,0:BO3:LO0,0) " : Menu Key(1,6) To 18,128
  166.    Menu$(1,7)="-------------------" : Menu Inactive(1,7)
  167.    Menu$(1,8)=" About             "
  168.    Menu$(1,9)=" Iconify           "
  169.    Menu$(1,10)=" Help         HELP " : Menu Key(1,10) To 95
  170.    Menu$(1,11)=" Quit            Q (LO116,0:BO3:LO0,0) " : Menu Key(1,11) To 16,128
  171.    '
  172.    Menu$(2)=" Sample "
  173.    Menu$(2,1)=" Append Sample    L (LO124,0:BO3:LO0,0) " : Menu Key(2,1) To 40,128
  174.    Menu$(2,2)=" Insert Sample    I (LO124,0:BO3:LO0,0) " : Menu Key(2,2) To 23,128
  175.    Menu$(2,3)=" Remove Sample    R (LO124,0:BO3:LO0,0) " : Menu Key(2,3) To 19,128
  176.    Menu$(2,4)=" Move Sample      M (LO124,0:BO3:LO0,0) " : Menu Key(2,4) To 55,128
  177.    Menu$(2,5)=" Play Sample      P (LO124,0:BO3:LO0,0) " : Menu Key(2,5) To 25,128
  178.    '
  179.    Menu$(3)=" Properties "
  180.    Menu$(3,1)=" Rename Sample     N (LO132,0:BO2:LO0,0) " : Menu Key(3,1) To 54,64
  181.    Menu$(3,2)=" Edit Frequency    F (LO132,0:BO2:LO0,0) " : Menu Key(3,2) To 35,64
  182.    '
  183.    Menu On 
  184.    Reserve Zone 30
  185.    Set Zone 1,616,12 To 639,24+YL*8
  186.    For A=2 To 12
  187.       Set Zone A,0,A*8+7 To 615,A*8+16
  188.    Next 
  189.    Curs Off 
  190.    Under On : Pen 3 : Paper 1
  191.    Ink 3 : Draw 0,15 To 616,15
  192.    Print At(0,2);"   | Sample |       Sample name      |   Length   |  Frequency  |  Type  |   ";
  193. End Proc
  194. Procedure INSERT[P]
  195.    If NSAM=MXSAM
  196.       SIMPLE_REQUESTER[TITLESTR$,"Maximum number of samples reached"," Acknowledged ",1]
  197.       OK=False
  198.    Else 
  199.       OK=True
  200.       For A=NSAM To P Step -1
  201.          TYPE(A+1)=TYPE(A)
  202.          F(A+1)=F(A)
  203.          S$(A+1)=S$(A)
  204.          F$(A+1)=F$(A)
  205.       Next 
  206.       Inc NSAM
  207.    End If 
  208. End Proc
  209. Procedure DELETE[P]
  210.    If NSAM>0
  211.       For A=P To NSAM-1
  212.          TYPE(A)=TYPE(A+1)
  213.          F(A)=F(A+1)
  214.          S$(A)=S$(A+1)
  215.          F$(A)=F$(A+1)
  216.       Next 
  217.       Dec NSAM
  218.       If NSAM=0 : L0ADED_SAMPLES=False : End If 
  219.    End If 
  220. End Proc
  221. '
  222. 'Project Menu
  223. '
  224. Procedure ABOUT
  225.    Shared VER$,RV$
  226.    L$=Chr$(10)
  227.    REQUEST_OPEN[65,19,7] : RN=Param
  228.    REQUEST_DRAW[RN,"About Sample Bank Editor - Version "+VER$+" - Revision "+RV$]
  229.    A$="Sample Bank Editor was written by Paul Hickman"+Chr$(169)+" 1993"+L$+"E-Mail: ph@doc.ic.ac.uk"+L$+L$
  230.    A$=A$+"This program is freeware, but the complete archive"+L$+"must be distributed unmodified."
  231.    REQUEST_ADD_TEXT[RN,0,A$,False,True]
  232.    REQUEST_ADD_TEXT[RN,2,"Based On The AMOS"+L$+"Sample Bank Maker"+L$+"By Peter Hickman"+L$+"(No Relation)"+L$,False,True]
  233.    REQUEST_ADD_TEXT[RN,1,"Written In"+L$+L$+L$+L$+"Basic V1.36",False,True] : AMZ=Param
  234.    REQUEST_ADD_TEXT[RN,1,"Chip Mem:"+Str$(Chip Free),True,True]
  235.    REQUEST_ADD_TEXT[RN,2,"Fast Mem:"+Str$(Fast Free),True,True]
  236.    REQUEST_ADD_BUTTONS[RN,0,"Press Left Mouse button Here Or Return To Continue",1,True] : BZ=Param
  237.    MOUSE_READY
  238.    Repeat 
  239.       Sprite 2,X Hard( Extension_16_0006(AMZ)+54),Y Hard( Extension_16_001C(AMZ)+16),4
  240.       REQUEST_GET_INPUT[RN] : Z=Param
  241.    Until Z=BZ
  242.    Sprite Off 2 : REQUEST_CLOSE[RN]
  243.    MOUSE_BUSY[True]
  244. End Proc
  245. Procedure CLEAR
  246.    SIMPLE_REQUESTER[TITLESTR$,"Erase All Samples","  Yes  |  No  | Save First ",2] : A=Param
  247.    If A=3
  248.       SVE_AS
  249.       If Param=1 : A=1 : End If 
  250.    End If 
  251.    If A=1
  252.       For LOP=1 To NSAM
  253.          S$(LOP)=""
  254.          F$(LOP)=""
  255.          F(LOP)=0
  256.          TYPE(LOP)=0
  257.       Next LOP
  258.       L0ADED_SAMPLES=False
  259.       NSAM=0
  260.       DISPLAY_SAMS
  261.    End If 
  262. End Proc
  263. Procedure OPEN
  264.    Shared BUF_FILE$,BUF_PATH$
  265.    BUF_FILE$=""
  266.    BUF_PATH$=""
  267.    FILE_REQUESTER["Open an existing sample bank",False," Open "]
  268.    If Param and(DFILE$<>"")
  269.       If Exist(PATH$+DFILE$)
  270.          BUF_PATH$=PATH$ : BUF_FILE$=DFILE$
  271.          NSAM=0 : TITLESTR$=BUF_FILE$
  272.          OPEN_BANK[PATH$+DFILE$,1]
  273.       End If 
  274.    End If 
  275. End Proc
  276. Procedure IN_BANK
  277.    ED_PERM_MESSAGE["Select Position To Inlcude Bank"]
  278.    SELMODE=7
  279. End Proc
  280. Procedure AP_BANK
  281.    A=NSAM+1 : A$="Append "
  282.    If SELMODE=7
  283.       SELMODE=0 : A=SELPOS : A$="Include "
  284.    End If 
  285.    FILE_REQUESTER[A$+"an existing sample bank",False," "+A$]
  286.    If Param and(DFILE$<>"")
  287.       If Exist(PATH$+DFILE$)
  288.          OPEN_BANK[PATH$+DFILE$,A]
  289.       End If 
  290.    End If 
  291. End Proc
  292. Procedure SVE
  293.    Shared BUF_FILE$,BUF_PATH$
  294.    If BUF_FILE$=""
  295.       SVE_AS
  296.    Else 
  297.       CMPILE_SAVE_BANK[BUF_FILE$+BUF_PATH$]
  298.    End If 
  299. End Proc
  300. Procedure SVE_AS
  301.    Shared BUF_FILE$,BUF_PATH$
  302.    If BUF_PATH$<>""
  303.       PATH$=BUF_PATH$
  304.    End If 
  305.    BUF_PATH$="" : BUF_FILE$=""
  306.    FILE_REQUESTER["Save Sample Bank As...",True," Save "]
  307.    If Param and(DFILE$<>"")
  308.       If Exist(PATH$)
  309.          BUF_PATH$=PATH$ : BUF_FILE$=DFILE$ : TITLESTR$=BUF_FILE$
  310.          CMPILE_SAVE_BANK[PATH$+DFILE$]
  311.          OK=Param
  312.       End If 
  313.    End If 
  314. End Proc[OK]
  315. Procedure PQUIT
  316.    SIMPLE_REQUESTER[TITLESTR$,"Quit Program","  Yes  |  No  | Save First ",2] : A=Param
  317.    If A=3
  318.       SVE_AS
  319.       If Param=1 : A=1 : End If 
  320.    End If 
  321.    If A=1
  322.       Fade 3 : Wait 50 : Screen Close 1
  323.        Extension_16_0220 
  324.       End 
  325.    End If 
  326. End Proc
  327. Procedure HELP
  328.    HYPER[Start(6),"Sample Bank Editor V1.1: On-Line Hypertext Help",78,21]
  329. End Proc
  330. '
  331. 'Project Support 
  332. '
  333. Procedure OPEN_BANK[F$,POS]
  334.    On Error Proc IO_ERRORS
  335.    Resume Label OP_ERR
  336.    '
  337.    Open In 1,F$ : L=Lof(1) : Close 1
  338.    Erase 10 : Reserve As Work 10,L
  339.    Bload F$,Start(10)
  340.    '
  341.    If Extension_16_026E( Extension_16_01CE(1)+12,8)<>"Samples "
  342.       SIMPLE_REQUESTER[TITLESTR$,"File is not a sample bank"," Acknowledged ",1]
  343.    Else 
  344.       ACALC=Start(10)+20
  345.       N=Deek(ACALC)
  346.       For A=0 To N-1
  347.          SAD=ACALC+Leek(ACALC+2+A*4)
  348.          INSERT[POS] : Exit If Not Param
  349.          F$(POS)= Extension_16_026E(SAD,8)
  350.          F(POS)=Deek(SAD+8)
  351.          TYPE(POS)=4
  352.          S$(POS)= Extension_16_026E(SAD+14,Leek(SAD+10))
  353.          Inc POS
  354.       Next 
  355.    End If 
  356.    L0ADED_SAMPLES=True
  357.    DISPLAY_SAMS
  358.    '
  359.    Pop Proc
  360.    OP_ERR:
  361.    Erase 10 : L0ADED_SAMPLES=False
  362.    Close 
  363. End Proc
  364. Procedure CMPILE_SAVE_BANK[F$]
  365.    If NSAM=0
  366.       SIMPLE_REQUESTER[TITLESTR$,"Buffer Is Empty! - Can't Save",ACK$,1]
  367.       OK=False
  368.    Else 
  369.       On Error Proc IO_ERRORS
  370.       Resume Label CMP_ERR
  371.       ED_MESSAGE["Converting Samples - Please Wait"] : ED_INFO
  372.       TL=2 : TN=0
  373.       For N=1 To NSAM
  374.          If Len(S$(N))<>0
  375.             Inc TN
  376.             TL=TL+Len(S$(N))+4+14
  377.          End If 
  378.       Next 
  379.       Erase 10
  380.       Reserve As Work 10,TL+12+8
  381.       AD= Extension_16_0296(Start(10),"AmBk")
  382.       Doke AD,5 : Add AD,2
  383.       Doke AD,0 : Add AD,2
  384.       Loke AD,(TL+8) or $80000000 : Add AD,4
  385.       AD= Extension_16_0296(AD,"Samples ")
  386.       ACALC=AD
  387.       Doke AD,TN : Add AD,2
  388.       AOFF=AD
  389.       APOKE=AOFF+TN*4
  390.       For N=1 To NSAM
  391.          If S$(N)<>""
  392.             Loke AOFF,APOKE-ACALC : Add AOFF,4
  393.              Extension_16_02A6 APOKE,Left$(F$(N),8)
  394.             Doke APOKE+8,F(N)
  395.             Loke APOKE+10,Len(S$(N))
  396.             APOKE=APOKE+14
  397.             If TYPE(N)=2
  398.                A=Varptr(S$(N))
  399.                PP=Varptr(P)
  400.                For X=0 To Len(S$(N))-1
  401.                P=Peek(A+X)-128
  402.                Poke APOKE+X,Peek(PP+3)
  403.                Next X
  404.                APOKE=APOKE+Len(S$(N))
  405.             Else 
  406.                APOKE= Extension_16_0296(APOKE,S$(N))
  407.             End If 
  408.             If Btst(0,APOKE)
  409.                Inc APOKE
  410.             End If 
  411.          End If 
  412.       Next N
  413.       Bsave F$,Start(10) To Start(10)+TL+12+8
  414.       OK=True : ED_MESSAGE["Sample Bank Saved - Bank Length"+Str$(TL)+" Bytes"]
  415.       CMP_ERR:
  416.       Erase 10
  417.    End If 
  418. End Proc[OK]
  419. '
  420. 'Sample Menu 
  421. '
  422. Procedure _APPEND_SAMPLE
  423.    If NSAM=MXSAM
  424.       SIMPLE_REQUESTER[TITLESTR$,"Maximum number of samples reached"," Acknowledged ",1]
  425.    Else 
  426.       L0AD_SAMPLE[NSAM+1]
  427.       If Param=True : Inc NSAM : End If 
  428.       DISPLAY_SAMS
  429.    End If 
  430. End Proc
  431. Procedure _MOVE_SAMPLE
  432.    ED_PERM_MESSAGE["Select a sample to move"]
  433.    SELMODE=3
  434. End Proc
  435. Procedure _INSERT_SAMPLE
  436.    ED_PERM_MESSAGE["Select Position To Insert Sample"]
  437.    SELMODE=1
  438. End Proc
  439. Procedure _REMOVE_SAMPLE
  440.    ED_PERM_MESSAGE["Select Sample To Remove"]
  441.    SELMODE=2
  442. End Proc
  443. Procedure _PLAY_SAMPLE
  444.    ED_PERM_MESSAGE["Select Sample To Play"]
  445.    SELMODE=8
  446. End Proc
  447. '
  448. 'Sample Support
  449. '
  450. Procedure PL_SAMPLE
  451.    '
  452.    REQUEST_OPEN[50,8,15] : RN=Param
  453.    REQUEST_DRAW[RN,"Play Sample "+F$(SELPOS)]
  454.    REQUEST_ADD_TEXT[RN,0,"Playback Frequency",False,True]
  455.    BS=Max(1,6*(32768-1024)/(REQC(RN,2)-REQC(RN,0)-112))
  456.    REQUEST_ADD_HSLIDER[RN,0,F(SELPOS)-1024,32768-1024+BS,BS] : SLZ=Param
  457.    REQUEST_ADD_BUTTONS[RN,0," Play | Done ",1,True] : BZ=Param
  458.    REQS(RN,0)=REQS(RN,0)-18
  459.    REQS(RN,1)=REQS(RN,1)-18
  460.    REQUEST_ADD_STRING[RN,0,Str$(F(SELPOS))-" ",7,7,1] : SZ=Param
  461.    MOUSE_READY
  462.    R=F(SELPOS)
  463.    Repeat 
  464.       REQUEST_GET_INPUT[RN] : MZ=Param
  465.       If(MZ=SLZ) or(MZ=SLZ+1) or(MZ=SLZ+2)
  466.          R=MI+REQ
  467.          UPDTE_STRING[RN,SZ,Str$(R)-" "]
  468.          UPDTE_SLIDER[RN,SLZ,REQ,True,True]
  469.       End If 
  470.       If MZ=SZ Then R=Val(REQ$)
  471.       If(MZ=BZ) and(R>=1024) and(R<=32768)
  472.          Print SELPOS,Len(S$(SELPOS)),R
  473.          Sam Raw %1111,Varptr(S$(SELPOS)),Len(S$(SELPOS)),R
  474.       End If 
  475.    Until(MZ=BZ+1)
  476.    REQUEST_CLOSE[RN]
  477.    Sam Stop : SELMODE=0
  478.    MOUSE_BUSY[True]
  479. End Proc
  480. Procedure L0AD_SAMPLE[N]
  481.    On Error Proc IO_ERRORS
  482.    Resume Label LD_SAM_ERR
  483.    FILE_REQUESTER["Choose a sample to load",False," Load "]
  484.    If Param and(DFILE$<>"")
  485.       If Not Exist(PATH$+DFILE$)
  486.          SIMPLE_REQUESTER[TITLESTR$,"File Not Found Error"," Acknowledged",1]
  487.       Else 
  488.           Extension_16_01BC 1,PATH$+DFILE$,2
  489.          If Extension_16_01DC(1)<Free
  490.             If Extension_16_026E( Extension_16_01CE(1),3)="JON"
  491.                F(N)=Peek( Extension_16_01CE(1)+3)*1024
  492.                S$(N)= Extension_16_026E( Extension_16_01CE(1)+4, Extension_16_01DC(1)-4)
  493.                TYPE(N)=2
  494.             Else 
  495.                If( Extension_16_026E( Extension_16_01CE(1),4)="FORM") and( Extension_16_026E( Extension_16_01CE(1)+8,8)="8SVXVHDR")
  496.                   F(N)=Min(32768,Max(1024,Deek( Extension_16_01CE(1)+32)))
  497.                   TYPE(N)=3
  498.                   S$(N)= Extension_16_026E( Extension_16_01CE(1)+72, Extension_16_01DC(1)-72)
  499.                Else 
  500.                   NUMBER_REQUESTER[TITLESTR$,"Raw sample - enter sampling frequency (Hz)",16384,1024,32768]
  501.                   If Param
  502.                      F(N)=REQ
  503.                   Else 
  504.                      F(N)=16384
  505.                   End If 
  506.                   TYPE(N)=1
  507.                   S$(N)= Extension_16_026E( Extension_16_01CE(1), Extension_16_01DC(1))
  508.                End If 
  509.             End If 
  510.             If(1 and Len(S$(N)))
  511.                S$(N)=S$(N)+Right$(S$(N),1)
  512.             End If 
  513.             F$(N)=Left$(DFILE$,8)
  514.             L0ADED_SAMPLES=True
  515.             OK=True
  516.             ED_MESSAGE["Sample Loaded OK"]
  517.          Else 
  518.             SIMPLE_REQUESTER[TITLESTR$,"Not enough memory to load sample","Acknowledged",1]
  519.          End If 
  520.       End If 
  521.    End If 
  522.    LD_SAM_ERR:
  523.     Extension_16_01EA 1
  524. End Proc[OK]
  525. Procedure _INCLUDE_SAMPLE
  526.    INSERT[SELPOS]
  527.    If Param
  528.       L0AD_SAMPLE[SELPOS]
  529.       If Param=False
  530.          DELETE[SELPOS]
  531.          ED_MESSAGE["Sample Inserted OK"]
  532.       Else 
  533.          ED_MESSAGE[""]
  534.       End If 
  535.       DISPLAY_SAMS
  536.    End If 
  537.    SELMODE=0
  538. End Proc
  539. Procedure _REMOVE1
  540.    DELETE[SELPOS]
  541.    ED_MESSAGE["Sample Removed"]
  542.    DISPLAY_SAMS
  543.    SELMODE=0
  544. End Proc
  545. Procedure _MOVE1
  546.    Shared MVSRC
  547.    ED_PERM_MESSAGE["Select position to insert the sample"]
  548.    SELMODE=4 : MVSRC=SELPOS
  549. End Proc
  550. Procedure _MOVE2
  551.    Shared MVSRC
  552.    If MVSRC<>SELPOS
  553.       INSERT[SELPOS]
  554.       If Param
  555.          If MVSRC>SELPOS : Inc MVSRC : End If 
  556.          TYPE(SELPOS)=TYPE(MVSRC)
  557.          F(SELPOS)=F(MVSRC)
  558.          F$(SELPOS)=F$(MVSRC)
  559.          S$(SELPOS)=S$(MVSRC)
  560.          DELETE[MVSRC]
  561.          ED_MESSAGE["Sample Moved"]
  562.       End If 
  563.    End If 
  564.    SELMODE=0
  565. End Proc
  566. '
  567. 'Properties Menu 
  568. '
  569. Procedure _EDIT_NAME
  570.    ED_PERM_MESSAGE["Choose a sample to change the name of"]
  571.    SELMODE=5
  572. End Proc
  573. Procedure _EDIT_FREQ
  574.    ED_PERM_MESSAGE["Choose a sample to change the frequency of"]
  575.    SELMODE=6
  576. End Proc
  577. '
  578. 'Properties Support
  579. '
  580. Procedure _ED_NAME
  581.    STRING_REQUESTER[TITLESTR$,"Enter new sample name (Max 8 Chars)",F$(SELPOS),8,-1]
  582.    If Param
  583.       F$(SELPOS)=REQ$
  584.       DISPLAY_SAMS
  585.       ED_MESSAGE["Sample name changed"]
  586.    Else 
  587.       ED_MESSAGE["Name change aborted"]
  588.    End If 
  589.    SELMODE=0
  590. End Proc
  591. Procedure _ED_FREQ
  592.    NUMBER_REQUESTER[TITLESTR$,"Enter new frequency (1024 - 32768 Hz)",F(SELPOS),1024,32768]
  593.    If Param
  594.       F(SELPOS)=REQ
  595.       DISPLAY_SAMS
  596.       ED_MESSAGE["Sample frequency changed"]
  597.    Else 
  598.       ED_MESSAGE["Frequency Change Aborted"]
  599.    End If 
  600.    SELMODE=0
  601. End Proc
  602. '
  603. '
  604. 'Misc
  605. '
  606. '
  607. '
  608. 'Requesters
  609. '
  610. '
  611. 'File Requester User Calls 
  612. '
  613. Procedure FILE_REQUESTER[T$,NEW,B1$]
  614.    Shared DMODE,DR$
  615.    '  
  616.    'File Name Length - Requester Width is based on this 
  617.    '
  618.    OFILE$=DFILE$
  619.    If PATH$="" Then DMODE=0
  620.    If(DMODE=0) and(DR$="") Then NEW=True
  621.    '
  622.    'Draw Requester
  623.    '
  624.    REQUEST_OPEN[50,19,30] : RN=Param
  625.    REQUEST_DRAW[RN,T$]
  626.    REQUEST_ADD_STRING[RN,0,"",-1,255,0] : ZPATH=Param
  627.    REQUEST_ADD_SELECTOR[RN,0,"",10] : ZSEL=Param
  628.    REQUEST_ADD_STRING[RN,0,"",-1,255,0] : ZFILE=Param
  629.    REQUEST_ADD_BUTTONS[RN,0,B1$+"| Volumes | Parent | Cancel ",1,True] : ZBTN=Param
  630.    '
  631.    'Read Directory / Device Lists 
  632.    '
  633.    On Error Proc IO_ERRORS
  634.    Resume Label FSEL_ERR
  635.    Set Dir 32
  636.    Do 
  637.       If NEW
  638.          DFILE$=""
  639.          If DMODE=0
  640.             PRCESS_DEVNAME[Dev First$("")] : DR$=Param$ : PATH$=""
  641.             While Param$<>""
  642.                PRCESS_DEVNAME[Dev Next$]
  643.                DR$=DR$+Param$
  644.             Wend 
  645.          Else 
  646.             If PATH$="" : PATH$=":" : End If 
  647.             RETRY=False : Do 
  648.             If Exist(PATH$)
  649.                PRCESS_FILENAME[Dir First$(PATH$)] : DR$=Param$
  650.                While Param$<>""
  651.                   PRCESS_FILENAME[Dir Next$] : DR$=DR$+Param$
  652.                Wend 
  653.                Exit 
  654.             Else 
  655.                If RETRY=False
  656.                   Wait 100 : RETRY=True
  657.                Else 
  658.                   SIMPLE_REQUESTER["File Selector","Unable To Find "+PATH$," Retry | MakeDir | Cancel ",1]
  659.                      If Param=3
  660.                         DFILE$="        <<< Non-Existant Path >>>" : DR$=""
  661.                      Exit 
  662.                   Else 
  663.                      If Param=2
  664.                         Mkdir PATH$ : Wait 100
  665.                      End If 
  666.                      RETRY=False
  667.                   End If 
  668.                End If 
  669.             End If 
  670.             Loop 
  671.          End If 
  672.       End If 
  673.       FSEL_ERR:
  674.       NEW=False
  675.       SELECTOR_RESET[RN,ZSEL,DR$]
  676.       UPDTE_SELECTOR[RN,ZSEL,0,0]
  677.       MOUSE_READY
  678.       UPDTE_STRING[RN,ZPATH,PATH$]
  679.       UPDTE_STRING[RN,ZFILE,DFILE$]
  680.       Repeat 
  681.          REQUEST_GET_INPUT[RN] : MZ=Param
  682.          If MZ=ZPATH
  683.             If REQ=1
  684.                MZ=ZBTN+3
  685.             Else 
  686.                PATH$=REQ$ : NEW=True : DMODE=1
  687.             End If 
  688.          End If 
  689.          If MZ=ZFILE
  690.             If REQ=1
  691.                MZ=ZBTN+3
  692.             Else 
  693.                DFILE$=REQ$
  694.             End If 
  695.          End If 
  696.          Exit If MZ=ZBTN+3,2
  697.          Exit If MZ=ZBTN,2
  698.          If MZ=ZBTN+1 Then DMODE=0 : NEW=True
  699.          If MZ=ZBTN+2 and DMODE=1 and(PATH$<>"")
  700.             A$=PATH$ : If Right$(A$,1)="/" : A$=Left$(A$,Len(A$)-1) : End If 
  701.             If Instr(A$,"/")>0
  702.                A=Len(A$) : While Instr(Left$(A$,A),"/")>0 : Dec A : Wend 
  703.                PATH$=Left$(A$,A)
  704.             Else 
  705.                PATH$=Left$(A$,Instr(A$,":"))
  706.             End If 
  707.             NEW=True
  708.          End If 
  709.          If MZ=ZSEL
  710.             SELECTOR_GET[RN,ZSEL,REQ] : A$=Left$(Param$, Extension_16_016A(Param$,32,32))
  711.             If DMODE=0
  712.                If A$<>""
  713.                   PATH$=A$ : DMODE=1 : NEW=True
  714.                End If 
  715.             Else 
  716.                If Mid$(Param$,36,3)="Dir"
  717.                   If Not((Right$(PATH$,1)=":") or(Right$(PATH$,1)="/"))
  718.                      PATH$=PATH$+"/"+A$
  719.                   Else 
  720.                      PATH$=PATH$+A$
  721.                   End If 
  722.                   NEW=True
  723.                Else 
  724.                   Exit If A$=DFILE$,2
  725.                   DFILE$=A$
  726.                   UPDTE_STRING[RN,ZFILE,DFILE$]
  727.                End If 
  728.             End If 
  729.          End If 
  730.       Until NEW=True
  731.       MOUSE_BUSY[True]
  732.    Loop 
  733.    '
  734.    'Clean Up & Return 
  735.    '
  736.    If PATH$<>""
  737.       If Right$(PATH$,1)<>":"
  738.          If Right$(PATH$,1)<>"/"
  739.             PATH$=PATH$+"/"
  740.          End If 
  741.       End If 
  742.    End If 
  743.    '
  744.    REQUEST_CLOSE[RN]
  745.    MOUSE_BUSY[False]
  746. End Proc[MZ<>ZBTN+3]
  747. Procedure FILE_REQ_MODIFY[A$,L,D,RM]
  748.    Shared DR$
  749.    AA$=Space$(39)+Chr$(0) : Mid$(AA$,1)=A$ : X=0
  750.    If D
  751.       Mid$(AA$,36)="Dir"
  752.    Else 
  753.       Mid$(AA$,32)=Str$(L)
  754.       While Mid$(DR$,40*X+36,3)="Dir" : Inc X : Wend 
  755.    End If 
  756.    Do 
  757.    B$=Mid$(DR$,X*40+1,32)
  758.    If AA$=B$
  759.       If RM : AA$="" : End If 
  760.       DR$=Left$(DR$,40*X)+AA$+Mid$(DR$,40*(X+1)+1)
  761.       Exit 
  762.    Else 
  763.       If(AA$<B$) or(D and(Mid$(DR$,X*40+36,3)<>"Dir"))
  764.          DR$=Left$(DR$,40*X)+AA$+Mid$(DR$,40*X+1) : Exit 
  765.       Else 
  766.          If B$=""
  767.             If Not RM : DR$=DR$+AA$ : End If 
  768.             Exit 
  769.          End If 
  770.       End If 
  771.    End If 
  772.    Inc X
  773.    Loop 
  774. End Proc
  775. '
  776. 'File Requester Internal Calls 
  777. '
  778. Procedure PRCESS_FILENAME[B$]
  779.    If Extension_16_00C0(B$,32)
  780.       D=(Mid$(B$,33)=Space$(8))
  781.       L=Val(Mid$(B$,33))
  782.       B$=Mid$(B$,2,31)
  783.       If D
  784.          B$=B$+"    Dir"+Chr$(0)
  785.       Else 
  786.          B$=B$+Right$("      "+Str$(L)+" ",8)+Chr$(0)
  787.       End If 
  788.    End If 
  789. End Proc[B$]
  790. Procedure PRCESS_DEVNAME[B$]
  791.    If Extension_16_00C0(B$,32)
  792.       B$=Mid$(B$,2,31)
  793.       B1$=Left$(B$, Extension_16_014E(B$,32))
  794.       If Exist(B1$)
  795.          Dir$=B1$
  796.          B$=B$+Right$("     "+Str$(Dfree/1024)+"K ",8)+Chr$(0)
  797.       Else 
  798.          B$=B$+"    N/A"+Chr$(0)
  799.       End If 
  800.    End If 
  801. End Proc[B$]
  802. '
  803. 'Built-In Requesters - User Calls  
  804. '
  805. Procedure SIMPLE_REQUESTER[TIT$,TEX$,BUT$,DF]
  806.    N= Extension_16_04D2(BUT$,"|")+1
  807.    W=Max(25,Max(Max(Len(TIT$)+1,Len(TEX$)+7),Len(BUT$)+(N+1)*2+6))
  808.    REQUEST_OPEN[W,7,N+2] : RN=Param
  809.    REQUEST_DRAW[RN,TIT$]
  810.    REQUEST_ADD_TEXT[RN,0,TEX$,True,True]
  811.    REQUEST_ADD_BUTTONS[RN,0,BUT$,DF,True] : BZ=Param
  812.    MOUSE_READY
  813.    Repeat : REQUEST_GET_INPUT[RN] : MZ=Param : Until MZ>=BZ
  814.    REQUEST_CLOSE[RN]
  815.    MOUSE_BUSY[True]
  816. End Proc[MZ-BZ+1]
  817. Procedure STRING_REQUESTER[TIT$,TEX$,S$,MX,DMX]
  818.    W=Max(27,Max(Max(Len(TIT$)+1,Len(TEX$)+7),DMX+7))
  819.    REQUEST_OPEN[W,8,6] : RN=Param
  820.    REQUEST_DRAW[RN,TIT$]
  821.    REQUEST_ADD_TEXT[RN,0,TEX$,False,True]
  822.    REQUEST_ADD_STRING[RN,0,S$,DMX,MX,0] : SZ=Param
  823.    REQUEST_ADD_BUTTONS[RN,0,"   OK   | Cancel ",1,True] : BZ=Param
  824.    MOUSE_READY
  825.    Repeat 
  826.       REQUEST_GET_INPUT[RN]
  827.       If Param=SZ Then R$=REQ$
  828.    Until Param>SZ
  829.    If Param=BZ+1 Then R$=S$
  830.    REQUEST_CLOSE[RN]
  831.    REQ$=R$
  832.    MOUSE_BUSY[True]
  833. End Proc[Param=BZ]
  834. Procedure NUMBER_REQUESTER[TIT$,TEX$,N,MI,MA]
  835.    N=Min(Max(MI,N),MA)
  836.    W=Max(Max(Len(TIT$)+1,Len(TEX$)+7),Len(Str$(MA))+32)
  837.    REQUEST_OPEN[W,7,8] : RN=Param
  838.    REQUEST_DRAW[RN,TIT$]
  839.    REQUEST_ADD_TEXT[RN,0,TEX$,False,True]
  840.    BS=Max(1,6*(MA-MI)/(REQC(RN,2)-REQC(RN,0)-112))
  841.    REQUEST_ADD_HSLIDER[RN,0,N-MI,MA-MI+BS,BS] : SLZ=Param
  842.    REQUEST_ADD_BUTTONS[RN,0,"   OK   | Cancel ",1,True] : BZ=Param
  843.    REQS(RN,0)=REQS(RN,0)-18
  844.    REQS(RN,1)=REQS(RN,1)-18
  845.    REQUEST_ADD_STRING[RN,0,Str$(N)-" ",Len(Str$(MA))+2,Len(Str$(MA))+2,1] : SZ=Param
  846.    MOUSE_READY
  847.    R=N
  848.    Repeat 
  849.       REQUEST_GET_INPUT[RN] : MZ=Param
  850.       If(MZ=SLZ) or(MZ=SLZ+1) or(MZ=SLZ+2)
  851.          R=MI+REQ
  852.          UPDTE_STRING[RN,SZ,Str$(R)-" "]
  853.          UPDTE_SLIDER[RN,SLZ,REQ,True,True]
  854.       End If 
  855.       If MZ=SZ Then R=Val(REQ$)
  856.       If MZ=BZ+1 Then R=N : Exit 
  857.    Until(MZ=BZ) and(R>=MI) and(R<=MA)
  858.    REQUEST_CLOSE[RN]
  859.    REQ=R
  860.    MOUSE_BUSY[True]
  861. End Proc[MZ=BZ]
  862. '
  863. '
  864. '
  865. 'Manual Requester Routines 
  866. '
  867. 'Requester Control 
  868. '
  869. Procedure REQUEST_OPEN[W,H,Z]
  870.    Shared NEXSTRING
  871.    'Returns requester Number, or 0 if too many requesters are open  
  872.    A=Instr(FR_REQ$," ")
  873.    If A>0
  874.       REQS$(A,0)= Extension_16_026E(Leek(Screen Base+210),8*Deek(Screen Base+214))
  875.       Reserve Zone Z
  876.       Poke Varptr(FR_REQ$)+A-1,A+48
  877.       RH=Min((Screen Height)/8,H+2) : RW=Min(W+1,Screen Width/8) and $FFFE
  878.       RX=Min(Screen Width-RW*8,Max(0,X Screen(X Mouse)-RW*4)) and $FFF8
  879.       RY=Min(Screen Height-RH*8-1,Max(0,Y Screen(Y Mouse)-RH*4)) and $FFFE
  880.       Get Block A*2,RX,RY,RW*8,RH*8+1
  881.       REQC(A,0)=RX : REQC(A,1)=RY : REQC(A,2)=RX+RW*8 : REQC(A,3)=RY+RH*8
  882.       REQS(A,0)=RY+17 : REQS(A,1)=REQS(A,0)
  883.       Menu Off : NEXSTRING=0
  884.    End If 
  885. End Proc[A]
  886. Procedure REQUEST_DRAW[RN,TITLE$]
  887.    '
  888.    MCOL=Screen Colour-1
  889.    Flash Off : Curs Off : Colour MCOL-1,Colour(1)
  890.    Cls 1,REQC(RN,0),REQC(RN,1) To REQC(RN,2),REQC(RN,3)
  891.    Ink MCOL,1,0 : Set Pattern 31
  892.    Bar REQC(RN,0)+4,REQC(RN,1)+13 To REQC(RN,2)-4,REQC(RN,3)-2
  893.    For A=0 To 3 : TBOX[REQC(RN,0)+A,REQC(RN,1)+A/2,REQC(RN,2)-A-1,REQC(RN,3)-A/2,False] : Next 
  894.    TBOX[REQC(RN,0)+4,REQC(RN,1)+2,REQC(RN,2)-5,REQC(RN,1)+13,False]
  895.    Ink MCOL : Text REQC(RN,0)+8,REQC(RN,1)+10,Left$(TITLE$,(REQC(RN,2)-REQC(RN,0)-16)/8)
  896.    REQS(RN,2)=2
  897.    Set Zone 1,REQC(RN,0)+4,REQC(RN,1)+2 To REQC(RN,2)-4,REQC(RN,1)+13
  898.    '
  899. End Proc
  900. Procedure REQUEST_CLOSE[RN]
  901.    Put Block RN*2 : Del Block RN*2 : Reserve Zone 
  902.    Mid$(FR_REQ$,RN,1)=" "
  903.    If Len(REQS$(RN,0))>0
  904.       Reserve Zone Len(REQS$(RN,0))/8
  905.        Extension_16_02A6 Leek(Screen Base+210),REQS$(RN,0)
  906.    End If 
  907.    REQS$(RN,0)="" : REQS$(RN,1)="" : REQS$(RN,2)=""
  908.    '
  909.    '
  910.    '
  911.    If Extension_16_00C0(FR_REQ$,32)=0
  912.       'Exiting last requester
  913.       Menu On 
  914.       Pen 3 : Colour 2,$8AD
  915.    End If 
  916. End Proc
  917. Procedure REQUEST_GET_INPUT[RN]
  918.    Shared RGE$,RMZ,NEXSTRING,REQDX,REQDY
  919.    Do 
  920.       Repeat 
  921.          Multi Wait : MK=Mouse Key : MZ=Mouse Zone : I$=Inkey$
  922.          If MK=0 and( Extension_16_00A0("LRUD",RGE$)>0)
  923.             RGE$=" "
  924.             Screen Copy Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1, Extension_16_0032(RMZ), Extension_16_0048(RMZ) To Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1,%110000
  925.          End If 
  926.       Until((MK=1) and(MZ>0)) or(I$<>"")
  927.       If(MZ<>RMZ) and( Extension_16_00A0("LRUD",RGE$)>0)
  928.          RGE$=" "
  929.          Screen Copy Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1, Extension_16_0032(RMZ), Extension_16_0048(RMZ) To Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1,%110000
  930.       End If 
  931.       IN= Extension_16_00A0("LRUD",RGE$)>0
  932.       If MK=1
  933.          RMZ=MZ
  934.          If RMZ=1
  935.             REQUEST_MOVE[RN]
  936.             Exit 
  937.          Else 
  938.             RGE$=Mid$(REQS$(RN,1),(RMZ-2)*5+1,1)
  939.             If Extension_16_00A0("BLRUDC",RGE$)>0
  940.                If Not IN
  941.                   Screen Copy Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1, Extension_16_0032(RMZ), Extension_16_0048(RMZ) To Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1,%110000
  942.                End If 
  943.             End If 
  944.             If Extension_16_00A0("BSC",RGE$)>0
  945.                K=1 : While Btst(0,K) and(RMZ=Mouse Zone) : K=Mouse Key : Wend 
  946.                If Extension_16_00A0("BC",RGE$)>0
  947.                   Screen Copy Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1, Extension_16_0032(RMZ), Extension_16_0048(RMZ) To Screen, Extension_16_0006(RMZ)+1, Extension_16_001C(RMZ)+1,%110000
  948.                End If 
  949.                If RMZ<>Mouse Zone : RMZ=0 : RGE$=" " : End If 
  950.                Exit If RGE$="B"
  951.             End If 
  952.             If(RGE$="S")
  953.                RSTRING[RN,RMZ]
  954.                NEXSTRING=RMZ-2
  955.                If REQ<>1 : Inc NEXSTRING : Exit : End If 
  956.             End If 
  957.             If(RGE$="H") or(RGE$="V")
  958.                B=(RMZ-2)*5+1
  959.                POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
  960.                BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
  961.                MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
  962.                SLIDER_READ[RMZ,POS,MX,BSIZE,2-(RGE$="V")]
  963.                POS=Param# : REQ=POS
  964.                REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
  965.                If RGE$="V"
  966.                   UPDTE_SELECTOR[RN,RMZ-1,POS,True]
  967.                Else 
  968.                   Exit 
  969.                End If 
  970.             End If 
  971.             If RGE$="L" or(RGE$="U")
  972.                B=(RMZ-2)*5-4
  973.                POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
  974.                BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
  975.                MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
  976.                POS=Max(0,POS-1) : REQ=POS
  977.                REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
  978.                If RGE$="U"
  979.                   UPDTE_SELECTOR[RN,RMZ-2,POS,True]
  980.                Else 
  981.                   SLIDER_DRAW[RMZ-1,POS,MX,BSIZE,2]
  982.                   Exit 
  983.                End If 
  984.             End If 
  985.             If(RGE$="R") or(RGE$="D")
  986.                B=(RMZ-2)*5-9
  987.                POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
  988.                BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
  989.                MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
  990.                POS=Min(MX,POS+1) : REQ=POS
  991.                REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
  992.                If RGE$="D"
  993.                   UPDTE_SELECTOR[RN,RMZ-3,POS,True]
  994.                Else 
  995.                   SLIDER_DRAW[RMZ-2,POS,MX,BSIZE,2]
  996.                   Exit 
  997.                End If 
  998.             End If 
  999.             If RGE$="F"
  1000.                N= Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+12))
  1001.                L= Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+17))
  1002.                X1= Extension_16_0006(RMZ)+8 : X2= Extension_16_0032(RMZ)-8
  1003.                REQDX=Max(0,Min( Extension_16_0032(RMZ),X Screen(X Mouse))- Extension_16_0006(RMZ))
  1004.                REQDY=Max(0,Min( Extension_16_0048(RMZ),Y Screen(Y Mouse))- Extension_16_001C(RMZ))
  1005.                Y1=Max(0,Min(L-1,(REQDY-2)/8))
  1006.                Screen Copy Screen,X1, Extension_16_001C(RMZ)+4+Y1*8,X2, Extension_16_001C(RMZ)+12+Y1*8 To Screen,X1, Extension_16_001C(RMZ)+4+Y1*8,%110000
  1007.                K=1 : While Btst(0,K) and(RMZ=Mouse Zone) : K=Mouse Key : Wend 
  1008.                Y=Max(0,Min(L-1,(Y Screen(Y Mouse)- Extension_16_001C(RMZ)-2)/8))
  1009.                Screen Copy Screen,X1, Extension_16_001C(RMZ)+4+Y1*8,X2, Extension_16_001C(RMZ)+12+Y1*8 To Screen,X1, Extension_16_001C(RMZ)+4+Y1*8,%110000
  1010.                If(RMZ=Mouse Zone) and(Y=Y1)
  1011.                   REQ=Y+ Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+7))
  1012.                   Exit If REQ<N
  1013.                End If 
  1014.             End If 
  1015.             If RGE$="T"
  1016.                REQDX=Min( Extension_16_0032(RMZ)- Extension_16_0006(RMZ),Max(0,X Screen(X Mouse)- Extension_16_0006(RMZ)))
  1017.                REQDY=Min( Extension_16_0048(RMZ)- Extension_16_001C(RMZ),Max(0,Y Screen(Y Mouse)- Extension_16_001C(RMZ)))
  1018.                Exit 
  1019.             End If 
  1020.          End If 
  1021.       End If 
  1022.       If I$<>""
  1023.             While NEXSTRING*5<Len(REQS$(RN,1))
  1024.                Inc NEXSTRING
  1025.                If Mid$(REQS$(RN,1),NEXSTRING*5-4,1)="S"
  1026.                   If I$<>Chr$(13) : Put Key I$ : End If 
  1027.                   RSTRING[RN,NEXSTRING+1]
  1028.                   Exit If REQ=3
  1029.                   RMZ=NEXSTRING+1
  1030.                   Exit 2
  1031.                End If 
  1032.             Wend 
  1033.             If I$=Chr$(13)
  1034.                RMZ=Instr(REQS$(RN,1),"B"+ Extension_16_04A2(-1))/5+2
  1035.                Exit 
  1036.             End If 
  1037.       End If 
  1038.    Loop 
  1039. End Proc[RMZ]
  1040. '
  1041. 'Requester Constructors
  1042. '
  1043. Procedure REQUEST_ADD_TEXT[RN,CL,T$,FULL,CEN]
  1044.    Shared X1,X2,YP
  1045.    'T$   = Text to print(Lines seperated by chr$(10), but no trailing chr$(10)'s) 
  1046.    'FULL = Full Height Box
  1047.    'CEN  = Centre Text
  1048.    'CL   = Column (0=Full 1=Left 2=Right) 
  1049.    '
  1050.    L= Extension_16_04E8(T$,10)+1
  1051.    REQUEST_SET_BORDERS[RN,CL]
  1052.    If FULL
  1053.       Y2=REQC(RN,3)-24
  1054.       TY=YP+6+(Y2-YP-L*8)/2
  1055.    Else 
  1056.       Y2=YP+10+L*8
  1057.       TY=YP+11
  1058.    End If 
  1059.    Z=REQS(RN,2)
  1060.    Set Zone Z,X1,YP To X2,Y2
  1061.    '
  1062.    Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
  1063.    TBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),True]
  1064.    OB=0 : Ink Screen Colour-1
  1065.    For A=1 To L
  1066.       B= Extension_16_0094(T$,10,OB)
  1067.       If B=0
  1068.          A$=Mid$(T$,OB+1)
  1069.       Else 
  1070.          A$=Mid$(T$,OB+1,B-OB-1) : OB=B
  1071.       End If 
  1072.       If CEN
  1073.          X=X1+(X2-X1-Len(A$)*8)/2
  1074.       Else 
  1075.          X=X1+8
  1076.       End If 
  1077.       Text X,TY,A$ : Add TY,8
  1078.    Next 
  1079.    '
  1080.    Inc REQS(RN,2) : YP=Y2+4
  1081.    REQS$(RN,2)=REQS$(RN,2)+Chr$(10) : REQS$(RN,1)=REQS$(RN,1)+"T    "
  1082.    REQUEST_UPDTE_YPOS[RN,CL]
  1083.    '
  1084. End Proc[Z]
  1085. Procedure REQUEST_ADD_BUTTONS[RN,CL,B$,DF,FULL]
  1086.    Shared X1,X2,YP
  1087.    R= Extension_16_04D2(B$,"|")+1
  1088.    REQUEST_SET_BORDERS[RN,CL]
  1089.    If FULL Then YP=YP+(REQC(RN,3)-YP-14)/2-2
  1090.    If R=1
  1091.       DF=R
  1092.       X#=X1+(X2-X1-Len(B$)*8-16)/2
  1093.    Else 
  1094.       X#=X1
  1095.       XS#=(X2-X1-(Len(B$)+1+R)*8)/(R-1.0)
  1096.    End If 
  1097.    OB=0 : IZ=REQS(RN,2)
  1098.    For A=1 To R
  1099.       Set Text 0 : If A=DF Then Set Text 2
  1100.       B= Extension_16_00B4(B$,"|",OB)
  1101.       If B=0
  1102.          A$=Mid$(B$,OB+1)
  1103.       Else 
  1104.          A$=Mid$(B$,OB+1,B-OB-1) : OB=B
  1105.       End If 
  1106.       '
  1107.       Z=REQS(RN,2) : Set Zone Z,X#,YP To X#+Len(A$)*8+16,YP+14
  1108.       Inc REQS(RN,2)
  1109.       Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
  1110.       BUTON[ Extension_16_0006(Z), Extension_16_001C(Z),A$,False]
  1111.       '
  1112.       X#=X#+Len(A$)*8+XS#+16
  1113.       If A=DF
  1114.          REQS$(RN,1)=REQS$(RN,1)+"B"+ Extension_16_04A2(True)
  1115.       Else 
  1116.          REQS$(RN,1)=REQS$(RN,1)+"B"+ Extension_16_04A2(False)
  1117.       End If 
  1118.       REQS$(RN,2)=REQS$(RN,2)+Chr$(10)
  1119.    Next 
  1120.    Set Text 0 : Add YP,18
  1121.    REQUEST_UPDTE_YPOS[RN,CL]
  1122. End Proc[IZ]
  1123. Procedure REQUEST_ADD_STRING[RN,CL,S$,WIDTH,MX,FLAGS]
  1124.    Shared X1,X2,YP
  1125.    REQUEST_SET_BORDERS[RN,CL]
  1126.    If WIDTH>-1
  1127.       A=(X2-X1-WIDTH*8-16)/2
  1128.       X1=X1+A : X2=X2-A
  1129.    End If 
  1130.    Z=REQS(RN,2) : Set Zone Z,X1,YP To X2,YP+14
  1131.    Inc REQS(RN,2) : Add YP,18
  1132.    Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
  1133.    SBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),False]
  1134.    Ink 0 : Text Extension_16_0006(Z)+8, Extension_16_001C(Z)+10,Left$(S$,(X2-X1-16)/8)
  1135.    REQS$(RN,1)=REQS$(RN,1)+"S"+ Extension_16_04BA(MX)+ Extension_16_04BA(FLAGS)
  1136.    REQS$(RN,2)=REQS$(RN,2)+S$+Chr$(10)
  1137.    REQUEST_UPDTE_YPOS[RN,CL]
  1138. End Proc[Z]
  1139. Procedure REQUEST_ADD_HSLIDER[RN,CL,POS,MX,BSIZE]
  1140.    Shared X1,X2,YP
  1141.    REQUEST_SET_BORDERS[RN,CL]
  1142.    Z=REQS(RN,2) : Set Zone Z,X1,YP To X2-64,YP+10
  1143.    Set Zone Z+1,X2-58,YP To X2-32,YP+10
  1144.    Set Zone Z+2,X2-26,YP To X2,YP+10
  1145.    Add YP,14 : Add REQS(RN,2),3
  1146.    Paste Icon Extension_16_0006(Z+1), Extension_16_001C(Z+1),1
  1147.    Paste Icon Extension_16_0006(Z+2), Extension_16_001C(Z+2),2
  1148.    Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
  1149.    SLIDER_DRAW[Z,POS,Max(0,MX-BSIZE),BSIZE,0]
  1150.    REQS$(RN,1)=REQS$(RN,1)+"H"+ Extension_16_04A2(POS)+"L"+ Extension_16_04A2(MX)+"R"+ Extension_16_04A2(BSIZE)
  1151.    REQS$(RN,2)=REQS$(RN,2)+Chr$(10)+Chr$(10)+Chr$(10)
  1152.    REQUEST_UPDTE_YPOS[RN,CL]
  1153. End Proc[Z]
  1154. Procedure REQUEST_ADD_SELECTOR[RN,CL,S$,L]
  1155.    Shared X1,X2,YP
  1156.    REQUEST_SET_BORDERS[RN,CL]
  1157.    N= Extension_16_04E8(S$,0)
  1158.    Z=REQS(RN,2) : Add REQS(RN,2),4
  1159.    Set Zone Z,X1,YP To X2-24,YP+L*8+8
  1160.    Set Zone Z+1,X2-15,YP To X2,YP+L*8-20
  1161.    Set Zone Z+2,X2-15,YP+L*8-18 To X2,YP+L*8-7
  1162.    Set Zone Z+3,X2-15,YP+L*8-4 To X2,YP+L*8+7
  1163.    For A=0 To 3 : Cls 1, Extension_16_0006(Z+A), Extension_16_001C(Z+A) To Extension_16_0032(Z+A), Extension_16_0048(Z+A) : Next 
  1164.    Paste Icon Extension_16_0006(Z+2), Extension_16_001C(Z+2),3
  1165.    Paste Icon Extension_16_0006(Z+3), Extension_16_001C(Z+3),4
  1166.    TBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),True]
  1167.    REQS$(RN,1)=REQS$(RN,1)+"F"+ Extension_16_04A2(0)+"V"+ Extension_16_04A2(0)+"U"+ Extension_16_04A2(N)+"D"+ Extension_16_04A2(L)
  1168.    REQS$(RN,2)=REQS$(RN,2)+S$+Chr$(10)
  1169.    UPDTE_SELECTOR[RN,Z,POS,0]
  1170.    Add YP,L*8+12
  1171.    REQUEST_UPDTE_YPOS[RN,CL]
  1172. End Proc[Z]
  1173. '
  1174. 'Requester Update Routines 
  1175. '
  1176. Procedure UPDTE_SLIDER[RN,Z,POS,MX,BSIZE]
  1177.    B=(Z-2)*5+1
  1178.    If POS=True Then POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
  1179.    If BSIZE=True Then BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
  1180.    If MX=True Then MX= Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))
  1181.    POS=Max(0,Min(MX-BSIZE,POS))
  1182.    REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+"L"+ Extension_16_04A2(MX)+"R"+ Extension_16_04A2(BSIZE)+Mid$(REQS$(RN,1),B+15)
  1183.    SLIDER_DRAW[Z,POS,Max(0,MX-BSIZE),BSIZE,2]
  1184. End Proc
  1185. Procedure UPDTE_SELECTOR[RN,Z,POS,HO]
  1186.    If HO=True Then HO= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+2))
  1187.    If POS=True Then POS= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+7))
  1188.    L= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+17))
  1189.    N=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+12))-L)
  1190.    POS=Max(0,Min(N,POS))
  1191.    REQS$(RN,1)=Mid$(REQS$(RN,1),1,(Z-2)*5+1)+ Extension_16_04A2(HO)+"V"+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),(Z-2)*5+11)
  1192.    SLIDER_DRAW[Z+1,POS,N,L,1]
  1193.    OB=0 : Ink Screen Colour-1
  1194.    If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
  1195.    E= Extension_16_0094(REQS$(RN,2),10,OB)
  1196.    While POS>0 : OB= Extension_16_0094(REQS$(RN,2),0,OB) : Dec POS : Wend 
  1197.    W=(REQC(RN,2)-REQC(RN,0)-88)/8
  1198.    For A=1 To L
  1199.       B= Extension_16_0094(REQS$(RN,2),0,OB)
  1200.       If(B>E) or(B=0)
  1201.          Cls 1, Extension_16_0006(Z)+4, Extension_16_001C(Z)+A*8-4 To Extension_16_0032(Z)-4, Extension_16_0048(Z)-2
  1202.          Exit 
  1203.       Else 
  1204.          A$=Mid$(REQS$(RN,2),OB+1+HO,Min(W,Max(0,B-OB-1-HO))) : OB=B
  1205.          A$=A$+Space$(Max(0,W-Len(A$)))
  1206.          Ink 3 : Text Extension_16_0006(Z)+8, Extension_16_001C(Z)+2+A*8,A$
  1207.       End If 
  1208.    Next 
  1209. End Proc[W]
  1210. Procedure SELECTOR_GET[RN,Z,POS]
  1211.    OB=0
  1212.    If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
  1213.    While POS>0 : OB= Extension_16_0094(REQS$(RN,2),0,OB) : Dec POS : Wend 
  1214.    B= Extension_16_0094(REQS$(RN,2),0,OB)
  1215. End Proc[Mid$(REQS$(RN,2),OB+1,Max(0,B-OB-1))]
  1216. Procedure SELECTOR_RESET[RN,Z,S$]
  1217.    'Delete all lines from a selector & replace with s$
  1218.    OB=0
  1219.    If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
  1220.    B= Extension_16_0094(REQS$(RN,2),10,OB) : If B=0 : B=Len(REQS$(RN,2)) : End If 
  1221.    REQS$(RN,2)=Mid$(REQS$(RN,2),1,OB)+S$+Chr$(10)+Mid$(REQS$(RN,2),B+1)
  1222.    N= Extension_16_04E8(S$,0)
  1223.    REQS$(RN,1)=Mid$(REQS$(RN,1),1,(Z-2)*5+6)+ Extension_16_04A2(0)+"U"+ Extension_16_04A2(N)+Mid$(REQS$(RN,1),(Z-2)*5+16)
  1224. End Proc
  1225. Procedure STRING_GET[RN,Z]
  1226.    Shared STREND,STRST
  1227.    B=2 : STRST=0 : While B<Z : STRST= Extension_16_0094(REQS$(RN,2),10,STRST) : Inc B : Wend 
  1228.    STREND= Extension_16_0094(REQS$(RN,2),10,STRST)
  1229.    If STREND>0
  1230.       S$=Mid$(REQS$(RN,2),STRST+1,STREND-STRST-1)
  1231.    Else 
  1232.       S$=Mid$(REQS$(RN,2),STRST+1)
  1233.    End If 
  1234. End Proc[S$]
  1235. Procedure UPDTE_STRING[RN,Z,S$]
  1236.    Shared STRST,STREND
  1237.    STRING_GET[RN,Z]
  1238.    If STREND=0
  1239.       REQS$(RN,2)=Mid$(REQS$(RN,2),1,STRST)+S$
  1240.    Else 
  1241.       REQS$(RN,2)=Mid$(REQS$(RN,2),1,STRST)+S$+Mid$(REQS$(RN,2),STREND)
  1242.    End If 
  1243.    X1= Extension_16_0006(Z)+8 : Y1= Extension_16_001C(Z)+4 : DMX=( Extension_16_0032(Z)-X1-8)/8
  1244.    Ink 0 : Text X1,Y1+6,Mid$(S$+Space$(DMX),1,DMX)
  1245. End Proc
  1246. '
  1247. 'Requester Internal Routines Only
  1248. '
  1249. Procedure REQUEST_SET_BORDERS[RN,CL]
  1250.    Shared X1,X2,YP
  1251.    X1=REQC(RN,0)+24 : X2=REQC(RN,2)-24
  1252.    YP=Max(REQS(RN,0),REQS(RN,1))
  1253.    If CL=2 Then X1=X1+(X2-X1)/2+8 : YP=REQS(RN,1)
  1254.    If CL=1 Then X2=X2-(X2-X1)/2-8 : YP=REQS(RN,0)
  1255. End Proc
  1256. Procedure REQUEST_UPDTE_YPOS[RN,CL]
  1257.    Shared YP
  1258.    If CL<>2 Then REQS(RN,0)=YP
  1259.    If CL<>1 Then REQS(RN,1)=YP
  1260. End Proc
  1261. Procedure RSTRING[RN,MZ]
  1262.    Shared STRST,STREND
  1263.    M= Extension_16_04C6(Mid$(REQS$(RN,1),(MZ-2)*5+2,2))
  1264.    FLAG=Asc(Mid$(REQS$(RN,1),(MZ-2)*5+4,1))
  1265.    STRING_GET[RN,MZ] : REQ$=Param$
  1266.    '
  1267.    '
  1268.    '
  1269.    X1= Extension_16_0006(MZ)+8 : Y1= Extension_16_001C(MZ)+4 : DMX=( Extension_16_0032(MZ)-X1-8)/8
  1270.    Cls 1,X1,Y1 To X1+DMX*8,Y1+8
  1271.    U$=A$ : A$=REQ$ : Ink 0,1
  1272.    TXS=0 : If Len(A$)>DMX Then TXS=Len(A$)-DMX
  1273.    Text X1,Y1+6,Mid$(A$,TXS+1,DMX)
  1274.    A=(X Screen(X Mouse)-X1)/8+TXS+1
  1275.    TCP=Min(Len(A$)+1,Min(TXS+DMX,Max(TXS+1,A)))
  1276.    Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
  1277.    AL=31 : AH=127 : If Btst(0,FLAG) Then AL=47 : AH=59
  1278.    '
  1279.    Do 
  1280.       Repeat 
  1281.          If Mouse Key=1
  1282.             If Mouse Zone=MZ
  1283.                While Mouse Key=1
  1284.                   Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
  1285.                   TCP=Min(Len(REQ$)+1,Min(TXS+DMX,Max(TXS+1,(X Screen(X Mouse)-X1)/8+TXS+1)))
  1286.                   Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
  1287.                Wend 
  1288.             Else 
  1289.                I$=Chr$(13) : S=0 : KS=0 : Exit 
  1290.             End If 
  1291.          End If 
  1292.          I$=Inkey$ : S=Scancode : KS=Scanshift
  1293.          If(I$="") and(S=0) : Multi Wait : End If 
  1294.       Until(I$<>"") or(S>0) : I=Asc(I$)
  1295.       '
  1296.       If Btst(3,KS)
  1297.          If Upper$(I$)="A" : KS=3 : S=79 : End If 
  1298.          If Upper$(I$)="E" : KS=3 : S=78 : End If 
  1299.          If Upper$(I$)="X" : TCP=1 : TXS=0 : REQ$=""
  1300.          Text X1,Y1+6,Space$(DMX) : End If 
  1301.          If Upper$(I$)="U" : REQ$=U$ : TCP=1 : TXS=0
  1302.          Text X1,Y1+6,Space$(DMX) : End If 
  1303.          If Upper$(I$)="D" : KS=0 : S=70 : End If 
  1304.          I$="" : I=0
  1305.       End If 
  1306.       If(I>AL) and(I<AH) and(Len(REQ$)<M)
  1307.          REQ$=Left$(REQ$,TCP-1)+Chr$(I)+Mid$(REQ$,TCP) : S=78 : KS=0
  1308.       End If 
  1309.       If S=70 and(TCP<Len(REQ$)+1)
  1310.          REQ$=Left$(REQ$,TCP-1)+Mid$(REQ$,TCP+1)
  1311.       End If 
  1312.       If I=8 and(TCP>1)
  1313.          REQ$=Left$(REQ$,TCP-2)+Mid$(REQ$,TCP) : S=79 : KS=0
  1314.       End If 
  1315.       If S=79
  1316.          If(KS and 3)>0
  1317.             TCP=1 : TXS=0
  1318.          Else 
  1319.             TCP=Max(1,TCP-1) : TXS=Min(TCP,TXS+1)-1
  1320.          End If 
  1321.       End If 
  1322.       If S=78
  1323.          If(KS and 3)>0
  1324.             TCP=Min(Len(REQ$)+1,M) : TXS=Max(0,TCP-DMX)
  1325.          Else 
  1326.             TCP=Min(Min(TCP+1,Len(REQ$)+1),M)
  1327.             If TCP>TXS+DMX : Inc TXS : End If 
  1328.          End If 
  1329.       End If 
  1330.       Text X1,Y1+6,Mid$(REQ$+"  ",TXS+1,DMX)
  1331.       If I=27 Then REQ$=U$ : REQ=1 : Exit 
  1332.       If I=13
  1333.          If S=0
  1334.             REQ=0
  1335.          Else 
  1336.             REQ=2
  1337.          End If : Exit 
  1338.       End If 
  1339.       Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
  1340.    Loop 
  1341.    '
  1342.    UPDTE_STRING[RN,MZ,REQ$]
  1343. End Proc
  1344. Procedure REQUEST_MOVE[RN]
  1345.    Shared REQDX,REQDY
  1346.    On Error Proc GENERAL_ERROR
  1347.    Resume Label RM_ERR
  1348.    MCOL=Screen Colour-1 : W=REQC(RN,2)-REQC(RN,0) : H=REQC(RN,3)-REQC(RN,1)+1
  1349.    Colour MCOL-1,$F80 : XX=X Screen(X Mouse)-REQC(RN,0) : YY=Y Screen(Y Mouse)-REQC(RN,1)
  1350.    Gr Writing 2 : Repeat 
  1351.       X1=Max(0,Min(Screen Width-W,X Screen(X Mouse)-XX))
  1352.       Y1=Max(0,Min(Screen Height-H,Y Screen(Y Mouse)-YY))
  1353.       C=Point(X1,Y1) : Box X1,Y1 To X1+W,Y1+H : Wait Vbl 
  1354.       Box X1,Y1 To X1+W,Y1+H : Plot X1,Y1,C : Wait Vbl 
  1355.    Until Mouse Key<>1
  1356.    Gr Writing 1
  1357.    Get Block RN*2+1,REQC(RN,0),REQC(RN,1),W,H
  1358.    Put Block RN*2 : XX=X1 and $FFF8 : YY=Y1 and $FFFE
  1359.    Get Block RN*2,XX,YY,W,H
  1360.    Put Block RN*2+1,XX,YY : Del Block RN*2+1
  1361.    REQDX=XX-REQC(RN,0) : REQDY=YY-REQC(RN,1)
  1362.     Extension_16_005E Screen,REQDX,REQDY
  1363.    Colour MCOL-1,Colour(1) : REQC(RN,0)=XX : REQC(RN,1)=YY : REQC(RN,2)=XX+W : REQC(RN,3)=YY+H-1
  1364.    RM_ERR:
  1365. End Proc
  1366. Procedure BUTON[X1,Y1,B$,IN]
  1367.    SBOX[X1,Y1,X1+16+Len(B$)*8,Y1+14,IN]
  1368.    Text X1+8,Y1+10,B$
  1369. End Proc
  1370. '
  1371. 'Requester Internal & User routines
  1372. '
  1373. Procedure TBOX[X1,Y1,X2,Y2,IN]
  1374.    A=Screen Colour-1
  1375.    Ink A+IN*A
  1376.    Polyline X1,Y2-1 To X1,Y1 To X2,Y1
  1377.    Ink -IN*A
  1378.    Polyline X1,Y2 To X2,Y2 To X2,Y1+1
  1379. End Proc
  1380. Procedure SBOX[X1,Y1,X2,Y2,IN]
  1381.    Ink 0 : A=Screen Colour-1
  1382.    Draw X1+1,Y1 To X2-1,Y1
  1383.    Draw X1+1,Y2 To X2-1,Y2
  1384.    Draw X1,Y1+1 To X1,Y2-1
  1385.    Draw X2,Y1+1 To X2,Y2-1
  1386.    Set Line $AAAA
  1387.    Ink -IN*A
  1388.    Polyline X1+1,Y2-1 To X2-1,Y2-1 To X2-1,Y1+2
  1389.    Ink A+IN*A
  1390.    Polyline X1+1,Y2-2 To X1+1,Y1+1 To X2-1,Y1+1
  1391.    Set Line $FFFF
  1392. End Proc
  1393. Procedure RDZONE[SCRN,Z]
  1394.    A0=Screen : Screen SCRN : A1=Leek(Screen Base+210)+(Z-1)*8
  1395.    X1=Min(Deek(A1),Deek(A1+4)) : Y1=Min(Deek(A1+2),Deek(A1+6))
  1396.    X2=Max(Deek(A1),Deek(A1+4)) : Y2=Max(Deek(A1+2),Deek(A1+6))
  1397.    Screen A0
  1398. End Proc
  1399. Procedure SLIDER_READ[Z,POS#,MX#,BSIZE#,FLAGS]
  1400.    If MX#<0 Then POS#=0 : MX#=0 : BSIZE#=1
  1401.    P#=POS#
  1402.    Repeat 
  1403.       ST= Extension_16_0006(Z)+3 : L#=( Extension_16_0032(Z)- Extension_16_0006(Z)-6)/(MX#+BSIZE#)
  1404.       P=X Screen(X Mouse)
  1405.       If Btst(0,FLAGS)
  1406.          ST= Extension_16_001C(Z)+3 : L#=( Extension_16_0048(Z)- Extension_16_001C(Z)-6)/(MX#+BSIZE#)
  1407.          P=Y Screen(Y Mouse)
  1408.       End If 
  1409.       POS#=(P-ST)/L#-BSIZE#/2.0
  1410.       If POS#>MX# Then POS#=MX#
  1411.       If POS#<0 Then POS#=0
  1412.       If(POS#<>P#) or Not Btst(1,FLAGS)
  1413.          SLIDER_DRAW[Z,POS#,MX#,BSIZE#,FLAGS]
  1414.          P#=POS#
  1415.       End If 
  1416.    Until(Mouse Key=0) or Not Btst(1,FLAGS)
  1417. End Proc[POS#]
  1418. Procedure SLIDER_DRAW[Z,POS#,MX#,BSIZE#,FLAGS]
  1419.    If MX#<=0 Then POS#=0 : MX#=0 : BSIZE#=1
  1420.    Wait Vbl 
  1421.    SBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),False]
  1422.    If Btst(0,FLAGS)
  1423.       L#=( Extension_16_0048(Z)- Extension_16_001C(Z)-6)/(MX#+BSIZE#)
  1424.       Cls 1, Extension_16_0006(Z)+3, Extension_16_001C(Z)+2 To Extension_16_0032(Z)-2, Extension_16_001C(Z)+3+POS#*L#
  1425.       Cls 0, Extension_16_0006(Z)+3, Extension_16_001C(Z)+3+POS#*L# To Extension_16_0032(Z)-2, Extension_16_001C(Z)+4+(POS#+BSIZE#)*L#
  1426.       Cls 1, Extension_16_0006(Z)+3, Extension_16_001C(Z)+4+(POS#+BSIZE#)*L# To Extension_16_0032(Z)-2, Extension_16_0048(Z)-1
  1427.    Else 
  1428.       L#=( Extension_16_0032(Z)- Extension_16_0006(Z)-6)/(MX#+BSIZE#)
  1429.       Cls 1, Extension_16_0006(Z)+2, Extension_16_001C(Z)+3 To Extension_16_0006(Z)+3+POS#*L#, Extension_16_0048(Z)-2
  1430.       Cls 0, Extension_16_0006(Z)+3+POS#*L#, Extension_16_001C(Z)+3 To Extension_16_0006(Z)+4+(POS#+BSIZE#)*L#, Extension_16_0048(Z)-2
  1431.       Cls 1, Extension_16_0006(Z)+4+(POS#+BSIZE#)*L#, Extension_16_001C(Z)+3 To Extension_16_0032(Z)-1, Extension_16_0048(Z)-2
  1432.    End If 
  1433. End Proc
  1434. '
  1435. '
  1436. Procedure ICONIFY
  1437.    Shared _FADEDIN
  1438.    Amos Lock 
  1439.    Amos To Back 
  1440.    Screen Close 7
  1441.    A= Extension_16_05A6(400,0,"Sample Bank Maker")
  1442.    Amos To Front 
  1443.    Amos Unlock 
  1444.    SET_UP_SCREEN
  1445.    DISPLAY_SAMS
  1446.    _FADEDIN=False
  1447.    FADIN
  1448.    If A=-1 Then PQUIT
  1449.    If A>0 Then SIMPLE_REQUESTER[TITLESTR$,"Unable To Iconify Sample Bank Editor",ACK$,1]
  1450. End Proc
  1451. Procedure SETUP_IO_ERRORS
  1452.    Shared ERR$(),EXERR$()
  1453.    '1st Character = error no
  1454.    '2nd Character Bit 0=request/message 1=add Ertype$ 
  1455.    Restore IO_ERRS
  1456.    For A=1 To 12 : Read ERR$(A) : Next 
  1457.    IO_ERRS:
  1458.    Data Chr$(82)+Chr$(0)+"Illegal File Name"
  1459.    Data Chr$(83)+Chr$(0)+"Disc is not validated"
  1460.    Data Chr$(84)+Chr$(0)+"Disc is write protected"
  1461.    Data Chr$(86)+Chr$(0)+"Device Not Available"
  1462.    Data Chr$(88)+Chr$(0)+"Disc Full"
  1463.    Data Chr$(89)+Chr$(0)+"File is protected from deletion"
  1464.    '
  1465.    Data Chr$(90)+Chr$(0)+"File is protected from writing"
  1466.    Data Chr$(91)+Chr$(0)+"File is protected from reading"
  1467.    Data Chr$(92)+Chr$(0)+"Not an amigados disk"
  1468.    Data Chr$(93)+Chr$(0)+"No disk in drive"
  1469.    Data Chr$(94)+Chr$(0)+"Read / write error occured"
  1470.    '
  1471.    Data Chr$(96)+Chr$(2)+"File in use - unable to "
  1472.    '
  1473.    'Extension Errors
  1474.    '
  1475.    Restore EX_ERRS
  1476.    For A=0 To 10 : Read EXERR$(A) : Next 
  1477.    EX_ERRS:
  1478.    Data Chr$(0)+"Unable To Load Powerpacker Library"
  1479.    Data Chr$(0)+"File Is Empty"
  1480.    Data Chr$(0)+"Illegal PowerPacker File Header"
  1481.    Data Chr$(0)+"Unable To Load Encrypted File"
  1482.    Data Chr$(0)+"Unable To Load Encrpyted File"
  1483.    Data Chr$(0)+"No enough memory for Powerpacker Buffer"
  1484.    Data Chr$(0)+"Error Reading File"
  1485.    Data Chr$(0)+"Unable To Open File"
  1486.    Data Chr$(0)+"Crunched File Longer Than Source - Aborted"
  1487.    Data " Ex Error 9"
  1488.    Data " Ex Error 10"
  1489.    '
  1490. End Proc
  1491. Procedure IO_ERRORS
  1492.    Shared ERR$(),EXERR$()
  1493.    FADIN
  1494.    EFREE$="" : EFREE=False : Set Text 0 : Gr Writing 1 : Extension_16_01EA 6
  1495.    If(Errn=23) and(ERTYPE$="Change Directory")
  1496.       SIMPLE_REQUESTER[TITLESTR$,"Illegal Directory Name",ACK$,1]
  1497.       Resume Label 
  1498.    End If 
  1499.    If Errn=10
  1500.       If Extension_16_01CE(7)=0 : Extension_16_01EA 7 : Resume : End If 
  1501.    End If 
  1502.    If Errn=11
  1503.       BLK$="" : CTAB$=""
  1504.       ED_MESSAGE["*** WARNING: VARIABLE BUFFER FULL ***"] : ED_INFO
  1505.       Resume Label 
  1506.    End If 
  1507.    For A=1 To 12
  1508.       If Errn=Asc(ERR$(A))
  1509.          B=Asc(Mid$(ERR$(A),2)) : A$=Mid$(ERR$(A),3)
  1510.          If Btst(1,B) : A$=A$+ERTYPE$ : End If 
  1511.          If Btst(0,B)
  1512.             ED_MESSAGE[A$] : ED_INFO
  1513.          Else 
  1514.             SIMPLE_REQUESTER[TITLESTR$,A$,ACK$,1]
  1515.          End If 
  1516.          Resume Label 
  1517.       End If 
  1518.    Next 
  1519.    If Errn>=4096
  1520.       SIMPLE_REQUESTER[TITLESTR$,Mid$(EXERR$(Errn-4096),2),ACK$,1]
  1521.       Resume Label 
  1522.    End If 
  1523.    SIMPLE_REQUESTER[TITLESTR$,"STRANGE: Amos Error No:"+Str$(Errn)+" Just Occured!"," This shouldn't Happen ",1]
  1524.    Resume Label 
  1525. End Proc
  1526. Procedure MAKE_RAM
  1527.    On Error Goto MAKE_RAM_ERROR
  1528.    D$=Dir$ : Dir$="RAM:" : Dir$=D$
  1529.    Pop Proc
  1530.    '
  1531.    MAKE_RAM_ERROR:
  1532.    Resume Next 
  1533. End Proc
  1534. Procedure GENERAL_ERROR
  1535.    Shared DEBUG
  1536.    Set Text 0 : Writing 0 : Gr Writing 1 : Extension_16_01EA 6
  1537.    If Errn=10
  1538.       If Extension_16_01CE(7)<>0
  1539.           Extension_16_01EA 7 : Resume 
  1540.       End If 
  1541.    End If 
  1542.    If Errn=11
  1543.       'Out Of Varaible Buffer Space
  1544.       DR$=""
  1545.    End If 
  1546.    If DEBUG
  1547.       Error Errn
  1548.    Else 
  1549.       SIMPLE_REQUESTER[TITLESTR$,"Error no"+Str$(Errn)+" has just occured - program may crash"," Save As | Continue ",2]
  1550.       Resume Label 
  1551.    End If 
  1552. End Proc
  1553. Procedure FADIN
  1554.    Shared _FADEDIN
  1555.    If Not _FADEDIN
  1556.       Fade 4,0,$458,$8AD,$EEF
  1557.       For A=Screen Height/2 To 0 Step -2
  1558.          Screen Display 1,,SCY+A,,Screen Height-2*A
  1559.          Screen Offset 1,,A
  1560.          Wait Vbl 
  1561.       Next 
  1562.       Screen Offset 1,,0
  1563.       Screen Display 1,,SCY,,Screen Height
  1564.       _FADEDIN=True
  1565.    End If 
  1566. End Proc
  1567. Procedure ED_INFO
  1568.    Shared _MESSAGE$,MESSAGE
  1569.    Cls 1,0,0 To 640,12
  1570.    Ink 3 : Polyline 0,10 To 0,0 To 638,0
  1571.    Ink 0 : Polyline 1,11 To 639,11 To 639,1
  1572.    If MESSAGE
  1573.       Ink 3,1 : Text 4+Max(0,79-Len(_MESSAGE$))*4,8,Left$(_MESSAGE$,79)
  1574.    Else 
  1575.       F=Free
  1576.       Ink 3,1 : Text 16,8,Left$(TITLESTR$,26)
  1577.       Text 240,8,"No Samples:"+Str$(NSAM)
  1578.       Text 420,8,"Buffer:"+Str$(F)+" bytes    "
  1579.    End If 
  1580. End Proc
  1581. Procedure ED_MESSAGE[A$]
  1582.    Shared MESSAGE,_MESSAGE$
  1583.    _MESSAGE$=A$
  1584.    If A$=""
  1585.       MESSAGE=0
  1586.    Else 
  1587.       MESSAGE=Timer+250
  1588.    End If 
  1589. End Proc
  1590. Procedure ED_PERM_MESSAGE[A$]
  1591.    Shared MESSAGE,_MESSAGE$
  1592.    _MESSAGE$=A$
  1593.    If A$=""
  1594.       MESSAGE=0
  1595.    Else 
  1596.       MESSAGE=Timer+1000000
  1597.    End If 
  1598. End Proc
  1599. Procedure HYPER[BF,TIT$,W,H]
  1600.    GP=0 : MN=0 : PV$=""
  1601.    On Error Proc GENERAL_ERROR
  1602.    Resume Label HYP_ERR
  1603.    REQUEST_OPEN[W,H,14] : RN=Param
  1604.    REQUEST_DRAW[RN,TIT$]
  1605.    REQUEST_ADD_SELECTOR[RN,0,"",H-4] : SZ=Param
  1606.    REQUEST_ADD_BUTTONS[RN,0," Previous | Index | Top | Bottom | Exit ",5,True] : BZ=Param
  1607.    W=( Extension_16_0032(SZ)- Extension_16_0006(SZ))/8-2
  1608.    H=( Extension_16_0048(SZ)- Extension_16_001C(SZ))/8-2
  1609.    Do 
  1610.       P=0 : CMZ=0 : ST$="" : M$= Extension_16_0232(BF,GP,MN)
  1611.       '
  1612.       While P<Len(M$)
  1613.          A=P
  1614.          Repeat 
  1615.             Q= Extension_16_0094(M$,10,P) : If Q=0 : Q=Len(M$)+1 : End If 
  1616.             L$=Mid$(M$,A+1,Max(0,Q-A-1))
  1617.             A1= Extension_16_04D2(L$,"[") : A2= Extension_16_04D2(L$,"]")
  1618.             P=Q
  1619.          Until A1=A2
  1620.          '
  1621.          P=A+1
  1622.          WW=W : A= Extension_16_00A0(Left$(L$,WW),"[")
  1623.          While A>0 : WW=WW+6 : A= Extension_16_00B4(Left$(L$,WW),"[",A) : Wend 
  1624.          While Len(L$)=>WW
  1625.             A= Extension_16_011E(L$,32,WW) : If A=0 : A=WW : End If 
  1626.             A1= Extension_16_0142(L$,"[",A) : A2= Extension_16_0142(L$,"]",A)
  1627.             If A1>A2 : A=A1-1 : End If 
  1628.             ST$=ST$+ Extension_16_04BA(P) : P=P+A
  1629.             L$=Mid$(L$,A+1)
  1630.             '
  1631.             WW=W : A= Extension_16_00A0(Left$(L$,WW),"[")
  1632.             While A>0 : WW=WW+6 : A= Extension_16_00B4(Left$(L$,WW),"[",A) : Wend 
  1633.          Wend 
  1634.          ST$=ST$+ Extension_16_04BA(P) : P=Q
  1635.       Wend 
  1636.       ST$=ST$+ Extension_16_04BA(Len(M$)+1)
  1637.       '
  1638.       ML=Len(ST$)/2-2
  1639.       For A=0 To H
  1640.          Gosub DISP_LINE
  1641.       Next 
  1642.       SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
  1643.       '
  1644.       MOUSE_READY
  1645.       Do 
  1646.          Repeat 
  1647.             Repeat 
  1648.                Multi Wait 
  1649.                MZ=Mouse Zone : I$=Inkey$ : S=Scancode
  1650.                If(Mouse Key=0) and(CMZ>3)
  1651.                   RDZONE[Screen,CMZ] : CMZ=0
  1652.                   Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
  1653.                End If 
  1654.             Until((MZ>0) and(Mouse Key>0)) or(S=76) or(S=77)
  1655.             If MZ<>CMZ
  1656.                If CMZ>SZ+1
  1657.                   RDZONE[Screen,CMZ] : CMZ=0
  1658.                   Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
  1659.                End If 
  1660.                If MZ>SZ+1
  1661.                   RDZONE[Screen,MZ]
  1662.                   Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
  1663.                End If 
  1664.                CMZ=MZ
  1665.             End If 
  1666.             If MZ>=BZ
  1667.                While(Mouse Zone=MZ) and(Mouse Key>0)
  1668.                MK=Max(MK,Mouse Key) : Wend 
  1669.                If MZ>=BZ
  1670.                   CMZ=0
  1671.                   Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
  1672.                End If 
  1673.             Else 
  1674.                If MZ=1 : REQUEST_MOVE[RN] : End If 
  1675.             End If 
  1676.          Until(Mouse Zone=MZ) or(S=76) or(S=77)
  1677.          Exit If MZ=BZ+4,2
  1678.          If S>0 : MZ=0 : End If 
  1679.          If((S=77) or(MZ=SZ+3)) and(L+H<ML)
  1680.             Screen Copy Screen, Extension_16_0006(SZ)+8, Extension_16_001C(SZ)+12, Extension_16_0006(SZ)+W*8+17, Extension_16_001C(SZ)+H*8+12 To Screen, Extension_16_0006(SZ)+8, Extension_16_001C(SZ)+4
  1681.             Inc L : A=H : Gosub DISP_LINE
  1682.             SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
  1683.          End If 
  1684.          If((S=76) or(MZ=SZ+2)) and(L>0)
  1685.             Screen Copy Screen, Extension_16_0006(SZ)+8, Extension_16_001C(SZ)+4, Extension_16_0006(SZ)+W*8+17, Extension_16_001C(SZ)+4+H*8 To Screen, Extension_16_0006(SZ)+8, Extension_16_001C(SZ)+12
  1686.             Dec L : A=0 : Gosub DISP_LINE
  1687.             SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
  1688.          End If 
  1689.          If MZ=BZ+2
  1690.             L=0 : For A=0 To H : Gosub DISP_LINE : Next 
  1691.             SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
  1692.          End If 
  1693.          If MZ=BZ+3
  1694.             L=Max(0,ML-H) : For A=0 To H : Gosub DISP_LINE : Next 
  1695.             SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
  1696.          End If 
  1697.          If MZ=BZ+1 Then PV$= Extension_16_04BA(GP)+ Extension_16_04BA(MN)+ Extension_16_04BA(L)+Left$(PV$,120) : GP=0 : MN=0 : L=0 : Exit 
  1698.          If(MZ=BZ) and(Len(PV$)>0)
  1699.             GP= Extension_16_04C6(PV$) : MN= Extension_16_04C6(Mid$(PV$,3)) : L= Extension_16_04C6(Mid$(PV$,5)) : PV$=Mid$(PV$,7) : Exit 
  1700.          End If 
  1701.          If SZ=MZ
  1702.             HY=Max(0,Min(H,(Y Screen(Y Mouse)- Extension_16_001C(SZ)-4)/8))
  1703.             HX=Max(0,Min(W,(X Screen(X Mouse)- Extension_16_0006(SZ)-8)/8))
  1704.             If HY+L<=ML
  1705.                ST= Extension_16_04C6(Mid$(ST$,(L+HY)*2+1)) : ED= Extension_16_04C6(Mid$(ST$,(L+HY+1)*2+1))
  1706.                A$=Mid$(M$,ST,ED-ST-1) : A3=0 : A4=1
  1707.                A1= Extension_16_00A0(A$,"[")
  1708.                While A1>0
  1709.                   A3=A3+Max(0,A1-A4)
  1710.                   A2= Extension_16_00B4(A$,"]",A1)+1
  1711.                   A5=A3+A2-A1-6 : A4=A2
  1712.                   If HX>=A3 and HX<A5
  1713.                      PV$= Extension_16_04BA(GP)+ Extension_16_04BA(MN)+ Extension_16_04BA(L)+Left$(PV$,120)
  1714.                      Ink 1,1,0 : Set Paint 1
  1715.                      For A=10 To 0 Step -1
  1716.                         If A=0 : Set Paint 0 : End If 
  1717.                         Bar Extension_16_0006(SZ)+8+(HX*8*A)/10.0, Extension_16_001C(SZ)+4+(HY*8*A)/10.0 To Extension_16_0006(SZ)+8+W*8-((W-HX)*8*A)/10.0+1, Extension_16_001C(SZ)+4+(H+1)*8-((H-HY)*8*A)/10.0+1
  1718.                      Next 
  1719.                      GP= Extension_16_04C6(Mid$(A$,A1+1)) : MN= Extension_16_04C6(Mid$(A$,A1+3)) : L=0 : Exit 2
  1720.                   End If 
  1721.                   A1= Extension_16_00B4(A$,"[",A2) : A3=A5
  1722.                Wend 
  1723.             End If 
  1724.          End If 
  1725.          If MZ=3
  1726.             SLIDER_READ[SZ+1,L,Max(0,ML-H),H,1]
  1727.             L=Max(0,Min(ML-H,Param#))
  1728.             For A=0 To H : Gosub DISP_LINE : Next 
  1729.          End If 
  1730.       Loop 
  1731.    Loop 
  1732.    MOUSE_BUSY[True]
  1733.    REQUEST_CLOSE[RN]
  1734.    Pop Proc
  1735.    '
  1736.    '
  1737.    'Pre: A = Y Pos of line
  1738.    '
  1739.    DISP_LINE:
  1740.    Cls 1, Extension_16_0006(SZ)+8, Extension_16_001C(SZ)+A*8+4 To Extension_16_0006(SZ)+W*8+1, Extension_16_001C(SZ)+4+(A+1)*8
  1741.    If L+A>ML Then Return 
  1742.    ST= Extension_16_04C6(Mid$(ST$,(L+A)*2+1)) : ED= Extension_16_04C6(Mid$(ST$,(L+A+1)*2+1))
  1743.    If ED>ST
  1744.       A$=Mid$(M$,ST,ED-ST-1) : A3=0 : A4=1
  1745.       A1= Extension_16_00A0(A$,"[")
  1746.       While A1>0
  1747.          Ink 0,1 : Set Text 0
  1748.          Text Extension_16_0006(SZ)+8+A3*8, Extension_16_001C(SZ)+A*8+10,Mid$(A$,A4,Max(0,A1-A4)) : A3=A3+Max(0,A1-A4)
  1749.          A2= Extension_16_00B4(A$,"]",A1)+1
  1750.          Set Text 4
  1751.          Ink 3,1 : Text Extension_16_0006(SZ)+8+A3*8, Extension_16_001C(SZ)+A*8+10,Mid$(A$,A1+5,A2-A1-6)
  1752.          A3=A3+A2-A1-6 : A4=A2
  1753.          A1= Extension_16_00B4(A$,"[",A2)
  1754.       Wend 
  1755.       Ink 0,1 : Set Text 0
  1756.       Text Extension_16_0006(SZ)+8+A3*8, Extension_16_001C(SZ)+A*8+10,Mid$(A$,A4)
  1757.    End If 
  1758.    Return 
  1759.    HYP_ERR:
  1760.    If RN>0
  1761.       REQUEST_CLOSE[RN]
  1762.    End If 
  1763. End Proc
  1764. Procedure MOUSE_BUSY[D]
  1765.    Shared BUSY_ANIM,BUSY
  1766.    If Not BUSY
  1767.       If Screen>=0
  1768.         Colour 17,$A31
  1769.         Colour 18,$0
  1770.         Colour 19,$FFF
  1771.       End If 
  1772.       If D
  1773.          BUSY_ANIM=False
  1774.          Change Mouse 9
  1775.       Else 
  1776.          Hide 
  1777.          Sprite 0,X Mouse,Y Mouse,6
  1778.          Channel 0 To Sprite 0
  1779.          Amal 0,"A 0,(6,25)(7,25)(8,25)(9,25)(10,25)(11,25)(12,4)(13,4)(14,4)(15,4)(16,4)(17,4) A: L X=XM L Y=YM P J A"
  1780.          Amal On 
  1781.          BUSY_ANIM=True
  1782.       End If 
  1783.       BUSY=True
  1784.    End If 
  1785. End Proc
  1786. Procedure MOUSE_READY
  1787.    Shared BUSY_ANIM,BUSY
  1788.    If BUSY
  1789.       If BUSY_ANIM
  1790.          Amal Off : Sprite Off 0 : BUSY_ANIM=False
  1791.          Show 
  1792.       End If 
  1793.       Change Mouse MSIM+3
  1794.       BUSY=False
  1795.    End If 
  1796. End Proc