amiberry/whdboot-src/GamebootLoader.txt
2022-04-11 23:07:40 +02:00

3039 lines
63 KiB
Plaintext

' ####################################################### '
' #
' # # #_# ##
' # V V # # #/
' #
' #############################
Set Buffer 200
Dim SLAVEFILES$(255),SLAVEFOLDERS$(255)
Dim PALSTORE(31)
Dim ADRIVE$(32)
Dim _WS_KICKNAME$(20)
Global ADRIVE$(),_GETDATA$,CLEARDB,DBPATH$
Global _STOREDRIVE$,_PARENTFOLDER$
Global _WS_NAME$,_WS_COPY$,_WS_INFO$,_WS_CONFIG$,_WS_KICKNAME$(),_WS_DIR$
'_GET_SLAVE_DATA["dh1:games_whdload/cybernoid/","cybernoid.slave"]
'_GET_SLAVE_DATA["dh1:games_whdload/sensibleworldofsoccer9697/","sensibleworldofsoccer9697.slave"]
'
'Print _WS_DIR$
'End
'============
' delete database info
If Fire(0)<>0 or Fire(1)<>0
CLEARDB=True
End If
' --- find a specified drive
CHKCOMMAND$=Lower$(Command Line$)
' CHKCOMMAND$=" scanpath=dh1: only usefolderpath"
If Instr(CHKCOMMAND$,"usefolderpath")>0
Write Cli "Using Folder Path as filename"
Else
Write Cli "Using Slave Name as filename"
End If
If Instr(CHKCOMMAND$,"scanpath=")>0
For SNUM=1 To Len(CHKCOMMAND$)-8
If Mid$(CHKCOMMAND$,SNUM,8)="scanpath"
Exit
End If
Next
SNUM=SNUM+9
For ENUM=SNUM To Len(CHKCOMMAND$)
If Mid$(CHKCOMMAND$,ENUM,1)=" " or Mid$(CHKCOMMAND$,ENUM,1)="/"
Exit
End If
Next
ADRIVE$(0)=Mid$(CHKCOMMAND$,SNUM,ENUM-SNUM)
Write Cli "Scanpath will include "+ADRIVE$(0)+Chr$($A)+""
End If
If Instr(CHKCOMMAND$,"database=")>0
For SNUM=1 To Len(CHKCOMMAND$)-8
If Mid$(CHKCOMMAND$,SNUM,8)="database"
Exit
End If
Next
SNUM=SNUM+9
For ENUM=SNUM To Len(CHKCOMMAND$)
If Mid$(CHKCOMMAND$,ENUM,1)=" " or Mid$(CHKCOMMAND$,ENUM,2)="/ "
Exit
End If
Next
DBPATH$=Mid$(CHKCOMMAND$,SNUM,ENUM-SNUM)
If Right$(DBATH$,1)<>":" and Right$(DBPATH$,1)<>"/"
DBPATH$=DBPATH$+"/"
End If
Write Cli "Database path set to "+DBPATH$+Chr$($A)+""
Else If Instr(CHKCOMMAND$,"database")>0
DBPATH$=_RUNFROM$+"Database/"
End If
'============
If Instr(CHKCOMMAND$,"scanpath=")>0 and Instr(CHKCOMMAND$,"only")>0
Write Cli "Scanpath is "+ADRIVE$(0)+" only"+Chr$($A)
Else
Write Cli "Scanpath includes all drives"+Chr$($A)
_GETDRIVES
End If
' --- these two are our "final" slave selections
Global PICKSLAVEFILE$,PICKSLAVEFOLDER$
' --- these are the optional slaves from our scan.
Global SLAVEFILES$(),SLAVEFOLDERS$()
Global SLAVECOUNT
' --- these are the optional scripts from our scan.
Global SCRIPTFOLDER$,SCRIPTFILE$
' --- these are for the colour-scheme
Global RANCOL,PALSTORE(),PROGMODE
Global NCOUNT
' --- and the program details
Global PROGNAME$,WEBNAME$
Global _DEBUGPATH$,_AUTOBOOTPATH$,_RUNFROM$
Global ENABLEDEBUG,ENABLEDATABASE,ENABLEFOLDERPATH
Global TYPCOUNT
' ==== lets read in the command line item(s)
ENABLEDATABASE=False
ENABLEDEBUG=False
ENABLEFOLDERPATH=False
If Instr(CHKCOMMAND$,"debug")>0 Then ENABLEDEBUG=True
If Instr(CHKCOMMAND$,"database")>0 Then ENABLEDATABASE=True
If Instr(CHKCOMMAND$,"usefolderpath")>0 Then ENABLEFOLDERPATH=True
CHEKA:
' program folder is a a WHDbooter folder
' ---
'Screen Open 0,320,256,4,Lowres
'_GETDRIVES
' scan drives for the folder
For QQQ=0 To 31
TEST$=ADRIVE$(QQQ)+"WHDbooter"
If Exist(ADRIVE$(QQQ)+"WHDbooter")
_RUNFROM$=ADRIVE$(QQQ)+"WHDbooter/"
Exit
End If
Next QQQ
' check current folder?
If _RUNFROM$="" Then _RUNFROM$=Dir$
If _RUNFROM$=""
Write Cli "Cannot find WHDBooter folder"
End
End If
If ENABLEDEBUG=True Then Write Cli "Running from "+_RUNFROM$+Chr$($A)
_GET_TEXT["s:ProgramTitle"]
' PROGNAME$=Param$
PROGNAME$="Amiberry WHDload AutoBooter"
' _GET_TEXT["s:WebTitle"]
' WEBTITLE$=Param$
WEBNAME$="(C) Ultimate Amiga - blitterstudio.com"
NCOUNT=4
Screen Open 0,320,200,16,Lowres
' --- these are the final whdload settings .... to be changed?
' Dim _WS_KICKNAME$(20)
'Global _WS_NAME$,_WS_COPY$,_WS_INFO$,_WS_CONFIG$,_WS_KICKNAME$(),_WS_DIR$
Global CUST1,CUST2,CUST3,CUST4,CUST5,BWAIT
Global QUITK,CACHE$,SCRN$,DATTA$
Global WHDREG
Reserve As Work 1,$20000
_PROGSTART:
' set up a nice new clean hi-res screen to play with
Screen Open 0,640,200,16,Hires : Screen Hide 0
Curs Off : Flash Off : Hide
Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Cls 0
' Pen 1 : Ink 12
' _TOP=6 : _LOW=199
' _LEFT=0 : _RIGHT=639
''
' Draw _LEFT,_TOP To 32,_TOP : Draw _LEFT,_TOP To _LEFT,_LOW : Draw _LEFT,_TOP To _LEFT,_LOW
' Draw _LEFT,_LOW To _RIGHT,_LOW : Draw _RIGHT,_LOW To _RIGHT,_TOP : Draw _RIGHT,_LOW To _RIGHT,_TOP
' Draw _RIGHT,_TOP To 607,_TOP
'
' Rem Bob 0,257,0,1
' Flash 7,"(f00,5)(fff,5)(ff0,5)(0f0,5)(0ff,5)(00f,5)(F0F,5)"
Screen Show
' decide on our theme colour....
_STANPAL
Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MYY=1 : MYZ=11 : TXT$=PROGNAME$
Gosub CENTXT
MYY=19 : MYZ=2 : TXT$=WEBNAME$
Gosub CENTXT
' -- Fade "in" our palette
Wait Vbl
Fade 3,,PALSTORE(1),PALSTORE(2),,PALSTORE(3),PALSTORE(5),PALSTORE(6),PALSTORE(7),PALSTORE(8),,,PALSTORE(11),,,,PALSTORE(15)
Wait 35
'================
' ---- check for database mode, and if needed, enter it
If ENABLEDATABASE=True
If ENABLEDEBUG=True
Write Cli "Running in database mode"+Chr$($A)
End If
If CLEARDB=True
Write Cli "Removing Database Contents"+Chr$($A)
Examine Dir DBPATH$
FIRST$=Examine Next$
Repeat
If Object Name$<>"Database"
Kill _RUNFROM$+"Database/"+Object Name$
End If
Until Examine Next$=""
End If
If Exist(DBPATH$)=False
ENABLEDATABASE=False
Write Cli _RUNFROM$+"Database not found."+Chr$($A)
Else
_DO_DATABASE_SELECT
End If
' we've picked a file via the database mode
If PICKSLAVEFILE$<>"" and PICKSLAVEFOLDER$<>""
TYPCOUNT=4
Goto FILECHOSEN
End If
End If
' we DIDNT pick a file via database mode...
' --- get the base-info, establish how we are running etc.
SCANNING:
' --- we scan "user-startup" for any possible slave file and WHDLOAD settings
If PICKSLAVEFILE$="" Then _GET_FROM_SCRIPT_FILE["t:auto-startup"]
If PICKSLAVEFILE$="" Then _GET_FROM_SCRIPT_FILE["s:auto-startup"]
If PICKSLAVEFILE$="" Then _GET_FROM_SCRIPT_FILE["s:user-startup"]
If Exist(PICKSLAVEFOLDER$+PICKSLAVEFILE$)=False
PICKSLAVEFOLDER$=""
PICKSLAVEFILE$=""
SLAVECOUNT=0
End If
' --- scan certain folders for testing purposes
' If PICKSCRIPTFILE$="" and SLAVECOUNT<1 Then _GET_FROM_SCAN["games:midnightresistance/"]
' If PICKSCRIPTFILE$="" and SLAVECOUNT<1 Then _GET_FROM_SCAN["games:bloodwych/"]
' If PICKSCRIPTFILE$="" and SLAVECOUNT<1 Then _GET_FROM_SCAN["whd:afterburneractivision/"]
' If PICKSCRIPTFILE$="" and SLAVECOUNT<1 Then _GET_FROM_SCAN["games:wormsdirectorscutaga2"]
' --- failing this, we scan available drives
TYPCOUNT=3
For AAA=31 To 0 Step -1
If ADRIVE$(AAA)<>""
TXT$="Scanning... "+ADRIVE$(AAA)+" "
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
If PICKSCRIPTFILE$="" and SLAVECOUNT<1 : _GET_FROM_SCAN[ADRIVE$(AAA)] : End If
End If
If SLAVECOUNT>0
_STOREDRIVE$=ADRIVE$(AAA)
Exit
End If
Next AAA
TYPCOUNT=TYPCOUNT+1
FILECHOSEN:
' --- this is the "status display" and report shizzle
_DO_INITIAL_CHECKS
' ----- at this point we should probably branch off
' if we are using a script or anything else. (including a quit)
' --- this is all the code for running a selected slave.
CHOSENWHD:
' --- display the WHD info
MYZ=6 : TYPCOUNT=4
PTXT$=_WS_NAME$ : Gosub MULTILINE
PTXT$=_WS_COPY$ : Gosub MULTILINE
PTXT$=_WS_INFO$ : Gosub MULTILINE
If _WS_CONFIG$<>""
MYY=17 : MYZ=1
TXT$="Press Second Fire or Space for Custom Options"
Gosub CENTXT :
End If
Wait Vbl
Fade 3,,PALSTORE(1),PALSTORE(2),,PALSTORE(3),PALSTORE(5),PALSTORE(6),PALSTORE(7),PALSTORE(8),,,PALSTORE(11),
Wait 35
If ENABLEFOLDERPATH=True
For TEMP=1 To Len(PICKSLAVEFOLDER$)-1
A$=Mid$(PICKSLAVEFOLDER$,Len(PICKSLAVEFOLDER$)-TEMP,1)
If A$="/" or A$=":"
Exit
End If
_PARENTFOLDER$=A$+_PARENTFOLDER$
Next
Else
_PARENTFOLDER$=""
End If
' ----- Holding loop (WHD Display)
ACTION=0 : ACTIONTIME=Timer : Clear Key
Repeat
If Timer-ACTIONTIME=>(10*50) Then ACTION=1
If Fire(0)=True or Fire(1)=True Then ACTION=1
If Xfire(0,1)=True or Xfire(1,1)=True or Jup(1)=True or Jup(0)=True or Key State($40)=True Then ACTION=-1
If Mouse Click>2 Then ACTION=-1
Wait Vbl
Until ACTION<>0
Wait 30 : Fade 3,0,0,0,0,0,0,0 : Wait 60
Ink 0 : Bar 3,12 To 640-3,182
' --- do "customiser"
If ACTION=-1 and _WS_CONFIG$<>"" Then _CUSTOM_OPTIONS
' --- make the loading script
SCRIPTOR:
Fade 1,,PALSTORE(1),PALSTORE(2),,PALSTORE(3),PALSTORE(5),PALSTORE(6),PALSTORE(7),PALSTORE(8),,,PALSTORE(11),
Wait 5
TYPCOUNT=3
TXT$="Creating WHDLoad BootScript...."
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
If ENABLEFOLDERPATH=False
TXT$=" "+PICKSLAVEFILE$
Else
TXT$=" "+_PARENTFOLDER$
End If
MYY=TYPCOUNT : MYZ=2 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+2 : Wait 2
Clear Key
Wait 10*NCOUNT
_TYPE_WHDSCRIPT : WHDSCRIPT_TEXT$=Param$
' ... delet oldscripts
If ENABLEFOLDERPATH=False
Exec("c:delete "+Chr$(34)+PICKSLAVEFOLDER$+"#?.auto-startup"+Chr$(34)+" >nil:")
Else
Exec("c:delete "+Chr$(34)+_RUNFROM$+"Autoboots/"+_PARENTFOLDER$+".auto-startup"+Chr$(34)+" >nil:")
End If
' CREATE THE FINAL SCRIPT
STORE_TEXT$=WHDSCRIPT_TEXT$
'--- save one copy to T:
OUTFILE$="t:auto-startup"
_OUTPUT[OUTFILE$,WHDSCRIPT_TEXT$] : Wait Vbl
'--- save one copy with the slave, or in AutoBoots
If Exist("WHDLoadSave:Autoboots")
_AUTOBOOTPATH$="WHDLoadSave:Autoboots/"
Else If Exist(_RUNFROM$+"Autoboots")
_AUTOBOOTPATH$=_RUNFROM$+"Autoboots/"
End If
If ENABLEDEBUG=True Then Write Cli "Autoboot Path; "+_AUTOBOOTPATH$+Chr$($A)
OUTFILE3$=OUTFILE2$
If ENABLEFOLDERPATH=False
OUTFILE2$=PICKSLAVEFOLDER$
OUTFILE2$=OUTFILE2$+"auto-startup"
_OUTPUT[OUTFILE2$,STORE_TEXT$] : Wait Vbl
End If
' make "
If _AUTOBOOTPATH$<>""
If ENABLEFOLDERPATH=False
OUTFILE3$=_AUTOBOOTPATH$+PICKSLAVEFILE$
OUTFILE3$=Left$(OUTFILE3$,Len(OUTFILE3$)-Len(".slave"))
Else
OUTFILE3$=_AUTOBOOTPATH$+_PARENTFOLDER$
End If
OUTFILE3$=OUTFILE3$+".auto-startup"
_OUTPUT[OUTFILE3$,STORE_TEXT$] : Wait Vbl
End If
''Print "hard sun"
If Exist(OUTFILE$)
TXT$="File Created..."
Else
TXT$="Error in File Creation..."
End If
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
ABORT:
Wait 30*NCOUNT : Fade 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 : Wait 100
Goto LAST :
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0+8,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
MULTILINE:
TXT$=""
For A=1 To Len(PTXT$)
B$=Mid$(PTXT$,A,1)
If B$=Chr$($A) or B$=Chr$($FF)
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else If A=Len(PTXT$)
TXT$=TXT$+B$
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else
TXT$=TXT$+B$
End If
Next A
Return
Procedure _GET_DB_DATA[INFILE$]
' ---
If _GETDATA$="" Then Pop Proc
If Exist(INFILE$)=False Then Pop Proc
'Print _GETDATA$
' open the file, and extract the name
Wload INFILE$,1
FILETEXT$=""
For Z=0 To Length(1)
FILETEXT$=FILETEXT$+Chr$(Peek(Start(1)+Z))
Next Z
Erase 1
'Print FILETEXT$
'find the "[??]
For _STARTPOINT=1 To Len(FILETEXT$)-(Len(_GETDATA$)+2)
If Lower$(Mid$(FILETEXT$,_STARTPOINT,(Len(_GETDATA$)+2)))="["+_GETDATA$+"]"
Exit
End If
Next _STARTPOINT
If _STARTPOINT>=Len(FILETEXT$)-(Len(_GETDATA$)+2)
_GETDATA$=""
Pop Proc
End If
_STARTPOINT=_STARTPOINT+Len(_GETDATA$)+2
'===find the "[??]
For _ENDPOINT=_STARTPOINT To Len(FILETEXT$)-(Len(_GETDATA$)+2)
If Mid$(FILETEXT$,_ENDPOINT,2)=Chr$($A)+"[" or Mid$(FILETEXT$,_ENDPOINT,1)=Chr$(0) or _ENDPOINT>=Len(FILETEXT$)
Exit
End If
Next _ENDPOINT
_SENDDATA$=Mid$(FILETEXT$,_STARTPOINT,_ENDPOINT-_STARTPOINT)
_GETDATA$=""
End Proc[_SENDDATA$]
Procedure _DO_DATABASE_SELECT
' check for any 0000 database file(s)
Examine Dir(DBPATH$)
FOUNDFILE=False
Repeat
FILE$=Examine Next$
If Object Type<0 and Right$(FILE$,5)=" 0000"
If Exist(DBPATH$+FILE$)=True : FOUNDFILE=True : Exit : End If
End If
Until FILE$=""
' if not found, do a db scan
If FOUNDFILE=False
_DATABASE_SCAN
' clear the screen afterwards
Wait 30 : Fade 3,0,0,0,0,0,0,0 : Wait 60
Ink 0 : Bar 3,12 To 640-3,182
Fade 1,,PALSTORE(1),PALSTORE(2),,PALSTORE(3),PALSTORE(5),PALSTORE(6),PALSTORE(7),PALSTORE(8),,,PALSTORE(11),
Wait 5
End If
' now, trawl through and save all the game names.
Dim GAMESTORE$(4096),FILESTORE$(4096),AUDERSTORE(4096)
Examine Dir(DBPATH$)
FOUNDFILE=False
Repeat
FILE$=Examine Next$
If Object Type<0 and Right$(FILE$,5)=" 0000"
' ------------------
' open the file, and extract the name
Reserve As Work 1,Object Size
Bload DBPATH$+FILE$,1
FILETEXT$=""
For Z=0 To Length(1)
FILETEXT$=FILETEXT$+Chr$(Peek(Start(1)+Z))
Next Z
Erase 1
' ------------------
' find the "[name]
For _STARTPOINT=0 To Len(FILETEXT$)-6
If Lower$(Mid$(FILETEXT$,_STARTPOINT,6))="[name]"
Exit
End If
Next _STARTPOINT
If _STARTPOINT>=Len(FILETEXT$)-6 : Exit : End If
_STARTPOINT=_STARTPOINT+6
' ------------------
' find the "[name]
For _ENDPOINT=_STARTPOINT To Len(FILETEXT$)
If Mid$(FILETEXT$,_ENDPOINT,1)=Chr$($A)
Exit
End If
Next _ENDPOINT
GAMENAME$=Mid$(FILETEXT$,_STARTPOINT,_ENDPOINT-_STARTPOINT)
GAMESTORE$(BIGCOUNT)=GAMENAME$
FILESTORE$(BIGCOUNT)=FILE$
AUDERSTORE(BIGCOUNT)=0
AUDERSTORE(BIGCOUNT)=AUDERSTORE(BIGCOUNT)+(Asc(Mid$(GAMENAME$,1,1))*10000)
AUDERSTORE(BIGCOUNT)=AUDERSTORE(BIGCOUNT)+(Asc(Mid$(GAMENAME$,2,1))*100)
AUDERSTORE(BIGCOUNT)=AUDERSTORE(BIGCOUNT)+(Asc(Mid$(GAMENAME$,3,1)))
BIGCOUNT=BIGCOUNT+1
If BIGCOUNT>4095 : Exit : End If
End If
Until FILE$=""
'Sort GAMESTORE$(0)
'Sort FILESTORE$(0)
' lets draw up a list of games from the DB
THISPAGE=0
PAGELIMIT=10
PAGES=(BIGCOUNT/PAGELIMIT)+1
SELECTED=0
_DRAWPAGE:
TYPCOUNT=4
Gosub DRWMENU :
' now we wait for an input
WRITEOPTIONS:
Gosub REDRWMENU
PREVIOUS=SELECTED
OLDPAGE=THISPAGE
Wait 7
_INPUTLOOP:
' INPUT-READ LOOP
Repeat
If Xfire(1,0)=True or Xfire(0,0)=True or Key State($40)=True
PICKGAME$=GAMESTORE$(SELECTED+(THISPAGE*PAGELIMIT))
If SELECTED>9
Rem If SELECTED>PAGELIMIT
PICKGAME$="other"
Text 0,50,PICKGAME$ : End If
End If
If Jup(1)=True Then SELECTED=SELECTED-1
If Jdown(1)=True Then SELECTED=SELECTED+1
If Key State($4C)=True Then SELECTED=SELECTED-1
If Key State($4D)=True Then SELECTED=SELECTED+1
If Xfire(0,1)=True Then SELECTED=SELECTED+1
If SELECTED>PAGELIMIT+1 Then SELECTED=0
If SELECTED<0 Then SELECTED=PAGELIMIT+1
If PAGES<=1 and PREVIOUS<SELECTED Then SELECTED=0
If PAGES<=1 and PREVIOUS>SELECTED Then SELECTED=9
' deal with incomplete pages
If PREVIOUS<SELECTED and GAMESTORE$(SELECTED+(THISPAGE*PAGELIMIT))=""
If PAGES>1
SELECTED=PAGELIMIT
Else
SELECTED=0
End If
End If
If PREVIOUS>SELECTED and GAMESTORE$(SELECTED+(THISPAGE*PAGELIMIT))=""
If PAGES>1
For SELECTED=PAGELIMIT-1 To 0 Step -1
If GAMESTORE$(SELECTED+(THISPAGE*PAGELIMIT))<>"" : Exit : End If
Next SELECTED
Else
SELECTED=PAGELIMIT-1
End If
End If
' "next" is true, but "previous" isnt ... and selected>9
If PAGES>1 and THISPAGE<1 and PREVIOUS<SELECTED and SELECTED>9 Then SELECTED=11
If PAGES>1 and THISPAGE<1 and PREVIOUS>SELECTED and SELECTED>9 Then SELECTED=9
Until PREVIOUS<>SELECTED or PICKGAME$<>""
' wait, its a "Previous or next"
If(PICKGAME$<>"" and SELECTED>PAGELIMIT) or PICKGAME$="other"
If SELECTED-PAGELIMIT=0 or SELECTED=10
THISPAGE=THISPAGE-1
End If
If SELECTED-PAGELIMIT=1 or SELECTED=11
THISPAGE=THISPAGE+1
If THIPAGE>PAGELIMIT : THISPAGE=PAGELIMIT : End If
End If
PICKGAME$="" : SELECTED=0
End If
If OLDPAGE<>THISPAGE Then Gosub DRWMENU :
If PICKGAME$="" Then Goto WRITEOPTIONS
'==================================================
VERSIONSELECT:
Ink 0
Bar 0,30 To 640,180
Blitter Wait
' we#re not done yet....
PICKFILE$=FILESTORE$(SELECTED+(THISPAGE*PAGELIMIT))
PICKFILE$=Left$(PICKFILE$,Len(PICKFILE$)-4)
For COUNT=0 To 9999
If Exist(DBPATH$+PICKFILE$+Lzstr$(COUNT,4))=False
Exit
End If
Next
'''
' there's only one file (0000)
If COUNT=1
FULLPATH$=DBPATH$+PICKFILE$+Lzstr$(COUNT-1,4)
_GETDATA$="slave"
_GET_DB_DATA[FULLPATH$]
PICKSLAVEFILE$=Param$
_GETDATA$="path"
_GET_DB_DATA[FULLPATH$]
PICKSLAVEFOLDER$=Param$
SLAVECOUNT=1
Pop Proc
End If
' or there are several
COUNT=0
_DRWVER:
OLDCOUNT=COUNT
Ink 0
Bar 0,30 To 640,180
Blitter Wait
'Wait Vbl
TYPCOUNT=4
MYZ=7 : MYY=TYPCOUNT
TYPCOUNT=TYPCOUNT+2
TXT$="Version: "+Lzstr$(COUNT+1,4)
Gosub CENTXT
' game name
MYY=TYPCOUNT
MYZ=8
FULLPATH$=DBPATH$+PICKFILE$+Lzstr$(COUNT,4)
_GETDATA$="name"
_GET_DB_DATA[FULLPATH$]
TXT$=Param$
Gosub CENTXT
' version details
FULLPATH$=DBPATH$+PICKFILE$+Lzstr$(COUNT,4)
_GETDATA$="version"
_GET_DB_DATA[FULLPATH$]
PTXT$=Param$
TYPCOUNT=MYY+2
Gosub MULTILINE
Wait 5
PICKVER=-1
Repeat
Wait Vbl
Until Key State($40)=False and Key State($4F)=False and Key State($4E)=False
Clear Key
'=====
Repeat
If Xfire(1,0)=True or Xfire(0,0)=True or Key State($40)=True
PICKVER=COUNT+1
End If
If Jleft(1)=True : COUNT=COUNT-1 : End If
If Jright(1)=True : COUNT=COUNT+1 : End If
If Key State($4F)=True : COUNT=COUNT-1 : End If
If Key State($4E)=True : COUNT=COUNT+1 : End If
If Exist(DBPATH$+PICKFILE$+Lzstr$(COUNT,4))=False
COUNT=COUNT-1
End If
If COUNT<0
COUNT=0
End If
If OLDCOUNT<>COUNT : Goto _DRWVER : End If
Wait Vbl
Until PICKVER<>-1
Wait Vbl
Ink 0
Bar 0,30 To 640,180
Blitter Wait
FULLPATH$=DBPATH$+PICKFILE$+Lzstr$(COUNT,4)
_GETDATA$="slave"
_GET_DB_DATA[FULLPATH$]
PICKSLAVEFILE$=Param$
_GETDATA$="path"
_GET_DB_DATA[FULLPATH$]
PICKSLAVEFOLDER$=Param$
SLAVECOUNT=1
Pop Proc
DRWMENU:
Ink 0
Bar 0,30 To 640,180
Blitter Wait
MYY=1 : MYZ=11 : TXT$=PROGNAME$
Gosub CENTXT
MYY=19 : MYZ=2 : TXT$=WEBNAME$
Gosub CENTXT
' WRITE THE MENU
TYPCOUNT=4
For COUNT=0 To PAGELIMIT-1
If GAMESTORE$(COUNT+(THISPAGE*PAGELIMIT))="" Then Exit
MYZ=8 : MYY=TYPCOUNT
If COUNT=SELECTED Then MYZ=7
TYPCOUNT=TYPCOUNT+1
' TXT$=GAMESTORE$(COUNT+(THISPAGE*PAGELIMIT))
' TXT$=Str$(AUDERSTORE(COUNT+(THISPAGE*PAGELIMIT)))
If TXT$="" Then Exit
Gosub CENTXT
Next COUNT
MYZ=8
If PAGES>1 and THISPAGE<>0
MYY=16
If SELECTED=10 : MYZ=7 : End If
TXT$="Previous"
Gosub CENTXT
End If
MYZ=8
If PAGES>1 and THISPAGE<PAGES-1
MYY=17
If SELECTED=11 : MYZ=7 : End If
TXT$="Next"
Gosub CENTXT
End If
Return
REDRWMENU:
' WRITE THE MENU (for the exit fade)
TYPCOUNT=4
' MYY=1 : MYZ=11 : TXT$=PROGNAME$
' Gosub CENTXT
'
' MYY=19 : MYZ=8 : TXT$=WEBNAME$
' Gosub CENTX
For COUNT=0 To PAGELIMIT-1
If GAMESTORE$(COUNT+(THISPAGE*PAGELIMIT))="" Then Exit
MYZ=8 : MYY=TYPCOUNT
If COUNT=SELECTED Then MYZ=7
If PICKGAME$<>"" Then MYZ=1
TYPCOUNT=TYPCOUNT+1
TXT$=GAMESTORE$(COUNT+(THISPAGE*PAGELIMIT))
'TXT$=TXT$+" "+Str$(AUDERSTORE(COUNT+(THISPAGE*PAGELIMIT)))
If TXT$="" Then Exit
Gosub CENTXT
Next COUNT
If PAGES>1 and THISPAGE<>0
MYY=16 : MYZ=8
If SELECTED=10 : MYZ=7 : End If
If PICKGAME$<>"" : MYZ=1 : End If
TXT$="Previous"
Gosub CENTXT
End If
If PAGES>1 and THISPAGE<PAGES-1
MYY=17 : MYZ=8
If SELECTED=11 : MYZ=7 : End If
If PICKGAME$<>"" : MYZ=1 : End If
TXT$="Next"
Gosub CENTXT
End If
Return
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0+8,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
MULTILINE:
TXT$=""
For A=1 To Len(PTXT$)
B$=Mid$(PTXT$,A,1)
If B$=Chr$($A) or B$=Chr$($FF)
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else If A=Len(PTXT$)
TXT$=TXT$+B$
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else
TXT$=TXT$+B$
End If
Next A
Return
End Proc
Procedure _DATABASE_SCAN
For AAA=31 To 0 Step -1
TYPCOUNT=3
If ADRIVE$(AAA)<>""
TXT$="Scanning for Slave Files... "+ADRIVE$(AAA)+" "
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
_GET_FROM_SCAN[ADRIVE$(AAA)]
End If
Next AAA
'==========
TYPCOUNT=TYPCOUNT+1
For BRRR=1 To 9999
If SLAVEFILES$(BRRR)="" Then Exit
Next BRRR
TXT$="Found"+Str$(BRRR)+" files"
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
' now we need to create each entry
For BRRR=0 To 9999
If SLAVEFILES$(BRRR)="" Then Exit
_GET_SLAVE_DATA[SLAVEFOLDERS$(BRRR),SLAVEFILES$(BRRR)]
DBSLAVE$=SLAVEFILES$(BRRR)
DBPATH$=SLAVEFOLDERS$(BRRR)
DBNAME$=_WS_NAME$
DBVERSION$=_WS_INFO$
DBADD$=_WS_COPY$
DBPLAYS$="0"
DBFAVE$="0"
DBENTRY$=""
DBENTRY$=DBENTRY$+"[slave]"+DBSLAVE$+Chr$($A)
DBENTRY$=DBENTRY$+"[path]"+DBPATH$+Chr$($A)
DBENTRY$=DBENTRY$+"[name]"+DBNAME$+Chr$($A)
DBENTRY$=DBENTRY$+"[version]"+DBVERSION$+Chr$($A)
DBENTRY$=DBENTRY$+"[additional]"+DBADD$+Chr$($A)
DBENTRY$=DBENTRY$+"[plays] "+DBPLAYS$+Chr$($A)
DBENTRY$=DBENTRY$+"[favourite] "+DBFAVE$+Chr$($A)
DBENTRY$=DBENTRY$+"[end]"
If DBNAME$="" : DBNAME$=Left$(DBSLAVE$,Len(DBSLAVE$)-6) : End If
SVENAME$=DBNAME$
SVENAME$=Replacestr$(SVENAME$,"/" To "-")
SVENAME$=Replacestr$(SVENAME$,":" To "-")
Rem SVENAME$=Replacestr$(SVENAME$,"" To "")
If Len(SVENAME$)>30 : SVENAME$=Left$(SVENAME$,27)+"..." : End If
'Print SVENAME$ : Print Len(SVENAME$) : Wait 3
' find next available lost
For COUNTER=0 To 9999
DBFILE$=DBPATH$+SVENAME$+" "+Lzstr$(COUNTER,4)
Rem DBFILE$=Replacestr$(DBFILE$,":" To " ")
Rem DBFILE$=Replacestr$(DBFILE$,"/" To " ")
Rem DBFILE$=REPLACE(DBFILE$,"" to " ")
If Not Exist(DBFILE$) Then Exit
Next
Rem Print DBFILE$
_OUTPUT[DBFILE$,DBENTRY$]
Next BRRR
Pop Proc
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0+8,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
MULTILINE:
TXT$=""
For A=1 To Len(PTXT$)
B$=Mid$(PTXT$,A,1)
If B$=Chr$($A) or B$=Chr$($FF)
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else If A=Len(PTXT$)
TXT$=TXT$+B$
MYY=TYPCOUNT : Gosub CENTXT : TYPCOUNT=TYPCOUNT+1 : TXT$=""
Else
TXT$=TXT$+B$
End If
Next A
Return
End Proc
Procedure _DO_INITIAL_CHECKS
' --- do the initialisation display stuff. '
Rem TYPCOUNT=3
' --- check the whd/script found file(s) and report...
If SCRIPTFILE$=""
TXT$=Replacestr$(Str$(SLAVECOUNT)," " To "")+" WHDLoad slave files identified."
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+2 : Wait 2
Else
TXT$="Script file...." : MYZ=1
If SCRIPTFOLDER$="" or SCRIPTFILE$="" : MYZ=15 : TXT$=TXT$+" Error " : Else : TXT$=TXT$+" Found " : End If
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
End If
' if no slaves, wtf!
If SLAVECOUNT=0
TXT$="No files to load."
MYY=TYPCOUNT : MYZ=1 : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
Wait 240 :
Fade 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 : Wait 100 : End
End If
' --- if multi-slaves, lets select
If SLAVECOUNT>1 and SLAVECOUNT<13 and SCRIPTFILE$=""
_SELECTSLAVE
Else If SLAVECOUNT>12
TXT$=TXT$+"Too many slaves found."
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
TXT$=TXT$+"Use database mode."
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
Wait 500
Wait 30 : Fade 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 : Wait 100
End
End If
' --- if only one slave is found
If SLAVECOUNT=1 and PICKSLAVEFILE$=""
PICKSLAVEFILE$=SLAVEFILES$(0)
PICKSLAVEFOLDER$=SLAVEFOLDERS$(0)
End If
' get slave information (if applicable)
If PICKSLAVEFILE$<>"" Then _GET_SLAVE_DATA[PICKSLAVEFOLDER$,PICKSLAVEFILE$]
If _WS_NAME$="" Then _WS_NAME$=PICKSLAVEFILE$
If _WS_CONFIG$="" Then _GET_WSCONFIG_FROM_FILE[PICKSLAVEFILE$]
'If SCRIPTFILE$=""
' TXT$="WHDLoad...."
' If Exist("C:whdload.key") or Exist("L:whdload.key") or Exist("DEVS:whdload.key") or Exist("S:whdload.key") or Exist("LIBS:whdload.key") or Exist(PICKSLAVEFOLDER$+"whdload.key")
' MYZ=1
' TXT$=TXT$+" Registered" : WHDREG=True : Else : MYZ=15 : TXT$=TXT$+" Unregistered" : WHDREG=False : End If
' MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
'End If
' --- setpatch check..
TXT$="Setpatch...."
If Exist("C:SetPatch") : MYZ=1
TXT$=TXT$+" Found"
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
Else : MYZ=15 :
TXT$=TXT$+" Not Found"
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 50
End If
' --- kickstart check ? (if applicable)
OK=False
For QQQ=0 To 20
If _WS_KICKNAME$(QQQ)<>""
TXT$="Required rom file: kick"
TXT$="kick"+_WS_KICKNAME$(QQQ)+"...."
If Exist("devs:kickstarts/kick"+_WS_KICKNAME$(QQQ)) : MYZ=1
TXT$=TXT$+" Found"
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1 : Wait 2
OK=True
Else : MYZ=15 :
TXT$=TXT$+" Not Found"
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1
End If
End If
Next QQQ
If OK=False and _WS_KICKNAME$(0)<>""
TYPCOUNT=TYPCOUNT+1
TXT$=TXT$+"This WHDload slave cannot be run without a required kickstart rom." : MYZ=1
MYY=TYPCOUNT : Gosub LEFTXT : TYPCOUNT=TYPCOUNT+1
Wait 500
Wait 30 : Fade 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 : Wait 100
End
End If
' --- and remove the display
Wait 60*NCOUNT : Fade 3,0,0,0,0,0,0,0,,,,,,,,,0 : Wait 60
Ink 0 : Bar 0+3,12 To 640-3,182
Pop Proc
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0+8,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
End Proc
Procedure _TYPE_WHDSCRIPT
' lets "write" a script
OUTTEXT$=""
' OUTTEXT$=OUTTEXT$+"CD "+Chr$($22)+_RUNFROM$+"WHDBooter"+Chr$($22)+Chr$($A)
' If WHDREG=False Then OUTTEXT$=OUTTEXT$+"C:RUN SplashScreen.exe >nil:"+Chr$($A)
OUTTEXT$=OUTTEXT$+"CD "+Chr$($22)+PICKSLAVEFOLDER$+Chr$($22)+Chr$($A)
' lets write the WHD part
'Global CUST1$,CUST2$,CUST3$,CUST4$,CUST5$,CUST0$
' UNCHANGED SLAVE OPTIONS:
If Right$(PICKSLAVEFOLDER$,1)<>"/" and Right$(PICKSLAVEFOLDER$,1)<>":" Then PICKSLAVEFOLDER$=PICKSLAVEFOLDER$+"/"
OUTTEXT$=OUTTEXT$+"WHDLOAD "
OUTTEXT$=OUTTEXT$+"SLAVE="+Chr$($22)+PICKSLAVEFOLDER$+PICKSLAVEFILE$+Chr$($22)+" "
OUTTEXT$=OUTTEXT$+"PRELOAD "
If CACHE$<>"" Then OUTTEXT$=OUTTEXT$+CACHE$+" "
OUTTEXT$=OUTTEXT$+"NOWRITECACHE "
OUTTEXT$=OUTTEXT$+"NOREQ "
OUTTEXT$=OUTTEXT$+"SPLASHDELAY=0 "
If ENABLEFOLDERPATH=True
_TEMPFOLDER$=_PARENTFOLDER$
_TEMPFOLDER$=Replacestr$(_TEMPFOLDER$,"&" To "")
_TEMPFOLDER$=Replacestr$(_TEMPFOLDER$,"!" To "")
_TEMPFOLDER$=Replacestr$(_TEMPFOLDER$,"?" To "")
OUTTEXT$=OUTTEXT$+"SAVEDIR="+_TEMPFOLDER$+" "
End If
' QUITKEY, BUTTONWAIT ETC
If QUITK=0
Else : OUTTEXT$=OUTTEXT$+"QUITKEY="+Hex$(QUITK)+" " : End If
If BWAIT=True : OUTTEXT$=OUTTEXT$+BTWAIT$+"BUTTONWAIT " : End If
If CACHE$<>"" : OUTTEXT$=OUTTEXT$+CACHE$+" " : End If
If SCRN$<>"" : OUTTEXT$=OUTTEXT$+SCRN$+" " : End If
If CUST1<>0 : OUTTEXT$=OUTTEXT$+"CUSTOM1="+Lzstr$(CUST1,4)+" " : End If
If CUST2<>0 : OUTTEXT$=OUTTEXT$+"CUSTOM2="+Lzstr$(CUST2,4)+" " : End If
If CUST3<>0 : OUTTEXT$=OUTTEXT$+"CUSTOM3="+Lzstr$(CUST3,4)+" " : End If
If CUST4<>0 : OUTTEXT$=OUTTEXT$+"CUSTOM4="+Lzstr$(CUST4,4)+" " : End If
If CUST5<>0 : OUTTEXT$=OUTTEXT$+"CUSTOM5="+Lzstr$(CUST5,4)+" " : End If
If CUST0$<>"" : OUTTEXT$=OUTTEXT$+"CUSTOM="+CUST0$ : End If
' GAME DATA
If DATTA$="" or DATTA$="DATA="
''' If Exist(PICKSLAVEFOLDER$+"data/")
''' OUTTEXT$=OUTTEXT$+"DATA="+Chr$($22)+PICKSLAVEFOLDER$+"data/"+Chr$($22)+" "
''' Else
''' OUTTEXT$=OUTTEXT$+"DATA="+Chr$($22)+PICKSLAVEFOLDER$+Chr$($22)+" "
''' End If
' use "default" data dir
'Print "ws dir: "+WS_DIR$
If Exist(PICKSLAVEFOLDER$+_WS_DIR$+"/") and _WS_DIR$<>""
OUTTEXT$=OUTTEXT$+"DATA="+Chr$($22)+PICKSLAVEFOLDER$+_WS_DIR$+"/"+Chr$($22)+" "
Else
OUTTEXT$=OUTTEXT$+"DATA="+Chr$($22)+PICKSLAVEFOLDER$+Chr$($22)+" "
End If
Else
OUTTEXT$=OUTTEXT$+"DATA="+DATTA$+" "
End If
' if the
GAMENAME$=Left$(PICKSLAVEFILE$,Len(PICKSLAVEFILE$)-Len(".slave"))
If Instr(Lower$(PICKSLAVEFOLDER$),Lower$(_STOREDRIVE$))>0
_DEBUGPATH$=PICKSLAVEFOLDER$
_DEBUGNAME$="whdscript_debug"
Else If Exist(_RUNFROM$+"Debugs")
_DEBUGPATH$=_RUNFROM$+"Debugs/"
_DEBUGNAME$=GAMENAME$+".whdscript_debug"
Else
_DEBUGPATH$=PICKSLAVEFOLDER$
_DEBUGNAME$="whdscript_debug"
End If
If ENABLEFOLDERPATH=True
If Exist("WHDLoadSave:Debugs/")
_DEBUGPATH$="WHDLoadSave:Debugs/"
Else If Exist(_RUNFROM$+"Debugs/")
_DEBUGPATH$=_RUNFROM$+"Debugs/"
Else
_DEBUGPATH$=_RUNFROM$
End If
_DEBUGNAME$=_PARENTFOLDER$+".whdscript_debug"
End If
If ENABLEDEBUG=True Then Write Cli "Debug path; "+_DEBUGPATH$+Chr$($A)
OUTTEXT$=OUTTEXT$+" NOREQ"
OUTTEXT$=OUTTEXT$+" >"+Chr$($22)+_DEBUGPATH$+_DEBUGNAME$+Chr$($22)+Chr$($A)
OUTTEXT$=OUTTEXT$+Chr$($A)
OUTTEXT$=OUTTEXT$+"uae-configuration SPC_QUIT 1"+Chr$($A)
End Proc[OUTTEXT$]
Procedure _CUSTOM_OPTIONS
Dim COMPLETEOPTIONS$(31),MENU_LAYOUT(31)
Dim CUSTOPTIONS$(31),CUSTCUSTOM$(31),CUSTTYPE$(31),CUSTPARAM$(31)
LINEMAX=24
Fade 1,,PALSTORE(1),PALSTORE(2),,PALSTORE(3),PALSTORE(5),PALSTORE(6),PALSTORE(7),PALSTORE(8),,,PALSTORE(11),,,,PALSTORE(15)
'---- Title
MYY=2 : MYZ=4 : TXT$="Custom Setup Options"
Gosub CENTXT
'--- read the customiers settings file into a string
' we already have this with _WS_CONFIG$
'--- count the total number of items within
COUNTEND=0
For AA=1 To Len(_WS_CONFIG$)+1
CODE$=Mid$(_WS_CONFIG$,AA,1)
If CODE$=";" Then COUNTEND=COUNTEND+1
Next AA
If COUNTEND=0 Then Goto NOMORE
RECCUST:
' Read-in what Customiser settings we are using.
For AA=0 To COUNTEND
COMPLETEOPTIONS$(AA)=Itemstr$(_WS_CONFIG$,AA,";")
COMPLETEOPTIONS$(AA)=COMPLETEOPTIONS$(AA)+":::"
Next AA
BB=COUNTEND
' some initialisation of variables....
OLDLINEMAX=LINEMAX
For NEWLINEMAX=LINEMAX To 0 Step -2
If BB>NEWLINEMAX Then Exit
Next NEWLINEMAX
YOFFSET=Vclip((OLDLINEMAX-NEWLINEMAX)/2,0 To 4)
If Even(YOFFSET)=True Then YOFFSET=YOFFSET-1
NEWLINEMAX=NEWLINEMAX+2
LINEMAX=NEWLINEMAX
COUNTEND=0
For AA=0 To LINEMAX-1
If COMPLETEOPTIONS$(AA)<>""
CUSTCUSTOM$(AA)=Upper$(Itemstr$(COMPLETEOPTIONS$(AA),0,":"))
CUSTTYPE$(AA)=Upper$(Itemstr$(COMPLETEOPTIONS$(AA),1,":"))
CUSTOPTIONS$(AA)=Itemstr$(COMPLETEOPTIONS$(AA),2,":")
CUSTPARAM$(AA)=Itemstr$(COMPLETEOPTIONS$(AA),3,":")
COUNTEND=COUNTEND+1
End If
Next AA
' --- lets do some "allocating" of each into slots
MENULAYOUTS:
Rem widthmax = 30 + 3 (bit / toggle) + 3 spaces
' allocate all "short" ones
For AA=0 To 31
'** is it a toggle / bit type?
If Upper$(CUSTTYPE$(AA))="B" or Upper$(CUSTTYPE$(AA))="X"
' is it short enough?
If Len(CUSTOPTIONS$(AA))<=30
Rem ... allocate into "any" slot (even / odd)
For CC=0 To 31
If Btst(7,MENU_LAYOUT(CC))=False
MENU_LAYOUT(CC)=AA
Bset 7,MENU_LAYOUT(CC)
Exit 1
End If
Next CC
End If
'** is it a list type?
Else If Upper$(CUSTTYPE$(AA))="L"
'** how many options are there in CUSTPARAM$(AA) ?
ITEMCOUNT=0
For Z=1 To Len(CUSTPARAM$(AA))
If Mid$(CUSTPARAM$(AA),Z,1)="," : ITEMCOUNT=ITEMCOUNT+1 : End If
Next Z
'** establish the longest length
MXLENGTH=0
For Z=1 To ITEMCOUNT
If Len(Itemstr$(CUSTPARAM$(AA),Z,","))>MXLENGTH : MXLENGTH=Len(Itemstr$(CUSTPARAM$(AA),Z,",")) : End If
Next Z
MXLENGTH=MXLENGTH+3 : Rem-- to allow for decent "space"
If Len(CUSTOPTIONS$(AA))+MXLENGTH<36
Rem ... allocate into "any" slot (even / odd)
For CC=0 To 31
If Btst(7,MENU_LAYOUT(CC))=False
MENU_LAYOUT(CC)=AA
Bset 7,MENU_LAYOUT(CC)
Exit 1
End If
Next CC
End If
End If
Next AA
AASD:
' --- scan for the "long" ones (remainer
For AA=0 To 31
If CUSTOPTIONS$(AA)="" Then Goto NXT : Rem -- blank, ignore
For CC=0 To 31
If MENU_LAYOUT(CC)-128=AA Then Goto NXT : Remm - already placed, ignore
Next CC
For CC=0 To 31 Step 2
' Print AA
If Btst(7,MENU_LAYOUT(CC))=False
MENU_LAYOUT(CC)=AA
Bset 6,MENU_LAYOUT(CC) : Rem -- mark as "long"
Bset 7,MENU_LAYOUT(CC) : Rem -- mark as "used"
Goto NXT :
End If
Next CC
NXT:
Next AA
' --- menu initialisation
SELECTY=99 : SELECTX=0
Rem -- sanity check!!
If Btst(7,MENU_LAYOUT(0))<>True
Wait 20
MYZ=15 : MYY=5
TXT$="No WSCustom Options Found... Aborting"
Gosub LEFTXT : Wait 200
Goto NOMORE :
End If
Gosub DRWMENU
'--- Wait For all Inputs To be clear
Repeat
Wait Vbl
Until(Fire(1)=False and Fire(0)=False and Key State($40)=False)
' --- main loop for selection
MAINLOOP:
_KEYHELD=False
Repeat
If Key State($4C)=True or Jup(1)=True
Gosub _MOVE_UP :
REFRESH=True
Else If Key State($4E)=True or Jright(1)=True
Gosub _MOVE_RIGHT :
REFRESH=True
Else If Key State($4F)=True or Jleft(1)=True
Gosub _MOVE_LEFT :
REFRESH=True
Else If Key State($4D)=True or Jdown(1)=True or Xfire(0,1)=True
Gosub _MOVE_DOWN :
REFRESH=True
End If
If REFRESH=True Then Gosub DRWMENU :
If SELECTY=99 and(Fire(1)=True or Fire(0)=True or Key State($40)=True)
Exit
Else If(Fire(1)=True or Fire(0)=True or Key State($40)=True) and KEYHELD=False
Gosub CHANGEOPTION
KEYHELD=True
Else If Fire(1)=False and Fire(0)=False and Key State($40)=False
KEYHELD=False
End If
Until 1=0
' ---- exit!
Flash Off
Rem Wait Vbl : Colour 7,$FFF : fade 3
NOMORE:
Wait 20 : Fade 3,0,0,0,0,0,0,0,0,,0,,,,,,0 : Wait 60
Ink 0 : Bar 0,12 To 640,182
Pop Proc
' ************* SUB-ROUTINES *************
_MOVE_UP:
If SELECTY=0 or SELECTY=1 Then Return
If SELECTY=99 Then SELECTY=30
SELECTY=SELECTY-2
For SELECTY=SELECTY To 0 Step -2
If Odd(SELECTY)=True
If Btst(7,MENU_LAYOUT(SELECTY))=False and Btst(7,MENU_LAYOUT(SELECTY-1))=True
SELECTY=SELECTY-1
End If
End If
If Btst(7,MENU_LAYOUT(SELECTY))=True Then Exit
Next SELECTY
Return
_MOVE_DOWN:
If SELECTY=99 Then Return
SELECTY=SELECTY+2
For SELECTY=SELECTY To 31
If Odd(SELECTY)=True and Btst(7,MENU_LAYOUT(SELECTY))=False and Btst(7,MENU_LAYOUT(SELECTY-1))=True
SELECTY=SELECTY-1
End If
If Btst(7,MENU_LAYOUT(SELECTY))=True Then Exit
Next SELECTY
If SELECTY>31 Then SELECTY=99
Return
_MOVE_LEFT:
If SELECTY=99 Then Return
If Odd(SELECTY)=True
If Btst(7,MENU_LAYOUT(SELECTY-1))=True
SELECTY=SELECTY-1
End If
End If
Return
_MOVE_RIGHT:
If SELECTY=99 Then Return
If Even(SELECTY)=True
If Btst(7,MENU_LAYOUT(SELECTY+1))=True
SELECTY=SELECTY+1
End If
End If
Return
DRWMENU:
TYPCOUNT=4+(YOFFSET/2)
For AA=0 To 31 : Rem ... AA is the value of the menu positioner
BB=MENU_LAYOUT(AA)
If Btst(7,BB)=False Then Goto SKP
LONGTYPE=Btst(6,BB)
Bclr 7,BB : Bclr 6,BB
' write the option name
If CUSTOPTIONS$(BB)="" Then Goto SKP
' ink colour
If SELECTY=AA : MYZ=7 : Else : MYZ=6 : End If
MYY=TYPCOUNT
If Even(AA)=True Then MYX=0
If Odd(AA)=True Then MYX=40
TXT$=" "+CUSTOPTIONS$(BB)
Gosub LEFFXT
TXT$=""
Gosub BITOPTION
SKP:
If Odd(AA)=True Then TYPCOUNT=TYPCOUNT+1
Next AA
If SELECTY=99 : MYZ=7 : Else : MYZ=6 : End If
MYY=17 : TXT$="--- Start Game ---" : Gosub CENTXT
Wait 5 : Clear Key
REFRESH=False
Return
CHANGEOPTION:
' BB=SELECTY
BB=MENU_LAYOUT(SELECTY)
Bclr 7,BB : Bclr 6,BB
If CUSTCUSTOM$(BB)="C1" Then TESTITEM=CUST1
If CUSTCUSTOM$(BB)="C2" Then TESTITEM=CUST2
If CUSTCUSTOM$(BB)="C3" Then TESTITEM=CUST3
If CUSTCUSTOM$(BB)="C4" Then TESTITEM=CUST4
If CUSTCUSTOM$(BB)="C5" Then TESTITEM=CUST5
TESTBIT=Val(CUSTPARAM$(BB))
' Text 20,190,"bit:"+Str$(TESTBIT)+" VAL:"+Str$(TESTITEM)+" "
Rem -- testitem = current value
Rem -- testbit = bit to change, or value upper limit or... ?
If CUSTTYPE$(BB)="X"
Bchg TESTBIT,TESTITEM
Else If CUSTTYPE$(BB)="B"
Bchg 0,TESTITEM
Else If CUSTTYPE$(BB)="L"
ITEMCOUNT=0
For Z=1 To Len(CUSTPARAM$(BB))
If Mid$(CUSTPARAM$(BB),Z,1)="," : ITEMCOUNT=ITEMCOUNT+1 : End If
Next Z
TESTITEM=TESTITEM+1
If TESTITEM>ITEMCOUNT : TESTITEM=0 : End If
End If
If CUSTCUSTOM$(BB)="C1" Then CUST1=TESTITEM
If CUSTCUSTOM$(BB)="C2" Then CUST2=TESTITEM
If CUSTCUSTOM$(BB)="C3" Then CUST3=TESTITEM
If CUSTCUSTOM$(BB)="C4" Then CUST4=TESTITEM
If CUSTCUSTOM$(BB)="C5" Then CUST5=TESTITEM
REFRESH=True
Return
BITOPTION:
' get current parameter
If CUSTCUSTOM$(BB)="C1" Then TESTITEM=CUST1
If CUSTCUSTOM$(BB)="C2" Then TESTITEM=CUST2
If CUSTCUSTOM$(BB)="C3" Then TESTITEM=CUST3
If CUSTCUSTOM$(BB)="C4" Then TESTITEM=CUST4
If CUSTCUSTOM$(BB)="C5" Then TESTITEM=CUST5
TESTBIT=Val(CUSTPARAM$(BB))
' draw a bit/option item
If CUSTTYPE$(BB)="B" or CUSTTYPE$(BB)="X"
If CUSTTYPE$(BB)="B" : TESTBIT=0 : End If
RESULT=Btst(TESTBIT,TESTITEM)
If RESULT=True : TXT$=" ON" : Else TXT$="OFF" : End If
XOFFSET=3
'draw a list item
Else If CUSTTYPE$(BB)="L"
'** how many options are there in CUSTPARAM$(AA) ?
ITEMCOUNT=0
For Z=1 To Len(CUSTPARAM$(BB))
If Mid$(CUSTPARAM$(BB),Z,1)="," : ITEMCOUNT=ITEMCOUNT+1 : End If
Next Z
'** establish the longest length
For Z=1 To ITEMCOUNT
If Len(Itemstr$(CUSTPARAM$(BB),Z,","))>MXLENGTH : MXLENGTH=Len(Itemstr$(CUSTPARAM$(BB),Z,",")) : End If
Next Z
TXT$=Itemstr$(CUSTPARAM$(BB),TESTITEM,",")
XOFFSET=MXLENGTH
While Len(TXT$)<MXLENGTH
TXT$=" "+TXT$
Wend
End If
' if selected, flash
If SELECTY=AA : MYZ=7 : Else : MYZ=6 : End If
' pick a column etc.
If Even(AA)=True Then MYX=0+38-Len(TXT$)
If Odd(AA)=True Then MYX=40+38-Len(TXT$)
If LONGTYPE=True Then MYX=78-Len(TXT$)
' pick the row (??)
MYY=TYPCOUNT
' draw it!
Gosub LEFFXT
Return
Pop Proc
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFFXT: YY=MYY*10 : XX=MYX*8 : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
End Proc
Procedure _GET_SLAVE_DATA[INFOLDER$,INFILE$]
If INFOLDER$="" or INFILE$="" Then Pop Proc
If Right$(INFOLDER$,1)<>"/" and Right$(INFOLDER$,1)<>":" Then INFOLDER$=INFOLDER$+"/"
If Exist(INFOLDER$+INFILE$)=False Then Pop Proc
Reserve As Work 1,$20000
Bload INFOLDER$+INFILE$,1
' FIND "WHDLOADS"
For COUNT=1 To Length(1)
CHK$=""
For B=0 To 7
CHK$=CHK$+Chr$(Peek(Start(1)+COUNT+B))
Next B
If CHK$="WHDLOADS" Then Exit
Next COUNT
' lets store some detault variables
BASEREF=COUNT-4
A=Start(1)
COUNT=COUNT+8 : Rem -- security / ID skipped
WS_REQVER=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- whd ver
COUNT=COUNT+2 : Rem -- flags
COUNT=COUNT+4 : Rem -- basemem
COUNT=COUNT+4 : Rem -- execinstall
COUNT=COUNT+2 : Rem -- gameloader
WS_CURRENTDIR=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- currentdir
COUNT=COUNT+2 : Rem -- dont cache
If WS_REQVER<4 Then Goto NOMORE
WS_DEBUG=Peek(COUNT+A) : COUNT=COUNT+1 : Rem -- debug key
WS_QUIT=Peek(COUNT+A) : COUNT=COUNT+1 : Rem -- quit key
If WS_REQVER<8 Then Goto NOMORE
COUNT=COUNT+4 : Rem -- expmem
If WS_REQVER<10 Then Goto NOMORE
WS_NAME=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- name
WS_COPY=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- copy
WS_INFO=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- info
If WS_REQVER<16 Then Goto NOMORE
WS_KICK=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- kickname
COUNT=COUNT+4 : Rem -- kicksize
COUNT=COUNT+2 : Rem -- kickcrc
If WS_REQVER<17 Then Goto NOMORE
WS_CONFIG=Deek(COUNT+A) : COUNT=COUNT+2 : Rem -- config
' ----- now we have the relevant info / offsets
NOMORE:
If WS_CURRENTDIR<>0
_GET_SLAVE_LINE[1,BASEREF,WS_CURRENTDIR,0] : _WS_DIR$=Param$
Else
_WS_DIR$=""
End If
If WS_REQVER<10 Then Goto NOMORE2
_GET_SLAVE_LINE[1,BASEREF,WS_NAME,WS_COPY] : _WS_NAME$=Param$
_GET_SLAVE_LINE[1,BASEREF,WS_COPY,WS_INFO] : _WS_COPY$=Param$
_GET_SLAVE_LINE[1,BASEREF,WS_INFO,0] : _WS_INFO$=Param$
If WS_REQVER<16 Then Goto NOMORE2
' cehcking multiple kickstarts needs trickery.
If WS_KICK<>0
_OFFS=-1 : Q=0
Repeat
Repeat
_OFFS=_OFFS+1
AAA$=""
For RRR=0 To 3
AAA$=AAA$+Chr$(Peek(Start(1)+BASEREF+WS_KICK+RRR+_OFFS))
Next RRR
Until AAA$="4006" or _OFFS>$64
If _OFFS<$32
_GET_SLAVE_LINE[1,BASEREF,WS_KICK+_OFFS,0]
_WS_KICKNAME$(Q)=Param$
Q=Q+1
End If
Until _OFFS>$32
End If
If WS_REQVER<17 Then Goto NOMORE2
_GET_SLAVE_LINE[1,BASEREF,WS_CONFIG,0] : _WS_CONFIG$=Param$
NOMORE2:
Erase 1
End Proc
Procedure _GET_SLAVE_LINE[_BANKNUMB,_BASEADD,_OFFSET,_MAXOFF]
OUTTIE$=""
' main loop
ADYIN=Start(_BANKNUMB)+_BASEADD+_OFFSET
If _MAXOFF=0 or _MAXOFF<_OFFSET
ADYOUT=Start(_BANKNUMB)+Length(_BANKNUMB)
Else
ADYOUT=Start(_BANKNUMB)+_BASEADD+_MAXOFF-1
End If
For B=ADYIN To ADYOUT
CODE=Peek(B)
If CODE=0 Then Exit
OUTTIE$=OUTTIE$+Chr$(CODE)
Next B
End Proc[OUTTIE$]
Procedure _SELECTSLAVE
TMPCOUNT=TYPCOUNT
Gosub DRWMENU
Rem Gosub FADIN
WRITEOPTIONS:
Gosub DRWMENU
PREVIOUS=SELECTED
Wait 7
' INPUT-READ LOOP
Repeat
If Xfire(1,0)=True or Xfire(0,0)=True or Key State($40)=True
PICKSLAVEFILE$=SLAVEFILES$(SELECTED)
PICKSLAVEFOLDER$=SLAVEFOLDERS$(SELECTED)
End If
If Jup(1)=True Then SELECTED=SELECTED-1
If Jdown(1)=True Then SELECTED=SELECTED+1
If Key State($4C)=True Then SELECTED=SELECTED-1
If Key State($4D)=True Then SELECTED=SELECTED+1
If Xfire(0,1)=True Then SELECTED=SELECTED+1
If SELECTED>SLAVECOUNT-1 Then SELECTED=0
If SELECTED<0 Then SELECTED=SLAVECOUNT-1
Until PREVIOUS<>SELECTED or PICKSLAVEFILE$<>""
If PICKSLAVEFILE$="" Then Goto WRITEOPTIONS
Gosub REDRWMENU :
TYPCOUNT=TYPCOUNT+1
Rem : Flash Off : Wait Vbl : Colour 7,$FFF : Fade 3
Rem For A=0 To 50 : Wait Vbl : Next A
Pop Proc
DRWMENU:
MYY=1 : MYZ=11 : TXT$=PROGNAME$
Gosub CENTXT
MYY=19 : MYZ=2 : TXT$=WEBNAME$
Gosub CENTXT
' WRITE THE MENU
TYPCOUNT=TMPCOUNT
For COUNT=0 To 255
If SLAVEFILES$(COUNT)="" Then Exit
MYZ=8 : MYY=TYPCOUNT
If COUNT=SELECTED Then MYZ=7
TXT$="Option"+Str$(COUNT+1)+": "+SLAVEFILES$(COUNT) : TYPCOUNT=TYPCOUNT+1
Gosub LEFTXT
Next COUNT
Return
REDRWMENU:
' WRITE THE MENU
TYPCOUNT=TMPCOUNT
For COUNT=0 To 255
If SLAVEFILES$(COUNT)="" Then Exit
MYZ=1 : MYY=TYPCOUNT
If COUNT=SELECTED Then MYZ=2
TXT$="Option"+Str$(COUNT+1)+": "+SLAVEFILES$(COUNT) : TYPCOUNT=TYPCOUNT+1
Gosub LEFTXT
Next COUNT
Return
' ************* SUB-ROUTINES *************
CENTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text XX,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
LEFTXT: YY=MYY*10 : XX=320-((Len(TXT$)*8)/2) : ZZ=MYZ : Ink ZZ,0 : Text 0+8,YY,TXT$ : YY=0 : XX=0 : ZZ=0 : TXT$="" : Return
Return
FADIN:
Rem --- BODGE-IT CODE!!
A=PALSTORE(0) : B=PALSTORE(1) : C=PALSTORE(2) : D=PALSTORE(3)
E=PALSTORE(4) : F=PALSTORE(5) : G=PALSTORE(6) : H=PALSTORE(7)
I=PALSTORE(8) : J=PALSTORE(9) : K=PALSTORE(10) : L=PALSTORE(11)
M=PALSTORE(12) : N=PALSTORE(13) : O=PALSTORE(14) : P=PALSTORE(15)
Q=PALSTORE(16) : R=PALSTORE(17) : S=PALSTORE(18) : T=PALSTORE(19)
U=PALSTORE(20) : V=PALSTORE(21) : W=PALSTORE(22) : X=PALSTORE(23)
Y=PALSTORE(24) : Z=PALSTORE(25) : AA=PALSTORE(26) : BB=PALSTORE(27)
CC=PALSTORE(28) : DD=PALSTORE(29) : EE=PALSTORE(30) : FF=PALSTORE(31)
Fade 4,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,FF
For A=0 To 50
Wait Vbl
Next A
Return
End Proc
Procedure _GET_FROM_SCAN[CHKFOLDER$]
Dim STOREDIR$(9999)
SCRIPTCOUNT=0
SLAVECOUNT=0
' Check that there is a DH1:
If Not Exist(CHKFOLDER$)
' MYY=3 : MYZ=1
' TXT$="Drive DH1: not found!" : Gosub LEFTXT
'' MYY=19 : MYZ=3
'' TXT$=webname$ : Gosub
' Wait 150
' Fade 3
' Wait 100
Pop Proc
End If
'lets scan for any folders we may be interested in.
ADIR$=CHKFOLDER$ : Gosub PLUSDIR
' 5 LEVEL FOLDER-FIND
Gosub SWEEP
Gosub SWEEP
Gosub SWEEP
Gosub SWEEP
Gosub SWEEP
'Repeat
'
'Print STOREDIR$(BLAH)
'Inc BLAH
'Until STOREDIR$(BLAH)=""
Pop Proc
SWEEP:
COUNT=9999
Repeat
If STOREDIR$(COUNT)<>""
Examine Dir(STOREDIR$(COUNT))
Repeat
FILE$=Examine Next$
'''' store all subfolders
If Object Type>0
If Right$(STOREDIR$(COUNT)+FILE$,1)<>"/" and Right$(STOREDIR$(COUNT)+FILE$,1)<>":"
ADIR$=STOREDIR$(COUNT)+FILE$+"/"
Gosub PLUSDIR
Else
ADIR$=STOREDIR$(COUNT)+FILE$
Gosub PLUSDIR
End If
'''' store files
Else If Object Type<0
'''' store script file
If Lower$(FILE$)="script" or Lower$(FILE$)="bootscript"
SCRIPTFILE$=FILE$
SCRIPTFOLDER$=STOREDIR$(COUNT)
If Right$(SCRIPTFOLDER$,1)<>"/" and Right$(SCRIPTFOLDER$,1)<>":"
SCRIPTFOLDER$=SCRIPTFOLDER$+"/"
End If
SCRIPTCOUNT=SCRIPTCOUNT+1
'''' store .slave files?
Else If Lower$(Right$(FILE$,6))=".slave" and Left$(FILE$,1)<>"." and Left$(FILE$,1)<>"_"
AFILE$=FILE$
AFOLDER$=STOREDIR$(COUNT)
If Right$(AFOLDER$,1)<>"/" and Right$(AFOLDER$,1)<>":"
AFOLDER$=AFOLDER$+"/"
End If
Gosub PLUSSLAVE
SLAVECOUNT=SLAVECOUNT+1
'''' store JST files?
End If
End If
Until FILE$="" or SCRIPTCOUNT>1
End If
COUNT=COUNT-1
Until COUNT<0 or(SLAVECOUNT>0 and ENABLEDATABASE=False)
Return
PLUSSLAVE:
For A=0 To 255
If Lower$(SLAVEFILES$(A))=Lower$(AFILE$)
Exit 1
Else If SLAVEFILES$(A)=""
SLAVEFILES$(A)=AFILE$
SLAVEFOLDERS$(A)=AFOLDER$
Exit 1
End If
Next A
Return
PLUSDIR:
For A=0 To 9999
If Lower$(STOREDIR$(A))=Lower$(ADIR$)
Exit 1
Else If STOREDIR$(A)=""
STOREDIR$(A)=ADIR$
Exit 1
End If
Next A
Return
End Proc
Procedure _GET_FROM_SCRIPT_FILE[CHKFILE$]
PICKSLAVEFILE$=""
PICKSLAVEFOLDER$=""
If Exist(CHKFILE$)=False Then Pop Proc
Reserve As Work 1,$20000
Bload CHKFILE$,1
_MAXSZ=Object Size(CHKFILE$)
_FINDAWORD[".slave",1,_MAXSZ] : PICKSLAVEFILE$=Param$
_FINDLINE["cd",1,_MAXSZ] : PICKSLAVEFOLDER$=Param$
_FINDLINE["whdload",1,_MAXSZ] : PICKSLAVELINE$=Param$
' check how many WHD parameters there are (spaces)
ENTRIES=0
For A=0 To Len(PICKSLAVELINE$)
If Mid$(PICKSLAVELINE$,A,1)=" " Then ENTRIES=ENTRIES+1
Next A
' process them all
For A=0 To ENTRIES
_WHDPARAM$=Itemstr$(PICKSLAVELINE$,A," ")
_WHDPARAM$=Lower$(_WHDPARAM$)
If Left$(_WHDPARAM$,8)="custom1=" Then CUST1=Val(Replacestr$(_WHDPARAM$,"custom1=" To ""))
If Left$(_WHDPARAM$,8)="custom2=" Then CUST2=Val(Replacestr$(_WHDPARAM$,"custom2=" To ""))
If Left$(_WHDPARAM$,8)="custom3=" Then CUST3=Val(Replacestr$(_WHDPARAM$,"custom3=" To ""))
If Left$(_WHDPARAM$,8)="custom4=" Then CUST4=Val(Replacestr$(_WHDPARAM$,"custom4=" To ""))
If Left$(_WHDPARAM$,8)="custom5=" Then CUST5=Val(Replacestr$(_WHDPARAM$,"custom5=" To ""))
If Left$(_WHDPARAM$,8)="custom=" Then CUST0$=Replacestr$(_WHDPARAM$,"custom=" To "")
If Left$(_WHDPARAM$,10)="buttonwait" Then BWAIT=True
If Left$(_WHDPARAM$,3)="pal" Then SCRN$="PAL"
If Left$(_WHDPARAM$,4)="ntsc" Then SCRN$="NTSC"
If Left$(_WHDPARAM$,8)="quitkey=" Then QUITK=Val(Replacestr$(_WHDPARAM$,"quitkey=" To ""))
If Left$(_WHDPARAM$,10)="branchcache" Then CACHE$="BRANCHCACHE"
If Left$(_WHDPARAM$,10)="nofilecache" Then CACHE$="NOFILECACHE"
If Left$(_WHDPARAM$,11)="nowritecache" Then CACHE$="NOWRITECACHE"
If Left$(_WHDPARAM$,10)="chipnocache" Then CACHE$="CHIPNOCACHE"
If Left$(_WHDPARAM$,10)="dcache" Then CACHE$="DCACHE"
If Left$(_WHDPARAM$,5)="cache" Then CACHE$="CACHE"
If Left$(_WHDPARAM$,6)="nocache" Then CACHE$="NOCACHE"
If Left$(_WHDPARAM$,5)="data=" Then DATTA$=Replacestr$(_WHDPARAM$,"data=" To "")
Next A
PICKSLAVEFOLDER$=Replacestr$(PICKSLAVEFOLDER$,"cd " To "")
PICKSLAVEFOLDER$=Replacestr$(PICKSLAVEFOLDER$,"CD " To "")
PICKSLAVEFOLDER$=Replacestr$(PICKSLAVEFOLDER$,"cD " To "")
PICKSLAVEFOLDER$=Replacestr$(PICKSLAVEFOLDER$,"Cd " To "")
PICKSLAVEFOLDER$=Replacestr$(PICKSLAVEFOLDER$,Chr$(34) To "")
PICKSLAVEFOLDER$=":"+PICKSLAVEFOLDER$
If Right$(PICKSLAVEFOLDER$,1)<>"/" and Right$(PICKSLAVEFOLDER$,1)<>":" Then PICKSLAVEFOLDER$=PICKSLAVEFOLDER$+"/"
If PICKSLAVEFILE$<>"" Then SLAVECOUNT=1
Erase 1
End Proc
Procedure _FINDLINE[FINDWORD$,BANKNUMB,_MAXSZ]
OUTPHRASE$=""
If Len(FINDWORD$)=0 Then Goto ZERO
If _MAXSZ>Length(BANKNUMB) Then _MAXSZ=Length(BANKNUMB)
' === this searches for the "findword$" and allows us to store a start-point
' For COUNTER=0 To Length(BANKNUMB)-Len(FINDWORD$)
For COUNTER=0 To _MAXSZ-Len(FINDWORD$)
CHK$=""
For WORDCOUNT=0 To Len(FINDWORD$)-1
CHK$=CHK$+Chr$(Peek(Start(BANKNUMB)+COUNTER+WORDCOUNT))
Next WORDCOUNT
If Lower$(CHK$)=FINDWORD$
WORDFOUND=True
If Peek(Start(BANKNUMB)+COUNTER+Len(FINDWORD$))=34 : QUOTESUSED=True : End If
Exit
End If
Next COUNTER
' === set the in-point
INPOINT=COUNTER
' === find the out-point
FINDVALUE=$A
' For COUNTER=INPOINT To Length(BANKNUMB)
For COUNTER=INPOINT To _MAXSZ
If Peek(Start(BANKNUMB)+COUNTER)=FINDVALUE Then Exit
Next COUNTER
OUTPOINT=COUNTER-1
OUTPHRASE$=""
For COUNTER=INPOINT To OUTPOINT
OUTPHRASE$=OUTPHRASE$+Chr$(Peek(Start(1)+COUNTER))
Next COUNTER
ZERO:
End Proc[OUTPHRASE$]
Procedure _FINDAWORD[FINDWORD$,BANKNUMB,_MAXSZ]
OUTPHRASE$=""
If Len(FINDWORD$)=0 Then Goto ZERO :
If _MAXSZ>Length(BANKNUMB) Then _MAXSZ=Length(BANKNUMB)
WORDFOUND=False
QUOTESUSED=False
' === this searches for the "findword$" and allows us to store an end-point
' For COUNTER=0 To Length(BANKNUMB)-Len(FINDWORD$)
For COUNTER=0 To _MAXSZ-Len(FINDWORD$)
CHK$=""
For WORDCOUNT=0 To Len(FINDWORD$)-1
CHK$=CHK$+Chr$(Peek(Start(BANKNUMB)+COUNTER+WORDCOUNT))
Next WORDCOUNT
If Lower$(CHK$)=FINDWORD$
WORDFOUND=True
If Peek(Start(BANKNUMB)+COUNTER+Len(FINDWORD$))=34 : QUOTESUSED=True : End If
Exit
End If
Next COUNTER
If WORDFOUND=False Then Goto ZERO :
' === set the out-point
OUTPOINT=COUNTER
OUTPOINT=OUTPOINT+Len(FINDWORD$)-1
If QUOTESUSED=True Then OUTPOINT=OUTPOINT+1
' === what character do we need to find?
FINDVALUE=Asc(" ")
If QUOTESUSED=True Then FINDVALUE=34
' === find the in-point
For COUNTER=OUTPOINT To 0 Step -1
If Peek(Start(BANKNUMB)+COUNTER)=FINDVALUE Then Exit
Next COUNTER
' === set the in-point
INPOINT=COUNTER+1
' Print " in: "+Str$(INPOINT)
' Print " out: "+Str$(OUTPOINT)
OUTPHRASE$=""
For COUNTER=INPOINT To OUTPOINT
OUTPHRASE$=OUTPHRASE$+Chr$(Peek(Start(1)+COUNTER))
Next COUNTER
ZERO:
End Proc[OUTPHRASE$]
Procedure _STANPAL
Randomize Timer*Ct Second(Current Time)
RANCOL=Rnd(14)
For A=0 To $10
If Exist("T:PAL"+Hex$(A)) Then Exit
Next A
If A>$F
A=RANCOL
Reserve As Work 8,1
Wsave "T:PAL"+Hex$(A),8
Erase 8
End If
If A=0 or A1 or A=2 : Gosub RED
Else If A=3 or A=4 or A=5 : Gosub BLUE
Else If A=6 or A=7 or A=8 : Gosub GREEN
Else If A=9 or A=10 : Gosub YELLOW
Else If A=11 or A=12 or A=13 : Gosub CYAN
Else If A=14 : Gosub PINK
Else
Gosub RED
End If
Pal Set 0,15,$A00
Colour 7,$FFF
Colour 15,$A00
Pal Get Screen 0,0
For A=0 To 15
PALSTORE(A)=Pal Get(0,A)
Next A
Pop Proc
RED:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$EDD To 10,$F00
Pal Spread 11,$F00 To 15,$300
CULN=$100 : Gosub MAKEFLSH
Return
GREEN:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$DED To 10,$D0
Pal Spread 11,$D0 To 15,$30
CULN=$10 : Gosub MAKEFLSH
Return
CYAN:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$DEE To 10,$FF
Pal Spread 11,$FF To 15,$33
CULN=$11 : Gosub MAKEFLSH
Return
PINK:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$EDE To 10,$F0F
Pal Spread 11,$F0F To 15,$303
CULN=$101 : Gosub MAKEFLSH
Return
BLUE:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$DDE To 10,$F
Pal Spread 11,$F To 15,$3
CULN=$1 : Gosub MAKEFLSH
Return
YELLOW:
Pal Spread 0,$0 To 6,$FFF
Pal Spread 8,$EED To 10,$FF0
Pal Spread 11,$FF0 To 15,$330
CULN=$110 : Gosub MAKEFLSH
Return
MAKEFLSH:
MADEUP$=""
For Q=5 To 15 Step 1 : MADEUP$=MADEUP$+"("+Right$(Hex$(0+(Q*CULN)+$1000),3)+",5)" : Next Q
For Q=15 To 8 Step -2 : MADEUP$=MADEUP$+"("+Right$(Hex$(0+(Q*CULN)+$1000),3)+",5)" : Next Q
Flash 7,MADEUP$
Return
End Proc
Procedure _ULTIMATEAMIGA
Rem Reserve As Chip Data 12,86552
Screen Open 0,320,256,16,Lowres : Curs Off : Hide
Colour 0,$0 : Colour 1,$0
Colour 2,$0 : Colour 3,$0
Cls 0 :
Default Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Screen 0
A=RANCOL
If A=0 or A1 or A=2 : Gosub RED
Else If A=3 or A=4 or A=5 : Gosub BLUE
Else If A=6 or A=7 or A=8 : Gosub GREEN
Else If A=9 or A=10 : Gosub YELLOW
Else If A=11 or A=12 or A=13 : Gosub CYAN
Else If A=14 : Gosub PINK
Else
Gosub RED
End If
Pal Get Screen 0,0
For A=0 To 31
PALSTORE(A)=Pal Get(0,A)
Next A
Load Iff "GRAFS/ua.iff",0 : Screen Hide 0
Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Wload "titlesound",-12 : Bank Name 12,"U.A.Snd"
Screen Show 0 : Led On
Pt Voice %1111
Pt Raw Play %1001,Start(12),Length(12),22050 : Wait 6
Pt Raw Play %110,Start(12),Length(12),22050 : Wait 20
Rem --- BODGE-IT CODE!!
A=PALSTORE(0) : B=PALSTORE(1) : C=PALSTORE(2) : D=PALSTORE(3)
E=PALSTORE(4) : F=PALSTORE(5) : G=PALSTORE(6) : H=PALSTORE(7)
I=PALSTORE(8) : J=PALSTORE(9) : K=PALSTORE(10) : L=PALSTORE(11)
M=PALSTORE(12) : N=PALSTORE(13) : O=PALSTORE(14) : P=PALSTORE(15)
Q=PALSTORE(16) : R=PALSTORE(17) : S=PALSTORE(18) : T=PALSTORE(19)
U=PALSTORE(20) : V=PALSTORE(21) : W=PALSTORE(22) : X=PALSTORE(23)
Y=PALSTORE(24) : Z=PALSTORE(25) : AA=PALSTORE(26) : BB=PALSTORE(27)
CC=PALSTORE(28) : DD=PALSTORE(29) : EE=PALSTORE(30) : FF=PALSTORE(31)
Fade 6,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,FF
COUNT=0
While COUNT<320
Wait Vbl
COUNT=COUNT+1
Wend
Fade 5
Wait 150
Screen Close 0 : Erase 12 : Led Off
Pop Proc
RED:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$EDD To 21,$F00
Pal Spread 21,$F00 To 31,$300
Return
GREEN:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$DED To 21,$D0
Pal Spread 21,$D0 To 31,$30
Return
CYAN:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$DEE To 21,$FF
Pal Spread 21,$FF To 31,$33
Return
PINK:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$EDE To 21,$F0F
Pal Spread 21,$F0F To 31,$303
Return
BLUE:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$DDE To 21,$F
Pal Spread 21,$F To 31,$3
Return
YELLOW:
Pal Spread 0,$0 To 14,$FFF
Pal Spread 16,$EED To 21,$FF0
Pal Spread 21,$FF0 To 31,$330
Return
End Proc
Procedure _OUTPUT[OUTFILE$,OUTTEXT$]
If OUTFILE$="" Then Pop Proc
If OUTTEXT$="" Then Pop Proc
Reserve As Work 9,Len(OUTTEXT$)+3
For CHARNUM=1 To Len(OUTTEXT$)
ACHAR=Asc(Mid$(OUTTEXT$,CHARNUM,1))
If ACHAR=$FF Then Exit 1
Poke Start(9)-1+CHARNUM,ACHAR
Next CHARNUM
Poke Start(9)+CHARNUM,$A
Wsave OUTFILE$,9
Wait Vbl : Erase 9
Wait Vbl
End Proc
Procedure _GET_WSCONFIG_FROM_FILE[PICKSLAVEFILE$]
If PICKSLAVEFILE$="" Then Pop Proc
Reserve As Work 1,$20000
FILEN$=Lower$(PICKSLAVEFILE$)
FILEN$=Replacestr$(FILEN$,".slave" To ".ws")
If Exist(_RUNFROM$+"WSConfigs/"+FILEN$)=False Then Pop Proc
Bload _RUNFROM$+"WSConfigs/"+FILEN$,1
FILESZ=Object Size(_RUNFROM$+"WSConfigs/"+FILEN$)
For A=0 To FILESZ
CODE=Peek(Start(1)+A)
' fix any PC txt file line-ends
If CODE=$5 Then CODE=$A
' exit at end
If CODE=0 Then Exit
' read everythign except line-ends
If CODE<>$A Then _WS_CONFIG$=_WS_CONFIG$+Chr$(CODE)
Next A
Erase 1
End Proc
Procedure _GETDRIVES
' ====== this is a program to fill an array with available drives
' --- output the INFO command to ram:
Exec "C:info >t:infoout"
' --- load the file, stick it into string
Reserve As Work 1,Object Size("t:infoout")
Bload "t:infoout",1
For B=0 To Length(1)-1
ALL$=ALL$+Chr$(Peek(Start(1)+B))
Next B
Erase 1
Exec("C:delete t:infoout")
' ==== now read each line at a time
For Q=3 To 100
FISH$=Itemstr$(ALL$,Q,Chr$($A))
If FISH$<>""
If Left$(FISH$,7)="Volumes" : Exit : End If
For T=1 To Len(FISH$)-3
If Mid$(FISH$,T,3)=": " : Exit : End If
Next T
FISH$=Left$(FISH$,T)
For F=0 To 31
If ADRIVE$(F)="" or ADRIVE$(F)=FISH$
ADRIVE$(F)=FISH$
Exit
End If
Next
' If FISH$<>"" : ADRIVE$(F)=FISH$ : F=F+1 : End If
' If F>32 : Exit : End If
End If
Rem Gosub _SAVELINE
Next Q
'For F=0 To 31
'Print "??????+"+ADRIVE$(F)
'Next F
Pop Proc
'============= export the line to a file for checking etc.
_SAVELINE:
Reserve As Work 2,Len(FISH$)
For R=1 To Len(FISH$)
Poke Start(2)+R-1,Asc(Mid$(FISH$,R,1))
Next R
Wsave "dh2:_output_"+Hex$(Q,2),2
Erase 2
Return
End Proc
Procedure _GET_TEXT[INFILE$]
If Exist(INFILE$)
Wload INFILE$,1
For COUNT=0 To Length(1)
OUTPUT$=OUTPUT$+Chr$(Peek(Start(1)+COUNT-1))
Next COUNT
End If
OUTPUT$=Replacestr$(OUTPUT$,Chr$($A) To "")
End Proc[OUTPUT$]
LAST: