*=- PROGRAM INFORMATION -=*************************************************************
* DopusFuncs, ©1996 Leo Davidson						      *
*=====================================================================================*
* Purpose: Conversion of the DirToDest, ParentToDest, WinCopy and WinSwap scripts.    *
*	   This program does various operations on the paths of the source/dest	      *
*	   listers under DOpus5.						      *
*	   It (will) also include any _small_ functions which are thought of.	      *
***************************************************************************************

*=- ASSEMBLE-TIME SWITCHES -=**********************************************************
* Comment out to disable the effect(s) described.                                     *
***************************************************************************************
;Beta_Version		; Include Debug-Labels, Beta messages, etc.
;Beta_Version_ARexx	; Include runtime-info about ARexx messages sent.
DOpus5_Error		; Enable Error messages via DOpus5/"dopus request".
;Test_Pool_On_OS3	; Force use of non-ROM pool routines, even with OS3+.
;No_Requesters		; Disable all requester-based output.
			; All error messages will be sent to shell.
			; Will also turn off "Please insert volume XXX" reqs.
Default_Req		; Make requesters the default for error messages.

*=- VERSION INFORMATION -=*************************************************************
* Things like versions numbers, dates, and the name of the program are all defined    *
* here as macros to save having to edit the entire source code.                       *
*=====================================================================================*
* The version strings should conform to the style guide. (Even though I think it      *
* isn't the best way to do it, it's a standard :-(  ).                                *
***************************************************************************************
PROGNAM	MACRO				Program name.
	dc.b	"DOpusFuncs"		/No spaces!/
	ENDM
VERSION	MACRO				The version of the program.
	dc.b	"1.6"			version.revision - /No leading zeros/
	ENDM
REVDATE	MACRO				Date of completion.
	dc.b	"6.1.96"		DD.MM.YY - /No leading zeros/
	ENDM
REVDAT2	MACRO				Date of completion.
	dc.b	"06-Jan-1996"		/Any format/ (Not in $VER string)
	ENDM
*=- ASSEMBLER INFORMATION/OPTIONS -=***************************************************
	Section	Super_Main,Code		Assemble to Public Memory.
	IFD	Beta_Version		-.
	Opt	D+			 |
	Opt	hcln			 |_ Debug info ON
	ELSE				 |  for Beta Versions.
	Opt	D-			 |
	ENDC				-'
***************************************************************************************
	Bra	ProgBeg			Jump to the start of the program.
***************************************************************************************
VerStr	Dc.b	"$VER: "		-.
	PROGNAM				 |
	IFD	Beta_Version		 |
	Dc.b	"_DEBUG"		 |
	ENDC				 |_ For 2.0+ Version Command
	Dc.b	" "			 |  (At the top to make "Version"
ActVer	VERSION				 |  find it quicker!)
	Dc.b	" ("			 |
	REVDATE				 |
	Dc.b	")",0			-'
	Even
;=====================================================================================;
;	Include	Asm:Include/Nudel_Constants.i
;
;	include	dos/dos.i
;	include	dos/var.i
;	include	exec/types.i
;	include	exec/nodes.i
;	include	exec/memory.i
;	include	rexx/storage.i
;	include	intuition/intuition.i
;	include	intuition/intuitionbase.i
;	include	libraries/iffparse.i
;
;	include	ASM:LVO3.0/dos_lib.i
;	include	ASM:LVO3.0/exec_lib.i
;	include	ASM:LVO3.0/intuition_lib.i
;	include	ASM:LVO3.0/rexxsyslib_lib.i
;	include	ASM:LVO3.0/utility_lib.i
;	include	ASM:LVO3.0/iffparse_lib.i
;	include	ASM:LVO3.0/mathieeedoubbas_lib.i
;	include	ASM:LVO3.0/graphics_lib.i

	Include	Nudel_Symbols.gs
***************************************************************************************
* The Variables (Address Equates for Space allocated at program start)                *
***************************************************************************************
	RSReset
	IFND	No_Requesters
;=====================================================================================;
N_EasyStruct	Equ	__RS		;- EasyStruct for EasyRequest ----------------;
;=====================================================================================;
N_ES_Length	Rs.l	1		Length of the structure.
N_ES_Flags	Rs.l	1		Flags (not currently supported).
N_ES_Title	Rs.l	1		Ptr to NullTerm Title Text.
N_ES_Body	Rs.l	1		Ptr to NullTerm Body Text.
N_ES_Gadgets	Rs.l	1		Prt to Gadget(s) Texts.
N_EasyStruct_Len	Equ	(__RS)-N_EasyStruct
	ENDC

;=====================================================================================;
; Nudel Info-Block Stuff							      ;
;=====================================================================================;
FakeNIB		Rs.b	NIB_SizeOf	;- Fake NIB for setting pseudo-filenames -----;
FakeNIB_Adrs	Rs.l	1		Address of FakeNIB (saves a few "lea"'s).
Active_NIB	Rs.l	1		Ptr to currently "Active" NIB, or null.
Base_NIB	Rs.l	1		Ptr to base NIB in linked list, or null.
Last_NIB	Rs.l	1		Ptr to last NIB in linked list, or null.
CAction		Rs.l	1		Ptr to current "Action" error message.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
BaseDir_NIB	Rs.l	1		Ptr to NIB for the Lock() on source-lister dir.
ParentDir_NIB	Rs.l	1		Ptr to NIB for the Lock() on the parent dir.
;=====================================================================================;

;=====================================================================================;
; READARGS() STUFF								      ;
;=====================================================================================;
RDA_Rtn		Rs.l	1		Pointer to returned RDArgs structure
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
RDA_Array	Equ	__RS		Array of longwords matching template
RDA_Template	Equ	*
RexxPort_A	Rs.l	1
		Dc.b	"RP=REXXPORT/A,"
ClipEntry_KM	Rs.l	1
		Dc.b	"CLIPENTRY/K/M,"
DirToDest_S	Rs.l	1
		Dc.b	"DIRTODEST/S,"
ParentToDest_S	Rs.l	1
		Dc.b	"PARENTTODEST/S,"
WinCopy_S	Rs.l	1
		Dc.b	"WINCOPY/S,"
WinSwap_S	Rs.l	1
		Dc.b	"WINSWAP/S,"
NewSource_S	Rs.l	1
		Dc.b	"NEWSOURCE/S,"
SourceDir_K	Rs.l	1
		Dc.b	"SOURCEDIR/K,"
SourcePos_K	Rs.l	1
		Dc.b	"SOURCEPOS/K,"
SourceLock_S	Rs.l	1
		Dc.b	"SOURCELOCK/S,"
NewDest_S	Rs.l	1
		Dc.b	"NEW=NEWDEST/S,"
DestDir_K	Rs.l	1
		Dc.b	"DIR=DESTDIR/K,"
DestPos_K	Rs.l	1
		Dc.b	"POS=DESTPOS/K,"
DestLock_S	Rs.l	1
		Dc.b	"LOCK=DESTLOCK/S,"
NoFront_S	Rs.l	1
		Dc.b	"NOFRONT/S,"
NoNew_S		Rs.l	1
		Dc.b	"NONEW/S"
RDA_Temp_Len	Equ	*-RDA_Template
		Dc.b	0
		Even
;=====================================================================================;
; OPEN_LIBRARIES STRUCTURES							      ;
;=====================================================================================;
LibBases_Start	Equ	__RS
LibData_Start	Equ	*
; NOTE: The open_lib_error routine requires lib-versions < 100

N_DOSBase	Rs.l	1
DOSName_Ptr	Dc.l	N_DOSName-LibNames_Start
DOSVers		Dc.l	37

N_RexBase	Rs.l	1
RexName_Ptr	Dc.l	N_RexName-LibNames_Start
RexVers		Dc.l	0

N_IFFBase	Rs.l	1
IFFBase_Ptr	Dc.l	N_IFFName-LibNames_Start
IFFVers		Dc.l	37
	IFND	No_Requesters
N_IntBase	Rs.l	1
IntBase_Ptr	Dc.l	N_IntName-LibNames_Start
IntVers		Dc.l	37
	ENDC
LibBases_Finish	Equ	__RS
NumLibs	Equ	(LibBases_Finish-LibBases_Start)/4
;-------------------------------------------------------------------------------------;
LibNames_Start	Equ	*
N_DOSName	DOSNAME
N_RexName	REXXSYSLIBNAME
N_IFFName	IFFPARSENAME
	IFND	No_Requesters
N_IntName	INTNAME		Required by Open_Libraries_Error rtn.
	ENDC
	Even
;=====================================================================================;
; FLAG BYTES									      ;
;=====================================================================================;
STD_F_1		Rs.b	1		Standard files.
EVEN_F_1	Rs.b	1		(Here as an Even)
;=====================================================================================;
; VARIOUS DATA									      ;
;=====================================================================================;
DosRtnC		Rs.l	1		Return code for DOS. (-> d0 at end)
;=====================================================================================;
; RawDoFmt() Stuff								      ;
;=====================================================================================;
;	IFD	DATA_RAWDOFMT
RDF_Size	Rs.l	1		Size of RawDoFmt() buffer.
RDF_Adrs	Rs.l	1		Address of RawDoFmt() buffer.
RDF_Array	Equ	__RS
RDF_1_Long	Rs.l	1		-.
RDF_2_Long	Rs.l	1		 |_ DataArray for RawDoFmt()
RDF_3_Long	Rs.l	1		 |  *MUST* *ALL* be *LONGWORDS*
RDF_4_Long	Rs.l	1		-'
;	ENDC
;=====================================================================================;
; VARIOUS ADDRESS-POINTERS, ETC							      ;
;=====================================================================================;
StarStk		Rs.l	1		Original Stack Pointer.
PoolHead	Rs.l	1		Header for program's memory pool.
CLI_Hdl		Rs.l	1		Output CLI (or whatever) handle.
NudelPort	Rs.l	1		Pointer to our MsgPort.
NudelRexxMsg	Rs.l	1		Pointer to our RexxMsg.
CRexxPort	Rs.l	1		Ptr to name of current Rexx host to talk to.
NudelIFFHandle	Rs.l	1		Pointer to our IFFHandle.
NudelClipboardHandle Rs.l 1		Pointer to out Clipboard Handle (iffparse)
;=====================================================================================;
; Temp Storage and Buffers							      ;
;=====================================================================================;
Buffer1Len	Equ	1024
Buffer1		Rs.b	Buffer1Len	Buffer for anything
Buffer2Len	Equ	1024
Buffer2		Rs.b	Buffer2Len	Buffer for anything

	IFD	Beta_Version_ARexx
BufferALen	Equ	1024
BufferA		Rs.b	BufferALen	Buffer for ARexx beta messages.
	ENDC

Source_HandleLen Equ	42
Source_Handle	Rs.b	Source_HandleLen
Dest_HandleLen	Equ	42
Dest_Handle	Rs.b	Dest_HandleLen
DirName1BufferLen Equ	80			AmigaDOS limit is 30 chars,
DirName1Buffer	Rs.b	DirName1BufferLen	but maybe OpusFTP w/ UNIX?

PathBuffer1Len	Equ	512
PathBuffer1	Rs.b	PathBuffer1Len
PathBuffer2Len	Equ	512
PathBuffer2	Rs.b	PathBuffer2Len


Temp001		Rs.l	1		-._ For temp storage
Temp002		Rs.l	1		-'  in routines.
;=====================================================================================;
NULLEND		Equ	__RS		;- Overlays Start Here -----------------------;
;=====================================================================================;
;=====================================================================================;
LENVARS		Equ	__RS		;- End of variables/overlays -----------------;
;=====================================================================================;

*=- MAIN PROGRAM -=********************************************************************
* Calls the subroutines.							      *
***************************************************************************************
ProgBeg	Bsr.s	Setup			Allocate Mem and initialize stuff.
	Bsr	NewSource		Open a new Source lister, if required.
	Bsr	NewDest			Open a new Destination lister, if required.
	Bsr	ClipEntry		-.
	Bsr	DirToDest		 |
	Bsr	ParentToDest		 |- Perform the
	Bsr	WinCopy			 |  requested action(s)
	Bsr	WinSwap			-'
	Bra	Finish			Close/Deallocate everything and exit.

*=- SETUP -=***************************************************************************
* Allocate Memory, Open Libraries, Parse Commandline, etc			      *
* This MUST be the first Subroutine run.					      *
***************************************************************************************
Setup	Move.l	#MEMF_PUBLIC!MEMF_CLEAR,d0	Public, Cleared mem.
	Move.l	#5120,d1			Puddle size = 5k.
	Move.l	#5120,d2			Thresh size = Puddle size.
	Bsr	AsmCreatePool			Create this prog's mem pool.
	Move.l	a0,-(SP)		Preserve PoolHeader
	Bne.s	SGotMm1			-.
	Addq.l	#4,a7			 |_ If Allocation failed, Quick Exit.
	Moveq	#RETURN_FAIL,d0		 |  pool and do a quick exit.
	RTS				-'
SGotMm1	Move.l	#LENVARS,d0		Size of variables' memory
;;;;;;;	Move.l	a0,a0			PoolHeader to a0 for allocation.
	Bsr	AsmAllocPooled		Allocate for the variables.
	Move.l	(SP)+,a0		Restore PoolHeader
	Move.l	d0,a5			Put variable/overlay address into A5
	Tst.l	d0			(Moves to a? don't set CCR).
	Bne.s	SGotMm2			-.
	Bsr	AsmDeletePool		 |
	Addq.l	#4,a7			 |- If Allocation failed, delete the
	Moveq	#RETURN_FAIL,d0		 |  pool and do a quick exit.
	RTS				-'
SGotMm2	Move.l	a0,PoolHead(a5)		Store header of memory pool.
	Lea	FakeNIB(a5),a0		-._ Store address of FakeNIB(a5)
	Move.l	a0,FakeNIB_Adrs(a5)	-'  for quick access later.
	Move.l	#RETURN_OK,DosRtnC(a5)	Default DOS return code: "OK".
	IFD	LENOVER
	Lea	NULLEND(a5),a0		-.
	Lea	Over01(pc),a1		 |  Copy Overlay
	Move.l	#(LENOVER/2)-1,d0	 |- Backings onto
OverPrL	Move.w	(a1)+,(a0)+		 |  Overlay Space (word moves)
	DBra	d0,OverPrL		-'
	ENDC
;=====================================================================================;
	Move.l	a7,StarStk(a5)		Store Stack Pointer
	Addq.l	#4,StarStk(a5)		Compensate for this being a subrout.
	IFND	No_Requesters
	SetReqDefault			Set default to requester/shell.
	ENDC
	Bsr	Open_Libraries		Open libraries.
	N_CallDOS	Output		-._ Get output Handle
	Move.l	d0,CLI_Hdl(a5)		-'  (CLI window or whatever)

;;;;;;;	Setup any non-zero default values for switch options here (below).
	Bsr	RArgNor			Parse the commandline with ReadArgs
;=====================================================================================;
	Tst.l	NoNew_S(a5)
	Bne.s	NoNew_S_Skip
	BSet	#SF1_NewListers,STD_F_1(a5)	Get(Source|Dest)Handle: Allow new listers
NoNew_S_Skip

	Move.l	RexxPort_A(a5),CRexxPort(a5)	RexxPort from CommandLine.

	Bra.s	CreateNudelPort		Create our MsgPort.
;;;;;;;	RTS for us.

*=- FINISH -=**************************************************************************
* Close Everything Down, Return Memory Etc to System and End Program		      *
*=====================================================================================*
* All routines in this section MUST make sure that what they are about to free back   *
* to the system has actually been taken in the first place! (With the exception of    *
* the Main-Variable memory: if this could not be allocated the program will have      *
* quit without calling Finish.)							      *
*=====================================================================================*
* The Finish routine may be called from sub-routines at any level because the	      *
* original stack-pointer is restored so that RTS always quits the prog.		      *
***************************************************************************************
Finish
	IFD	Beta_Version
	Bsr_ErrorN	ErrAct_FinishBetaMsg(pc),#0
	ENDC

	Bsr	CloseNudelIFF		Close our IFFhandle.
	Bsr	FreeNudelIFF		Free our IFFHandle.
	Bsr	CloseNudelClipboard	Close the Clipboard.
	Bsr	DeleteNudelRexxMsg	Delete our RexxMsg (also clears arguments).
	Bsr.s	DeleteNudelPort		Delete our MsgPort.
	Bsr	NIBs_DeleteAll		Delete all Nudel-Info-Blocks.
	Bsr	FArgNor			Free the commandline related memory.
	Bsr	Close_Libraries		Close all open libraries.
	Move.l	StarStk(a5),a7		Ignore all Branches.
	Move.l	DosRtnC(a5),-(SP)	Store DOS return code...
	Bsr	LeoDeletePool		Free the entire memory pool.
	Move.l	(SP)+,d0		Return code to d0 for DOS.
	RTS				End Program

	IFD	Beta_Version
ErrAct_FinishBetaMsg
	Dc.b	"Finish routine run",0
	Even
	ENDC

*=- EXTERNAL SUB-ROUTINES -=***********************************************************
* Sub-routines stored in external "library" files.				      *
***************************************************************************************
;=====================================================================================;
; OS Subroutines.								      ;
;=====================================================================================;
SYS_CLIRITE	; Write text using CLI_Hdl(a5) as output handle.
SYS_READARG	; ReadArgs() routine.
SYS_FREEARG	; FreeArgs() routine.
SYS_CHKCRTC	; Check for ^C-Break and abort program if sent.
SYS_PORTS	; CreateMsgPort(), DeleteMsgPort() routines.
	Include	ASM:Source/Routines/System.s
;=====================================================================================;
; Data Subroutines. (Number/String Handling, etc etc)				      ;
;=====================================================================================;
DATA_NULLLEN	; Calculate the length of a Null-Term String.
DATA_JOINNT	; Join two null-terminated strings.
DATA_JOINARRAY	; Join together an array of strings.
DATA_COPYCN3	; Copy chars with Null-Term, don't copy Null, no Length
DATA_CHARCNT	; Copy x chars with Null-Term
DATA_CHARCOPNL	; Copy x chars with Null-Term and specified terminator.
DATA_NUM2ASC	; Raw Number to ASCII conversion.
DATA_RAWDOFMT	; RawDoFmt() routine.
	Include	ASM:Source/Routines/Data.s
;=====================================================================================;
; NudelInfoBlock Subroutines.							      ;
;=====================================================================================;
NIBR_UNLOCK	; DOS/UnLock
NIBR_LOCK	; DOS/Lock
	Include	ASM:Source/Routines/NIB.s
;=====================================================================================;
; Directory Opus 5 Subroutines.							      ;
;=====================================================================================;
DO5_GetSource	; Get first source handle.
DO5_GetDest	; Get first destination handle.
DO5_GetPath	; Get the path of a lister.
DO5_GetFSelDir	; Get first selected directory in a lister.
;DO5_GetFSelEnt	; Get first selected entry in a lister.
DO5_SetPath	; Set (read) a new path into a lister.
DO5_Refesh	; Refresh a lister.
DO5_Select	; (De)select a lister entry.
DO5_NewLister	; Open a new lister.
DO5_ListerSet	; Generic "Lister Set..." command.
DO5_GenError	; Error message for things which really shouldn't go wrong.
DO5_CopyLister	; Copy a lister.
DO5_ListerWait	; Wait for a lister to finish what it's doing.
DO5_DOpusFront	; Move the DOpus screen to the front, unless "NoFront/S"
	Include	ASM:Source/Routines/DOpus5_ARexx.s
;=====================================================================================;
; Other routines.								      ;
;=====================================================================================;
	Include	ASM:Source/Routines/ARexx.s
	Include	ASM:Source/Routines/Pool.s
	Include	ASM:Source/Routines/OpenLibraries.s
	Include Asm:Source/Routines/Clipboard.s
***************************************************************************************
	Include	ASM:Source/DOpusFuncs/NewLister.s
	Include	ASM:Source/DOpusFuncs/ClipEntry.s
	Include	ASM:Source/DOpusFuncs/DirToDest.s
	Include	ASM:Source/DOpusFuncs/ParentToDest.s
	Include	ASM:Source/DOpusFuncs/WinCopy.s
	Include	ASM:Source/DOpusFuncs/WinSwap.s
