Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (01/15/90)
Submitted-by: ludde@nada.kth.se (Erik Lundevall) Posting-number: Volume 90, Issue 001 Archive-name: kernel/makefastmem-1.0 MakeFastMem is a program that changes the attributes of a chunk of chipmem to fastmem, so that programs that requires fastmem can run. The program is runnable both from CLI and Workbench, source in assembler included. [ uuencoded executable included ...tad ] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: MakeFastMem.asm MakeFastMem.doc MakeFastMem.info.uu # MakeFastMem.uu # Wrapped by tadguy@xanth on Sun Jan 14 16:06:42 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'MakeFastMem.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MakeFastMem.asm'\" else echo shar: Extracting \"'MakeFastMem.asm'\" \(14078 characters\) sed "s/^X//" >'MakeFastMem.asm' <<'END_OF_FILE' X OPT L-,C+,D-,O+ ; Devpac Amiga stuff, skip this X ; for other assemblers X X* MakeFastMem v1.0 891028 E. Lundevall X* X* A little program to provide folks with only chipmem some "fastmem" X* for programs that require fastmem (what's the point with that?!?). X* X X INCDIR Assembler:include/ X; INCLUDE mymacros.i ; You don't have this one X INCLUDE exec/exec_lib.i ; Library offsets in X INCLUDE intuition/intuition_lib.i ; those four files X INCLUDE libraries/dos_lib.i X INCLUDE workbench/icon_lib.i X INCLUDE exec/execbase.i X INCLUDE exec/alerts.i X INCLUDE exec/tasks.i X INCLUDE exec/memory.i X INCLUDE intuition/intuition.i X INCLUDE libraries/dosextens.i X INCLUDE workbench/startup.i X INCLUDE workbench/workbench.i X X X; Necessary macros from "mymacros.i" X X Xjsrb MACRO X jsr _LVO\1(a6) X XREF.L _LVO\1 X ENDM X X Xpush MACRO X movem.\0 \1,-(sp) X ENDM X Xpop MACRO X movem.\0 (sp)+,\1 X ENDM X Xopenlib MACRO X lea \1,a1 X move.l \2,d0 X jsrb OpenLibrary X ENDM X X X; Some symbol definitions X XVERSION EQU 33 ; Use only v1.2 och higher XREQHEIGHT EQU 80 ; Height of the error requester XREQWIDTH EQU 300 ; Width of the error requester X X XMakeFastMem movea.l 4,a6 X push.l d0/a0 ; Save d0 & a0 in case we are run from the CLI X suba.l a1,a1 X jsrb FindTask ; Find the address to our own process X movea.l d0,a4 X pop.l d0/a0 X tst.l pr_CLI(a4) ; Check if we are running from the CLI X beq fromWB X X X********************** Code for CLI part ********************************* X XfromCLI subq.l #1,d0 ; Decrement argument length to strip LF X beq usage ; No argument given, tell user how to use us X move.b #0,0(a0,d0.l) ; Make argument string NULL-terminated X bsr asctodec ; Convert string to binary value X bmi usage ; Not a positive number, display usage X bsr CreateFast ; Do the real work X tst.l d0 X bne .nosuccess ; Yack, something went wrong... X X lea okmess(pc),a0 ; We did it! Bring the news to X moveq #okmesslen,d0 ; the world! X bra WriteMess X X.nosuccess lea errmess(pc),a0 ; Hey, who stole the memory...;-) X moveq #errmesslen,d0 X bsr WriteMess X tst.l d0 ; Did we succeed in writing message? X bne.s .nodos X moveq #10,d0 X.nodos rts X X Xusage lea usemess(pc),a0 ; Write the usage message X moveq #usemesslen,d0 X bra WriteMess X X X X********************** Code for Workbench part ***************************** X XfromWB lea pr_MsgPort(a4),a0 ; Wait for WB startup message X jsrb WaitPort X lea pr_MsgPort(a4),a0 ; Get the message... X jsrb GetMsg X push.l d0 ; ...and save it for later use X X movea.l d0,a0 X movea.l sm_ArgList(a0),a1 ; Get the first argument: X move.l wa_Name(a1),-(sp) ; Name of program X move.l wa_Lock(a1),-(sp) ; Lock to directory of program X X openlib dosname,#VERSION ; Open dos.library X tst.l d0 X beq nodos ; Hey, where's DOS??!? X X movea.l d0,a6 ; Change current directory to X pop.l d1 ; the directory of our program X jsrb CurrentDir X X movea.l a6,a1 ; Close dos.library X movea.l 4,a6 X jsrb CloseLibrary X XOpenIconLib openlib iconname,#VERSION ; Open icon.library X tst.l d0 X beq noiconlib X X movea.l d0,a6 ; Get the icon for our program X pop.l a0 X jsrb GetDiskObject X tst.l d0 X beq noobj X X move.l d0,d7 ; Put away address to DiskObject X movea.l d0,a0 X movea.l do_ToolTypes(a0),a0 X lea tooltype(pc),a1 ; Search for ToolType 'FASTMEM' X jsrb FindToolType X tst.l d0 X beq notooltype X X movea.l d0,a0 X movea.l a0,a1 ; Calculate the length of the string X moveq #-1,d0 X.strlen addq.l #1,d0 X tst.b 0(a1,d0.l) X bne.s .strlen X bsr asctodec ; Convert ASCII string to binary value X bmi nomemsize X X push.l d0 ; Save memory size X bsr FreeDO ; Release the DiskObject X bsr CloseIconLib ; Ok, now close icon.libary X pop.l d0 X bsr CreateFast ; Do the real work X tst.l d0 X beq exitWB ; Yeah, we did it! X X X* X* Some error conditions, show an error requester X* X Xnocreatefast lea wberrmess(pc),a0 X bsr ShowRequest X bra goodbye X Xnoiconlib lea noiconlibmess(pc),a0 ; No icon.library available X bsr ShowRequest X bra goodbye X Xnodos ALERT (AG_OpenLib!AO_DOSLib) ; Hey, no dos.libary!! X bra goodbye ; This is NOT good... X Xnoobj bsr CloseIconLib ; No icon for our program X lea noobjmess(pc),a0 X bsr ShowRequest X bra goodbye X Xnotooltype bsr FreeDO ; No FASTMEM tooltype X bsr CloseIconLib X lea notooltypemess(pc),a0 X bsr ShowRequest X bra goodbye X Xnomemsize bsr FreeDO ; Release icon X bsr CloseIconLib ; Incorrect value for the X lea nomemsizemess(pc),a0 ; FASTMEM tooltype X bsr ShowRequest X Xgoodbye moveq #100,d0 X bra exitWB X X**** Close icon.library ***** X XCloseIconLib movea.l a6,a1 X movea.l 4,a6 X jsrb CloseLibrary X rts X X X**** Exit from Workbench ***** X XexitWB jsrb Forbid ; Disable multitasking so that WB X pop.l a1 ; won't unload us before we're ready X jsrb ReplyMsg ; Get the original WB startup message X rts ; and reply to it, then exit X X X X X***************************************************************************** X* FreeDO - Do a FreeDiskObject X* Input: d7 - address to DiskObject X* a6 - address to IconBase X* Result: None X***************************************************************************** X XFreeDO movea.l d7,a0 ; Release the allocated X jsrb FreeDiskObject ; resources for the icon X rts X X X X*************************************************************************** X* ShowRequest - display a requester with an error message X* Input: a0 - address to an IntuiText X* a6 - address to ExecBase X* Result: None X*************************************************************************** X XShowRequest push.l d2/d3/a2/a3 X push.l a0 X openlib intuiname(pc),#VERSION X pop.l a0 X tst.l d0 X beq .nointui X X movea.l d0,a6 X movea.l a0,a1 X suba.l a0,a0 X lea darnmess(pc),a2 X movea.l a2,a3 X moveq #0,d0 X moveq #0,d1 X move.l #REQHEIGHT,d3 X move.l #REQWIDTH,d2 X jsrb AutoRequest X push.l d0 X movea.l a6,a1 X movea.l 4,a6 X jsrb CloseLibrary X pop.l d0 X.nointui pop.l d2/d3/a2/a3 X rts X X X X X**************************************************************************** X* CreateFast - Allocate a chunk of CHIPRAM and convert it to FASTRAM X* Input: d0 - Size of the wanted FASTRAM chunk. X* a6 - pointer to ExecBase X* Result: d0 - NULL if successfull X**************************************************************************** X XCreateFast push.l d2-d3 X addq.l #8,d0 ; Adjust size for the mem chunk header X move.l d0,d3 ; Allocate the "fast" memory X move.l #MEMF_CHIP+MEMF_PUBLIC+MEMF_CLEAR,d1 X jsrb AllocMem X move.l d0,d2 X beq .error1 X X move.l #MH_SIZE,d0 ; Allocate space for a MemHeader X move.l #MEMF_CLEAR+MEMF_PUBLIC,d1 X jsrb AllocMem X tst.l d0 X beq .error2 X X lea MakeFastMem(pc),a0 ; Disconnect the DATA hunk X moveq #0,d1 ; This is for the name field X move.l d1,-4(a0) ; of the MemHeader. X X move.l d0,a1 X move.l d2,MH_FIRST(a1) ; Use the first 8 bytes in the "fast" X movea.l d2,a0 ; memory for a MemChunk X addq.l #8,d2 X move.l d2,MH_LOWER(a1) ; Init the MemHeader as fastmem X move.w #MEMF_FAST+MEMF_PUBLIC,MH_ATTRIBUTES(a1) X ; We have made one big chunk X subq.l #8,d3 ; Subtract the MemChunk size and X move.l d3,MC_BYTES(a0) ; store the actual free size X move.l d3,MH_FREE(a1) X add.l d2,d3 ; Add size and lower address to get X move.l d3,MH_UPPER(a1) ; the upper bound X moveq #NT_MEMORY,d0 ; Store the node type X move.b d0,LN_TYPE(a1) X lea name,a0 X move.l a0,LN_NAME(a1) ; Store the address to the name X X push.l a1 X jsrb Disable ; Want to mess around by myself X pop.l a1 X lea MemList(a6),a0 ; Add our memory node to the X ADDHEAD ; MemList in ExecBase X jsrb Enable ; Ok, let the others play X X moveq #0,d0 ; We were successful, return 0 to X bra.s .fastfixed ; to say it's ok. X X.error2 movea.l d0,a1 ; Trouble allocating memory, free X move.l d3,d0 ; the stuff we already have X swap d0 ; allocated X jsrb FreeMem X X.error1 moveq #-1,d0 ; Error, return -1 to say it's not ok. X.fastfixed pop.l d2-d3 X rts X X X X***************************************************************************** X* WriteMess - Write a message to the CLI Window. X* Input: a0 - pointer to message X* d0 - length of message X* a6 - pointer to ExecBase X* Result: d0 - NULL if successful X***************************************************************************** X XWriteMess push.l d2-d3 X move.l d0,d3 X push.l a0 X lea dosname(pc),a1 X jsrb OldOpenLibrary ; Open dos.library, any version X tst.l d0 X beq.s .nomess X X movea.l d0,a6 X jsrb Output ; Write the appropriate message X move.l d0,d1 ; in the CLI-window we were run X pop.l d2 ; from. X jsrb Write X pop.l d2-d3 X movea.l a6,a1 X movea.l 4,a6 X jsrb CloseLibrary ; Close dos.library X moveq #0,d0 X.exitwrite rts X X X.nomess ALERT (AG_OpenLib!AO_DOSLib) ; No dos.library available!!! X moveq #100,d0 ; This is REAL bad... X bra .exitwrite X X X X X X X***************************************************************************** X* asctodec - Convert an ASCII string (NULL-terminated) to a binary value X* Input: a0 - pointer to ASCII string X* d0 - length of string X* Result: d0 - Binary value X***************************************************************************** X Xasctodec push.l d2 X move.l d0,d2 X subq.l #1,d2 ; We will use nr of characters as an X lsl.l #2,d2 ; offset X moveq #0,d1 X move.l d1,d0 X lea .Numbers(pc),a1 ; Get base address of offset table X.loop1 move.b (a0)+,d1 X beq .finished X subi.b #$31,d1 X bmi .zero X cmpi.b #NumBase-1,d1 X bcs .loop2 X moveq #-1,d0 X bra .finished X.loop2 add.l 0(a1,d2.w),d0 ; Add value in table d1 times to d0. X dbra d1,.loop2 X moveq #0,d1 X.zero subq.w #4,d2 X bra .loop1 X.finished pop.l d2 X rts X XNumBase EQU 10 X.Numbers dc.l 1,10,100,1000,10000,100000,1000000,10000000,100000000 X X X X X X****************** Some text & messages definitions ************************ X Xdosname dc.b 'dos.library',0 Xiconname dc.b 'icon.library',0 X CNOP 0,2 Xintuiname dc.b 'intuition.library',0 X CNOP 0,2 Xtooltype dc.b 'FASTMEM',0 X CNOP 0,2 Xerrmess dc.b 'P-p-p-pleeeaase... I need more memory!',10,0 Xerrmesslen EQU *-errmess X CNOP 0,2 Xokmess dc.b 'FastMem created!',10,0 Xokmesslen EQU *-okmess X CNOP 0,2 Xusemess dc.b 'Usage: MakeFastMem fastmemsize',10,0 Xusemesslen EQU *-usemess X CNOP 0,2 Xdarntext dc.b 'Darn!',0 X CNOP 0,2 Xnoobjtext dc.b 'No icon available',0 X CNOP 0,2 Xnoiconlibtext dc.b 'No icon.library',0,0 X CNOP 0,2 Xnotooltypetext dc.b 'No FASTMEM ToolType',0 X CNOP 0,2 Xnomemsizetext dc.b 'Error in FASTMEM value',0 X CNOP 0,2 Xwberrtext dc.b 'Not Enough ChipRAM',0 X CNOP 0,2 X X*********** IntuiText structures for the error requester messages ********** X Xnoiconlibmess dc.b 0,1 X dc.b RP_JAM1,0 X dc.w 75,20 X dc.l 0 X dc.l noiconlibtext X dc.l 0 X Xnotooltypemess dc.b 0,1 X dc.b RP_JAM1,0 X dc.w 60,20 X dc.l 0 X dc.l notooltypetext X dc.l 0 X Xnomemsizemess dc.b 0,1 X dc.b RP_JAM1,0 X dc.w 52,20 X dc.l 0 X dc.l nomemsizetext X dc.l 0 X Xnoobjmess dc.b 0,1 X dc.b RP_JAM1,0 X dc.w 60,20 X dc.l 0 X dc.l noobjtext X dc.l 0 X Xwberrmess dc.b 0,1 X dc.b RP_JAM1,0 X dc.w 68,20 X dc.l 0 X dc.l wberrtext X dc.l 0 X Xdarnmess dc.b 0,1 ; it_FrontPen, it_BackPen X dc.b RP_JAM1,0 ; it_DrawMode, it_KludgeFill00 X dc.w 6,3 ; it_LeftEdge, it_TopEdge X dc.l 0 ; it_ITextFont X dc.l darntext ; it_IText X dc.l 0 ; it_NextText X X X X SECTION foo,DATA Xname dc.b 'expansion ram',0 X END X END_OF_FILE if test 14078 -ne `wc -c <'MakeFastMem.asm'`; then echo shar: \"'MakeFastMem.asm'\" unpacked with wrong size! fi # end of 'MakeFastMem.asm' fi if test -f 'MakeFastMem.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MakeFastMem.doc'\" else echo shar: Extracting \"'MakeFastMem.doc'\" \(1553 characters\) sed "s/^X//" >'MakeFastMem.doc' <<'END_OF_FILE' X X X MakeFastMem v1.0 X ==================== X XMakeFastMem is a little program that changes a chunk of ChipRAM to FastRAM. XAt least the OS is fooled to believe that. The reason for doing this is Xbecause some people (programmers) believs that they MUST ask for FastRAM, and Xbelieve that the user always has that. XThat is really stupid, and has caused problems for a number of people with X1 Mb ChipRAM for example. X XThe program can be used both from the CLI and the Workbench. From CLI you Xstart MakeFastMem by simply writing: X XMakeFastMem <size> X Xwhere <size> is the size of the FastRAM chunk you want, in bytes. For Xexample, "MakeFastMem 307200" will create 300 Kb of "FastRAM" (and you lose X300 Kb of ChipRAM of course). X XFrom the Workbench you just double-click on the MakeFastMem icon and the Xmemory will be changed from ChipRAM to FastRAM. You have to specify the size Xof the FastRAM in the ToolTypes-field, by setting FASTMEM to the size you Xwant. For example, setting the tooltype to: X XFASTMEM=307200 X Xwill make MakeFastMem to create 300 Kb of FastRAM when you double-click on Xits icon. XOnce you have changed some chipmem to "fastmem" it will stay that way until Xyou reboot (or writes a hack to reclaim it). X XThis code is released in the Public Domain, feel free to modify and improve Xit if you want, especially the terrible icon... X X X X-Erik Lundevall Internet: ludde@nada.kth.se X Camelot: Erik Lundevall Sysop (+46-8-348523) 300-2400 bps X SnailMail: Korsbarsvagen 4B/422, S-114 23 STOCKHOLM, SWEDEN X X X X X X X X X END_OF_FILE if test 1553 -ne `wc -c <'MakeFastMem.doc'`; then echo shar: \"'MakeFastMem.doc'\" unpacked with wrong size! fi # end of 'MakeFastMem.doc' fi if test -f 'MakeFastMem.info.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MakeFastMem.info.uu'\" else echo shar: Extracting \"'MakeFastMem.info.uu'\" \(1477 characters\) sed "s/^X//" >'MakeFastMem.info.uu' <<'END_OF_FILE' Xbegin 664 MakeFastMem.info XMXQ```0``````&@`+`%``%P`&``,``0`@#`@`(`Q0````````````````````Z XM`````_X``````"`#2`````@```````````````````````````!0`!8``@`!= XM8M@#``````#_________________________________________________8 XM____________________________________________________________3 XM_S><^'C?______YSG/GYS______\__SY_\_______/^,^?@?______[_G/GY_ XM________\YS__________P><X'!_________________________________; XM____________________________________________________________3 XM____________________________________________________________3 XM_________________________________________!YS@<!_______D&$.!@Z XM'______R<A#AX0______\/X`X>!/______#^`.'@'______XSA#AX?______S XM_!(0@<'_______\'G.!P?_______________________________________O XM_________________________________________________________P``5 XM````4``6``(``620`P``````____________________________________% XM____________________________________________________________3 XM______________^-__CYE_______N?W_F[?________G]_^_______^'_OW_= XMO_______O\/_W[_________??Y________X/GG@^'___________________] XM____________________________________________________________3 XM____________________________________________________________3 XM______________________________________________________P#Y_!P> XM#______^`</@,`?______CG!XYHW______X/@?#^/______^!X#\/C______Y XM_C\`YQX_______P?''`</______^#YYX/A__________________________H XM____________________________________________________________3 X?__________\````(````#T9!4U1-14T],3`R-#`P`/__^ X`` Xend Xsize 1021 END_OF_FILE if test 1477 -ne `wc -c <'MakeFastMem.info.uu'`; then echo shar: \"'MakeFastMem.info.uu'\" unpacked with wrong size! fi # end of 'MakeFastMem.info.uu' fi if test -f 'MakeFastMem.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MakeFastMem.uu'\" else echo shar: Extracting \"'MakeFastMem.uu'\" \(1913 characters\) sed "s/^X//" >'MakeFastMem.uu' <<'END_OF_FILE' Xbegin 664 MakeFastMem XM```#\P`````````"``````````$```$N````!````^D```$N+'@`!$CG@("3Q XMR4ZN_MHH0$S?`0%*K`"L9P``1E.`9P``-A&\```(`&$``K1K```H80`!NDJ`6 XM9@``#$'Z`V1P$F```DI!^@,R<"AA``)`2H!F`G`*3G5!^@-:<"%@``(N0>P`" XM7$ZN_H!![`!<3J[^C$CG@``@0")H`"0O*0`$+Q%#^0```T1P(4ZN_=A*@&<`4 XM`)8L0$S?``).KO^"(DXL>``$3J[^8D/Y```#4'`A3J[]V$J`9P``9"Q`3-\!^ XM`$ZN_[)*@&<``'HN`"!`(&@`-D/Z`IY.KO^@2H!G``!T($`B2'#_4H!*,0@`/ XM9OAA``'P:P``<DCG@`!A``":80``?$S?``%A``#F2H!G``!Z0?H#?F$``(A@W XM``!<0?H#(F$``'Q@``!02.<!!BX\``.`!RQX``1.KO^43-]@@&```#9A```XD XM0?H#-&$``%)@```F80``0F$``"1!^@+X80``/F```!)A```N80``$$'Z`OAAO XM```J<&1@```.(DXL>``$3J[^8DYU3J[_?$S?`@!.KOZ&3G4@1TZN_Z9.=4CG$ XM,#!(YP"`0_H!N'`A3J[]V$S?`0!*@&<``#`L0")(D<A%^@+B)DIP`'(`=E`D" XM/````2Q.KOZD2.>``").+'@`!$ZN_F),WP`!3-\,#$YU2.<P`%"`)@`B/``!0 XM``-.KO\Z)`!G``""<"`B/``!``%.KO\Z2H!G``!F0?K]Z'(`(4'__")`(T(`W XM$"!"4((C0@`4,WP`!0`.48,A0P`$(T,`'-:"(T,`&'`*$T``"$'Y`````"-(- XM``I(YP!`3J[_B$S?`@!![@%"(!`@B4C1`0$@0"%)``1.KO^"<`!@#")`(`-(# XM0$ZN_RYP_TS?``Q.=4CG,``F`$CG`(!#^@"L3J[^:$J`9R(L0$ZN_\0B`$S?< XM``1.KO_03-\`#").+'@`!$ZN_F)P`$YU2.<!!BX\``.`!RQX``1.KO^43-]@9 XM@'!D8.1(YR``)`!3@N6*<@`@`4/Z`#(2&&<``"8$`0`Q:P``&@P!``EE```(& XM</]@```0T+$@`%')__IR`%E"8-9,WP`$3G4````!````"@```&0```/H```G) XM$``!AJ``#T)``)B6@`7UX0!D;W,N;&EB<F%R>0!I8V]N+FQI8G)A<GD``&EN= XM='5I=&EO;BYL:6)R87)Y`$9!4U1-14T`4"UP+7`M<&QE965A87-E+BXN($D@K XM;F5E9"!M;W)E(&UE;6]R>2$*`$9A<W1-96T@8W)E871E9"$*`%5S86=E.B!-_ XM86ME1F%S=$UE;2`@9F%S=&UE;7-I>F4*``!$87)N(0!.;R!I8V]N(&%V86ELI XM86)L90!.;R!I8V]N+FQI8G)A<GD```!.;R!&05-4345-(%1O;VQ4>7!E`$5R^ XM<F]R(&EN($9!4U1-14T@=F%L=64``$YO="!%;F]U9V@@0VAI<%)!30````$`P XM``!+`!0````````#[````````0```#P`%`````````/^```````!````-``4I XM````````!!(```````$````\`!0````````#V@```````0```$0`%```````= XM``0J```````!````!@`#`````````]0```````````/L````"`````````""( XM````J```!$H```1>```$<@``!(8```2:```$K@````$````!```"3```````X X?``/R```#Z@````1E>'!A;G-I;VX@<F%M```````#\@$`1 X`` Xend Xsize 1336 END_OF_FILE if test 1913 -ne `wc -c <'MakeFastMem.uu'`; then echo shar: \"'MakeFastMem.uu'\" unpacked with wrong size! fi # end of 'MakeFastMem.uu' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to: amiga@cs.odu.edu or amiga@xanth.cs.odu.edu ( obsolescent mailers may need this address ) or ...!uunet!xanth!amiga ( very obsolescent mailers need this address ) Comments, questions, and suggestions s should be addressed to ``amiga-request'' (only use ``amiga'' for submissions) at the above addresses.