;*******************************************************************************
; Title:	EveryWhere
; Author:	Dave Lawrence and DA
; Copyright:	(C) Philip Ludlam 2006
; Version:	1.01, 7 May 2006
;
; Changes:	Updated for the A9home by Philip Ludlam
;
;*******************************************************************************
; This program is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the Free
; Software Foundation; either version 2 of the License, or (at your option)
; any later version.
;
; This program is distributed in the hope that it will be useful, but WITHOUT
; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
; FITNESS FOR APARTICULAR PURPOSE. See the GNU General Public License for more
; details.
;
; You should have received a copy of the GNU General Public License along with
; this program; if not, write to the Free Software Foundation, Inc., 59 Temple
; Place - Suite 330, Boston, MA 02111-1307, USA
;
;*******************************************************************************


		TTL	> EveryWhere

		GET	OSLib:oslib.hdr.OS
		GET	OSLib:oslib.hdr.OSArgs
		GET	OSLib:oslib.hdr.OSGBPB
		GET	OSLib:oslib.hdr.OSFSControl
		GET	AsmLib2:hdr.RegsBoth

command		*	&0
table		*	&100
docom		*	&140
dir		*	&200
csd		*	&300
cmd_c		*	&0
cmd_h		*	&4
cmd_d		*	&8
cmd_v		*	&C
cmd_f		*	&10
cmd_t		*	&14
cmd_q		*	&18
cmd_s		*	&1C
cmd_n		*	&20

		AREA	|main|, CODE, READONLY

		ENTRY

;-------------------------------------------------------------------------------

Start		B	Entry			; Entry instruction
		DCD	&79766748		; Magic value 1
		DCD	&216C6776		; Magic value 2
		DCD	Data-Start		; Read only size
		DCD	End-Data		; Read/write size
		DCD	32			; 26 or 32 bit build

Entry

alldirs
		STMFD	sp!, {lr}
		ADD	R10, wp, #command
		LDRB	R0, [R1]
		CMP	R0, #32
		BLT	showhelp
		MOV	R2, #0

