*************************************************************************
*									*
*			  StartupControl V1.2				*
*		       © 1995-1996 by Dirk Jesse			*
*		       written with MaxonASM V1.1			*
*			       23.10.96					*
*			  released as MAILWARE				*
*									*
*************************************************************************


    incdir  Include:
    include "reqtools/reqtools.i"
    include "reqtools/reqtools_lib.i"

_SysBase		= 4

OS_Version		=37			; ab OS2.04 lauffähig !!

Signal			=%0001000000000000	; Ctrl C - Break
Memsize			=1024

openlibrary		= -$0228
closelibrary		= -$019e
allocmem		= -198
freemem			= -210
wait			= -318

EasyRequestArgs		= -588

Execute			= -222
Rename			= -78
Open			= -30
Write			= -48
Close			= -36

Lock			= -84
CurrentDir		= -126
UnLock			= -90

AllocAslRequest		= -48
FreeAslRequest		= -54
AslRequest		= -60


mode_oldfile		= 1005

	section "StartupControl",code_p	

*************************************************************************
*									*
*	Programm							*
*									*
*************************************************************************

Start
	movem.l	d0-a6,-(sp)
	move.l	a0,CLI_Parameter


***** Kickstart-Versionstest für PAL-Option *****
*     -------------------------------------	*
*						*	
.open_V38_intuition				*
	move.w	#0,use_pal			*
	move.l	_SysBase,a6			*
	move.l	#intuitionname,a1		*
	move.l	#38,d0				*
	jsr	openlibrary(a6)			*
	cmp.l	#0,d0				*
	beq	.open_intuition			*
	move.l	d0,_IntuitionBase		*
						*
	move.w	#1,use_pal			*
	lea	MyEasyStruc(pc),a0		*
	move.l	#MyText2,12(a0)			*
	move.l	#MyButton2,16(a0)		*
						*
	bra	.open_dos			*
*						*
*************************************************

.open_intuition		
	move.l	_SysBase,a6
	move.l	#intuitionname,a1
	move.l	#OS_Version,d0
	jsr	openlibrary(a6)
	cmp.l	#0,d0
	beq	.ende
	move.l	d0,_IntuitionBase

.open_dos		
	move.l	_SysBase,a6
	move.l	#dosname,a1
	move.l	#OS_Version,d0
	jsr	openlibrary(a6)
	cmp.l	#0,d0
	beq	.close_intuition
	move.l	d0,_DosBase

.open_asl		
	move.l	_SysBase,a6
	move.l	#aslname,a1
	move.l	#OS_Version,d0
	jsr	openlibrary(a6)
	cmp.l	#0,d0
	beq	.close_dos
	move.l	d0,_AslBase
	
.get_mem
	move.l	_SysBase,a6		; Speicher für Scriptpath
	move.l	#Memsize,d0		; allocieren
	move.l	#$10000,d1		; public
	jsr	allocmem(a6)
	cmp.l	#0,d0
	beq	.close_asl
	move.l	d0,Path

.get_request
	move.l	_AslBase(pc),a6		; Requesterstruktur
	moveq	#0,d0			; für Scriptwahl holen
	sub.l	a0,a0
	jsr	AllocAslRequest(a6)
	tst.l	d0
	beq	.freemem
	move.l	d0,request

*************************************************************************
*									*
*	CLI Parameter auswerten						*
*									*
*************************************************************************
real_argument	macro
	cmp.b	#" ",(a0)
	beq	.real\@
	cmp.b	#0,(a0)
	beq	.real\@
	cmp.b	#$a,(a0)
	beq	.real\@
	bra	.find_argument
.real\@
	endm
	
.get_cli_args
	move.l	CLI_Parameter(pc),a0
	moveq	#0,d0

	move.w	#256-1,d7
.hunt_for_help
	move.b	(a0)+,d0
	beq	.no_help
	cmp.b	#"?",d0
	beq	.perhaps_help
	cmp.b	#" ",d0
	bne	.no_help
	dbra	d7,.hunt_for_help	
	bra	.no_help
	
.perhaps_help
	move.b	(a0)+,d0
	beq	.show_help
	cmp.b	#$A,d0
	beq	.show_help
	cmp.b	#" ",d0
	bne	.no_help
	dbra	d7,.perhaps_help	
		
.no_help
	move.l	CLI_Parameter(pc),a0
	moveq	#0,d0

.find_argument
	move.b	(a0)+,d0
	beq	.all_done
	cmp.b	#$A,d0
	beq	.all_done
	cmp.b	#"-",d0
	beq	.analyse_argument
	bra	.find_argument

