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:
Amiga (detected)
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
AMOS Source Code
|
1993-02-25
|
58.1 KB
|
1,796 lines
'************************************************************
'** Sample Bank Editor V1.1 - By Paul Hickman � Oct 1993 **
'** **
'** Based On The AMOS Sample Bank Maker by Francois Lionet **
'** & Peter Hickman (No Relation) **
'************************************************************
'
' You may increase the storage capacity of this program by changing
' the size of the text buffer. You can also increase the maximum number
' of samples per bank by changing MXSAM.
'
'
'
Set Buffer 150
Close Editor : Screen Close 0
Global MXSAM,ACK$
MXSAM=200 : VER$="1.1" : RV$="1.0"
ACK$="Acknowledged"
'
'
'
'
'
'
'
Dim S$(MXSAM),F$(MXSAM),F(MXSAM),TYPE(MXSAM),TYPE$(4)
Dim ERR$(12),EXERR$(10),PLF(10)
NSAM=0 : L0ADED_SAMPLES=False
Global S$(),F$(),F(),TYPE(),L0ADED_SAMPLES,SELMODE,SELPOS,TYPE$(),MSIM
Global X1,X2,Y1,Y2,FR_REQ$,MXREQS,SCY,HSC,WINOFF,YL,NSAM,PLF(),TITLESTR$
MXREQS=4 : Dim REQS(MXREQS,2),REQS$(MXREQS,2),REQC(MXREQS,3)
FR_REQ$=Space$(MXREQS) : RGE$=" "
Global REQS(),REQS$(),REQC(),DFILE$,PATH$,REQ,REQ$,REQDX,REQDY
FSELWIDTH=50 : SCY=44 : WINOFF=0 : NSAM=0 : MSIM=5
TYPE$(1)="RAW"
TYPE$(2)="STOS"
TYPE$(3)="IFF"
TYPE$(4)="AMOS"
TITLESTR$="New-Bank"
For A=2 To 10 : Read PLF(A) : Next
Data 1024,2048,4096,6144,8192,12288,16384,32768,10000
MAKE_RAM
SETUP_IO_ERRORS
SET_UP_SCREEN
MOUSE_BUSY[True]
DISPLAY_SAMS
ED_INFO
FADIN
ABOUT
MAIN
'
'
'
Procedure MAIN
Shared MESSAGE,_MESSAGE$
'
'Install general error handler
'
Goto BEGIN
RESTART:
BEGIN:
On Error Proc GENERAL_ERROR
Resume Label RESTART
'
'
'
Do
K$=Inkey$ : S=Scancode : SS=Scanshift : MK=0 : C=0 : A=0
If(K$="") or(Mouse Key>0)
MOUSE_READY
Repeat
Multi Wait : Inc A
If(Timer>MESSAGE) and(MESSAGE>0) : MESSAGE=0 : A=50 : End If
If A=50 : ED_INFO : End If
Menu On
MK=Mouse Key : Z=Mouse Zone : C=Choice
K$=Inkey$ : S=Scancode : SS=Scanshift
Until(K$<>"") or(MK<>0) or(C<>0)
End If
Curs Off
'
'
If(MK=1) and(Z=1)
SLIDER_READ[1,WINOFF,Max(0,NSAM-YL),YL,3]
WINOFF=Param#
DISPLAY_SAMS
End If
'
If C
Menu Off : SELMODE=0
MESSAGE=0 : MOUSE_BUSY[False]
ED_INFO
On Choice(1) Gosub ED_PROJECT,ED_SAMPLE,ED_PROP
K=0 : K$="" : S=0 : ED_INFO
End If
'
If(MK=1) and(Z>1) and(Z<NSAM+2)
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
Repeat : Exit If Mouse Zone<>Z : Until Mouse Key=0
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
If Mouse Zone=Z
SELPOS=Z-1+WINOFF
On SELMODE Proc _INCLUDE_SAMPLE,_REMOVE1,_MOVE1,_MOVE2,_ED_NAME,_ED_FREQ,AP_BANK,PL_SAMPLE
End If
End If
Loop
'
ED_PROJECT:
On Choice(2) Proc CLEAR,OPEN,SVE,SVE_AS,IN_BANK,AP_BANK,NULL,ABOUT,ICONIFY,HELP,PQUIT
Clear Key : Return
ED_SAMPLE:
On Choice(2) Proc _APPEND_SAMPLE,_INSERT_SAMPLE,_REMOVE_SAMPLE,_MOVE_SAMPLE,_PLAY_SAMPLE
Clear Key : Return
ED_PROP:
On Choice(2) Proc _EDIT_NAME,_EDIT_FREQ
Clear Key : Return
End Proc
Procedure NULL
End Proc
Procedure DISPLAY_SAMS
Paper 1 : Pen 3
Under On
If L0ADED_SAMPLES
If(NSAM-WINOFF<YL) and(WINOFF>0)
WINOFF=Max(0,NSAM-YL)
End If
Y=3
For LOP=WINOFF+1 To WINOFF+Min(NSAM-WINOFF,YL)
Print At(0,Y);" | | | | | | ";
Print At(6,Y);" ";LOP;At(14,Y);Left$(F$(LOP),21);At(40,Y); Using "#######";Len(S$(LOP))
Print At(54,Y); Using "#####";F(LOP);"Hz"
Print At(67,Y);TYPE$(TYPE(LOP))
Inc Y
Next LOP
If Y<=YL+3
Cls 1,0,Y*8 To 616,24+YL*8
End If
Else
Cls 1,0,24 To 616,24+YL*8
End If
Under Off
SLIDER_DRAW[1,WINOFF,Max(0,NSAM-YL),YL,1]
End Proc
Procedure SET_UP_SCREEN
HSC=250 : If Ntsc Then HSC=200
YL=(HSC-2)/8
Screen Open 1,640,HSC,4,Hires
Screen Display 1,,160,,0 : Flash Off
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)"
Palette 0,0,0,0 : Bob Update Off
Colour Back Colour(0)
Cls 1
Limit Mouse 128,SCY To 446,SCY+HSC
MOUSE_BUSY[True]
Menu Del : Set Paint 0
Paper 3 : Pen 0
'
Menu Static 1 : Menu Static 2 : Menu Static 3
Menu$(1)=" Project "
Menu$(1,1)=" Clear Buffer N (LO116,0:BO3:LO0,0) " : Menu Key(1,1) To 51,128
Menu$(1,2)=" Open Bank O (LO116,0:BO3:LO0,0) " : Menu Key(1,2) To 24,128
Menu$(1,3)=" Save Bank S (LO116,0:BO3:LO0,0) " : Menu Key(1,3) To 33,128
Menu$(1,4)=" Save Bank As A (LO116,0:BO3:LO0,0) " : Menu Key(1,4) To 32,128
Menu$(1,5)=" Include Bank I (LO116,0:BO3:LO0,0) " : Menu Key(1,5) To 23,128
Menu$(1,6)=" Append Bank E (LO116,0:BO3:LO0,0) " : Menu Key(1,6) To 18,128
Menu$(1,7)="-------------------" : Menu Inactive(1,7)
Menu$(1,8)=" About "
Menu$(1,9)=" Iconify "
Menu$(1,10)=" Help HELP " : Menu Key(1,10) To 95
Menu$(1,11)=" Quit Q (LO116,0:BO3:LO0,0) " : Menu Key(1,11) To 16,128
'
Menu$(2)=" Sample "
Menu$(2,1)=" Append Sample L (LO124,0:BO3:LO0,0) " : Menu Key(2,1) To 40,128
Menu$(2,2)=" Insert Sample I (LO124,0:BO3:LO0,0) " : Menu Key(2,2) To 23,128
Menu$(2,3)=" Remove Sample R (LO124,0:BO3:LO0,0) " : Menu Key(2,3) To 19,128
Menu$(2,4)=" Move Sample M (LO124,0:BO3:LO0,0) " : Menu Key(2,4) To 55,128
Menu$(2,5)=" Play Sample P (LO124,0:BO3:LO0,0) " : Menu Key(2,5) To 25,128
'
Menu$(3)=" Properties "
Menu$(3,1)=" Rename Sample N (LO132,0:BO2:LO0,0) " : Menu Key(3,1) To 54,64
Menu$(3,2)=" Edit Frequency F (LO132,0:BO2:LO0,0) " : Menu Key(3,2) To 35,64
'
Menu On
Reserve Zone 30
Set Zone 1,616,12 To 639,24+YL*8
For A=2 To 12
Set Zone A,0,A*8+7 To 615,A*8+16
Next
Curs Off
Under On : Pen 3 : Paper 1
Ink 3 : Draw 0,15 To 616,15
Print At(0,2);" | Sample | Sample name | Length | Frequency | Type | ";
End Proc
Procedure INSERT[P]
If NSAM=MXSAM
SIMPLE_REQUESTER[TITLESTR$,"Maximum number of samples reached"," Acknowledged ",1]
OK=False
Else
OK=True
For A=NSAM To P Step -1
TYPE(A+1)=TYPE(A)
F(A+1)=F(A)
S$(A+1)=S$(A)
F$(A+1)=F$(A)
Next
Inc NSAM
End If
End Proc
Procedure DELETE[P]
If NSAM>0
For A=P To NSAM-1
TYPE(A)=TYPE(A+1)
F(A)=F(A+1)
S$(A)=S$(A+1)
F$(A)=F$(A+1)
Next
Dec NSAM
If NSAM=0 : L0ADED_SAMPLES=False : End If
End If
End Proc
'
'Project Menu
'
Procedure ABOUT
Shared VER$,RV$
L$=Chr$(10)
REQUEST_OPEN[65,19,7] : RN=Param
REQUEST_DRAW[RN,"About Sample Bank Editor - Version "+VER$+" - Revision "+RV$]
A$="Sample Bank Editor was written by Paul Hickman"+Chr$(169)+" 1993"+L$+"E-Mail: ph@doc.ic.ac.uk"+L$+L$
A$=A$+"This program is freeware, but the complete archive"+L$+"must be distributed unmodified."
REQUEST_ADD_TEXT[RN,0,A$,False,True]
REQUEST_ADD_TEXT[RN,2,"Based On The AMOS"+L$+"Sample Bank Maker"+L$+"By Peter Hickman"+L$+"(No Relation)"+L$,False,True]
REQUEST_ADD_TEXT[RN,1,"Written In"+L$+L$+L$+L$+"Basic V1.36",False,True] : AMZ=Param
REQUEST_ADD_TEXT[RN,1,"Chip Mem:"+Str$(Chip Free),True,True]
REQUEST_ADD_TEXT[RN,2,"Fast Mem:"+Str$(Fast Free),True,True]
REQUEST_ADD_BUTTONS[RN,0,"Press Left Mouse button Here Or Return To Continue",1,True] : BZ=Param
MOUSE_READY
Repeat
Sprite 2,X Hard( Extension_16_0006(AMZ)+54),Y Hard( Extension_16_001C(AMZ)+16),4
REQUEST_GET_INPUT[RN] : Z=Param
Until Z=BZ
Sprite Off 2 : REQUEST_CLOSE[RN]
MOUSE_BUSY[True]
End Proc
Procedure CLEAR
SIMPLE_REQUESTER[TITLESTR$,"Erase All Samples"," Yes | No | Save First ",2] : A=Param
If A=3
SVE_AS
If Param=1 : A=1 : End If
End If
If A=1
For LOP=1 To NSAM
S$(LOP)=""
F$(LOP)=""
F(LOP)=0
TYPE(LOP)=0
Next LOP
L0ADED_SAMPLES=False
NSAM=0
DISPLAY_SAMS
End If
End Proc
Procedure OPEN
Shared BUF_FILE$,BUF_PATH$
BUF_FILE$=""
BUF_PATH$=""
FILE_REQUESTER["Open an existing sample bank",False," Open "]
If Param and(DFILE$<>"")
If Exist(PATH$+DFILE$)
BUF_PATH$=PATH$ : BUF_FILE$=DFILE$
NSAM=0 : TITLESTR$=BUF_FILE$
OPEN_BANK[PATH$+DFILE$,1]
End If
End If
End Proc
Procedure IN_BANK
ED_PERM_MESSAGE["Select Position To Inlcude Bank"]
SELMODE=7
End Proc
Procedure AP_BANK
A=NSAM+1 : A$="Append "
If SELMODE=7
SELMODE=0 : A=SELPOS : A$="Include "
End If
FILE_REQUESTER[A$+"an existing sample bank",False," "+A$]
If Param and(DFILE$<>"")
If Exist(PATH$+DFILE$)
OPEN_BANK[PATH$+DFILE$,A]
End If
End If
End Proc
Procedure SVE
Shared BUF_FILE$,BUF_PATH$
If BUF_FILE$=""
SVE_AS
Else
CMPILE_SAVE_BANK[BUF_FILE$+BUF_PATH$]
End If
End Proc
Procedure SVE_AS
Shared BUF_FILE$,BUF_PATH$
If BUF_PATH$<>""
PATH$=BUF_PATH$
End If
BUF_PATH$="" : BUF_FILE$=""
FILE_REQUESTER["Save Sample Bank As...",True," Save "]
If Param and(DFILE$<>"")
If Exist(PATH$)
BUF_PATH$=PATH$ : BUF_FILE$=DFILE$ : TITLESTR$=BUF_FILE$
CMPILE_SAVE_BANK[PATH$+DFILE$]
OK=Param
End If
End If
End Proc[OK]
Procedure PQUIT
SIMPLE_REQUESTER[TITLESTR$,"Quit Program"," Yes | No | Save First ",2] : A=Param
If A=3
SVE_AS
If Param=1 : A=1 : End If
End If
If A=1
Fade 3 : Wait 50 : Screen Close 1
Extension_16_0220
End
End If
End Proc
Procedure HELP
HYPER[Start(6),"Sample Bank Editor V1.1: On-Line Hypertext Help",78,21]
End Proc
'
'Project Support
'
Procedure OPEN_BANK[F$,POS]
On Error Proc IO_ERRORS
Resume Label OP_ERR
'
Open In 1,F$ : L=Lof(1) : Close 1
Erase 10 : Reserve As Work 10,L
Bload F$,Start(10)
'
If Extension_16_026E( Extension_16_01CE(1)+12,8)<>"Samples "
SIMPLE_REQUESTER[TITLESTR$,"File is not a sample bank"," Acknowledged ",1]
Else
ACALC=Start(10)+20
N=Deek(ACALC)
For A=0 To N-1
SAD=ACALC+Leek(ACALC+2+A*4)
INSERT[POS] : Exit If Not Param
F$(POS)= Extension_16_026E(SAD,8)
F(POS)=Deek(SAD+8)
TYPE(POS)=4
S$(POS)= Extension_16_026E(SAD+14,Leek(SAD+10))
Inc POS
Next
End If
L0ADED_SAMPLES=True
DISPLAY_SAMS
'
Pop Proc
OP_ERR:
Erase 10 : L0ADED_SAMPLES=False
Close
End Proc
Procedure CMPILE_SAVE_BANK[F$]
If NSAM=0
SIMPLE_REQUESTER[TITLESTR$,"Buffer Is Empty! - Can't Save",ACK$,1]
OK=False
Else
On Error Proc IO_ERRORS
Resume Label CMP_ERR
ED_MESSAGE["Converting Samples - Please Wait"] : ED_INFO
TL=2 : TN=0
For N=1 To NSAM
If Len(S$(N))<>0
Inc TN
TL=TL+Len(S$(N))+4+14
End If
Next
Erase 10
Reserve As Work 10,TL+12+8
AD= Extension_16_0296(Start(10),"AmBk")
Doke AD,5 : Add AD,2
Doke AD,0 : Add AD,2
Loke AD,(TL+8) or $80000000 : Add AD,4
AD= Extension_16_0296(AD,"Samples ")
ACALC=AD
Doke AD,TN : Add AD,2
AOFF=AD
APOKE=AOFF+TN*4
For N=1 To NSAM
If S$(N)<>""
Loke AOFF,APOKE-ACALC : Add AOFF,4
Extension_16_02A6 APOKE,Left$(F$(N),8)
Doke APOKE+8,F(N)
Loke APOKE+10,Len(S$(N))
APOKE=APOKE+14
If TYPE(N)=2
A=Varptr(S$(N))
PP=Varptr(P)
For X=0 To Len(S$(N))-1
P=Peek(A+X)-128
Poke APOKE+X,Peek(PP+3)
Next X
APOKE=APOKE+Len(S$(N))
Else
APOKE= Extension_16_0296(APOKE,S$(N))
End If
If Btst(0,APOKE)
Inc APOKE
End If
End If
Next N
Bsave F$,Start(10) To Start(10)+TL+12+8
OK=True : ED_MESSAGE["Sample Bank Saved - Bank Length"+Str$(TL)+" Bytes"]
CMP_ERR:
Erase 10
End If
End Proc[OK]
'
'Sample Menu
'
Procedure _APPEND_SAMPLE
If NSAM=MXSAM
SIMPLE_REQUESTER[TITLESTR$,"Maximum number of samples reached"," Acknowledged ",1]
Else
L0AD_SAMPLE[NSAM+1]
If Param=True : Inc NSAM : End If
DISPLAY_SAMS
End If
End Proc
Procedure _MOVE_SAMPLE
ED_PERM_MESSAGE["Select a sample to move"]
SELMODE=3
End Proc
Procedure _INSERT_SAMPLE
ED_PERM_MESSAGE["Select Position To Insert Sample"]
SELMODE=1
End Proc
Procedure _REMOVE_SAMPLE
ED_PERM_MESSAGE["Select Sample To Remove"]
SELMODE=2
End Proc
Procedure _PLAY_SAMPLE
ED_PERM_MESSAGE["Select Sample To Play"]
SELMODE=8
End Proc
'
'Sample Support
'
Procedure PL_SAMPLE
'
REQUEST_OPEN[50,8,15] : RN=Param
REQUEST_DRAW[RN,"Play Sample "+F$(SELPOS)]
REQUEST_ADD_TEXT[RN,0,"Playback Frequency",False,True]
BS=Max(1,6*(32768-1024)/(REQC(RN,2)-REQC(RN,0)-112))
REQUEST_ADD_HSLIDER[RN,0,F(SELPOS)-1024,32768-1024+BS,BS] : SLZ=Param
REQUEST_ADD_BUTTONS[RN,0," Play | Done ",1,True] : BZ=Param
REQS(RN,0)=REQS(RN,0)-18
REQS(RN,1)=REQS(RN,1)-18
REQUEST_ADD_STRING[RN,0,Str$(F(SELPOS))-" ",7,7,1] : SZ=Param
MOUSE_READY
R=F(SELPOS)
Repeat
REQUEST_GET_INPUT[RN] : MZ=Param
If(MZ=SLZ) or(MZ=SLZ+1) or(MZ=SLZ+2)
R=MI+REQ
UPDTE_STRING[RN,SZ,Str$(R)-" "]
UPDTE_SLIDER[RN,SLZ,REQ,True,True]
End If
If MZ=SZ Then R=Val(REQ$)
If(MZ=BZ) and(R>=1024) and(R<=32768)
Print SELPOS,Len(S$(SELPOS)),R
Sam Raw %1111,Varptr(S$(SELPOS)),Len(S$(SELPOS)),R
End If
Until(MZ=BZ+1)
REQUEST_CLOSE[RN]
Sam Stop : SELMODE=0
MOUSE_BUSY[True]
End Proc
Procedure L0AD_SAMPLE[N]
On Error Proc IO_ERRORS
Resume Label LD_SAM_ERR
FILE_REQUESTER["Choose a sample to load",False," Load "]
If Param and(DFILE$<>"")
If Not Exist(PATH$+DFILE$)
SIMPLE_REQUESTER[TITLESTR$,"File Not Found Error"," Acknowledged",1]
Else
Extension_16_01BC 1,PATH$+DFILE$,2
If Extension_16_01DC(1)<Free
If Extension_16_026E( Extension_16_01CE(1),3)="JON"
F(N)=Peek( Extension_16_01CE(1)+3)*1024
S$(N)= Extension_16_026E( Extension_16_01CE(1)+4, Extension_16_01DC(1)-4)
TYPE(N)=2
Else
If( Extension_16_026E( Extension_16_01CE(1),4)="FORM") and( Extension_16_026E( Extension_16_01CE(1)+8,8)="8SVXVHDR")
F(N)=Min(32768,Max(1024,Deek( Extension_16_01CE(1)+32)))
TYPE(N)=3
S$(N)= Extension_16_026E( Extension_16_01CE(1)+72, Extension_16_01DC(1)-72)
Else
NUMBER_REQUESTER[TITLESTR$,"Raw sample - enter sampling frequency (Hz)",16384,1024,32768]
If Param
F(N)=REQ
Else
F(N)=16384
End If
TYPE(N)=1
S$(N)= Extension_16_026E( Extension_16_01CE(1), Extension_16_01DC(1))
End If
End If
If(1 and Len(S$(N)))
S$(N)=S$(N)+Right$(S$(N),1)
End If
F$(N)=Left$(DFILE$,8)
L0ADED_SAMPLES=True
OK=True
ED_MESSAGE["Sample Loaded OK"]
Else
SIMPLE_REQUESTER[TITLESTR$,"Not enough memory to load sample","Acknowledged",1]
End If
End If
End If
LD_SAM_ERR:
Extension_16_01EA 1
End Proc[OK]
Procedure _INCLUDE_SAMPLE
INSERT[SELPOS]
If Param
L0AD_SAMPLE[SELPOS]
If Param=False
DELETE[SELPOS]
ED_MESSAGE["Sample Inserted OK"]
Else
ED_MESSAGE[""]
End If
DISPLAY_SAMS
End If
SELMODE=0
End Proc
Procedure _REMOVE1
DELETE[SELPOS]
ED_MESSAGE["Sample Removed"]
DISPLAY_SAMS
SELMODE=0
End Proc
Procedure _MOVE1
Shared MVSRC
ED_PERM_MESSAGE["Select position to insert the sample"]
SELMODE=4 : MVSRC=SELPOS
End Proc
Procedure _MOVE2
Shared MVSRC
If MVSRC<>SELPOS
INSERT[SELPOS]
If Param
If MVSRC>SELPOS : Inc MVSRC : End If
TYPE(SELPOS)=TYPE(MVSRC)
F(SELPOS)=F(MVSRC)
F$(SELPOS)=F$(MVSRC)
S$(SELPOS)=S$(MVSRC)
DELETE[MVSRC]
ED_MESSAGE["Sample Moved"]
End If
End If
SELMODE=0
End Proc
'
'Properties Menu
'
Procedure _EDIT_NAME
ED_PERM_MESSAGE["Choose a sample to change the name of"]
SELMODE=5
End Proc
Procedure _EDIT_FREQ
ED_PERM_MESSAGE["Choose a sample to change the frequency of"]
SELMODE=6
End Proc
'
'Properties Support
'
Procedure _ED_NAME
STRING_REQUESTER[TITLESTR$,"Enter new sample name (Max 8 Chars)",F$(SELPOS),8,-1]
If Param
F$(SELPOS)=REQ$
DISPLAY_SAMS
ED_MESSAGE["Sample name changed"]
Else
ED_MESSAGE["Name change aborted"]
End If
SELMODE=0
End Proc
Procedure _ED_FREQ
NUMBER_REQUESTER[TITLESTR$,"Enter new frequency (1024 - 32768 Hz)",F(SELPOS),1024,32768]
If Param
F(SELPOS)=REQ
DISPLAY_SAMS
ED_MESSAGE["Sample frequency changed"]
Else
ED_MESSAGE["Frequency Change Aborted"]
End If
SELMODE=0
End Proc
'
'
'Misc
'
'
'
'Requesters
'
'
'File Requester User Calls
'
Procedure FILE_REQUESTER[T$,NEW,B1$]
Shared DMODE,DR$
'
'File Name Length - Requester Width is based on this
'
OFILE$=DFILE$
If PATH$="" Then DMODE=0
If(DMODE=0) and(DR$="") Then NEW=True
'
'Draw Requester
'
REQUEST_OPEN[50,19,30] : RN=Param
REQUEST_DRAW[RN,T$]
REQUEST_ADD_STRING[RN,0,"",-1,255,0] : ZPATH=Param
REQUEST_ADD_SELECTOR[RN,0,"",10] : ZSEL=Param
REQUEST_ADD_STRING[RN,0,"",-1,255,0] : ZFILE=Param
REQUEST_ADD_BUTTONS[RN,0,B1$+"| Volumes | Parent | Cancel ",1,True] : ZBTN=Param
'
'Read Directory / Device Lists
'
On Error Proc IO_ERRORS
Resume Label FSEL_ERR
Set Dir 32
Do
If NEW
DFILE$=""
If DMODE=0
PRCESS_DEVNAME[Dev First$("")] : DR$=Param$ : PATH$=""
While Param$<>""
PRCESS_DEVNAME[Dev Next$]
DR$=DR$+Param$
Wend
Else
If PATH$="" : PATH$=":" : End If
RETRY=False : Do
If Exist(PATH$)
PRCESS_FILENAME[Dir First$(PATH$)] : DR$=Param$
While Param$<>""
PRCESS_FILENAME[Dir Next$] : DR$=DR$+Param$
Wend
Exit
Else
If RETRY=False
Wait 100 : RETRY=True
Else
SIMPLE_REQUESTER["File Selector","Unable To Find "+PATH$," Retry | MakeDir | Cancel ",1]
If Param=3
DFILE$=" <<< Non-Existant Path >>>" : DR$=""
Exit
Else
If Param=2
Mkdir PATH$ : Wait 100
End If
RETRY=False
End If
End If
End If
Loop
End If
End If
FSEL_ERR:
NEW=False
SELECTOR_RESET[RN,ZSEL,DR$]
UPDTE_SELECTOR[RN,ZSEL,0,0]
MOUSE_READY
UPDTE_STRING[RN,ZPATH,PATH$]
UPDTE_STRING[RN,ZFILE,DFILE$]
Repeat
REQUEST_GET_INPUT[RN] : MZ=Param
If MZ=ZPATH
If REQ=1
MZ=ZBTN+3
Else
PATH$=REQ$ : NEW=True : DMODE=1
End If
End If
If MZ=ZFILE
If REQ=1
MZ=ZBTN+3
Else
DFILE$=REQ$
End If
End If
Exit If MZ=ZBTN+3,2
Exit If MZ=ZBTN,2
If MZ=ZBTN+1 Then DMODE=0 : NEW=True
If MZ=ZBTN+2 and DMODE=1 and(PATH$<>"")
A$=PATH$ : If Right$(A$,1)="/" : A$=Left$(A$,Len(A$)-1) : End If
If Instr(A$,"/")>0
A=Len(A$) : While Instr(Left$(A$,A),"/")>0 : Dec A : Wend
PATH$=Left$(A$,A)
Else
PATH$=Left$(A$,Instr(A$,":"))
End If
NEW=True
End If
If MZ=ZSEL
SELECTOR_GET[RN,ZSEL,REQ] : A$=Left$(Param$, Extension_16_016A(Param$,32,32))
If DMODE=0
If A$<>""
PATH$=A$ : DMODE=1 : NEW=True
End If
Else
If Mid$(Param$,36,3)="Dir"
If Not((Right$(PATH$,1)=":") or(Right$(PATH$,1)="/"))
PATH$=PATH$+"/"+A$
Else
PATH$=PATH$+A$
End If
NEW=True
Else
Exit If A$=DFILE$,2
DFILE$=A$
UPDTE_STRING[RN,ZFILE,DFILE$]
End If
End If
End If
Until NEW=True
MOUSE_BUSY[True]
Loop
'
'Clean Up & Return
'
If PATH$<>""
If Right$(PATH$,1)<>":"
If Right$(PATH$,1)<>"/"
PATH$=PATH$+"/"
End If
End If
End If
'
REQUEST_CLOSE[RN]
MOUSE_BUSY[False]
End Proc[MZ<>ZBTN+3]
Procedure FILE_REQ_MODIFY[A$,L,D,RM]
Shared DR$
AA$=Space$(39)+Chr$(0) : Mid$(AA$,1)=A$ : X=0
If D
Mid$(AA$,36)="Dir"
Else
Mid$(AA$,32)=Str$(L)
While Mid$(DR$,40*X+36,3)="Dir" : Inc X : Wend
End If
Do
B$=Mid$(DR$,X*40+1,32)
If AA$=B$
If RM : AA$="" : End If
DR$=Left$(DR$,40*X)+AA$+Mid$(DR$,40*(X+1)+1)
Exit
Else
If(AA$<B$) or(D and(Mid$(DR$,X*40+36,3)<>"Dir"))
DR$=Left$(DR$,40*X)+AA$+Mid$(DR$,40*X+1) : Exit
Else
If B$=""
If Not RM : DR$=DR$+AA$ : End If
Exit
End If
End If
End If
Inc X
Loop
End Proc
'
'File Requester Internal Calls
'
Procedure PRCESS_FILENAME[B$]
If Extension_16_00C0(B$,32)
D=(Mid$(B$,33)=Space$(8))
L=Val(Mid$(B$,33))
B$=Mid$(B$,2,31)
If D
B$=B$+" Dir"+Chr$(0)
Else
B$=B$+Right$(" "+Str$(L)+" ",8)+Chr$(0)
End If
End If
End Proc[B$]
Procedure PRCESS_DEVNAME[B$]
If Extension_16_00C0(B$,32)
B$=Mid$(B$,2,31)
B1$=Left$(B$, Extension_16_014E(B$,32))
If Exist(B1$)
Dir$=B1$
B$=B$+Right$(" "+Str$(Dfree/1024)+"K ",8)+Chr$(0)
Else
B$=B$+" N/A"+Chr$(0)
End If
End If
End Proc[B$]
'
'Built-In Requesters - User Calls
'
Procedure SIMPLE_REQUESTER[TIT$,TEX$,BUT$,DF]
N= Extension_16_04D2(BUT$,"|")+1
W=Max(25,Max(Max(Len(TIT$)+1,Len(TEX$)+7),Len(BUT$)+(N+1)*2+6))
REQUEST_OPEN[W,7,N+2] : RN=Param
REQUEST_DRAW[RN,TIT$]
REQUEST_ADD_TEXT[RN,0,TEX$,True,True]
REQUEST_ADD_BUTTONS[RN,0,BUT$,DF,True] : BZ=Param
MOUSE_READY
Repeat : REQUEST_GET_INPUT[RN] : MZ=Param : Until MZ>=BZ
REQUEST_CLOSE[RN]
MOUSE_BUSY[True]
End Proc[MZ-BZ+1]
Procedure STRING_REQUESTER[TIT$,TEX$,S$,MX,DMX]
W=Max(27,Max(Max(Len(TIT$)+1,Len(TEX$)+7),DMX+7))
REQUEST_OPEN[W,8,6] : RN=Param
REQUEST_DRAW[RN,TIT$]
REQUEST_ADD_TEXT[RN,0,TEX$,False,True]
REQUEST_ADD_STRING[RN,0,S$,DMX,MX,0] : SZ=Param
REQUEST_ADD_BUTTONS[RN,0," OK | Cancel ",1,True] : BZ=Param
MOUSE_READY
Repeat
REQUEST_GET_INPUT[RN]
If Param=SZ Then R$=REQ$
Until Param>SZ
If Param=BZ+1 Then R$=S$
REQUEST_CLOSE[RN]
REQ$=R$
MOUSE_BUSY[True]
End Proc[Param=BZ]
Procedure NUMBER_REQUESTER[TIT$,TEX$,N,MI,MA]
N=Min(Max(MI,N),MA)
W=Max(Max(Len(TIT$)+1,Len(TEX$)+7),Len(Str$(MA))+32)
REQUEST_OPEN[W,7,8] : RN=Param
REQUEST_DRAW[RN,TIT$]
REQUEST_ADD_TEXT[RN,0,TEX$,False,True]
BS=Max(1,6*(MA-MI)/(REQC(RN,2)-REQC(RN,0)-112))
REQUEST_ADD_HSLIDER[RN,0,N-MI,MA-MI+BS,BS] : SLZ=Param
REQUEST_ADD_BUTTONS[RN,0," OK | Cancel ",1,True] : BZ=Param
REQS(RN,0)=REQS(RN,0)-18
REQS(RN,1)=REQS(RN,1)-18
REQUEST_ADD_STRING[RN,0,Str$(N)-" ",Len(Str$(MA))+2,Len(Str$(MA))+2,1] : SZ=Param
MOUSE_READY
R=N
Repeat
REQUEST_GET_INPUT[RN] : MZ=Param
If(MZ=SLZ) or(MZ=SLZ+1) or(MZ=SLZ+2)
R=MI+REQ
UPDTE_STRING[RN,SZ,Str$(R)-" "]
UPDTE_SLIDER[RN,SLZ,REQ,True,True]
End If
If MZ=SZ Then R=Val(REQ$)
If MZ=BZ+1 Then R=N : Exit
Until(MZ=BZ) and(R>=MI) and(R<=MA)
REQUEST_CLOSE[RN]
REQ=R
MOUSE_BUSY[True]
End Proc[MZ=BZ]
'
'
'
'Manual Requester Routines
'
'Requester Control
'
Procedure REQUEST_OPEN[W,H,Z]
Shared NEXSTRING
'Returns requester Number, or 0 if too many requesters are open
A=Instr(FR_REQ$," ")
If A>0
REQS$(A,0)= Extension_16_026E(Leek(Screen Base+210),8*Deek(Screen Base+214))
Reserve Zone Z
Poke Varptr(FR_REQ$)+A-1,A+48
RH=Min((Screen Height)/8,H+2) : RW=Min(W+1,Screen Width/8) and $FFFE
RX=Min(Screen Width-RW*8,Max(0,X Screen(X Mouse)-RW*4)) and $FFF8
RY=Min(Screen Height-RH*8-1,Max(0,Y Screen(Y Mouse)-RH*4)) and $FFFE
Get Block A*2,RX,RY,RW*8,RH*8+1
REQC(A,0)=RX : REQC(A,1)=RY : REQC(A,2)=RX+RW*8 : REQC(A,3)=RY+RH*8
REQS(A,0)=RY+17 : REQS(A,1)=REQS(A,0)
Menu Off : NEXSTRING=0
End If
End Proc[A]
Procedure REQUEST_DRAW[RN,TITLE$]
'
MCOL=Screen Colour-1
Flash Off : Curs Off : Colour MCOL-1,Colour(1)
Cls 1,REQC(RN,0),REQC(RN,1) To REQC(RN,2),REQC(RN,3)
Ink MCOL,1,0 : Set Pattern 31
Bar REQC(RN,0)+4,REQC(RN,1)+13 To REQC(RN,2)-4,REQC(RN,3)-2
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
TBOX[REQC(RN,0)+4,REQC(RN,1)+2,REQC(RN,2)-5,REQC(RN,1)+13,False]
Ink MCOL : Text REQC(RN,0)+8,REQC(RN,1)+10,Left$(TITLE$,(REQC(RN,2)-REQC(RN,0)-16)/8)
REQS(RN,2)=2
Set Zone 1,REQC(RN,0)+4,REQC(RN,1)+2 To REQC(RN,2)-4,REQC(RN,1)+13
'
End Proc
Procedure REQUEST_CLOSE[RN]
Put Block RN*2 : Del Block RN*2 : Reserve Zone
Mid$(FR_REQ$,RN,1)=" "
If Len(REQS$(RN,0))>0
Reserve Zone Len(REQS$(RN,0))/8
Extension_16_02A6 Leek(Screen Base+210),REQS$(RN,0)
End If
REQS$(RN,0)="" : REQS$(RN,1)="" : REQS$(RN,2)=""
'
'
'
If Extension_16_00C0(FR_REQ$,32)=0
'Exiting last requester
Menu On
Pen 3 : Colour 2,$8AD
End If
End Proc
Procedure REQUEST_GET_INPUT[RN]
Shared RGE$,RMZ,NEXSTRING,REQDX,REQDY
Do
Repeat
Multi Wait : MK=Mouse Key : MZ=Mouse Zone : I$=Inkey$
If MK=0 and( Extension_16_00A0("LRUD",RGE$)>0)
RGE$=" "
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
End If
Until((MK=1) and(MZ>0)) or(I$<>"")
If(MZ<>RMZ) and( Extension_16_00A0("LRUD",RGE$)>0)
RGE$=" "
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
End If
IN= Extension_16_00A0("LRUD",RGE$)>0
If MK=1
RMZ=MZ
If RMZ=1
REQUEST_MOVE[RN]
Exit
Else
RGE$=Mid$(REQS$(RN,1),(RMZ-2)*5+1,1)
If Extension_16_00A0("BLRUDC",RGE$)>0
If Not IN
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
End If
End If
If Extension_16_00A0("BSC",RGE$)>0
K=1 : While Btst(0,K) and(RMZ=Mouse Zone) : K=Mouse Key : Wend
If Extension_16_00A0("BC",RGE$)>0
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
End If
If RMZ<>Mouse Zone : RMZ=0 : RGE$=" " : End If
Exit If RGE$="B"
End If
If(RGE$="S")
RSTRING[RN,RMZ]
NEXSTRING=RMZ-2
If REQ<>1 : Inc NEXSTRING : Exit : End If
End If
If(RGE$="H") or(RGE$="V")
B=(RMZ-2)*5+1
POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
SLIDER_READ[RMZ,POS,MX,BSIZE,2-(RGE$="V")]
POS=Param# : REQ=POS
REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
If RGE$="V"
UPDTE_SELECTOR[RN,RMZ-1,POS,True]
Else
Exit
End If
End If
If RGE$="L" or(RGE$="U")
B=(RMZ-2)*5-4
POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
POS=Max(0,POS-1) : REQ=POS
REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
If RGE$="U"
UPDTE_SELECTOR[RN,RMZ-2,POS,True]
Else
SLIDER_DRAW[RMZ-1,POS,MX,BSIZE,2]
Exit
End If
End If
If(RGE$="R") or(RGE$="D")
B=(RMZ-2)*5-9
POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
MX=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))-BSIZE)
POS=Min(MX,POS+1) : REQ=POS
REQS$(RN,1)=Mid$(REQS$(RN,1),1,B)+ Extension_16_04A2(POS)+Mid$(REQS$(RN,1),B+5)
If RGE$="D"
UPDTE_SELECTOR[RN,RMZ-3,POS,True]
Else
SLIDER_DRAW[RMZ-2,POS,MX,BSIZE,2]
Exit
End If
End If
If RGE$="F"
N= Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+12))
L= Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+17))
X1= Extension_16_0006(RMZ)+8 : X2= Extension_16_0032(RMZ)-8
REQDX=Max(0,Min( Extension_16_0032(RMZ),X Screen(X Mouse))- Extension_16_0006(RMZ))
REQDY=Max(0,Min( Extension_16_0048(RMZ),Y Screen(Y Mouse))- Extension_16_001C(RMZ))
Y1=Max(0,Min(L-1,(REQDY-2)/8))
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
K=1 : While Btst(0,K) and(RMZ=Mouse Zone) : K=Mouse Key : Wend
Y=Max(0,Min(L-1,(Y Screen(Y Mouse)- Extension_16_001C(RMZ)-2)/8))
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
If(RMZ=Mouse Zone) and(Y=Y1)
REQ=Y+ Extension_16_04AE(Mid$(REQS$(RN,1),(RMZ-2)*5+7))
Exit If REQ<N
End If
End If
If RGE$="T"
REQDX=Min( Extension_16_0032(RMZ)- Extension_16_0006(RMZ),Max(0,X Screen(X Mouse)- Extension_16_0006(RMZ)))
REQDY=Min( Extension_16_0048(RMZ)- Extension_16_001C(RMZ),Max(0,Y Screen(Y Mouse)- Extension_16_001C(RMZ)))
Exit
End If
End If
End If
If I$<>""
While NEXSTRING*5<Len(REQS$(RN,1))
Inc NEXSTRING
If Mid$(REQS$(RN,1),NEXSTRING*5-4,1)="S"
If I$<>Chr$(13) : Put Key I$ : End If
RSTRING[RN,NEXSTRING+1]
Exit If REQ=3
RMZ=NEXSTRING+1
Exit 2
End If
Wend
If I$=Chr$(13)
RMZ=Instr(REQS$(RN,1),"B"+ Extension_16_04A2(-1))/5+2
Exit
End If
End If
Loop
End Proc[RMZ]
'
'Requester Constructors
'
Procedure REQUEST_ADD_TEXT[RN,CL,T$,FULL,CEN]
Shared X1,X2,YP
'T$ = Text to print(Lines seperated by chr$(10), but no trailing chr$(10)'s)
'FULL = Full Height Box
'CEN = Centre Text
'CL = Column (0=Full 1=Left 2=Right)
'
L= Extension_16_04E8(T$,10)+1
REQUEST_SET_BORDERS[RN,CL]
If FULL
Y2=REQC(RN,3)-24
TY=YP+6+(Y2-YP-L*8)/2
Else
Y2=YP+10+L*8
TY=YP+11
End If
Z=REQS(RN,2)
Set Zone Z,X1,YP To X2,Y2
'
Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
TBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),True]
OB=0 : Ink Screen Colour-1
For A=1 To L
B= Extension_16_0094(T$,10,OB)
If B=0
A$=Mid$(T$,OB+1)
Else
A$=Mid$(T$,OB+1,B-OB-1) : OB=B
End If
If CEN
X=X1+(X2-X1-Len(A$)*8)/2
Else
X=X1+8
End If
Text X,TY,A$ : Add TY,8
Next
'
Inc REQS(RN,2) : YP=Y2+4
REQS$(RN,2)=REQS$(RN,2)+Chr$(10) : REQS$(RN,1)=REQS$(RN,1)+"T "
REQUEST_UPDTE_YPOS[RN,CL]
'
End Proc[Z]
Procedure REQUEST_ADD_BUTTONS[RN,CL,B$,DF,FULL]
Shared X1,X2,YP
R= Extension_16_04D2(B$,"|")+1
REQUEST_SET_BORDERS[RN,CL]
If FULL Then YP=YP+(REQC(RN,3)-YP-14)/2-2
If R=1
DF=R
X#=X1+(X2-X1-Len(B$)*8-16)/2
Else
X#=X1
XS#=(X2-X1-(Len(B$)+1+R)*8)/(R-1.0)
End If
OB=0 : IZ=REQS(RN,2)
For A=1 To R
Set Text 0 : If A=DF Then Set Text 2
B= Extension_16_00B4(B$,"|",OB)
If B=0
A$=Mid$(B$,OB+1)
Else
A$=Mid$(B$,OB+1,B-OB-1) : OB=B
End If
'
Z=REQS(RN,2) : Set Zone Z,X#,YP To X#+Len(A$)*8+16,YP+14
Inc REQS(RN,2)
Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
BUTON[ Extension_16_0006(Z), Extension_16_001C(Z),A$,False]
'
X#=X#+Len(A$)*8+XS#+16
If A=DF
REQS$(RN,1)=REQS$(RN,1)+"B"+ Extension_16_04A2(True)
Else
REQS$(RN,1)=REQS$(RN,1)+"B"+ Extension_16_04A2(False)
End If
REQS$(RN,2)=REQS$(RN,2)+Chr$(10)
Next
Set Text 0 : Add YP,18
REQUEST_UPDTE_YPOS[RN,CL]
End Proc[IZ]
Procedure REQUEST_ADD_STRING[RN,CL,S$,WIDTH,MX,FLAGS]
Shared X1,X2,YP
REQUEST_SET_BORDERS[RN,CL]
If WIDTH>-1
A=(X2-X1-WIDTH*8-16)/2
X1=X1+A : X2=X2-A
End If
Z=REQS(RN,2) : Set Zone Z,X1,YP To X2,YP+14
Inc REQS(RN,2) : Add YP,18
Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
SBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),False]
Ink 0 : Text Extension_16_0006(Z)+8, Extension_16_001C(Z)+10,Left$(S$,(X2-X1-16)/8)
REQS$(RN,1)=REQS$(RN,1)+"S"+ Extension_16_04BA(MX)+ Extension_16_04BA(FLAGS)
REQS$(RN,2)=REQS$(RN,2)+S$+Chr$(10)
REQUEST_UPDTE_YPOS[RN,CL]
End Proc[Z]
Procedure REQUEST_ADD_HSLIDER[RN,CL,POS,MX,BSIZE]
Shared X1,X2,YP
REQUEST_SET_BORDERS[RN,CL]
Z=REQS(RN,2) : Set Zone Z,X1,YP To X2-64,YP+10
Set Zone Z+1,X2-58,YP To X2-32,YP+10
Set Zone Z+2,X2-26,YP To X2,YP+10
Add YP,14 : Add REQS(RN,2),3
Paste Icon Extension_16_0006(Z+1), Extension_16_001C(Z+1),1
Paste Icon Extension_16_0006(Z+2), Extension_16_001C(Z+2),2
Cls 1, Extension_16_0006(Z), Extension_16_001C(Z) To Extension_16_0032(Z), Extension_16_0048(Z)
SLIDER_DRAW[Z,POS,Max(0,MX-BSIZE),BSIZE,0]
REQS$(RN,1)=REQS$(RN,1)+"H"+ Extension_16_04A2(POS)+"L"+ Extension_16_04A2(MX)+"R"+ Extension_16_04A2(BSIZE)
REQS$(RN,2)=REQS$(RN,2)+Chr$(10)+Chr$(10)+Chr$(10)
REQUEST_UPDTE_YPOS[RN,CL]
End Proc[Z]
Procedure REQUEST_ADD_SELECTOR[RN,CL,S$,L]
Shared X1,X2,YP
REQUEST_SET_BORDERS[RN,CL]
N= Extension_16_04E8(S$,0)
Z=REQS(RN,2) : Add REQS(RN,2),4
Set Zone Z,X1,YP To X2-24,YP+L*8+8
Set Zone Z+1,X2-15,YP To X2,YP+L*8-20
Set Zone Z+2,X2-15,YP+L*8-18 To X2,YP+L*8-7
Set Zone Z+3,X2-15,YP+L*8-4 To X2,YP+L*8+7
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
Paste Icon Extension_16_0006(Z+2), Extension_16_001C(Z+2),3
Paste Icon Extension_16_0006(Z+3), Extension_16_001C(Z+3),4
TBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),True]
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)
REQS$(RN,2)=REQS$(RN,2)+S$+Chr$(10)
UPDTE_SELECTOR[RN,Z,POS,0]
Add YP,L*8+12
REQUEST_UPDTE_YPOS[RN,CL]
End Proc[Z]
'
'Requester Update Routines
'
Procedure UPDTE_SLIDER[RN,Z,POS,MX,BSIZE]
B=(Z-2)*5+1
If POS=True Then POS= Extension_16_04AE(Mid$(REQS$(RN,1),B+1,4))
If BSIZE=True Then BSIZE= Extension_16_04AE(Mid$(REQS$(RN,1),B+11,4))
If MX=True Then MX= Extension_16_04AE(Mid$(REQS$(RN,1),B+6,4))
POS=Max(0,Min(MX-BSIZE,POS))
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)
SLIDER_DRAW[Z,POS,Max(0,MX-BSIZE),BSIZE,2]
End Proc
Procedure UPDTE_SELECTOR[RN,Z,POS,HO]
If HO=True Then HO= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+2))
If POS=True Then POS= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+7))
L= Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+17))
N=Max(0, Extension_16_04AE(Mid$(REQS$(RN,1),(Z-2)*5+12))-L)
POS=Max(0,Min(N,POS))
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)
SLIDER_DRAW[Z+1,POS,N,L,1]
OB=0 : Ink Screen Colour-1
If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
E= Extension_16_0094(REQS$(RN,2),10,OB)
While POS>0 : OB= Extension_16_0094(REQS$(RN,2),0,OB) : Dec POS : Wend
W=(REQC(RN,2)-REQC(RN,0)-88)/8
For A=1 To L
B= Extension_16_0094(REQS$(RN,2),0,OB)
If(B>E) or(B=0)
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
Exit
Else
A$=Mid$(REQS$(RN,2),OB+1+HO,Min(W,Max(0,B-OB-1-HO))) : OB=B
A$=A$+Space$(Max(0,W-Len(A$)))
Ink 3 : Text Extension_16_0006(Z)+8, Extension_16_001C(Z)+2+A*8,A$
End If
Next
End Proc[W]
Procedure SELECTOR_GET[RN,Z,POS]
OB=0
If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
While POS>0 : OB= Extension_16_0094(REQS$(RN,2),0,OB) : Dec POS : Wend
B= Extension_16_0094(REQS$(RN,2),0,OB)
End Proc[Mid$(REQS$(RN,2),OB+1,Max(0,B-OB-1))]
Procedure SELECTOR_RESET[RN,Z,S$]
'Delete all lines from a selector & replace with s$
OB=0
If Z>2 Then OB= Extension_16_056C(REQS$(RN,2),10,Z-2)
B= Extension_16_0094(REQS$(RN,2),10,OB) : If B=0 : B=Len(REQS$(RN,2)) : End If
REQS$(RN,2)=Mid$(REQS$(RN,2),1,OB)+S$+Chr$(10)+Mid$(REQS$(RN,2),B+1)
N= Extension_16_04E8(S$,0)
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)
End Proc
Procedure STRING_GET[RN,Z]
Shared STREND,STRST
B=2 : STRST=0 : While B<Z : STRST= Extension_16_0094(REQS$(RN,2),10,STRST) : Inc B : Wend
STREND= Extension_16_0094(REQS$(RN,2),10,STRST)
If STREND>0
S$=Mid$(REQS$(RN,2),STRST+1,STREND-STRST-1)
Else
S$=Mid$(REQS$(RN,2),STRST+1)
End If
End Proc[S$]
Procedure UPDTE_STRING[RN,Z,S$]
Shared STRST,STREND
STRING_GET[RN,Z]
If STREND=0
REQS$(RN,2)=Mid$(REQS$(RN,2),1,STRST)+S$
Else
REQS$(RN,2)=Mid$(REQS$(RN,2),1,STRST)+S$+Mid$(REQS$(RN,2),STREND)
End If
X1= Extension_16_0006(Z)+8 : Y1= Extension_16_001C(Z)+4 : DMX=( Extension_16_0032(Z)-X1-8)/8
Ink 0 : Text X1,Y1+6,Mid$(S$+Space$(DMX),1,DMX)
End Proc
'
'Requester Internal Routines Only
'
Procedure REQUEST_SET_BORDERS[RN,CL]
Shared X1,X2,YP
X1=REQC(RN,0)+24 : X2=REQC(RN,2)-24
YP=Max(REQS(RN,0),REQS(RN,1))
If CL=2 Then X1=X1+(X2-X1)/2+8 : YP=REQS(RN,1)
If CL=1 Then X2=X2-(X2-X1)/2-8 : YP=REQS(RN,0)
End Proc
Procedure REQUEST_UPDTE_YPOS[RN,CL]
Shared YP
If CL<>2 Then REQS(RN,0)=YP
If CL<>1 Then REQS(RN,1)=YP
End Proc
Procedure RSTRING[RN,MZ]
Shared STRST,STREND
M= Extension_16_04C6(Mid$(REQS$(RN,1),(MZ-2)*5+2,2))
FLAG=Asc(Mid$(REQS$(RN,1),(MZ-2)*5+4,1))
STRING_GET[RN,MZ] : REQ$=Param$
'
'
'
X1= Extension_16_0006(MZ)+8 : Y1= Extension_16_001C(MZ)+4 : DMX=( Extension_16_0032(MZ)-X1-8)/8
Cls 1,X1,Y1 To X1+DMX*8,Y1+8
U$=A$ : A$=REQ$ : Ink 0,1
TXS=0 : If Len(A$)>DMX Then TXS=Len(A$)-DMX
Text X1,Y1+6,Mid$(A$,TXS+1,DMX)
A=(X Screen(X Mouse)-X1)/8+TXS+1
TCP=Min(Len(A$)+1,Min(TXS+DMX,Max(TXS+1,A)))
Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
AL=31 : AH=127 : If Btst(0,FLAG) Then AL=47 : AH=59
'
Do
Repeat
If Mouse Key=1
If Mouse Zone=MZ
While Mouse Key=1
Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
TCP=Min(Len(REQ$)+1,Min(TXS+DMX,Max(TXS+1,(X Screen(X Mouse)-X1)/8+TXS+1)))
Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
Wend
Else
I$=Chr$(13) : S=0 : KS=0 : Exit
End If
End If
I$=Inkey$ : S=Scancode : KS=Scanshift
If(I$="") and(S=0) : Multi Wait : End If
Until(I$<>"") or(S>0) : I=Asc(I$)
'
If Btst(3,KS)
If Upper$(I$)="A" : KS=3 : S=79 : End If
If Upper$(I$)="E" : KS=3 : S=78 : End If
If Upper$(I$)="X" : TCP=1 : TXS=0 : REQ$=""
Text X1,Y1+6,Space$(DMX) : End If
If Upper$(I$)="U" : REQ$=U$ : TCP=1 : TXS=0
Text X1,Y1+6,Space$(DMX) : End If
If Upper$(I$)="D" : KS=0 : S=70 : End If
I$="" : I=0
End If
If(I>AL) and(I<AH) and(Len(REQ$)<M)
REQ$=Left$(REQ$,TCP-1)+Chr$(I)+Mid$(REQ$,TCP) : S=78 : KS=0
End If
If S=70 and(TCP<Len(REQ$)+1)
REQ$=Left$(REQ$,TCP-1)+Mid$(REQ$,TCP+1)
End If
If I=8 and(TCP>1)
REQ$=Left$(REQ$,TCP-2)+Mid$(REQ$,TCP) : S=79 : KS=0
End If
If S=79
If(KS and 3)>0
TCP=1 : TXS=0
Else
TCP=Max(1,TCP-1) : TXS=Min(TCP,TXS+1)-1
End If
End If
If S=78
If(KS and 3)>0
TCP=Min(Len(REQ$)+1,M) : TXS=Max(0,TCP-DMX)
Else
TCP=Min(Min(TCP+1,Len(REQ$)+1),M)
If TCP>TXS+DMX : Inc TXS : End If
End If
End If
Text X1,Y1+6,Mid$(REQ$+" ",TXS+1,DMX)
If I=27 Then REQ$=U$ : REQ=1 : Exit
If I=13
If S=0
REQ=0
Else
REQ=2
End If : Exit
End If
Gr Writing 5 : Text X1+(TCP-TXS-1)*8,Y1+6,Mid$(REQ$+" ",TCP,1) : Gr Writing 1
Loop
'
UPDTE_STRING[RN,MZ,REQ$]
End Proc
Procedure REQUEST_MOVE[RN]
Shared REQDX,REQDY
On Error Proc GENERAL_ERROR
Resume Label RM_ERR
MCOL=Screen Colour-1 : W=REQC(RN,2)-REQC(RN,0) : H=REQC(RN,3)-REQC(RN,1)+1
Colour MCOL-1,$F80 : XX=X Screen(X Mouse)-REQC(RN,0) : YY=Y Screen(Y Mouse)-REQC(RN,1)
Gr Writing 2 : Repeat
X1=Max(0,Min(Screen Width-W,X Screen(X Mouse)-XX))
Y1=Max(0,Min(Screen Height-H,Y Screen(Y Mouse)-YY))
C=Point(X1,Y1) : Box X1,Y1 To X1+W,Y1+H : Wait Vbl
Box X1,Y1 To X1+W,Y1+H : Plot X1,Y1,C : Wait Vbl
Until Mouse Key<>1
Gr Writing 1
Get Block RN*2+1,REQC(RN,0),REQC(RN,1),W,H
Put Block RN*2 : XX=X1 and $FFF8 : YY=Y1 and $FFFE
Get Block RN*2,XX,YY,W,H
Put Block RN*2+1,XX,YY : Del Block RN*2+1
REQDX=XX-REQC(RN,0) : REQDY=YY-REQC(RN,1)
Extension_16_005E Screen,REQDX,REQDY
Colour MCOL-1,Colour(1) : REQC(RN,0)=XX : REQC(RN,1)=YY : REQC(RN,2)=XX+W : REQC(RN,3)=YY+H-1
RM_ERR:
End Proc
Procedure BUTON[X1,Y1,B$,IN]
SBOX[X1,Y1,X1+16+Len(B$)*8,Y1+14,IN]
Text X1+8,Y1+10,B$
End Proc
'
'Requester Internal & User routines
'
Procedure TBOX[X1,Y1,X2,Y2,IN]
A=Screen Colour-1
Ink A+IN*A
Polyline X1,Y2-1 To X1,Y1 To X2,Y1
Ink -IN*A
Polyline X1,Y2 To X2,Y2 To X2,Y1+1
End Proc
Procedure SBOX[X1,Y1,X2,Y2,IN]
Ink 0 : A=Screen Colour-1
Draw X1+1,Y1 To X2-1,Y1
Draw X1+1,Y2 To X2-1,Y2
Draw X1,Y1+1 To X1,Y2-1
Draw X2,Y1+1 To X2,Y2-1
Set Line $AAAA
Ink -IN*A
Polyline X1+1,Y2-1 To X2-1,Y2-1 To X2-1,Y1+2
Ink A+IN*A
Polyline X1+1,Y2-2 To X1+1,Y1+1 To X2-1,Y1+1
Set Line $FFFF
End Proc
Procedure RDZONE[SCRN,Z]
A0=Screen : Screen SCRN : A1=Leek(Screen Base+210)+(Z-1)*8
X1=Min(Deek(A1),Deek(A1+4)) : Y1=Min(Deek(A1+2),Deek(A1+6))
X2=Max(Deek(A1),Deek(A1+4)) : Y2=Max(Deek(A1+2),Deek(A1+6))
Screen A0
End Proc
Procedure SLIDER_READ[Z,POS#,MX#,BSIZE#,FLAGS]
If MX#<0 Then POS#=0 : MX#=0 : BSIZE#=1
P#=POS#
Repeat
ST= Extension_16_0006(Z)+3 : L#=( Extension_16_0032(Z)- Extension_16_0006(Z)-6)/(MX#+BSIZE#)
P=X Screen(X Mouse)
If Btst(0,FLAGS)
ST= Extension_16_001C(Z)+3 : L#=( Extension_16_0048(Z)- Extension_16_001C(Z)-6)/(MX#+BSIZE#)
P=Y Screen(Y Mouse)
End If
POS#=(P-ST)/L#-BSIZE#/2.0
If POS#>MX# Then POS#=MX#
If POS#<0 Then POS#=0
If(POS#<>P#) or Not Btst(1,FLAGS)
SLIDER_DRAW[Z,POS#,MX#,BSIZE#,FLAGS]
P#=POS#
End If
Until(Mouse Key=0) or Not Btst(1,FLAGS)
End Proc[POS#]
Procedure SLIDER_DRAW[Z,POS#,MX#,BSIZE#,FLAGS]
If MX#<=0 Then POS#=0 : MX#=0 : BSIZE#=1
Wait Vbl
SBOX[ Extension_16_0006(Z), Extension_16_001C(Z), Extension_16_0032(Z), Extension_16_0048(Z),False]
If Btst(0,FLAGS)
L#=( Extension_16_0048(Z)- Extension_16_001C(Z)-6)/(MX#+BSIZE#)
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#
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#
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
Else
L#=( Extension_16_0032(Z)- Extension_16_0006(Z)-6)/(MX#+BSIZE#)
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
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
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
End If
End Proc
'
'
Procedure ICONIFY
Shared _FADEDIN
Amos Lock
Amos To Back
Screen Close 7
A= Extension_16_05A6(400,0,"Sample Bank Maker")
Amos To Front
Amos Unlock
SET_UP_SCREEN
DISPLAY_SAMS
_FADEDIN=False
FADIN
If A=-1 Then PQUIT
If A>0 Then SIMPLE_REQUESTER[TITLESTR$,"Unable To Iconify Sample Bank Editor",ACK$,1]
End Proc
Procedure SETUP_IO_ERRORS
Shared ERR$(),EXERR$()
'1st Character = error no
'2nd Character Bit 0=request/message 1=add Ertype$
Restore IO_ERRS
For A=1 To 12 : Read ERR$(A) : Next
IO_ERRS:
Data Chr$(82)+Chr$(0)+"Illegal File Name"
Data Chr$(83)+Chr$(0)+"Disc is not validated"
Data Chr$(84)+Chr$(0)+"Disc is write protected"
Data Chr$(86)+Chr$(0)+"Device Not Available"
Data Chr$(88)+Chr$(0)+"Disc Full"
Data Chr$(89)+Chr$(0)+"File is protected from deletion"
'
Data Chr$(90)+Chr$(0)+"File is protected from writing"
Data Chr$(91)+Chr$(0)+"File is protected from reading"
Data Chr$(92)+Chr$(0)+"Not an amigados disk"
Data Chr$(93)+Chr$(0)+"No disk in drive"
Data Chr$(94)+Chr$(0)+"Read / write error occured"
'
Data Chr$(96)+Chr$(2)+"File in use - unable to "
'
'Extension Errors
'
Restore EX_ERRS
For A=0 To 10 : Read EXERR$(A) : Next
EX_ERRS:
Data Chr$(0)+"Unable To Load Powerpacker Library"
Data Chr$(0)+"File Is Empty"
Data Chr$(0)+"Illegal PowerPacker File Header"
Data Chr$(0)+"Unable To Load Encrypted File"
Data Chr$(0)+"Unable To Load Encrpyted File"
Data Chr$(0)+"No enough memory for Powerpacker Buffer"
Data Chr$(0)+"Error Reading File"
Data Chr$(0)+"Unable To Open File"
Data Chr$(0)+"Crunched File Longer Than Source - Aborted"
Data " Ex Error 9"
Data " Ex Error 10"
'
End Proc
Procedure IO_ERRORS
Shared ERR$(),EXERR$()
FADIN
EFREE$="" : EFREE=False : Set Text 0 : Gr Writing 1 : Extension_16_01EA 6
If(Errn=23) and(ERTYPE$="Change Directory")
SIMPLE_REQUESTER[TITLESTR$,"Illegal Directory Name",ACK$,1]
Resume Label
End If
If Errn=10
If Extension_16_01CE(7)=0 : Extension_16_01EA 7 : Resume : End If
End If
If Errn=11
BLK$="" : CTAB$=""
ED_MESSAGE["*** WARNING: VARIABLE BUFFER FULL ***"] : ED_INFO
Resume Label
End If
For A=1 To 12
If Errn=Asc(ERR$(A))
B=Asc(Mid$(ERR$(A),2)) : A$=Mid$(ERR$(A),3)
If Btst(1,B) : A$=A$+ERTYPE$ : End If
If Btst(0,B)
ED_MESSAGE[A$] : ED_INFO
Else
SIMPLE_REQUESTER[TITLESTR$,A$,ACK$,1]
End If
Resume Label
End If
Next
If Errn>=4096
SIMPLE_REQUESTER[TITLESTR$,Mid$(EXERR$(Errn-4096),2),ACK$,1]
Resume Label
End If
SIMPLE_REQUESTER[TITLESTR$,"STRANGE: Amos Error No:"+Str$(Errn)+" Just Occured!"," This shouldn't Happen ",1]
Resume Label
End Proc
Procedure MAKE_RAM
On Error Goto MAKE_RAM_ERROR
D$=Dir$ : Dir$="RAM:" : Dir$=D$
Pop Proc
'
MAKE_RAM_ERROR:
Resume Next
End Proc
Procedure GENERAL_ERROR
Shared DEBUG
Set Text 0 : Writing 0 : Gr Writing 1 : Extension_16_01EA 6
If Errn=10
If Extension_16_01CE(7)<>0
Extension_16_01EA 7 : Resume
End If
End If
If Errn=11
'Out Of Varaible Buffer Space
DR$=""
End If
If DEBUG
Error Errn
Else
SIMPLE_REQUESTER[TITLESTR$,"Error no"+Str$(Errn)+" has just occured - program may crash"," Save As | Continue ",2]
Resume Label
End If
End Proc
Procedure FADIN
Shared _FADEDIN
If Not _FADEDIN
Fade 4,0,$458,$8AD,$EEF
For A=Screen Height/2 To 0 Step -2
Screen Display 1,,SCY+A,,Screen Height-2*A
Screen Offset 1,,A
Wait Vbl
Next
Screen Offset 1,,0
Screen Display 1,,SCY,,Screen Height
_FADEDIN=True
End If
End Proc
Procedure ED_INFO
Shared _MESSAGE$,MESSAGE
Cls 1,0,0 To 640,12
Ink 3 : Polyline 0,10 To 0,0 To 638,0
Ink 0 : Polyline 1,11 To 639,11 To 639,1
If MESSAGE
Ink 3,1 : Text 4+Max(0,79-Len(_MESSAGE$))*4,8,Left$(_MESSAGE$,79)
Else
F=Free
Ink 3,1 : Text 16,8,Left$(TITLESTR$,26)
Text 240,8,"No Samples:"+Str$(NSAM)
Text 420,8,"Buffer:"+Str$(F)+" bytes "
End If
End Proc
Procedure ED_MESSAGE[A$]
Shared MESSAGE,_MESSAGE$
_MESSAGE$=A$
If A$=""
MESSAGE=0
Else
MESSAGE=Timer+250
End If
End Proc
Procedure ED_PERM_MESSAGE[A$]
Shared MESSAGE,_MESSAGE$
_MESSAGE$=A$
If A$=""
MESSAGE=0
Else
MESSAGE=Timer+1000000
End If
End Proc
Procedure HYPER[BF,TIT$,W,H]
GP=0 : MN=0 : PV$=""
On Error Proc GENERAL_ERROR
Resume Label HYP_ERR
REQUEST_OPEN[W,H,14] : RN=Param
REQUEST_DRAW[RN,TIT$]
REQUEST_ADD_SELECTOR[RN,0,"",H-4] : SZ=Param
REQUEST_ADD_BUTTONS[RN,0," Previous | Index | Top | Bottom | Exit ",5,True] : BZ=Param
W=( Extension_16_0032(SZ)- Extension_16_0006(SZ))/8-2
H=( Extension_16_0048(SZ)- Extension_16_001C(SZ))/8-2
Do
P=0 : CMZ=0 : ST$="" : M$= Extension_16_0232(BF,GP,MN)
'
While P<Len(M$)
A=P
Repeat
Q= Extension_16_0094(M$,10,P) : If Q=0 : Q=Len(M$)+1 : End If
L$=Mid$(M$,A+1,Max(0,Q-A-1))
A1= Extension_16_04D2(L$,"[") : A2= Extension_16_04D2(L$,"]")
P=Q
Until A1=A2
'
P=A+1
WW=W : A= Extension_16_00A0(Left$(L$,WW),"[")
While A>0 : WW=WW+6 : A= Extension_16_00B4(Left$(L$,WW),"[",A) : Wend
While Len(L$)=>WW
A= Extension_16_011E(L$,32,WW) : If A=0 : A=WW : End If
A1= Extension_16_0142(L$,"[",A) : A2= Extension_16_0142(L$,"]",A)
If A1>A2 : A=A1-1 : End If
ST$=ST$+ Extension_16_04BA(P) : P=P+A
L$=Mid$(L$,A+1)
'
WW=W : A= Extension_16_00A0(Left$(L$,WW),"[")
While A>0 : WW=WW+6 : A= Extension_16_00B4(Left$(L$,WW),"[",A) : Wend
Wend
ST$=ST$+ Extension_16_04BA(P) : P=Q
Wend
ST$=ST$+ Extension_16_04BA(Len(M$)+1)
'
ML=Len(ST$)/2-2
For A=0 To H
Gosub DISP_LINE
Next
SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
'
MOUSE_READY
Do
Repeat
Repeat
Multi Wait
MZ=Mouse Zone : I$=Inkey$ : S=Scancode
If(Mouse Key=0) and(CMZ>3)
RDZONE[Screen,CMZ] : CMZ=0
Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
End If
Until((MZ>0) and(Mouse Key>0)) or(S=76) or(S=77)
If MZ<>CMZ
If CMZ>SZ+1
RDZONE[Screen,CMZ] : CMZ=0
Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
End If
If MZ>SZ+1
RDZONE[Screen,MZ]
Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
End If
CMZ=MZ
End If
If MZ>=BZ
While(Mouse Zone=MZ) and(Mouse Key>0)
MK=Max(MK,Mouse Key) : Wend
If MZ>=BZ
CMZ=0
Screen Copy Screen,X1+1,Y1+1,X2,Y2 To Screen,X1+1,Y1+1,%110000
End If
Else
If MZ=1 : REQUEST_MOVE[RN] : End If
End If
Until(Mouse Zone=MZ) or(S=76) or(S=77)
Exit If MZ=BZ+4,2
If S>0 : MZ=0 : End If
If((S=77) or(MZ=SZ+3)) and(L+H<ML)
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
Inc L : A=H : Gosub DISP_LINE
SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
End If
If((S=76) or(MZ=SZ+2)) and(L>0)
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
Dec L : A=0 : Gosub DISP_LINE
SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
End If
If MZ=BZ+2
L=0 : For A=0 To H : Gosub DISP_LINE : Next
SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
End If
If MZ=BZ+3
L=Max(0,ML-H) : For A=0 To H : Gosub DISP_LINE : Next
SLIDER_DRAW[SZ+1,L,Max(0,ML-H),H,1]
End If
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
If(MZ=BZ) and(Len(PV$)>0)
GP= Extension_16_04C6(PV$) : MN= Extension_16_04C6(Mid$(PV$,3)) : L= Extension_16_04C6(Mid$(PV$,5)) : PV$=Mid$(PV$,7) : Exit
End If
If SZ=MZ
HY=Max(0,Min(H,(Y Screen(Y Mouse)- Extension_16_001C(SZ)-4)/8))
HX=Max(0,Min(W,(X Screen(X Mouse)- Extension_16_0006(SZ)-8)/8))
If HY+L<=ML
ST= Extension_16_04C6(Mid$(ST$,(L+HY)*2+1)) : ED= Extension_16_04C6(Mid$(ST$,(L+HY+1)*2+1))
A$=Mid$(M$,ST,ED-ST-1) : A3=0 : A4=1
A1= Extension_16_00A0(A$,"[")
While A1>0
A3=A3+Max(0,A1-A4)
A2= Extension_16_00B4(A$,"]",A1)+1
A5=A3+A2-A1-6 : A4=A2
If HX>=A3 and HX<A5
PV$= Extension_16_04BA(GP)+ Extension_16_04BA(MN)+ Extension_16_04BA(L)+Left$(PV$,120)
Ink 1,1,0 : Set Paint 1
For A=10 To 0 Step -1
If A=0 : Set Paint 0 : End If
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
Next
GP= Extension_16_04C6(Mid$(A$,A1+1)) : MN= Extension_16_04C6(Mid$(A$,A1+3)) : L=0 : Exit 2
End If
A1= Extension_16_00B4(A$,"[",A2) : A3=A5
Wend
End If
End If
If MZ=3
SLIDER_READ[SZ+1,L,Max(0,ML-H),H,1]
L=Max(0,Min(ML-H,Param#))
For A=0 To H : Gosub DISP_LINE : Next
End If
Loop
Loop
MOUSE_BUSY[True]
REQUEST_CLOSE[RN]
Pop Proc
'
'
'Pre: A = Y Pos of line
'
DISP_LINE:
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
If L+A>ML Then Return
ST= Extension_16_04C6(Mid$(ST$,(L+A)*2+1)) : ED= Extension_16_04C6(Mid$(ST$,(L+A+1)*2+1))
If ED>ST
A$=Mid$(M$,ST,ED-ST-1) : A3=0 : A4=1
A1= Extension_16_00A0(A$,"[")
While A1>0
Ink 0,1 : Set Text 0
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)
A2= Extension_16_00B4(A$,"]",A1)+1
Set Text 4
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)
A3=A3+A2-A1-6 : A4=A2
A1= Extension_16_00B4(A$,"[",A2)
Wend
Ink 0,1 : Set Text 0
Text Extension_16_0006(SZ)+8+A3*8, Extension_16_001C(SZ)+A*8+10,Mid$(A$,A4)
End If
Return
HYP_ERR:
If RN>0
REQUEST_CLOSE[RN]
End If
End Proc
Procedure MOUSE_BUSY[D]
Shared BUSY_ANIM,BUSY
If Not BUSY
If Screen>=0
Colour 17,$A31
Colour 18,$0
Colour 19,$FFF
End If
If D
BUSY_ANIM=False
Change Mouse 9
Else
Hide
Sprite 0,X Mouse,Y Mouse,6
Channel 0 To Sprite 0
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"
Amal On
BUSY_ANIM=True
End If
BUSY=True
End If
End Proc
Procedure MOUSE_READY
Shared BUSY_ANIM,BUSY
If BUSY
If BUSY_ANIM
Amal Off : Sprite Off 0 : BUSY_ANIM=False
Show
End If
Change Mouse MSIM+3
BUSY=False
End If
End Proc