[comp.sys.amiga] Screen.c source for MRBackup

mrr@amanpt1.UUCP (Mark Rinfret) (02/07/88)

In my recent posting of MRBackup, I omitted the file Screen.c.  I sincerely
apologize for the omission.  I've posted it here to get it out as quickly
as possible.  By the way - I also found a bug (a typo) in Backup.c.  Look
for a statement beginning with:

	if ( ! CheckExclude( FIB->fib_FileName && ...

There should be a right paren after fib_FileName.  Natch, you'll have to
balance parens in the rest of the statement.  

For those who are interested, MRBackup 2.1 is ready for consumption.  I've
added the ability to test/set the file system archive bits (thanks to 
Steve Drew for the idea).  I've also changed the context saving routine to
use an external file and there's a new command, Resume Backup, which you
may find extremely useful.  Essentially, information about the state of the
backup list is saved to a file (S:MRBackup.context) as each new backup
floppy is started.  Should some non-recoverable error occur during a backup
(power failure, core meltdown, etc.) you can pick up where you left off
with the Resume Backup command.  Clever people will also discover that this
is a nifty way to backup a disjoint set of files (edit s:mrbackup.context,
then use Resume Backup).

I will probably not be posting any more source (since I can't seem to do
it right anyway :-) but it will remain available.  For anyone who wants it,
just mail me $2.00 and I'll send you whatever's "hot":

	Mark R. Rinfret
	348 Indian Avenue
	Portsmouth, RI 02871

Of course, that will include the most recent executable and docs.

Mark

P.S. I haven't gotten a response to my previous query regarding the endless
     retry situation with "Write to bad floppy".  Has anyone checked it out?


 


------------------- cut here ------------------------------------
struct NewScreen NewScreenStructure = {
	0,0,
	640,200,
	3,
	0,1,
	HIRES,
	CUSTOMSCREEN,
	NULL,
	(UBYTE *)"MRBackup V2.0, Mark Rinfret, 11/87",
	NULL,
	NULL
};

#define NEWSCREENSTRUCTURE NewScreenStructure

USHORT Palette[] = {
	0x0000,
	0x0FFF,
	0x0666,
	0x0F00,
	0x00F0,
	0x0B70,
	0x00FF,
	0x0F0F
#define PaletteColorCount 8
};

#define PALETTE Palette

UBYTE UNDOBUFFER[81];

UBYTE curVolumeGadgetSIBuff[31];
struct StringInfo curVolumeGadgetSInfo = {
	curVolumeGadgetSIBuff,
	NULL,
	0,
	31,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors1[] = {
	0,0,
	243,0,
	243,9,
	0,9,
	0,0
};
struct Border Border1 = {
	-2,-1,
	4,0,JAM1,
	5,
	BorderVectors1,
	NULL
};

struct IntuiText IText1 = {
	4,0,JAM2,
	0,-9,
	NULL,
	(UBYTE *)"Current Backup Volume Name",
	NULL
};

struct Gadget curVolumeGadget = {
	NULL,
	28,90,
	240,8,
	NULL,
	RELVERIFY,
	STRGADGET,
	(APTR)&Border1,
	NULL,
	&IText1,
	NULL,
	(APTR)&curVolumeGadgetSInfo,
	CURVOLUME,
	NULL
};

UBYTE errorGadgetSIBuff[6] =
	"0";
struct StringInfo errorGadgetSInfo = {
	errorGadgetSIBuff,
	NULL,
	0,
	6,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors2[] = {
	0,0,
	47,0,
	47,9,
	0,9,
	0,0
};
struct Border Border2 = {
	-2,-1,
	5,0,JAM1,
	5,
	BorderVectors2,
	NULL
};

struct IntuiText IText2 = {
	5,0,JAM2,
	-60,0,
	NULL,
	(UBYTE *)"Errors:",
	NULL
};

struct Gadget errorGadget = {
	&curVolumeGadget,
	272,55,
	44,8,
	GADGHBOX+GADGHIMAGE,
	NULL,
	STRGADGET,
	(APTR)&Border2,
	NULL,
	&IText2,
	NULL,
	(APTR)&errorGadgetSInfo,
	NULL,
	NULL
};

struct PropInfo gaugeGadgetSInfo = {
	AUTOKNOB+FREEHORIZ,
	0,-1,
	3276,-1,
};

struct Image Image1 = {
	0,0,
	7,4,
	0,
	NULL,
	0x0000,0x0000,
	NULL
};

struct IntuiText IText5 = {
	3,0,JAM2,
	114,9,
	NULL,
	(UBYTE *)"Full",
	NULL
};

struct IntuiText IText4 = {
	4,0,JAM2,
	1,9,
	NULL,
	(UBYTE *)"Empty",
	&IText5
};

struct IntuiText IText3 = {
	6,0,JAM2,
	11,-9,
	NULL,
	(UBYTE *)"Output Capacity",
	&IText4
};

struct Gadget gaugeGadget = {
	&errorGadget,
	25,55,
	144,8,
	NULL,
	RELVERIFY,
	PROPGADGET,
	(APTR)&Image1,
	NULL,
	&IText3,
	NULL,
	(APTR)&gaugeGadgetSInfo,
	GAUGE,
	NULL
};

USHORT ImageData2[] = {
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x8000,0x0000,0x0003,
	0xFFFF,0xFFFF,0xE000,0x0000,0x0007,0xFFFF,0xFFFF,0xF000,
	0x0000,0x001F,0xFFFF,0xFFFF,0xFC00,0x0000,0x003F,0xFFFF,
	0xFFFF,0xFE00,0x0000,0x00FF,0xFFFF,0xFFFF,0xFF80,0x0000,
	0x01FF,0xFFFF,0xFFFF,0xFFC0,0x0000,0x07FF,0xFFFF,0xFFFF,
	0xFFF0,0x0000,0x0FFF,0xFFFF,0xFFFF,0xFFF8,0x0000,0x0FFF,
	0xC381,0xC703,0xFFF8,0x0000,0x0FFF,0x99A5,0x9399,0xFFF8,
	0x0000,0x0FFF,0x8FE7,0x3999,0xFFF8,0x0000,0x0FFF,0xC7E7,
	0x3983,0xFFF8,0x0000,0x0FFF,0xF1E7,0x399F,0xFFF8,0x0000,
	0x0FFF,0x99E7,0x939F,0xFFF8,0x0000,0x0FFF,0xC3C3,0xC70F,
	0xFFF8,0x0000,0x0FFF,0xFFFF,0xFFFF,0xFFF8,0x0000,0x07FF,
	0xFFFF,0xFFFF,0xFFF0,0x0000,0x01FF,0xFFFF,0xFFFF,0xFFC0,
	0x0000,0x00FF,0xFFFF,0xFFFF,0xFF80,0x0000,0x003F,0xFFFF,
	0xFFFF,0xFE00,0x0000,0x001F,0xFFFF,0xFFFF,0xFC00,0x0000,
	0x0007,0xFFFF,0xFFFF,0xF000,0x0000,0x0003,0xFFFF,0xFFFF,
	0xE000,0x0000,0x0000,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0xFFFF,0xFFFF,0x8000,0x0000,0x0003,0xFFFF,0xFFFF,
	0xE000,0x0000,0x0007,0xFFFF,0xFFFF,0xF000,0x0000,0x001F,
	0xFFFF,0xFFFF,0xFC00,0x0000,0x003F,0xFFFF,0xFFFF,0xFE00,
	0x0000,0x00FF,0xFFFF,0xFFFF,0xFF80,0x0000,0x01FF,0xFFFF,
	0xFFFF,0xFFC0,0x0000,0x07FF,0xFFFF,0xFFFF,0xFFF0,0x0000,
	0x07FF,0xC381,0xC703,0xFFF0,0x0000,0x07FF,0x99A5,0x9399,
	0xFFF0,0x0000,0x07FF,0x8FE7,0x3999,0xFFF0,0x0000,0x07FF,
	0xC7E7,0x3983,0xFFF0,0x0000,0x07FF,0xF1E7,0x399F,0xFFF0,
	0x0000,0x07FF,0x99E7,0x939F,0xFFF0,0x0000,0x07FF,0xC3C3,
	0xC70F,0xFFF0,0x0000,0x07FF,0xFFFF,0xFFFF,0xFFF0,0x0000,
	0x01FF,0xFFFF,0xFFFF,0xFFC0,0x0000,0x00FF,0xFFFF,0xFFFF,
	0xFF80,0x0000,0x003F,0xFFFF,0xFFFF,0xFE00,0x0000,0x001F,
	0xFFFF,0xFFFF,0xFC00,0x0000,0x0007,0xFFFF,0xFFFF,0xF000,
	0x0000,0x0003,0xFFFF,0xFFFF,0xE000,0x0000,0x0000,0xFFFF,
	0xFFFF,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000
};

struct Image Image2 = {
	0,0,
	65,29,
	2,
	ImageData2,
	0x0003,0x0000,
	NULL
};

struct Gadget stopGadget = {
	&gaugeGadget,
	65,14,
	71,31,
	GADGIMAGE,
	RELVERIFY+GADGIMMEDIATE,
	BOOLGADGET,
	(APTR)&Image2,
	NULL,
	NULL,
	NULL,
	NULL,
	STOP,
	NULL
};

#define GadgetList1 stopGadget

struct IntuiText IText6 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Pathnames",
	NULL
};

struct MenuItem MenuItem1 = {
	NULL,
	0,0,
	72,8,
	ITEMTEXT+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText6,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct Menu Menu3 = {
	NULL,
	173,0,
	75,0,
	MENUENABLED,
	"Windows",
	&MenuItem1
};

struct IntuiText IText7 = {
	0,1,JAM1,
	19,0,
	NULL,
	(UBYTE *)"Format Destination",
	NULL
};

struct MenuItem MenuItem6 = {
	NULL,
	0,36,
	163,8,
	CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
	0,
	(APTR)&IText7,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText8 = {
	0,1,JAM1,
	19,0,
	NULL,
	(UBYTE *)"Speak",
	NULL
};

struct MenuItem MenuItem5 = {
	&MenuItem6,
	0,27,
	163,8,
	CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
	0,
	(APTR)&IText8,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText9 = {
	0,1,JAM1,
	19,0,
	NULL,
	(UBYTE *)"Generate Listing",
	NULL
};

struct MenuItem MenuItem4 = {
	&MenuItem5,
	0,18,
	163,8,
	CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
	0,
	(APTR)&IText9,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText10 = {
	0,1,JAM1,
	19,0,
	NULL,
	(UBYTE *)"Do Big Files",
	NULL
};

struct MenuItem MenuItem3 = {
	&MenuItem4,
	0,9,
	163,8,
	CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
	0,
	(APTR)&IText10,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText11 = {
	0,1,JAM1,
	19,0,
	NULL,
	(UBYTE *)"Compress Files",
	NULL
};

struct MenuItem MenuItem2 = {
	&MenuItem3,
	0,0,
	163,8,
	CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
	0,
	(APTR)&IText11,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct Menu Menu2 = {
	&Menu3,
	109,0,
	57,0,
	MENUENABLED,
	"Flags",
	&MenuItem2
};

struct IntuiText IText12 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Quit",
	NULL
};

struct MenuItem MenuItem12 = {
	NULL,
	0,45,
	168,8,
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText12,
	NULL,
	'Q',
	NULL,
	MENUNULL
};

struct IntuiText IText13 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Save Preferences",
	NULL
};

struct MenuItem MenuItem11 = {
	&MenuItem12,
	0,36,
	168,8,
	ITEMTEXT+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText13,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText14 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Load Preferences",
	NULL
};

struct MenuItem MenuItem10 = {
	&MenuItem11,
	0,27,
	168,8,
	ITEMTEXT+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText14,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct IntuiText IText15 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Restore",
	NULL
};

struct MenuItem MenuItem9 = {
	&MenuItem10,
	0,18,
	168,8,
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText15,
	NULL,
	'R',
	NULL,
	MENUNULL
};

struct IntuiText IText16 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"Backup",
	NULL
};

struct MenuItem MenuItem8 = {
	&MenuItem9,
	0,9,
	168,8,
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText16,
	NULL,
	'B',
	NULL,
	MENUNULL
};

struct IntuiText IText17 = {
	0,1,JAM1,
	0,0,
	NULL,
	(UBYTE *)"About",
	NULL
};

struct MenuItem MenuItem7 = {
	&MenuItem8,
	0,0,
	168,8,
	ITEMTEXT+ITEMENABLED+HIGHCOMP,
	0,
	(APTR)&IText17,
	NULL,
	NULL,
	NULL,
	MENUNULL
};

struct Menu Menu1 = {
	&Menu2,
	0,0,
	102,0,
	MENUENABLED,
	"Operations",
	&MenuItem7
};

#define MenuList1 Menu1

struct IntuiText IText18 = {
	3,0,JAM2,
	218,40,
	NULL,
	(UBYTE *)"",
	NULL
};

#define IntuiTextList1 IText18

struct NewWindow NewWindowStructure1 = {
	0,0,
	640,200,
	0,1,
	GADGETDOWN+GADGETUP+MENUPICK+CLOSEWINDOW+MENUVERIFY+DISKINSERTED+DISKREMOVED,
	WINDOWSIZING+WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE,
	&stopGadget,
	NULL,
	(UBYTE *)"MRBackup V2.0, Mark Rinfret, 11/87",
	NULL,
	NULL,
	640,100,
	640,200,
	CUSTOMSCREEN
};

struct IntuiText IText19 = {
	4,0,JAM1,
	2,2,
	NULL,
	(UBYTE *)"Skip This File",
	NULL
};

struct Gadget fileSkipGadget = {
	NULL,
	77,65,
	117,11,
	NULL,
	RELVERIFY+GADGIMMEDIATE+ENDGADGET,
	BOOLGADGET+REQGADGET,
	NULL,
	NULL,
	&IText19,
	NULL,
	NULL,
	FILESKIP,
	NULL
};

struct IntuiText IText20 = {
	4,0,JAM1,
	2,2,
	NULL,
	(UBYTE *)"Restart Diskette",
	NULL
};

struct Gadget diskRestartGadget = {
	&fileSkipGadget,
	71,52,
	132,11,
	NULL,
	RELVERIFY+GADGIMMEDIATE+ENDGADGET,
	BOOLGADGET+REQGADGET,
	NULL,
	NULL,
	&IText20,
	NULL,
	NULL,
	DISKRESTART,
	NULL
};

struct IntuiText IText21 = {
	4,0,JAM1,
	1,2,
	NULL,
	(UBYTE *)"Retry File",
	NULL
};

struct Gadget fileRetryGadget = {
	&diskRestartGadget,
	93,39,
	82,11,
	NULL,
	RELVERIFY+GADGIMMEDIATE+ENDGADGET,
	BOOLGADGET+REQGADGET,
	NULL,
	NULL,
	&IText21,
	NULL,
	NULL,
	FILERETRY,
	NULL
};

struct IntuiText IText22 = {
	4,7,JAM1,
	2,2,
	NULL,
	(UBYTE *)"Abort",
	NULL
};

struct Gadget abortGadget = {
	&fileRetryGadget,
	112,26,
	43,11,
	NULL,
	RELVERIFY+GADGIMMEDIATE+ENDGADGET,
	BOOLGADGET+REQGADGET,
	NULL,
	NULL,
	&IText22,
	NULL,
	NULL,
	ABORT,
	NULL
};

#define GadgetList2 abortGadget

struct IntuiText IText23 = {
	6,0,JAM2,
	19,13,
	NULL,
	(UBYTE *)"Select from the enabled options:",
	NULL
};

#define IntuiTextList2 IText23

struct Requester RequesterStructure2 = {
	NULL,
	334,110,
	290,80,
	0,0,
	&GadgetList2,
	NULL,
	&IntuiTextList2,
	NULL,
	2,
	NULL,
	NULL,
	NULL
};

UBYTE xcldPathGadgetSIBuff[81] =
	"S:MRBackup.xcld";
struct StringInfo xcldPathGadgetSInfo = {
	xcldPathGadgetSIBuff,
	UNDOBUFFER,
	0,
	81,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors3[] = {
	0,0,
	161,0,
	161,9,
	0,9,
	0,0
};
struct Border Border3 = {
	-2,-1,
	7,0,JAM1,
	5,
	BorderVectors3,
	NULL
};

struct IntuiText IText24 = {
	6,0,JAM2,
	-110,1,
	NULL,
	(UBYTE *)"Exclude Path:",
	NULL
};

struct Gadget xcldPathGadget = {
	NULL,
	130,63,
	158,8,
	NULL,
	RELVERIFY+GADGIMMEDIATE,
	STRGADGET,
	(APTR)&Border3,
	NULL,
	&IText24,
	NULL,
	(APTR)&xcldPathGadgetSInfo,
	XCLDPATH,
	NULL
};

UBYTE listPathGadgetSIBuff[81] =
	"PRT:";
struct StringInfo listPathGadgetSInfo = {
	listPathGadgetSIBuff,
	UNDOBUFFER,
	0,
	81,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors4[] = {
	0,0,
	162,0,
	162,9,
	0,9,
	0,0
};
struct Border Border4 = {
	-2,-1,
	7,0,JAM1,
	5,
	BorderVectors4,
	NULL
};

struct IntuiText IText25 = {
	6,0,JAM2,
	-110,1,
	NULL,
	(UBYTE *)"Listing Path:",
	NULL
};

struct Gadget listPathGadget = {
	&xcldPathGadget,
	129,48,
	159,8,
	NULL,
	RELVERIFY+GADGIMMEDIATE,
	STRGADGET,
	(APTR)&Border4,
	NULL,
	&IText25,
	NULL,
	(APTR)&listPathGadgetSInfo,
	LISTPATH,
	NULL
};

UBYTE backPathGadgetSIBuff[81] =
	"DF1:";
struct StringInfo backPathGadgetSInfo = {
	backPathGadgetSIBuff,
	UNDOBUFFER,
	0,
	81,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors5[] = {
	0,0,
	162,0,
	162,9,
	0,9,
	0,0
};
struct Border Border5 = {
	-2,-1,
	7,0,JAM1,
	5,
	BorderVectors5,
	NULL
};

struct IntuiText IText26 = {
	6,0,JAM2,
	-102,1,
	NULL,
	(UBYTE *)"Backup Path:",
	NULL
};

struct Gadget backPathGadget = {
	&listPathGadget,
	129,33,
	159,8,
	NULL,
	RELVERIFY+GADGIMMEDIATE,
	STRGADGET,
	(APTR)&Border5,
	NULL,
	&IText26,
	NULL,
	(APTR)&backPathGadgetSInfo,
	BACKPATH,
	NULL
};

UBYTE homePathGadgetSIBuff[81] =
	"DH0:";
struct StringInfo homePathGadgetSInfo = {
	homePathGadgetSIBuff,
	UNDOBUFFER,
	0,
	81,
	0,
	0,0,0,0,0,
	0,
	0,
	NULL
};

SHORT BorderVectors6[] = {
	0,0,
	161,0,
	161,9,
	0,9,
	0,0
};
struct Border Border6 = {
	-2,-1,
	7,0,JAM1,
	5,
	BorderVectors6,
	NULL
};

struct IntuiText IText27 = {
	6,0,JAM2,
	-86,1,
	NULL,
	(UBYTE *)"Home Path:",
	NULL
};

struct Gadget homePathGadget = {
	&backPathGadget,
	129,19,
	158,8,
	NULL,
	RELVERIFY+GADGIMMEDIATE,
	STRGADGET,
	(APTR)&Border6,
	NULL,
	&IText27,
	NULL,
	(APTR)&homePathGadgetSInfo,
	HOMEPATH,
	NULL
};

#define GadgetList3 homePathGadget

struct NewWindow NewWindowStructure3 = {
	332,19,
	300,80,
	0,1,
	GADGETDOWN+GADGETUP+CLOSEWINDOW,
	WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE,
	&homePathGadget,
	NULL,
	(UBYTE *)"Pathname Specifications",
	NULL,
	NULL,
	300,80,
	300,80,
	CUSTOMSCREEN
};

struct NewWindow NewWindowStructure4 = {
	0,105,
	622,95,
	0,1,
	NULL,
	WINDOWSIZING+WINDOWDRAG+WINDOWDEPTH,
	NULL,
	NULL,
	(UBYTE *)"Progress Report",
	NULL,
	NULL,
	40,40,
	640,200,
	CUSTOMSCREEN
};

struct NewWindow NewWindowStructure5 = {
	172,140,
	309,51,
	0,1,
	NULL,
	WINDOWSIZING+WINDOWDRAG+WINDOWDEPTH,
	NULL,
	NULL,
	(UBYTE *)"Debug",
	NULL,
	NULL,
	5,5,
	640,200,
	CUSTOMSCREEN
};
/* EOF */
-- 
< Mark R. Rinfret,  mrr@amanpt1.ZONE1.COM | ...rayssd!galaxia!amanpt1!mrr    >
< Aquidneck Management Associates       Home: 401-846-7639                   >
< 6 John Clarke Road                    Work: 401-849-8900 x56               >
< Middletown, RI 02840          	"If I just had a little more time...">

papa@pollux.usc.edu (Marco Papa) (02/07/88)

I am using the current version, and I do like it a lot.  Incremental backups
are real easy, thought I am sure that people would like the new version.
How about submitting it to comp.binaries.amiga anyway?  

-- Marco

P.S.:
Mark, your appreciation is very welcome.  I tried to reach you directly, but
mail bounced back every time.