.analyse_argument
	move.b	(a0)+,d0
	beq	.all_done	

	cmp.b	#"r",d0
	beq	.rt
	cmp.b	#"R",d0
	beq	.rt
	bra	.find_argument

.rt	
	movem.l	d0-a6,-(sp)
	real_argument
	move.w	#1,use_reqtools

	move.l	_SysBase,a6		; open ReqTools.library
	move.l	#reqtoolsname,a1
	move.l	#38,d0
	jsr	openlibrary(a6)
	cmp.l	#0,d0
	beq	.show_error
	move.l	d0,_ReqToolsBase

	move.l	_ReqToolsBase(pc),a6	; ReqTools Requesterstruktur
	moveq	#RT_FILEREQ,d0		; für Filerequester holen
	sub.l	a0,a0
	jsr	_LVOrtAllocRequestA(a6)
	tst.l	d0
	beq	.close_reqtools
	move.l	d0,reqtoolsrequest
	
	movem.l	(sp)+,d0-a6
	bra	.find_argument

*************************************************************************
*									*
*	Error Meldung ausgeben						*
*									*
*************************************************************************

.show_error
	movem.l	(sp)+,d0-a6
	move.l	_DosBase(pc),a6
	move.l	#CLI_name,d1
	move.l	#mode_oldfile,d2
	jsr	Open(a6)		; CLI öffnen
	move.l	d0,CLI_filehandle
	beq	.free_aslrequest

	move.l	_DosBase(pc),a6
	move.l	CLI_filehandle,d1
	move.l	#Error_text,d2
	move.l	#Error_endtext-Error_text,d3
	jsr	Write(a6)		; Text ablassen...

	move.l	_DosBase(pc),a6
	move.l	CLI_filehandle,d1
	jsr	Close(a6)		; CLI schliessen
	bra	.free_aslrequest

*************************************************************************
*									*
*	Hilfe-Seite ausgeben						*
*									*
*************************************************************************
	
.show_help
	move.l	_DosBase(pc),a6
	move.l	#CLI_name,d1
	move.l	#mode_oldfile,d2
	jsr	Open(a6)		; CLI öffnen
	move.l	d0,CLI_filehandle
	beq	.all_done

	move.l	_DosBase(pc),a6
	move.l	CLI_filehandle,d1
	move.l	#CLI_text,d2
	move.l	#CLI_endtext-CLI_text,d3
	jsr	Write(a6)		; Test ablassen...
	
	move.l	_DosBase(pc),a6
	move.l	CLI_filehandle,d1
	jsr	Close(a6)		; CLI schliessen
.all_done

*************************************************************************
*									*
*	Grundzustand der Dateinamen herstellen				*
*									*
*************************************************************************

.enable_WBStartup
	move.l	_DosBase(pc),a6		; WBStartup
	move.l	#DisabledWB,d1
	move.l	#EnabledWB,d2
	jsr	Rename(a6)

	move.l	_DosBase(pc),a6		; WBStartup.info
	move.l	#DisabledWBinfo,d1
	move.l	#EnabledWBinfo,d2
	jsr	Rename(a6)

.enable_User
	move.l	_DosBase(pc),a6		; user-startup
	move.l	#DisabledUser,d1
	move.l	#EnabledUser,d2
	jsr	Rename(a6)

.enable_Monitors
	tst.w	use_pal
	beq	.get_activationkey

	move.l	_DosBase(pc),a6		; devs/Monitors
	move.l	#DisabledMonitors,d1
	move.l	#EnabledMonitors,d2
	jsr	Rename(a6)

	move.l	_DosBase(pc),a6		; devs/Monitors.info
	move.l	#DisabledMonitorsinfo,d1
	move.l	#EnabledMonitorsinfo,d2
	jsr	Rename(a6)
	

*************************************************************************
*									*
*	Tastatur + LMB Abfrage						*
*									*
*************************************************************************

.get_activationkey
	btst	#6,$bfe001		; LMB
	beq	.open_requester

	moveq	#0,d0			; Nicht ganz sauber, aber
	move.b	$bfec01,d0		; funktioniert ganz prächtig!
	ror.b	#1,d0
	eori.b	#$ff,d0
	cmp.b	#$64,d0			; Left ALT
	beq	.open_requester
	cmp.b	#$65,d0			; Right ALT
	beq	.open_requester
	bra	.close_down
	
*************************************************************************
*									*
*	Menü öffnen							*
*									*
*************************************************************************
	