copypars
		LDRB	R0, [R1, R2]
		CMP	R0, #32
		MOVLT	R0, #13
		STRB	R0, [R10, R2]
		ADD	R2, R2, #1
		BGE	copypars
		STR	R2, comend
		STR	sp, stack
		ADRL	R0, key
		ADD	R1, wp, #command
		ADD	R2, wp, #table
		MOV	R3, #256
		SWI	XOS_ReadArgs
		LDMVSFD sp!, {pc}
		LDR	R1, [wp, #table+cmd_n]
		CMP	R1, #0
		STRNE	R1, [wp, #table+cmd_v]
		LDR	R1, [wp, #table+cmd_t]
		CMP	R1, #0
		BEQ	notype
		MVN	R0, #0
		STR	R0, [wp, #table+cmd_f]
		MOV	R0, #31
		SWI	XOS_FSControl
		BVC	gottype
		MOV	R0, #16
		ORR	R0, R0, #1<<29
		LDR	R1, [wp, #table+cmd_t]
		MOV	R2, #&1000
		SUB	R2, R2, #1
		SWI	XOS_ReadUnsigned
		LDMVSFD sp!, {pc}

gottype
		STR	R2, type

notype
		LDR	R1, [wp, #table+cmd_c]
		CMP	R1, #0
		STREQB	R1, [wp, #command]
		BEQ	nocommandgiven
		ADD	R10, wp, #command
		MOV	R2, #0

copycom
		LDRB	R0, [R1, R2]
		STRB	R0, [R10, R2]
		ADD	R2, R2, #1
		CMP	R0, #32
		BGE	copycom
		STR	R2, comend

nocommandgiven
		LDR	R0, [wp, #table+cmd_h]
		CMP	R0, #0
		BEQ	nothlp

showhelp
		ADR	R0, helpmess
		MOV	R1, #0
		SWI	OS_PrettyPrint
		LDMFD	sp!, {pc}

nothlp
		MOV	R10, #0

getpath
		MOV	R0, #6
		ADRL	R2, fileblock
		SWI	XOS_GBPB
		LDRVS	sp, stack
		LDMVSFD sp!, {pc}
		ADD	R2, R2, #1
		BL	copyname
		CMP	R0, #"$"
		BEQ	reachedroot
		MOV	R0, #"."
		BL	addchar
		MOV	R0, #0
		ADR	R1, up
		SWI	XOS_FSControl
		B	getpath

reachedroot
		MOV	R0, #5
		ADRL	R2, fileblock
		SWI	XOS_GBPB
		LDRVS	sp, stack
		LDMVSFD sp!, {pc}
		LDRB	R1, [R2]
		CMP	R1, #0
		BEQ	adiscwithnoname
		MOV	R0, #"."
		BL	addchar
		BL	copyname
		MOV	R0, #":"
		BL	addchar

adiscwithnoname
		MOV	R0, #0
		MOV	R1, #0
		MOV	R2, #0
		SWI	XOS_Args
		MOV	R1, R0
		MOV	R0, #33
		ADRL	R2, fileblock
		MOV	R3, #16
		SWI	XOS_FSControl
		MOV	R0, #":"
		BL	addchar
		MOV	R1, #0

find0
		LDRB	R0, [R2, R1]
		ADD	R1, R1, #1
		CMP	R0, #0
		BNE	find0
		SUB	R2, R2, #1
		SUB	R1, R1, #1
		BL	copyloop
		ADD	R1, wp, #csd

makecsd
		LDRB	R0, [sp], #1
		STRB	R0, [R1], #1
		SUBS	R10, R10, #1
		BNE	makecsd
		MOV	R0, #13
		STRB	R0, [R1]
		LDR	R2, [wp, #table+cmd_d]
		CMP	R2, #0
		LDREQ	R0, root
		STREQ	R0, [wp, #dir]
		MOVEQ	R9, #1
		BEQ	gotdir
		ADD	R1, wp, #dir
		MOV	R9, #0

cpydir
		LDRB	R0, [R2, R9]
		CMP	R0, #32
		MOVLT	R0, #0
		STRB	R0, [R1, R9]
		ADD	R9, R9, #1
		BGE	cpydir
		SUB	R9, R9, #1

gotdir
		BL	dodirectory

gotocsd
		MOV	R0, #0
		ADD	R1, wp, #csd
		SWI	XOS_FSControl
		LDMFD	sp!, {pc}

dodirectory
		STMFD	sp!, {lr}
		SWI	XOS_ReadEscapeState
		BCC	notescape
		MOV	R0, #0
		ADD	R1, wp, #csd
		SWI	XOS_FSControl
		LDR	sp, stack
		ADR	R0, escape
		SWI	XOS_GenerateError
		LDMFD	sp!, {pc}

escape
		DCD	17
		DCB	"Escape", 0
		ALIGN

notescape
		LDR	R0, [wp, #table+cmd_v]
		CMP	R0, #0
		BEQ	dontshowinfo
		SWI	XOS_WriteS
		DCB	"*Dir "
		DCB	0
		ALIGN
		ADD	R0, wp, #dir
		MOV	R1, R9
		SWI	XOS_WriteN
		SWI	XOS_NewLine

dontshowinfo
		BL	seldir
		LDR	R0, [wp, #table+cmd_f]
		CMP	R0, #0
		BNE	filemode
		ADD	R1, wp, #command
		LDR	R2, [wp, #table+cmd_v]
		CMP	R2, #0
		BEQ	dontshowcom1
		SWI	OS_WriteI + "*"
		MOV	R0, R1
		SWI	XOS_Write0
		SWI	XOS_NewLine

dontshowcom1
		MOV	R0, R1
		BL	oscli

filemode
		MOV	R4, #0

readnames
		MOV	R0, #10
		ADD	R1, wp, #dir
		ADRL	R2, fileblock
		MOV	R3, #1
		MOV	R5, #32
		MOV	R6, #0
		SWI	XOS_GBPB
		CMP	R4, #0
		LDMLTFD sp!, {pc}
		LDR	R0, obtype
		CMP	R0, #1
		BNE	notfile
		LDR	R0, [wp, #table+cmd_f]
		CMP	R0, #0
		BEQ	readnames
		LDR	R0, type
		CMP	R0, #0
		BLT	anytype
		LDR	R1, loadad
		MOV	R1, R1, ASL #12
		MOV	R1, R1, LSR #20
		CMP	R0, R1
		BNE	readnames

anytype
		STMFD	sp!, {R4}
		BL	seldir
		ADR	R0, obname
		ADD	R1, wp, #docom
		MOV	R2, #192
		ADD	R3, wp, #command
		LDR	R4, comend
		SWI	XOS_SubstituteArgs
		LDRVS	sp, stack
		LDMVSFD sp!, {pc}
		LDR	R2, [wp, #table+cmd_v]
		CMP	R2, #0
		BEQ	dontshowcom2
		SWI	OS_WriteI + "*"
		MOV	R0, R1
		SWI	XOS_Write0
		SWI	XOS_NewLine

dontshowcom2
		MOV	R0, R1
		BL	oscli
		LDMFD	sp!, {R4}
		B	readnames

notfile
		CMP	R0, #2
		BNE	readnames
		LDR	R0, [wp, #table+cmd_s]
		CMP	R0, #0
		BNE	readnames
		STMFD	sp!, {R4, R9}
		ADR	R10, obname
		ADD	R11, wp, #dir
		MOV	R0, #"."
		STRB	R0, [R11, R9]

adddirname
		ADD	R9, R9, #1
		LDRB	R0, [R10], #1
		STRB	R0, [R11, R9]
		CMP	R0, #0
		BNE	adddirname
		MOV	R0, #13
		STRB	R0, [R11, R9]
		BL	dodirectory
		LDMFD	sp!, {R4, R9}
		ADD	R11, wp, #dir
		MOV	R0, #13
		STRB	R0, [R11, R9]
		B	readnames

copyname
		LDRB	R1, [R2]

copyloop
		LDRB	R0, [R2, R1]
		STRB	R0, [sp, #-1]!
		ADD	R10, R10, #1
		SUBS	R1, R1, #1
		BNE	copyloop
		MOV	pc, lr

addchar
		STRB	R0, [sp, #-1]!
		ADD	R10, R10, #1
		MOV	pc, lr

seldir
		STMFD	sp!, {lr}
		MOV	R0, #0
		ADD	R1, wp, #dir
		SWI	XOS_FSControl
		LDRVS	sp, stack
		LDMFD	sp!, {pc}

oscli
		LDR	R1, [wp, #table+cmd_n]
		CMP	R1, #0
		BNE	ok_exit
		SWI	XOS_CLI
		MOVVC	pc, lr
		LDR	R1, [wp, #table+cmd_q]
		CMP	R1, #0
		BNE	ok_exit
		LDR	sp, stack
		LDMFD	sp!, {lr}

ok_exit
		ClearFlags
		MOV	pc, lr

up		DCB	"^", 13
		ALIGN

root		DCB	"$", 13
		ALIGN

stack		DCD	0

key		DCB	"command,"
		DCB	"help/s,"
		DCB	"root/k,"
		DCB	"verbose/s,"
		DCB	"file/s,"
		DCB	"type/k,"
		DCB	"quiet/s,"
		DCB	"single/s,"
		DCB	"noexecute/s"
		DCB	13
		ALIGN

helpmess
		DCB	"Recursive command executer", 10, 13, 10, 13
		DCB	"Keywords:", 10, 13, 10, 13
		DCB	"Upper case indicates allowable abbreviation", 10, 13

		DCB	"-Command", 31, 31, 31
		DCB	": *Command to execute in each directory", 10, 13
		DCB	"-Root", 31, 31, 31, 31, 31, 31
		DCB	": Directory to start from (default = $)", 10, 13
		DCB	"-File", 31, 31, 31, 31, 31, 31
		DCB	": If present, execute command on each file", 10, 13
		DCB	"-Help", 31, 31, 31, 31, 31, 31
		DCB	": Display this help", 10, 13
		DCB	"-Noexecute", 31
		DCB	": Don't execute commands (sets -verbose option)", 10, 13
		DCB	"-Single", 31, 31, 31, 31
		DCB	": If present, apply to single level (don't recurse)", 10, 13
		DCB	"-Quiet", 31, 31, 31, 31, 31
		DCB	": If present, suppress error messages", 10, 13
		DCB	"-Type", 31, 31, 31, 31, 31, 31
		DCB	": Specify file type (sets -file option)", 10, 13
		DCB	"-Verbose", 31, 31, 31
		DCB	": If present, print each directory name", 10, 13
		DCB	0

licence		DCB	" DL & DA, 2002. Licence: GPL."
		ALIGN

Data

type		DCD	-1
comend		DCD	0
fileblock
loadad		DCD	0
execad		DCD	0
length		DCD	0
attrib		DCD	0
obtype		DCD	0
obname		DCD	0
		DCD	0
		DCD	0
		DCD	0

End

		END
