amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/18/91)
Submitted-by: "John Davis, chem dept, Uni of Canty, NZ" <CHEM194@cantva.canterbury.ac.nz> Posting-number: Volume 91, Issue 104 Archive-name: utilities/bootmenu-1.0/part01 [ includes uuencoded executable and icon ...tad ] Bootmenu - YANPS (yet another ntsc/pal switcher). This program allows you to switch between NTSC and PAL if you have an obese agnus (8372). Where it differs from the rest (Matt Dillon's BPD and Nico Francois PALBoot) is that it allows for an interactive choice of options at boot time, via a graphical interface. Also, it gives you the option of turning off ALL your expansion boards, allowing you to disable your hard-disk (makes it harder for virii to attack it). Can also be useful in that respect to allow testing of software on a 'bare bones' machine (as it also turns off any expansion memory). Contains code that acts as an alternative to the 1mb chip ram patch CBM's setpatch installs, curing the problems with the setpatch code failing on a double-reboot. Includes assembler source (Hisoft DevPac) - tested on 1.3 and 1.2 ROMs, unknown if it works on 2.0 (though I somehow doubt it). #!/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: bootmenu.doc bootmenu.s bootmenu.uu bootmenu0.uu # Wrapped by tadguy@ab20 on Fri May 17 21:45:16 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'bootmenu.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bootmenu.doc'\" else echo shar: Extracting \"'bootmenu.doc'\" \(10456 characters\) sed "s/^X//" >'bootmenu.doc' <<'END_OF_FILE' XBootMenu v1.0 XBy J davis X09/1990 X X XSynopsis X-------- X XBootmenu - a program to allow graphical, interactive selection of NTSC/PAL Xscreen modes and the enabling/disabling of hard-disks on every reboot. XAlso acts as a partial replacement for CBM's setpatch program. Includes Xsource code in Assembler. Version 1.0 (first release). Author - John Davis X XPurpose X------- X XBootMenu serves three purposes :- X XFirstly it allows you to disable your auto-configing hard-disk (and all Xother auto-config devices) so as to minimise the chances of a virus or Xtrojan horse attacking your hard-disk when booting of a game disk, and Xalso to help with running some games/demos that won't run with a hard-disk Xactive. X XSecondly, for people with the 1mb Fat Agnus (8372), it offers a choice of XNTSC and PAL screen modes. PAL is useful for in the USA, as it offers a X25% increase in screen area (at the expense of being incompatible with XNTSC genlocks etc), whilst NTSC is useful for the rest of the world, as a Xlot of games are written for NTSC sized screens, and the graphics only Xdisplay the correct aspect ratio in NTSC mode ( F/A-18 has to be the best Xexample of this, playing f/a-18 on a PAL screen gives you a very X'squished' looking plane!) X XThirdly, it acts as an improved version of CBM's 'setpatch r' for people Xwith 1mb of chip memory. CBM's reboot handler will only survive ONE Xreboot, meaning that if you use rad, reboot off a floppy and then reboot Xagain, the contents of rad: are GONE!!! The reboot handler this installs Xis much more reliable - it will only fail if exec is so damaged the Xmachine _must_ coldboot. X XWhat's more, since it 'wedges' itself into the system you only need to Xload it once - it will survive reboots, which is handy if you're playing Xseveral games in a row and don't want to have to re-boot off the hard-disk Xto reselect screen mode, all you do is reboot and BootMenu will let you Xselect system options once again. X XInstallation X------------ X XJust run BootMenu - either from the CLI or WorkBench (there's an icon Xprovided, though it's no artistic masterpiece - I'm a programmer, not an Xartist). You should get a message saying that it's installed ok. X XIMPORTANT - do NOT run the WorkBench1.3.2 Setpatch program with the 'r' Xoption (option to patch for rad: and 1mb ram) after you have run XBootMenu, as both use the same vector, and hence SetPatch will disable XBootMenu! You should run Setpatch _without_ the 'r' option!! X XAlso see the section 'virus checkers and BootMenu' X XUsage X----- X XOnce it's installed, the next time you reboot you should be presented with Xa menu screen asking whether or not to turn off all the machine's Xexpansion boards. Click the left button to select 'on' - this will leave Xyour hard-disk, expansion memory etc enabled, or click the right button to Xselect 'off' and turn off all the boards. If you don't make any selection Xwithin 10 seconds, the program will default to the 'no' option and leave Xall your boards turned on. X XIf you've got a 1mb Obese Agnus fitted, you'll then be presented with a Xsecond screen, allowing a choice of PAL screen modes (click left button) Xor NTSC (click right button). Again, if no choice is made within 10 Xseconds the program will default to PAL. X XThe machine will then carry on it's normal boot sequence .... X XTechnical Info X-------------- X XThis program uses BOTH a coldcapture and coolcapture handler to do it's Xwork. X XThe coldcapture handler is simply used to fix the KickStart1.x bug Xregarding 1mb of chip mem. The bug is that ks1.x treats any amount of Xchip memory greater than 512k as abnormal, and will do a total cold Xreboot, clearing any cold/cool handlers. Our cold-handler fixes this bug Xin the rom, mainly so as to make our cool-handler actually get a chance to Xrun, but as an added bonus it also acts as an improved version of setpatch Xwith the 'r' option. X XThe trouble with the CBM 'setpatch r' is that it doesn't stick around - Xthe coldcapture vector they (and I) use gets cleared after use, hence if Xyou want to survive multiple reboots you need to re-insert yourself into Xthe system. Setpatch fails to do this and hence can fail to protect rad: Xif you reboot twice in a row without reloading setpatch. We DO reinsert Xourselves, so unless the system is totally rebooted (as will happen if you Xget serious enough memory corruption from a guru, or from some games), XBootMenu should protect rad:. X X Moral of the story - use BootMenu instead of setpatch r!!! X X Note also that you should ONLY use BootMenu with KickStart 1.x!!!! X XThe main code for running the screens etc is hung off the coolcapture Xvector. Being on coolcapture as opposed to coldcapture allows us to Xaccess much more of the system, as most of the machine is setup by the Xtime coolcapture runs (this is important if we want to access exec.library Xfunctions such as addmem) X XThe menu driver runs all the hardware direct (intuition isn't in a usable Xstate when coolcapture runs), using the window controls so as to make each Xscreen only take up 1k for it's bitmap as opposed to the usual 21k. All Xscreens are only 1 plane deep (to conserve memory). The copper is used to Xrun the screen itself, and also to get more than 1 colour off the 1 plane Xscreen (reloading the palette on a per-scanline basis) X XThe 'core' of bootmenu (approx 2.5k of code, of which 2k is the bitmaps Xfor the display, the actual code fits in approx 512k bytes!) installs onto Xthe bottom of the system stack, to avoid having to use kickmemptr to keep Xour memory allocated. As the system stack is 6k, and only 1k is normally Xused this shouldn't be a problem (bootmenu uses the opposite end of the Xstack - there's still at least 2k free). If worse comes to worse and Xthe system stack grows large (due to nested exceptions), all that will Xhappen will be that BootMenu is overwritten - it will not cause the system Xto lock up in normal operation. X XAs we can't guarantee the system stack will be in chip mem, the screen Xdata and copper list is swapped into and out of chip memory (swapping Xpreserves the original memory contents - in case rad: was somehow using Xthe target memory ). I haven't tested the effect of using MoveSSP (a pd Xprogram which places the system stack in fast ram) but I would guess it's Xuse would prevent BootMenu from functioning (as expansion memory isn't Xaccessible during the reboot process). X XThe NTSC/PAL switch code simply alters the mode bit on the 1mb agnus. X XThe expansion board disable code is slightly more artistic - it scans for Xexapansion boards waiting to be configured , and either tells them to Xshuptup (if they support it) or configures them out of the way. Hence by Xthe time expansion.library gets run there's no boards around - hence Xnothing gets config'd and added to the system. X XPeople who bother to read the included source code will notice it possible Xto build a version that will do an AddMem of non-autoconfig memory on Xreboot. This was done so as to allow a friend (hi peter!) with an old XRonin accelerator board to do a 'fake autoconfig' on his memory as opposed Xto being forced to run a cli 'addmem' on every reboot. As most memory Xboards are autoconfig nowdays, I haven't released the executable for that Xversion - but the source code be useful for anyone wanting to build a Xsimple memory board. Note that in the addmem code I set the priority of Xthe ram to -20 to make sure the 2090a driver uses the chipmem for it's Xbuffers, as the ronin memory is NOT capable of being DMA'd to. If your Xmemory does support DMA, you should raise it's priority to >0 to make the Xdriver and libraries use it, as this will maximise the amount of free chip Xmem you will have after reboot. X XThe program was assembled using Hisoft's DevPac v2 - it should be fairly Xsimle to alter the code to assemble under other assemblers however. X X XVirus Checkers and BootMenu X--------------------------- X XAs BootMenu hangs around by much the same mechanism as some viruses, most Xgood virus checkers will give you some warning when run about ColdCapture Xand CoolCapture being set and the possibility that this represents a virus Xin the system. X XIf you use VMK, you will actually be able to see an embedded message Xconfirming that the program on cold|coolcapture is only BootMenu, with Xother packages your actions may need to be different. X XIf you're at all unsure that what's on the vectors may NOT be bootmenu, Xyou should re-run BootMenu, as this will over-write the vectors and Xre-install itself, disabling any virus that may have been using them. XSimply clearing the vectors (thru your virus checker) will disable Xbootmenu. X XAs long as you get BootMenu's screens on reboot, you can be 90% sure no Xvirus is using the coldcapture and coolcapture vectors - however you Xshould still be cautious, as a virus could pass execution to my code if it Xwanted to be clever (haven't yet seen a virus that clever though!). X XAlso, as some newer viruses stay in memory _without_ using the Xcold/coolcapture vectors, so you should stil run virus checkers! X XGeneral Info X------------ X XI would like to thank all the people on AmigaINFO BBS who helped in beta Xtesting this program, especially Peter.B Mcintyre, John Nettleton and XStephen Webber, all of whom were always only too willing to download new Xtest versions at weird hours to help out with testing the code on Xdiffering machine setups. X XIf you have any questions about the program, or bug-reports, feel free to Xcontact me. X XThe source code and executable are 100% public domain - use or abuse it as Xyou see fit. If you'd like to use BootMenu on a commercial package, feel Xfree, though an acknowledgement (or a free copy of the package!) would be Xnice! X XYou can contact me via the following routes :- X Xmail on internet/usenet/bitnet/janet et al : X X chem194@canterbury.ac.nz X "meaningful userid's are for wimps" :-) X XBBS email: X X 'JOHN DAVIS' on AmigaINFO BBS X ph NZ+3-3371531 X 24 hours a day 1200/2400 baud ccitt (v22/v22bis) X X XSnail Mail if you must to: X X John Davis X 31 Clarence St X ChristChurch 2 X New Zealand X X X XENJOY!!! X END_OF_FILE if test 10456 -ne `wc -c <'bootmenu.doc'`; then echo shar: \"'bootmenu.doc'\" unpacked with wrong size! fi # end of 'bootmenu.doc' fi if test -f 'bootmenu.s' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bootmenu.s'\" else echo shar: Extracting \"'bootmenu.s'\" \(21253 characters\) sed "s/^X//" >'bootmenu.s' <<'END_OF_FILE' X; BootMenu by J Davis 09/1990 X; X; version 1.0 - beta 05 X; X; assembled using HiSoft DevPac v2 X; X; a little program to allow choice of NTSC/PAL screen mode X; and expansion boards enabled/disabled at boot-time X; X; hangs around via both cool and coldcapture (see note 1) X; X; on each reboot puts up a menu allowing mode choice X; X; if there's no input in 10 secs, it defaults to the left most X; option ( PAL and boards ON respectively ) X; X; X; note 1 : on machines with 1mb of chip, due to a slight oversight X; in the 1.3/1.2 kickstart reset routine, EVERY reboot causes X; a TOTAL system rebuild. This of course makes it hard to make X; our code hang around. X; X; Hence, we add a coldcapture handler that fixes the bug, X; then run our menu routine of coolcapture X; X; Hence our coldcapt routine also acts as an IMPROVED setpatch R, X; in that two reboots in a row KILLS setpatch r, wheras ours, X; hangs around and hence protects RAD: properly. Therefore X; DO NOT use SetPatch r and BootMenu at the same time! X; X; X; note 2 : if do_addemem is set to 1, this will build a version X; that does an addmem of memory on the ronin 020 board X; on the fly, due to the ronin mem not being dma-able we X; have to set a low pri on the mem X; X X ; turn on debug info and turn off optimising X OPT D+ X OPT O- X X;====================== X Xdo_addmem equ 0 ; flag for whether we do an addmem X ; for hurricane board as well X X;====================== X X X IFNE do_addmem=1 X FORMAT 0-,1-,2- X LIST X ; building PBMC_BootMenu X NOLIST X output PBMC_BootMenu X ELSEIF X FORMAT 0-,1-,2- X LIST X ; building normal BootMenu X NOLIST X output bootmenu X ENDC X Xchip_addr equ $40000 ; where we swap our chip data to/from X X; process structure offsets X Xpr_cli equ $0Ac ; process cli flag offset Xpr_msgport equ $05c ; process msgport offset X X; execbase structure offsets X Xcoldcapture equ $02a Xcoolcapture equ $02e Xsysstklower equ $03a X X; misc library functions X Xforbid equ -$084 ; offsets for various exec and int calls Xgetmsg equ -$174 ; saves long includes and compile times Xreplymsg equ -$17a Xwaitport equ -$180 Xfindtask equ -$126 Xautoreq equ -$15c Xopenlib equ -$228 Xcloselib equ -$19e X Xoutput equ -$003c Xwrite equ -$0030 X Xopenlibrary equ -$0228 Xcloselibrary equ -$019e X Xaddmemlist equ -618 X X; hardware equates X Xpotgor equ $dff016 Xpotgo equ $dff034 X Xintreq equ $dff09c Xintreqr equ $dff01e X Xddfstart equ $dff092 Xddfstop equ $dff094 X Xdiwstart equ $dff08e Xdiwstop equ $dff090 X Xbpl1mod equ $dff108 X Xbplcon1 equ $dff102 Xbplcon0 equ $dff100 X Xr_color0 equ $0180 Xr_color1 equ $0182 X Xr_bpl1pth equ $00e0 Xr_bpl1ptl equ $00e2 X Xcop1lch equ $dff080 Xcop1lcl equ $dff082 Xcopjmp1 equ $dff088 X Xdmacon equ $dff096 X Xagnusdetect equ $dff004 X X;============================================================== X Xstartup: ; startup code - determine if run from wb/cli etc X X move.l $4,a6 X move.l #0,a1 X jsr findtask(a6) ; find ourselves X X move.l d0,a4 ; save our process pointer X X move.l pr_cli(a4),d0 X bne fromdos ; was a DOS startup X X ; was started from WB X Xfromwb: lea pr_msgport(a4),a0 X jsr waitport(a6) ; wait for startup msg X lea pr_msgport(a4),a0 X jsr getmsg(a6) ; get the wb msg X X move.l d0,wbmsg ; save pointer to our startup msg X move.l #1,wb ; flag we started from wb X X lea intuiname,a1 X move.l #0,d0 X move.l $4,a6 X jsr openlib(a6) ; open intuition lib X X move.l d0,a6 ; save ibase X X move.l #0,a0 ; window to display in X move.l #bodyitext1,a1 ; body text X move.l #gaditext,a2 ; postive text X move.l #gaditext,a3 ; negative text X move.l #0,d0 ; pflags X move.l #0,d1 ; nflags X move.l #370,d2 ; width X move.l #80,d3 ; height X jsr autoreq(a6) ; request user confirmation X X move.l a6,a1 ; close intuition lib X move.l $4,a6 X jsr closelib(A6) X X bsr install ; install ourselves X X bra exit X Xfromdos: ; was run from dos - output message to stdout X X move.l $4,a6 X lea dosname,a1 X move.l #$0,d0 X jsr openlibrary(a6) ; open dos library X X move.l d0,a6 ; save dos base X X jsr output(a6) ; get handle on stdout X X move.l d0,d1 ; get file handle X move.l #msgtxt,d2 X move.l #etext-msgtxt,d3 X jsr write(a6) ; put up a message saying we're installed X X move.l $4,a6 X move.l a6,a1 X jsr closelibrary(a6) ; close dos X X bsr install X Xexit: move.l wb,d0 X cmp.l #0,d0 ; was this a CLI invocation X beq exit_dos ; DOS - just exit X X ; workbench exit X X move.l $4,a6 X jsr forbid(a6) ; lock out everyone else X X move.l wbmsg,a1 X jsr replymsg(a6) ; reply to Wbstartup msg X Xexit_dos: move.l #0,d0 ; return with return code 0 X rts X X;================================================= X even Xwb: dc.l 0 ; run mode flag 0=dos process 1=wbprocess Xwbmsg: dc.l 0 ; where we save our workbench msg X X even Xintuiname: dc.b "intuition.library",0 X X even Xdosname: dc.b "dos.library",0 X X ; message we output for cli startup X IFNE do_addmem=1 Xmsgtxt: dc.b 27,"[33mBootMenu PBMC",27,"[0m, by J Davis 09/1990",10 X ELSEIF Xmsgtxt: dc.b 27,"[33mBootMenu v1.0",27,"[0m, by J Davis 09/1990",10 X ENDC X dc.b "installed ok - menu will become active at next reboot",10,0 Xetext: dc.b 0 X X even X X ; stuff for our autorequester for wb usage Xbodyitext1: dc.b 2 ; front pen X dc.b 1 ; back pen X dc.b 0 ; draw mode X dc.w 40 ; leftedge X dc.w 6 ; topedge X dc.l 0 ; textattr = default X dc.l bodytext1 ; actual text X dc.l bodyitext2 ; next X Xbodyitext2: dc.b 3 ; front pen X dc.b 0 ; back pen X dc.b 0 ; draw mode X dc.w 120 ; leftedge X dc.w 26 ; topedge X dc.l 0 ; textattr = default X dc.l bodytext2 ; actual text X dc.l bodyitext3 ; next X Xbodyitext3: dc.b 3 ; front pen X dc.b 0 ; back pen X dc.b 0 ; draw mode X dc.w 20 ; leftedge X dc.w 36 ; topedge X dc.l 0 ; textattr = default X dc.l bodytext3 ; actual text X dc.l 0 ; next X Xgaditext: dc.b 0 ; front pen X dc.b 0 ; back pen X dc.b 0 ; draw mode X dc.w 4 ; leftedge X dc.w 4 ; topedge X dc.l 0 ; textattr = default X dc.l gadtext ; actual text X dc.l 0 ; next X X ; actual text for our requester X X IFNE do_addmem=1 Xbodytext1: dc.b "BootMenu PBMC, by J Davis 09/1990",0 X ELSEIF Xbodytext1: dc.b "BootMenu v1.0, by J Davis 09/1990",0 X ENDC Xbodytext2: dc.b "installed ok",0 Xbodytext3: dc.b "menu will become active at next reboot",0 Xgadtext: dc.b "Ok",0 X X;===================================================== X X even X Xinstall: ; this routine does the actual cold/coolcapture X ; setting X X ; works out where we're going to install to X ; then copies handler code there and hooks vectors X X move.l $4,a6 X move.l sysstklower(A6),a0 ; get pointer to base of sys-stack X move.l a0,codetarget ; save pointer to address X X move.l a0,a1 X add.l #coldcapt-captstart,a1 ; point to coldcapt address X move.l a1,coldcaptaddr ; save address X X move.l a0,a1 X add #coolcapt-captstart,a1 ; point to coolcapt addres X move.l a1,coolcaptaddr ; save address X X ; now stuff our code away on the bottom of the system stack X X lea captstart(pc),a1 ; code to copy X move.l codetarget,a2 ; where to copy to X move.l #endcapt-captstart,d0 ; amount to copy Xmloop: move.b (a1)+,(a2)+ X dbf d0,mloop X X ; now install a vector to the copied code in execbase.coldcapture X X move.l $4,a6 ; get execbase X move.l coldcaptaddr,a0 ; address of our coldcap routine X move.l a0,coldcapture(a6) ; set coldcapture X X move.l coolcaptaddr,a0 ; address of our coolcap routine X move.l a0,coolcapture(a6) ; set coolcapture to our code X X ; finally, recalc the execbase checksum X X lea 34(a6),a0 ; start of checksummed area in execbase X move.w #$16,d0 ; number of checksummed words X move.w #$0,d1 ; clear counter X Xsum: add.w (A0)+,d1 ; sum execbase and update checksum X dbf d0,sum X X not.w d1 X move.w d1,82(a6) ; set new execbase checksum X X ; all done X rts X X even X Xcodetarget: dc.l 0 Xcoolcaptaddr: dc.l 0 Xcoldcaptaddr: dc.l 0 X X;============================================================== X; X; our capture routines X; X; since this is going to stick around, we need to copy X; it somewhere safe - like the SysStack area X; X; since we can't guarantee sys-stack will be in chip, we X; swap our bitplane data and copper list to chip mem on the fly X; and then swap it back out ( in case rad: was using the bit where X; we put our screen ! ) X X even X Xcaptstart: X Xcoldcapt: ; this is our coldcapture routine - basically X ; fixes the rebuild problem that SETPATCH R tries X ; ( but fails ) to X X ; CAUTION!! This code is _specific to kickstart 1.x X ; DO NOT USE WITH KickStart 2.x!!! X X ; important - reinsert our code into execbase, as coldcapt X ; is cleared before it's called!! this is what setpatch r X ; fails to do (and hence why it's not reliable)! X X lea coldcapt(pc),a0 ; on entry A6=execbase X move.l a0,coldcapture(a6) ; reset our vector in execbase - don't need to resum X X ; the following is a kludge to get around exec 34.x X ; insisting on doing a system rebuild if >512k chip X ; it is directly based on the rom code in ks1.2/1.3 X X bchg #1,$bfe001 ; toggle led on X X move.l $fc0010,d0 ; get ks ver no. X cmp.l $14(a6),d0 ; compare with execbase ver X bne.s rebuild_all X X ; the following is the bit that's wrong with ks1.x X ; now fixed to work with 1mb chipmem X X move.l $3e(a6),a3 ; get maxchipmem X cmpa.l #$100000,a3 ; more than 1mb chip ? X bhi.s rebuild_all X X add.l #$1e,a5 ; point A5 past the (incorrect) code we skip X jmp (A5) ; carry on with rest of boot X Xrebuild_all: jmp $fc01ce ; jump to rom rebuild code X X;==================================================================== X X even X Xcoolcapt: ; our coolcapture routine - actually does the menus etc X X movem.l d0-d7/a0-a6,-(a7) ; save everything X X bsr swapmem ; first, copy our bitplane data and copper list to chip mem X X move.w #$ffff,potgo ; set for button inputs on mouse X X ; finished setting up - ask whether to turn boards off X X move.l #chip_addr+board_mode-chipdata_start,a1 ; address where bitplane data is copied to X bsr doscreen ; put up screen and wait for choice X X btst #0,d0 X beq.s next ; left mouse=leave on so skip X X ; user requested expansion board disable - do it X X moveq.l #$7,d1 ; max no boards we fix = 8 X Xbchk: move.w $e80008,d0 ; get flag byte from board X not.w d0 ; invert X btst.l #14,d0 ; see if board supports shut_up X beq.s shut_up ; bit=0 means board shuts up ok X X ; board doesn't support shut up, so X ; config board to $200000 (only gap big enough for 8mb boards) X X move.w #$0000,$e8004a ; fake board out to $200000 X move.w #$2000,$e80048 X X bra.s nboard ; carry on X Xshut_up: move.b #$ff,$e8004c ; tell the board to shut up X Xnboard: dbf d1,bchk ; loop thru all boards X X ; now query for screen mode Xnext: ; see if this machine has the 1mb Agnus X X move.w agnusdetect,d0 X and.w #$2000,d0 X beq.s no_8372 ; doesn't have obese agnus - skip screen mode choice X X ; has the 1mb agnus, offer screen mode choice X X move.l #chip_addr+scr_mode-chipdata_start,a1 ; address where bitplane data is copied to X bsr doscreen ; put up screen and wait for choice X X btst #0,d0 ; left mouse = PAL X beq.s go_pal X X move.w #$0000,$dff1dc ; set NTSC mode on agnus X bra.s no_8372 X Xgo_pal: move.w #$0020,$dff1dc ; set PAL mode on agnus X Xno_8372: bsr swapmem ; finally restore chipmem X X IFNE do_addmem=1 X X FORMAT 0-,1-,2- X LIST X ; adding special addmem code! X NOLIST X X ; Addmem the 32 bit mem on the Ronin 020 board X ; into the system X ; X ; we add 1mb, starting at $600000 X X move.l $4,a6 ; get execbase X move.l #$100000,d0 ; amount of mem we're adding ( 1mb ) X move.l #$5,d1 ; attributes ( memf_fast | memf_public ) X move.l #-20,d2 ; pri of mem must be low so as to force HD to use chip!!! X move.l #$600000,a0 ; where the mem starts ( 6 mb ) X move.l #0,a1 ; pointer to a name for this block X ; don't want one so pass NULL X jsr addmemlist(a6) ; do the deed !!! X X ; you need to be careful after this to NOT run the X ; ronin addmem prog - as otherwise you will get the X ; same block of mem added TWICE ( can you say 'guru' ? :-) X ENDC X X movem.l (A7)+,d0-d7/a0-a6 ; get back all regs X rts X X X; =============================== X; this routine swaps chipdata into/out of a block of chipmem X Xswapmem: lea chipdata_start(pc),a0 ; where to copy from X move.l #chip_addr,a1 ; where we copy to X move.l #chipdata_end-chipdata_start,d0 ; amount to copy X Xcm_loop: move.b (a0),d1 ; we exchange data in and out X move.b (a1),d2 X move.b d2,(a0)+ X move.b d1,(a1)+ X dbf d0,cm_loop X X rts X X X;==================================== X; this subroutine puts up the screen pointed to by a1 X; and return d0=0 for left mouse and d0<>0 for right mouse X; also trashes d1 X Xdoscreen: ; setup screen hardware X X move.w #$1200,bplcon0 ; set for lores, 1 plane X move.w #$0000,bplcon1 X X move.w #$0000,bpl1mod ; modulo = 0 X X move.w #$0038,ddfstart ; data fetch start X move.w #$00d0,ddfstop ; data fetch stop X X move.w #$7081,diwstart ; display window start X move.w #$89b0,diwstop ; display window stop X X move.l a1,d0 ; setup up copper list bitplane pointers X move.w d0,chip_addr+screen_l-chipdata_start ; point cop1l load addr to right place X swap d0 X move.w d0,chip_addr+screen_h-chipdata_start ; point cop1h load addr to right place X X move.l #chip_addr+ourcoplist-chipdata_start,cop1lch ; point copper at our copper list X X move.w copjmp1,d0 ; force copper to our list X X move.w #%1000000110000000,dmacon ; enable bitplane and copper dma X X move.w #10*50,d1 ; 10 secs worth of vblanks before timeout X Xwaittof: move.w intreqr,d0 X btst #5,d0 ; vblank int ? X beq.s waittof ; wait until tof true X X move.w #$0020,intreq ; clear int X X btst #6,$bfe001 ; left button down ? X beq.s lmb X X btst #10,potgor ; right button down X beq.s rmb X X subq.w #$1,d1 ; dec frame counter X cmp.w #$0,d1 ; time up ? X beq.s lmb ; default to left mouse button X X bra.s waittof X Xlmb: moveq #0,d0 X bra.s _exit_1 X Xrmb: moveq #1,d0 X X_exit_1: ; debounce buttons to avoid 'fallthru' - wait for both buttons up X X btst #10,potgor X beq _exit_1 ; wait for user to let go of rmb X X btst #6,$bfe001 X beq _exit_1 ; wait for user to let go of rmb X X ; now delay 15 vblanks to allow buttons to settle X X move.w #15,d2 X X_1waittof: move.w intreqr,d1 X btst #5,d1 ; vblank int ? X beq.s _1waittof ; wait until tof true X X move.w #$0020,intreq ; clear int X X subq.w #1,d2 ; dec delay counter X cmp.w #$0,d2 X bne _1waittof X X move.w #%0000000110000000,dmacon ; disable bitplane and copper dma X X rts X X;========================================= X X ; message for people running VMK etc X X dc.b " BootMenu v1.0 J Davis - this is NOT a virus!!! " X X;========================================= X X even X Xchipdata_start: X Xourcoplist: ; the following copperlist runs our screen X X dc.w r_bpl1pth Xscreen_h dc.w 0 ; set high bitplane address X X dc.w r_bpl1ptl Xscreen_l dc.w 0 ; set low bitplane address X X dc.w r_color0 X dc.w $0026 ; set background X X dc.w $6f01,$ff00 ; wait for top of our display X X dc.w r_color1 X dc.w $0fff ; set fg X X dc.w $7101,$ff00 ; wait til after top line X X dc.w r_color1 X dc.w $0f08 ; set fg X X dc.w $7c01,$ff00 ; wait for next bit of text X X dc.w r_color1 X dc.w $006c ; set fg X X dc.w $8801,$ff00 ; wait for bottom line X X dc.w r_color1 X dc.w $0fff ; set fg X X dc.w $ffff,$fffe ; wait for next TOF X X ; the following is the bit map for out first screen X Xboard_mode: dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $0000038C,$60000000,$0000000F,$E0000000,$00018000,$000FC000,$0000E000,$00000000,$00000000,$00000000 X dc.l $000006CE,$60000000,$00000006,$60000000,$00000000,$00066000,$00006000,$00000000,$71FDFC00,$00000000 X dc.l $0007EC6F,$67E00000,$00000006,$063DC3C7,$C3E383C7,$C00663C3,$CEC363E0,$00000000,$D8CCCC00,$00000000 X dc.l $07E00C6D,$E007E000,$00000007,$83666066,$66018666,$6007C660,$6766E600,$000000FD,$8CC0C0FC,$00000000 X dc.l $00000C6C,$E0000000,$00000006,$01C661E6,$63C18666,$60066661,$E66663C0,$0000FC01,$8CF0F000,$FC000000 X dc.l $0007E6CC,$67E00000,$00000006,$6367C666,$60618666,$60066666,$66066060,$00000001,$8CC0C000,$00000000 X dc.l $0000038C,$60000000,$0000000F,$E63603B6,$67C3C3C6,$600FC3C3,$BF03B7C0,$000000FC,$D8C0C0FC,$00000000 X dc.l $00000000,$00000000,$00000000,$000F0000,$00000000,$00000000,$00000000,$00000000,$71E1E000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $000007E0,$00004000,$00000006,$18C001E0,$07E00000,$7007C000,$00C00001,$E1E018C1,$E1E1E000,$00000000 X dc.l $00000330,$0000C000,$00000006,$19C00330,$03300000,$30036000,$00000003,$333031C3,$33333000,$00000000 X dc.l $00000331,$E1E1F331,$E3E33003,$30C00370,$03333000,$300331E3,$31C1F003,$733060C3,$33337000,$00000000 X dc.l $000003E3,$3330C3BB,$33333003,$30C003F0,$03E33000,$30033033,$30C30003,$F1F0C0C1,$F1F3F000,$00000000 X dc.l $00000333,$3330C35B,$F3333001,$E0C003B0,$03333003,$300330F3,$30C1E003,$B03180C0,$3033B000,$00000000 X dc.l $00000333,$3330D31B,$03333001,$E0C0C330,$0331E003,$30036331,$E0C03003,$306300C0,$60633000,$00000000 X dc.l $000007E1,$E1E06319,$E331D800,$C3F0C1E0,$07E0C001,$E007C1D8,$C1E3E001,$E1C603F1,$C1C1E000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00038000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff X X ; the following is the bitmap for our second screen X Xscr_mode: dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $000007E0,$C7800000,$00000000,$00001E00,$00000000,$00410007,$00000000,$0000018C,$FC787800,$00000000 X dc.l $00000331,$E3000000,$00000000,$00003300,$00000000,$00630003,$00000000,$000001CC,$B4CCCC00,$00000000 X dc.l $0003F331,$E303F000,$00000000,$0000381E,$761E1E3E,$00771E1B,$1E000000,$0000FDEC,$30E180FC,$00000000 X dc.l $03F003E3,$330003F0,$00000000,$00001C33,$3B333333,$007F3337,$33000000,$00FC01BC,$30718000,$FC000000 X dc.l $00000303,$F3100000,$00000000,$00000730,$333F3F33,$006B3333,$3F000000,$0000019C,$301D8000,$00000000 X dc.l $0003F306,$1B33F000,$00000000,$00003333,$30303033,$00633333,$30000000,$0000FD8C,$30CCCCFC,$00000000 X dc.l $00000786,$1FF00000,$00000000,$00001E1E,$781E1E33,$00631E1D,$9E000000,$0000018C,$78787800,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $000007E0,$00004000,$00000006,$18C001E0,$07E00000,$7007C000,$00C00001,$E1E018C1,$E1E1E000,$00000000 X dc.l $00000330,$0000C000,$00000006,$19C00330,$03300000,$30036000,$00000003,$333031C3,$33333000,$00000000 X dc.l $00000331,$E1E1F331,$E3E33003,$30C00370,$03333000,$300331E3,$31C1F003,$733060C3,$33337000,$00000000 X dc.l $000003E3,$3330C3BB,$33333003,$30C003F0,$03E33000,$30033033,$30C30003,$F1F0C0C1,$F1F3F000,$00000000 X dc.l $00000333,$3330C35B,$F3333001,$E0C003B0,$03333003,$300330F3,$30C1E003,$B03180C0,$3033B000,$00000000 X dc.l $00000333,$3330D31B,$03333001,$E0C0C330,$0331E003,$30036331,$E0C03003,$306300C0,$60633000,$00000000 X dc.l $000007E1,$E1E06319,$E331D800,$C3F0C1E0,$07E0C001,$E007C1D8,$C1E3E001,$E1C603F1,$C1C1E000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00038000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000 X dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff X Xchipdata_end: X Xendcapt: X X END X END_OF_FILE if test 21253 -ne `wc -c <'bootmenu.s'`; then echo shar: \"'bootmenu.s'\" unpacked with wrong size! fi # end of 'bootmenu.s' fi if test -f 'bootmenu.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bootmenu.uu'\" else echo shar: Extracting \"'bootmenu.uu'\" \(5981 characters\) sed "s/^X//" >'bootmenu.uu' <<'END_OF_FILE' Xbegin 666 bootmenu XM```#\P`````````!``````````````,I```#Z0```RDL>0````0B?`````!.0 XMKO[:*$`@+`"L9@``@D'L`%Q.KOZ`0>P`7$ZN_HPCP````0@C_`````$```$$Q XM0_D```$,(#P`````+'D````$3J[]V"Q`('P`````(GP```&.)'P```'*)GP`A XM``'*(#P`````(CP`````)#P```%R)CP```!03J[^I").+'D````$3J[^8F$`^ XM`:1@``!`+'D````$0_D```$>(#P`````3J[]V"Q`3J[_Q"(`)#P```$J)CP`P XM``!B3J[_T"QY````!").3J[^8F$``6(@.0```02PO`````!G```6+'D````$6 XM3J[_?")Y```!"$ZN_H8@/`````!.=0``````````:6YT=6ET:6]N+FQI8G)A5 XM<GD`9&]S+FQI8G)A<GD`&ULS,VU";V]T365N=2!V,2XP&ULP;2P@8GD@2B!$S XM879I<R`P.2\Q.3DP"FEN<W1A;&QE9"!O:R`M(&UE;G4@=VEL;"!B96-O;64@G XM86-T:79E(&%T(&YE>'0@<F5B;V]T"@````(!````*``&`````````=X```&BX XM`P````!X`!H````````"`````;8#`````!0`)`````````(-````````````8 XM!``$`````````C0`````0F]O=$UE;G4@=C$N,"P@8GD@2B!$879I<R`P.2\Q= XM.3DP`&EN<W1A;&QE9"!O:P!M96YU('=I;&P@8F5C;VUE(&%C=&EV92!A="!N3 XM97AT(')E8F]O=`!/:P``+'D````$(&X`.B/(```"K")(T_P`````(\D```*T; XM(DC2_``V(\D```*P0_H`5"1Y```"K"`\```)[!394<C__"QY````!"!Y```"^ XMM"U(`"H@>0```K`M2``N0>X`(C`\`!8R/```TEA1R/_\1D$]00!23G4`````: XM``````````!!^O_^+4@`*@AY``$`O^`!(#D`_``0L*X`%&84)FX`/K?\`!``? XM`&((V_P````>3M5.^0#\`<Y(Y__^80``@#/\__\`W_`T(GP`!``P80``C`@`8 XM``!G+G(',#D`Z``(1D`(```.9Q(S_````.@`2C/\(```Z`!(8`@3_`#_`.@`Z XM3%')_]8P.0#?\`0"0"``9R(B?``$!!AA``!""````&<*,_P```#?\=Q@"#/\N XM`"``W_'<80``"$S??_].=4'Z`2XB?``$```@/```"``2$!01$,(2P5'(__9.9 XM=3/\$@``W_$`,_P```#?\0(S_````-_Q"#/\`#@`W_"2,_P`T`#?\)0S_'"!8 XM`-_PCC/\B;``W_"0(`DSP``$``9(0#/```0``B/\``0```#?\(`P.0#?\(@SP XM_(&``-_PEC(\`?0P.0#?\!X(```%9_0S_``@`-_PG`@Y``8`O^`!9Q0(.0`*J XM`-_P%F<.4T&R?```9P)@SG``8`)P`0@Y``H`W_`69P#_]@@Y``8`O^`!9P#_/ XMZC0\``\R.0#?\!X(`0`%9_0S_``@`-_PG%-"M'P``&8`_^0S_`&``-_PEDYU* XM("!";V]T365N=2!V,2XP($H@1&%V:7,@+2!T:&ES(&ES($Y/5"!A('9I<G5S; XM(2$A("``X````.(```&``"9O`?\``8(/_W$!_P`!@@\(?`'_``&"`&R(`?\`* XM`8(/______[_________________________________________________G XM____````````````````````````````````````````````````````````] XM``````````````````````````````````````````````````````.,8```O XM``````_@``````&````/P````.`````````````````````&SF`````````&9 XM8```````````!F````!@``````!Q_?P````````'[&]GX```````!@8]P\?#/ XMXX/'P`9CP\[#8^``````V,S,```````'X`QMX`?@``````>#9F!F9@&&9F`'T XMQF!G9N8`````_8S`P/P````````,;.`````````&`<9AYF/!AF9@!F9AYF9CV XMP```_`&,\/``_``````'YLQGX```````!F-GQF9@889F8`9F9F8&8&`````!M XMC,#```````````.,8`````````_F-@.V9\/#QF`/P\._`[?`````_-C`P/P`0 XM``````````````````````\```````````````````````!QX>``````````! XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````!^```$``````!AC``>`'M XMX```<`?```#```'AX!C!X>'@``````````,P``#```````89P`,P`S```#`#_ XM8``````#,S`QPS,S,``````````#,>'A\S'CXS`#,,`#<`,S,``P`S'C,<'P5 XM`W,P8,,S,W```````````^,S,,.[,S,P`S#``_`#XS``,`,P,S##``/Q\,#!F XM\?/P``````````,S,S##6_,S,`'@P`.P`S,P`S`#,/,PP>`#L#&`P#`SL```\ XM```````#,S,PTQL#,S`!X,##,`,QX`,P`V,QX,`P`S!C`,!@8S``````````X XM!^'AX&,9XS'8`,/PP>`'X,`!X`?!V,'CX`'AQ@/QP<'@````````````````/ XM``````````````.`````````````````````````````````````````````# XM````````````````````````````````````````````````````````````` XM``````````````````````````````#_____________________________J XM____________________________________________________________3 XM_________________P``````````````````````````````````````````S XM````````````````````````````````````````````````````````````` XM```````'X,>````````````>````````00`'`````````8S\>'@`````````- XM`S'C````````````,P```````&,``P````````',M,S,`````````_,QXP/P& XM`````````#@>=AX>/@!W'AL>``````#][##A@/P``````_`#XS,``_``````) XM```<,SLS,S,`?S,W,P````#\`;PP<8``_````````P/S$```````````!S`S( XM/S\S`&LS,S\```````&<,!V``````````_,&&S/P`````````#,S,#`P,P!CQ XM,S,P``````#]C##,S/P````````'AA_P```````````>'G@>'C,`8QX=G@``> XM`````8QX>'@`````````````````````````````````````````````````U XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM``````````````````````````````````````````````````````?@``!`G XM``````88P`'@!^```'`'P```P``!X>`8P>'AX``````````#,```P``````&3 XM&<`#,`,P```P`V```````S,P,<,S,S```````````S'AX?,QX^,P`S#``W`#[ XM,S``,`,QXS'!\`-S,&##,S-P``````````/C,S##NS,S,`,PP`/P`^,P`#`#W XM,#,PPP`#\?#`P?'S\``````````#,S,PPUOS,S`!X,`#L`,S,`,P`S#S,,'@` XM`[`Q@,`P,[```````````S,S,-,;`S,P`>#`PS`#,>`#,`-C,>#`,`,P8P#`\ XM8&,P``````````?AX>!C&>,QV`##\,'@!^#``>`'P=C!X^`!X<8#\<'!X```" XM```````````````````````````#@```````````````````````````````# XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````________________T XM_____________________________________P```^P````6`````````"P`5 XM```V````/````%H```!@````9@```*(```"Z````V@```/0```&:```!G@``V XM`:X```&R```!P@```=8```)$```"4@```EX```)H```"@````HH````````#Q XM\`````%W8@`````!!`````%L;6(````$*`````%R;6(````$+`````%S=6T`_ XM```"G@````%B8VAK```#$`````%E>&ET````V`````%N97AT```#/`````)E% XM=&5X=````````8P````";6QO;W````````)R`````G=B;7-G```````!"```: XM``)F<F]M=V(``````!H````"9V]?<&%L``````-B`````FUS9W1X=``````!L XM*@````)N8F]A<F0``````S@````"7V5X:71?,0````0N`````F-M7VQO;W``E XM```#A`````)D;W-N86UE`````1X````"96YD8V%P=`````RD`````F9R;VUDZ XM;W,`````F@````)G861T97AT`````C0````":6YS=&%L;`````(X`````FYOW XM7S@S-S(````#:@````)S:'5T7W5P`````S`````"<W1A<G1U<```````````R XM`G-W87!M96T````#=`````)W86ET=&]F`````_8````"8V]L9&-A<'0```*XR XM`````F-O;VQC87!T```"[@````)D;W-C<F5E;@```Y(````"97AI=%]D;W,`2 XM``#\`````F=A9&ET97AT```!R@````)S8W)?;6]D90``"+P````"<V-R965NW XM7V@```2F`````G-C<F5E;E]L```$J@````-?,7=A:71T;V8```````1*````+ XM`V)O9'ET97AT,0```````=X````#8F]D>71E>'0R```````"``````-B;V1YA XM=&5X=#,```````(-`````V-A<'1S=&%R=````````K@````#:6YT=6EN86UEG XM```````!#`````-B;V%R9%]M;V1E``````34`````V)O9'EI=&5X=#$`````$ XM`8X````#8F]D>6ET97AT,@`````!H@````-B;V1Y:71E>'0S``````&V````, XM`V-O9&5T87)G970``````JP````#;W5R8V]P;&ES=``````$I`````-R96)U# XM:6QD7V%L;`````+H`````V-H:7!D871A7V5N9```#*0````#8V]L9&-A<'1AP XM9&1R```"M`````-C;V]L8V%P=&%D9'(```*P````!&-H:7!D871A7W-T87)TD X.``````2D`````````_)L) X`` Xend Xsize 4244 END_OF_FILE if test 5981 -ne `wc -c <'bootmenu.uu'`; then echo shar: \"'bootmenu.uu'\" unpacked with wrong size! fi # end of 'bootmenu.uu' fi if test -f 'bootmenu0.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bootmenu0.uu'\" else echo shar: Extracting \"'bootmenu0.uu'\" \(532 characters\) sed "s/^X//" >'bootmenu0.uu' <<'END_OF_FILE' Xbegin 666 bootmenu.info XMXQ```0``````R`!@`",`$0`%``,``0`CNC``````````````````````````F XM`````R0`(H00`````````6X```!5``&Z>`````````^@````+@%R`)?__P``Y XM```"0`)_``%=!```````P!*`````````````6@`H_____P`!____Z0``````< XM`````",`$``"``&\.`,```````!__\````!_X<````!_X<````!_X<````!_* XM_\````````````````````/ZJ/````/U1'@```/JHC@```/5<1@```.J__@`4 XM``-5__@```*K__@```/___@``````````/____^``/_____``/_____@`/__^ XM___@`/_____@`/_____@`/_____@`/P']0_@`/P.ZH?@`/P=U4?@`/P[BJ?@1 XD`/QW``?@`/SN``?@`,W<``?@`/P```?@``````````````$`? X`` Xend Xsize 351 END_OF_FILE if test 532 -ne `wc -c <'bootmenu0.uu'`; then echo shar: \"'bootmenu0.uu'\" unpacked with wrong size! fi # end of 'bootmenu0.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 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.