.open_requester
	move.l	_IntuitionBase(pc),a6	; Menu öffnen
	sub.l	a0,a0			; auf OS Screen
	lea	MyEasyStruc(pc),a1
	sub.l	a2,a2
	sub.l	a3,a3
	jsr	EasyRequestArgs(a6)	; EasyRequestArgs - der Requester
	tst.l	d0			;                   unserer Träume
	beq	.close_down

	cmp.l	#1,d0			; Button auswerten
	beq	.Disable_All
	cmp.l	#2,d0
	beq	.Disable_WB
	cmp.l	#3,d0
	beq	.Disable_User
	cmp.l	#4,d0
	beq	.open_shell
	cmp.l	#5,d0
	beq	.execute_script
	cmp.l	#6,d0
	beq	.run_exe
	cmp.l	#7,d0
	beq	.Disable_Monitors
	bra	.close_down

*************************************************************************
*									*
*	Disable something						*
*									*
*************************************************************************

.Disable_All				; USER + WB
	move.l	_DosBase(pc),a6
	move.l	#EnabledUser,d1
	move.l	#DisabledUser,d2
	jsr	Rename(a6)

.Disable_WB
	move.l	_DosBase(pc),a6		; WB
	move.l	#EnabledWB,d1
	move.l	#DisabledWB,d2
	jsr	Rename(a6)

	move.l	_DosBase(pc),a6
	move.l	#EnabledWBinfo,d1
	move.l	#DisabledWBinfo,d2
	jsr	Rename(a6)
	bra	.close_down
	
.Disable_User				; USER
	move.l	_DosBase(pc),a6
	move.l	#EnabledUser,d1
	move.l	#DisabledUser,d2
	jsr	Rename(a6)
	bra	.close_down

.Disable_Monitors			; DEVS/MONITORS
	move.l	_DosBase(pc),a6
	move.l	#EnabledMonitors,d1
	move.l	#DisabledMonitors,d2
	jsr	Rename(a6)

	move.l	_DosBase(pc),a6
	move.l	#EnabledMonitorsinfo,d1
	move.l	#DisabledMonitorsinfo,d2
	jsr	Rename(a6)
	bra	.close_down

*************************************************************************
*									*
*	Shell-window öffnen						*
*									*
*************************************************************************

.open_shell
	moveq	#0,d0			; Sim Salabim - und auf...
	move.l	_DosBase(pc),a6
	move.l	#NewShell,d1
	moveq	#0,d2
	moveq	#0,d3
	jsr	Execute(a6)

*************************************************************************
*									*
*	auf Break-Signal warten						*
*									*
*************************************************************************

.wait_for_signal
	move.l	_SysBase,a6		; .......
	move.l	#Signal,d0		; ....
	jsr	wait(a6)		; .....
	cmp.l	#Signal,d0
	bne	.wait_for_signal
	bra	.close_down		; ..und ab
		
*************************************************************************
*									*
*	Script auswählen und starten					*
*									*
*************************************************************************

		
.execute_script
	move.l	#Script,Command	
	tst	use_reqtools
	beq	.asl_script

	lea	Load_script(pc),a3
	jsr	Select_rtFile
	bra	.start_script
.asl_script
	jsr	Select_ASLFile
	
.start_script	
	cmp.l	#1,d0
	beq	.open_requester
	cmp.l	#-1,d0
	beq	.close_down

	jsr	set_dir
	
	moveq	#0,d0
	move.l	_DosBase(pc),a6
	move.l	Path(pc),d1
	moveq	#0,d2
	moveq	#0,d3
	jsr	Execute(a6)

	jsr	set_olddir
	
	bra	.open_requester

*************************************************************************
*									*
*	Executable auswählen und starten				*
*									*
*************************************************************************

		
.run_exe
	move.l	#Executable,Command	
	tst	use_reqtools
	beq	.asl_exe

	lea	Load_exe(pc),a3
	jsr	Select_rtFile
	bra	.start_exe
.asl_exe
	jsr	Select_ASLFile
	
.start_exe	
	cmp.l	#1,d0
	beq	.open_requester
	cmp.l	#-1,d0
	beq	.close_down

	jsr	set_dir
			
	moveq	#0,d0
	move.l	_DosBase(pc),a6
	move.l	Path(pc),d1
	moveq	#0,d2
	moveq	#0,d3
	jsr	Execute(a6)		; Programm starten...

	jsr	set_olddir

	bra	.open_requester


*************************************************************************
*									*
*	Alles sauber beenden						*
*									*
*************************************************************************

.close_down
	tst.w	use_reqtools
	beq	.free_aslrequest
	move.l	_ReqToolsBase(pc),a6
	move.l	reqtoolsrequest(pc),a1
	jsr	_LVOrtFreeRequest(a6)	; Requesterstruktur freigeben

.close_reqtools
	move.l	_SysBase,a6
	move.l	_ReqToolsBase(pc),a1
	jsr	closelibrary(a6)

.free_aslrequest
	move.l	_AslBase(pc),a6
	move.l	request(pc),a0
	jsr	FreeAslRequest(a6)	; Requesterstruktur freigeben

.freemem
	move.l	_SysBase,a6
	move.l	Path(pc),a1
	move.l	#Memsize,d0
	jsr	freemem(a6)		; Speicher friegeben

.close_asl
	move.l	_SysBase,a6
	move.l	_AslBase(pc),a1
	jsr	closelibrary(a6)

.close_dos
	move.l	_SysBase,a6
	move.l	_DosBase(pc),a1
	jsr	closelibrary(a6)

.close_intuition
	move.l	_SysBase,a6
	move.l	_IntuitionBase(pc),a1
	jsr	closelibrary(a6)

.ende
	movem.l	(sp)+,d0-a6
	moveq	#0,d0
	rts				;...und tschüss!

*************************************************************************
*									*
*	ReqTools - Filerequester öffnen					*
*									*
*************************************************************************

Select_rtFile:
	move.l	_ReqToolsBase(pc),a6
	move.l	reqtoolsrequest(pc),a1
	lea	Filename(pc),a2
	sub.l	a0,a0
	jsr	_LVOrtFileRequestA(a6)		; Filerequester öffnen
	tst.l	d0
	beq	.no_file

	move.l	reqtoolsrequest(pc),a0
	move.l	rtfi_Dir(a0),lockname

	move.l	Command(pc),a0
	move.l	Path(pc),a1

.copy_command
	move.b	(a0)+,(a1)+			; Dos-Befehl kopieren
	bne	.copy_command
	
	lea	-1(a1),a1
	move.l	reqtoolsrequest(pc),a0
	lea	Filename(pc),a0			; File kopieren

.copy_drawer
	move.b	(a0)+,(a1)+			; Pfad kopieren
	bne	.copy_drawer
	
	move.l	Path(pc),a0	
	move.w	#Memsize-2,d7
.loop
	move.b	(a0),d0
	tst.b	d0
	beq	.set_foot
	lea	1(a0),a0
	dbra	d7,.loop

.set_foot
	move.b	#34,(a0)+
	move.b	#0,(a0)+

.all_done
	move.l	#0,d0				; nix ausgewählt!
	rts

.no_file					; und raus hier...
	move.l	#1,d0
	rts

*************************************************************************
*									*
*	ASL - Filerequester öffnen					*
*									*
*************************************************************************

reqdrawer	= 8
reqfile		= 4

Select_ASLFile
	move.l	_AslBase(pc),a6
	move.l	request(pc),a0
	sub.l	a1,a1
	jsr	AslRequest(a6)		; Filerequester öffnen
	tst.l	d0
	beq	.no_file

	move.l	request(pc),a0
	move.l	reqdrawer(a0),lockname

	move.l	Command(pc),a0
	move.l	Path(pc),a1
	
.copy_command
	move.b	(a0)+,(a1)+		; Dos-Befehl kopieren
	bne	.copy_command
	
	lea	-1(a1),a1
	move.l	request(pc),a0
	move.l	reqfile(a0),a0	 
		
.copy_exedrawer
	move.b	(a0)+,(a1)+		; File kopieren
	bne	.copy_exedrawer
	
	move.l	Path(pc),a0	
	move.w	#Memsize-2,d7
.loop2
	move.b	(a0),d0
	tst.b	d0
	beq	.set_foot
	lea	1(a0),a0
	dbra	d7,.loop2

.set_foot
	move.b	#34,(a0)+
	move.b	#0,(a0)+
	
.all_done
	move.l	#0,d0			; nix ausgewählt
	rts

.no_file
	move.l	#1,d0			; und raus hier...
	rts

*************************************************************************
*									*
*	Lock & Verzeichnis - Routinen					*
*									*
*************************************************************************

set_dir
	move.l	#0,OldDir
	move.l	_DosBase(pc),a6		; Lock auf Verzeichnis holen
	move.l	lockname,d1
	move.l	#ACCESS_READ,d2
	jsr	Lock(a6)
	move.l	d0,Filelock		

	move.l	_DosBase(pc),a6		; Neues Verzeichnis setzen
	move.l	Filelock,d1		; (Altes merken)
	jsr	CurrentDir(a6)
	move.l	d0,OldDir
	rts
	
set_olddir
	move.l	_DosBase(pc),a6		; altes Verzeichnis setzen
	move.l	OldDir,d1
	jsr	CurrentDir(a6)

	move.l	_DosBase,a6		; Lock wieder freigeben
	move.l	Filelock,d1
	jsr	UnLock(a6)
	move.l	#0,lockname
	rts
			
*************************************************************************
*									*
*	Daten								*
*									*
*************************************************************************
*
*	section "StartupControl_Daten",data_p
*

intuitionname
	dc.b	"intuition.library",0
	even
dosname
	dc.b	"dos.library",0
	even
aslname
	dc.b	"asl.library",0
	even
reqtoolsname
	dc.b	"reqtools.library",0
	even
	
_IntuitionBase	ds.l	1
_DosBase	ds.l	1
_AslBase	ds.l	1
_ReqToolsBase	ds.l	1

CLI_Parameter	ds.l	1
use_reqtools	ds.w	1
use_pal		ds.w	1

reqtoolsrequest	ds.l	1

Path		ds.l	1
lockname	ds.l	1
Filelock	ds.l	1
OldDir		ds.l	1

Command		ds.l	1
request		ds.l	1
Filename	ds.b	110

	dc.b 	"$VER: StartupControl",160,"V1.2",160,"(",160
	DATE 4
	dc.b	160,")",0
	even

EnabledWB
	dc.b	"SYS:WBStartup",0
	even
DisabledWB
	dc.b	"SYS:#WBStartup",0
	even

EnabledWBinfo
	dc.b	"SYS:WBStartup.info",0
	even
DisabledWBinfo
	dc.b	"SYS:#WBStartup.info",0
	even

EnabledUser
	dc.b	"SYS:S/User-Startup",0
	even
DisabledUser
	dc.b	"SYS:S/#User-Startup",0
	even

EnabledMonitors
	dc.b	"SYS:Devs/Monitors",0
	even
DisabledMonitors
	dc.b	"SYS:Devs/#Monitors",0
	even
EnabledMonitorsinfo
	dc.b	"SYS:Devs/Monitors.info",0
	even
DisabledMonitorsinfo
	dc.b	"SYS:Devs/#Monitors.info",0
	even


NewShell
	dc.b	"NewShell",0
	even
Script:
	dc.b	"execute >NIL: ",34,0
	even
Executable:
	dc.b	"run >NIL: ",34,0
	even

Load_exe:
	dc.b	"Select an executable...",0
	even
Load_script:
	dc.b	"Select a scriptfile...",0
	even
	
MyEasyStruc:	dc.l 0
		dc.l 0
		dc.l MyTitel
		dc.l MyText
		dc.l MyButton
		even
		
MyTitel:	dc.b "StartupControl V1.2 © 1995-1996 Dirk Jesse ("
		DATE 4
		dc.b ") AMIGA is alive",0
		even
MyText:		dc.b "Select one of the following functions:",10,10
		dc.b "WB+User    disables WBStartup and User-Startup",10
		dc.b "WB         disables WBStartup only",10
		dc.b "User       disables User-Startup only",10
		dc.b "Shell      opens a shell window",10
		dc.b "Script     lets you execute a scriptfile",10
		dc.b "Exe        to run an executable file",10
		dc.b "Cancel     aehhhmmm... - go away!",0
		even
MyButton:	dc.b "WB+User|WB|User|Shell|Script|Exe|Cancel",0
		even

MyText2:	dc.b "Select one of the following functions:",10,10
		dc.b "WB+User    disables WBStartup and User-Startup",10
		dc.b "WB         disables WBStartup only",10
		dc.b "User       disables User-Startup only",10
		dc.b "Shell      opens a shell window",10
		dc.b "Script     lets you execute a scriptfile",10
		dc.b "Exe        to run an executable file",10
		dc.b "PAL only   forces standard PAL screenmode (TV friendly)",10
		dc.b "Cancel     aehhhmmm... - go away!",0
		even
MyButton2:	dc.b "WB+User|WB|User|Shell|Script|Exe|PAL only|Cancel",0
		even


********	CLI Helppage	********

CLI_filehandle:	dc.l	0
CLI_name:	dc.b	"*",0
		even
CLI_text:	dc.b	$9b,"1;32;31mStartupControl V1.2 Copyright © 1995,96 Dirk Jesse",10
		dc.b	$9b,"0;32;31mThis is released as Mailware",10,10
		dc.b	"USAGE: StartupControl [Options]",10,10
		dc.b	"       Options:  ?     shows this text",10
		dc.b	"                -r     use ReqTools Filrequester",10
		dc.b	10,0                
CLI_endtext:
		even
		
Error_text:	dc.b	"Sorry! I need reqtools.library V38.xxx",10
		dc.b	10,0                
Error_endtext:
		even

	END
		
