MessageChecker v1.02 By Nathan Mates, 6/28/94 Table Of Contents: 1. What MessageChecker is 2. Installing MessageChecker 3. General Description of MessageChecker & its functions 4. About the options 5. Potential Problems 6. Hackers info 7. Random vaporware 8. Hellos 9. Distribution info 10. Version History 11. About the programmer 12. Signoff If you want to quickly go to a section, just search for ~~ followed by the number. For example, to read the distribution info, search for '~~9', without the quotes. ~~1 What MessageChecker is: MessageChecker is a CDA that installes a HeartBeat task to constantly check on the integrity of the MessageCenter. For you non-programmers, the MessageCenter is how programs on the Apple IIGS communicate with each other, and used for some important system stuff. The MessageCenter is a list of messages, but no integrity checks are ever done on it. Therefore, when it is trashed, the system will usually go off in an infinite loop trying to figure out what's in it. On my system, after a number of crashes and memory-trashing bugs, I have found that the MessageCenter was blasted. But, the system can usually keep going for a while after the damage occurs, so it's hard to trace exactly when the system got trashed. Such memory-trashing bugs have been fairly serious, and required patch programs, such as my FixKern204 init for the GNO 2.0.4 shell. (Shameless plug-- if you have GNO 2.0.4, get it! It prevents some random memory trashing bugs in the 2.0.4 kernel. It's free, and prevents problems. Check your local Apple II archive, or contact me). Therefore, I wrote MessageChecker to keep tabs on the MessageCenter. MessageChecker, when you turn it on, constantly checks on the MessageCenter, and if it's messed up (if the IIGS Memory Manager feels that where the next message isn't valid at all), MessageChecker first stops everything to warn you that it has found what it feels a problem. Once you acknowledge this, and 'ignore' the problem, (the recommended action), MessageChecker simply flashes the screen border so you won't forget. It does not crash the system, like when the system detects a bad HeartBeat queue, as the system can keep functioning for a bit. (Your system is in danger of crashing, so I'd reboot rather soon) ~~2 Installing MessageChecker: To install MessageChecker, drop the 'MessageChecker' file in the "Desk.Accs" folder inside the "System" folder on your boot disk, and reboot. There's also an icon file that you can drop in an "icons" directory on one of your disks; this is merely fluff, and totally unnecessary. In the icon file, there are 5 icons for MessageChecker. Only the one with the name 'MessageChecker' will be used; the other two will not be used. Icon editors such as IconEd and DicED can change the names... Programs capable of installing CDAs on the fly, such as IR, should be able to install it, but I haven't tried any. (You may need to select MessageChecker from the CDA menu once just to start the background checks after installing it on the fly, but, again, I haven't tried any of these installers.) Although MessageChecker puts up an icon on booting (a big eyeball; so sue me. I can't draw. You got a better idea/icon?), it should be compatible with GS/OS system 4,5 and 6. I haven't tested it with anything other than 6.0.1 on my HD. If you find it doesn't seem to work with another system version, tell me so I can fix it. ~~3 General descripion of what the MessageChecker does, and its functions MessageChecker is an interactive CDA. When you select it, it will display its current status, number of backed up messages, and a menu. Pressing 'Q' or will exit the MessageChecker CDA. Most of its options are self-explanatory; the following text details exactly what they do. MessageChecker has 3 modes: off, normal, and paranoid. When it is off, MessageChecker will never check for trashed MessageCenters. Normal mode and paranoid mode both check repeatedly for trashed messages; the only difference between them is the speed at which they check. Normal mode usually checks twice per second, and paranoid, as often as possible. When they detect a problem, both will take over the system as they attempt to warn you, giving you a small menu of options. The default option is 'Ignore' the problem, as trying to restore the system is a dangerous thing. (See below) If you ignore the problem, the border will simply be blinked repeatedly to show that there are peoplems. Since they check at different speeds, normal and paranoid blink the border at different rates, but there is nothing implied in the urgency (or lack thereof) of border blinking. From the MessageChecker CDA, you can view the list of system messages. The list contains a few more pieces of information relevant to messages than other list viewers (aka NiftyList 3.4), as it displays the full 32-bit handle of the next message, allowing you to see if anything is amiss in the upper 8 bits of the address. When travelling the list of messages, MessageChecker asks the MemoryManager to verify all handles it runs across, and if the MM doesn't like it, the handle will be printed in inverse. This allows you to quickly see where the problem is. The list of messages goes until it reaches the end (a long-0 for the next handle), or runs into a bad handle for the next message. If it finds a bad handle, it displays it in inverse text. It also pauses every screen, allowing you to check on things, while also stopping infinite loops dead in their tracks. You can also save what mode MessageChecker will be in when it boots up; MessageChecker simply saves the current settings (the current mode (normal/paranoid/off), and all the options from the options menu) to disk, and restores them later at boot. The prefs are stored in */system/preferences/msgchkr.prefs, and if that file is not found at boot, the defaults are used. See the section on the options for what those defaults are. If your system folder does not contain the preferences folder, it will be created for you. (Far better for all those config files to sit there than all over.) Note: If you're running GNO 2.0.4 or earlier, and in the foreground, you're running a resource-using desktop app (like the Finder), the prefs can't be saved. This isn't my fault, so bug Jawaid for the fix, namely GNO 2.0.5. When MessageChecker runs into a bad handle for the next message, it stores the offending message, handle, and message contents for your perusal. From the MessageChecker menu (either the menu you get from CDA menu, or the shorter one that appears when MessageChecker takes over your system), you can view the 'Top 10 List of Offending Messages' that MessageChecker has run into. This is useful for keeping track of all the damage your system has sustained. If you're a hacker, you can also look at the memory near the damage; see below for a quick bit of information on that. MessageChecker also keeps track of your system, and as long as it boots into Normal or Paranoid mode, roughly 105 seconds after boot (enough time for most systems to load the boot program and become stable), it backs up the current list of messages. It keeps the first 62 bytes of the first 64 messages (enough to hold most messages; I'm not going to back up all 32K of your silly desktop pic, ok? :). This backing up happens once and only once; if you do a number of things, you may want to tell MessageChecker to back up the list again, which you can do from the CDA. Backing up the message list would be useless without the ability to restore it. But, RESTORING THE MESSAGE LIST IS FUNDAMENTALLY STUPID! Your system could have changed (for better or worse) since the last backup; why should the current message backup have anything to do with what's in your system? Before you restore the backup, you will have to read a long disclaimer so that you acknowledge any and all responsibility for things that happen as a result of the restoration. MessageChecker might crash/trash your system when it restores everything; tough. You asked for it. In case you're stupid or desperate enough to try a restoration, MessageChecker tries to do a good job at it. It notes the connections, and the contents of the messages, and tries fix things, prompting you when it can. If it detects a bad handle to the next message, it replaces that bad handle with the next good handle in the backup. If the message contents have changed, it says so, displays what it can of the messages (the changes may have occurred in the non-printed parts of the messages; they may look identical) and asks you if you want to restore the backup. If the number of messages has changed, MessageChecker will try to accomodate. (Quit/enter the Finder to change it by the number of Finder Extensions sitting in *:system:finderextensions). But, it may really get confused. Oh well. You asked for it. That's why you should manually back up the system every little bit if you want to keep track of things. ~~4 About the options MessageChecker is fairly configurable. This section explains most of them, and recommendations as to what you should set them to: 0) The mode MessageChecker is in: Normal, Paranoid, or Off. Should be self-explanatory unless you haven't read the documentation above. 1) For the speeds of Normal & Paranoid mode (see below), they can be displayed and entered in either decimal or hexadecimal mode. This defauls to decimal mode as most of you aren't hacker types, but if you want, it can be displayed in hexadecimal. Memory dumps are always done in hex, regardless. 2) The speed at which Normal Mode checks your system. This value is in 'ticks' or 1/60 of a second slices. Because of the way the system works, this is the time _between_ checks, so 1 tick is as fast as MessageChecker can run. (0 is off). This value can be set to anything between 1 and 65535 (FFFF hex). It defaults to 30 ($1E) ticks between checks, or checking twice per second 3) The speed at which Paranoid Mode checks your system. Can be set like the Normal speed. If you want, you can have Normal mode check faster than Paranoid; you're the boss. Paranoid mode can really eat up system time, and a time like 1 is best for trying to determine exactly when some memory gets trashed.... For best debugging results, turn your Zip down to .6 Mhz, and turn paranoid mode on :) 4) At boot time, under System 6.0 and later, MessageChecker can draw an icon. MessageChecker has 5 boot icons it can show, namely an eyeball by me, 'Eyes scanning a tape' by Richard King, and 'Says ok' by Moah Mittman, and two by Frank M. Lin. MessageChecker can show one of them, none of them, or a random icon chosen from those three at boot. It defaults to my icon only. No matter what is chosen here, MessageChecker always reports its presence and version in the text bootup screen. 5) MessageChecker can report some information in its Classic Desk accessory menu title. It can have just the name 'MessageChecker', it contain the MessageChecker version currently running, or it can display what mode it's in. It defaults to just 'MessageChecker', but you change that. This purely fluff; doesn't really affect anything. Note: You can have either the version or the mode in the title, but not both at once. 6) When the GS reorganizes memory (this is done at times when it needs certain large chunks of memory), there is the chance that MessageChecker will look through the list of messages, and flag an 'error' because the next message is currently being moved. Things such as Desktop background pictures are the single biggest cause of this. MessageChecker provides a fix for that. When it backs up the messages (automatically, some time after booting up), it can 'lock' the messages down so that they won't be moved, and hopefully fewer false alarms will be generated. But, locked messages can't be shuffled around in memory, so this will fragment your memory somewhat more. MessageChecker defaults to doing nothing to the memory blocks, but if you want, you can lock 'small' messages (usually programs communicating with each other), 'large' messages (usually desktop pictures), or both. It only locks them once when it backs things up, so if you load a new background picture, it would probably become unlocked... I wish I had a way to let MessageChecker know when the system is shuffling memory around; it would make this whole option nicely obsolete. ~~5 Potential Problems: Here's a list of things that have been reported by the beta testers, and my comments/suggestions. 1) Since MessageChecker runs in the background, it eats some system time. I've tried to get the time usage as small as possible, but in some conditions, it may eat a lot of time and cause some char lossage in modem programs: - Your GS is not accelerated. Please, support the GS, and get an accelerator. Your GS will run at the speed as a much more powerful (and expensive) computer. - In the first 2 minutes after boot, MessageChecker checks the system time to see if it's time to back things up. That checking uses a little more time than normal. After it backs things up, it totally skips checking the time. - When it detects a problem, it either takes over your system until you dismiss it (I think it's far more important to be warned than to get some chars), or flashes the border. Even when it's flashing the border, it uses much, much more system time than when it finds no errors. - The faster it checks, the more system time it uses. If there's some character loss, try setting the time between checks to something large, like 120 (check every 2 seconds) or more. - Other things are eating system time. Easy Access eats time and some chars even when not 'on'.... Did I mention I have a vendetta against the misuse of this program? :) 2) If 'paranoid' mode is turned on, when the system installs/removes a message, there is a really, really slight chance that the list of messages will be out of order when MessageChecker checks. Turning on the 'locking' of messages will prevent a lot of problems, but, again, will contribute to memory fragmentation. This is why you should try and Ignore any problems that happen... If the border stops, this was only a false alarm. If it keeps blinking, save everything, and reboot. 3) MessageChecker is mostly good for finding infinite loops and bad handles in the Message list. If something prematurely truncates the list (which isn't good at all, but things are wrapped up neatly), MessageChecker won't think there is a problem. If you use MessageChecker a lot, you should get look at the list of messages a lot so you know roughly what messages are usually there, the number of messages, and all.... 4) Because of speed, not all errors that are flagged in the viewing of the message list are caught. Without using lots of system time to pinpoint problems (I use a 'pretty good' check to see when there's a problem), there's nothing that can be done about this. 5) MessageChecker is not compatible with Easy Access on Rom 01 GS's. The main menu should work fine, but when MC detects a problem and takes over your GS, Easy Access prevents MC from getting any keypresses. All you need is Easy Access installed (not just 'on'; Easy Access steals keys when installed) for this to happen. If you don't really need it, deactivate it! It can steal keys from other programs (like terminal programs) and MC.... ~~6 What to do if you have some low-level programming skill: (If you don't know a handle from a long word, skip this section). Those of you who are hackers probably know about NiftyList's '~m' command to view the message center. My beef with NiftyList's display is that the address reported by NiftyList for a message is not entirely correct. This is where the contents of the message are, yes, but the actual message has a 6 byte header (see a few lines below) that is needed by the system. Therefore, the addresses reported by MC will be 6 bytes less than what NL reports. I like my method, as you can see the whole structure of a message. If you want to know where the message contents are, either add 6 to the MC address, or just do a hex dump from the start of the message. Also, NiftyList doesn't check for any problems with the handle of the next message; it'll heppily go into an infinite loop looking at bad handles; fortunately, this is stoppable by hitting 'esc'. On the other hand, MessageChecker verifies all handles it runs across, so it tells you that there's either a problem with the handle of the next message, or the Memory Manager is toasted. MessageChecker only looks at the first 4 bytes of each message, so if you deliberately trash memory at the NL address, MC won't catch it. But, if you try a 'Restore', it checks the internal contents of the messages against the backup (first 62 bytes only), which can catch a few more errors... But, Restore can get really confused at times (it passes my simple tests fine, but if you add/delete messages, it can get royally confused), and possibly lock up/trash your system! Use at your own risk. I put in the 'Memory Dump' screen into the system takeover code for us hackers. It displays the preceeding $50 bytes, and the first $60 or so bytes of the actual message. The structure of messages is as follows: +0: Handle to next. MC didn't like this. +4: Word: message type. So what? People mostly use names nowadays. +6... contents of message. Can be anything. Messages usually are unlocked, so they float around near the top of regular memory in the IIGS. On my 4.25MB Rom 01 system, all of the messages (except for a desktop pic) sit in bank $41. If you have other amounts of memory in your GS, this may vary. That is why I recommend that you become familiar with a normal message list on your computer before doing too much more. MessageChecker also asks the Memory Manager for all the handle info on the actual message (which is 90% of the time going to be shorter than then $60 bytes I printed out, but what the heck :), as well as the owner of the byte preceeding this message. This is nice for seeing who owned that memory, in case it looks like they overstepped their bounds, such as GNO 2.0.4 or earlier expanding pathnames without my FixKern204. As to going from here, you're on your own. Good luck! For a while (until I get sick of waiting for my GS to boot), I've re-enabled virtually every little da/init/CDev that I had floating around, and apart from my GS being more sluggish, I haven't managed to get anything repeatable yet.... For version 1.0, I stated my belief in at least one (there are more) memory-trashing bug in the Orca languages. Well, about 10 days after 1.0 came out, I ran into one, thanks to MessageChecker. If you have Orca/M 2.0 or 2.0.1, bug Mike Westerfield for an update. Also, if you have artistic skills better than my own, the icon MessageChecker shows at boot is in MessageChecker's resource fork, id #$00000101 to #$00000105. You may edit the icon on the copy of MessageChecker you posess; do NOT pass around modified ones. If you think you have a cooler icon, send it on to me (either rIcon format or regular 'Finder' icon file), and I might include it on future releases of MessageChecker. Also, just for fun and thanks to Frank M. Lin for bugging me to do this, MessageChecker has the ability to display at any of a number of icons at boot in 'random' mode. Here's how: add more icons to the MC resource fork, numbered sequentially from the last one. Then, in the preferences file, byte 14 past the start contains how many icons there are. For the 1.0.2 release, this byte should be 5. Change that byte on disk, but if you ever delete the prefs file, it'll revert back to 5. If you want to look thru this program in GSBug, good luck. :) I didn't plan it this way, but it seems that GSBug has lots of trouble 'x'ing (do a subroutine now, no step-thru) over my printing subroutines. Also, since I use rather custom routines for dumping things to the screen, jsr's to my print a c-string are followed by a 3-byte addr saying where the string is in memory... Saves lots of space by doing just that, but GSBug can't figure out what to display. Well, my source's fine for me. :) ~~7 Vaporware news: Today's literary term is foreshadowing. Why is it that even though they have really underpowered GS's (2 MB or less ram, no accelerator, no HD), people tend install all these "cool" things that they don't really seem to use 90% of the time. (background sound/music players, picture viewers, other fluff.) Could it be....... they feel...... inadequate? Trying to overcome some shortcomings? Have no fear, steroids is coming your way to prop up your ego even further. For those of you who took offense at my slamming of all sorts of 'fluff' inits/das/cdevs, note that I use my IIGS for quite a lot of things. I get by with these addons: "fun stuff": SoftDisk G-S's II Scroll, ReadOnly and Shortcuts, GUIMaster, Twilight II and Gamehacker "programming/bugfixes": GSBug, Splat! (Damn Cool. Buy it.), NiftyList, MessageChecker, FixKern204, FixFontMgr, FixRomBlaster, and Hacker's Helper. "optional.. install when needed": EasyOpen 1.56, Open-It That's about it. My GS boots/runs a lot faster when only these things are installed, which I like. I use Pointless only when I need a fairly weird font from my 300+ TT font collection; the rest of the time, Times/Geneva/Shaston are enough. One suggestion: If you're booting up and see the icon for an addon that you haven't used in the past week or month, DISABLE IT! It's only taking up memory and boot time. ~~8 Hellos: The guys on IRC for GS support. (Except the random pirate, such as the 'plomar' Milhouse). Random IRC folks were beta testers. Here's a list of people who gave suggestions as to what should be added and complained about things... :) Brian Tao (Traycer): 'Top 10' list, designing the main MessageChecker menu. Davius Rex (DaveR): sugesting the backup/restore Alvin Tan (Corey): Debugging info screen Richard King: The 'Eyes and Tape' Icon Noah Mittman: 'Says OK' Icon Frank M. Lin (fmlin/potty/etc): boot icon exists and read from resource fork, plus 2 more boot icons. Jawaid Bazyar (himself) for GNO, the best IIGS development environment. (Far stabler than the Orca shell, in my experience, especially when my FixKern204B is installed :) Non-IRC folks who deserve honorable mentions: Mike Westerfield for Orca/M, which MessageChecker was written in. Dave Lyons: NiftyList 3.4 for showing me how to find the start of the Message list (starthandle=GetWAP(0,2), in case you're interested). Apple Computer Co: for 6.0.1, and lot more dreams. (You can still make them real, guys. The GS is not dead). If you guys want to integrate MessageChecker into 6.1, or distibute it with it, I'd be honored. Can you find the easter eggs? One requires very fast reading in one place; the other you'll find if you're a pirating, sector-editing, bullcrap-claiming jerk.... (That should tell you what to look for :) ~~9 Distribution: MessageChecker is FreeWare. If you know what you are doing, and use it to find a serious bug on the GS, good! (Then, turning around and fixing the bug is an even better step :). Pass it around at will, but do not sell. There are 2 conditions for the distribution of MessageChecker: 1) Don't mess with (add/remove files or text) my .shk archive when you distribute it, unless I give express permission. (Especially DON'T post it to places minus all docs and credit!!! The MessageChecker archive should contain the MessageChecker CDA, this readme file, and an icon file. 2) MessageChecker can be placed on BBS's, software collections, and the like, so long as no more than $5 is charged for downloading, or any 3.5" disk including this program. (If you want to put it on a CD-Rom, that's ok, too). Forms of distribution that are acceptable the last time I checked are, but not limited to: Internet ftp, Internet fsp, IRC dcc, GEnie, AOL, Compuserve, Resource Central's A2.Central, Big Red Computer Club, and Shareware Solutions II. Names are trademarks of respective companies and are not a recommendation on my part. Although the text displayed on the screen by MessageChecker isn't in its resource fork (where it's really easy to edit), I did manage to put 99% of it into one source file, so if you would like to do a different language version of MessageChecker (personally, I think a Latin version would be really spiffy :), contact me, and we can arrange for different versions with various languages to be built. ~~10 Version History What? You never saw all these cool betas? Awww. If you have access to the Internet, and IRC, drop by #AppleIIGS. We're a newbie leg-pulling, and pirate-smashing (learn to spell 'warez' right, bozos; we might take you seriously. You pirate GNO, you feel our wrath.) group of mostly college-age or younger males. (So the subject matter is mostly gutter-level when it's not about the IIGS, but we're working on cleaning it up). Anyhow, as I can send betas to people on IRC that I know, and they do such a good job of finding bugs (well, of all these releases, only one that I know of had a crashing problem, and that was merely a debugging break), and suggesting cool things that I let them beta this. My first version (which I was content with, and would have released had they not suggested cool things to add) merely blinked the border when things may have been wrong. (It used a really bad method of deterining if things were ok). v0.1b1 First released version. Simply flashed the border when it thought things were amiss. v0.11b1 Small update to code: interaction with user. v0.20b1 Cut heartbeat code in half; should be faster. User-definable speeds and boot mode; prefs saved to disk and loaded at boot. Added support to recognize desktop background pics in list of messages. No limit on # of messages anymore. v0.30b1 Now prints out inversed text a bit better. Silly Apple folks put Mousetext in the middle of the charmap. Added: Top 10 bad messages, Backup & restore message list. v0.40b1 Added 'system takeover' code to heartbeat task: freezes system, asks what you want to do as soon as it detects a problem. Also added automatic backup a bit after booting. Some border code was also added-- when it feels things are fine after the takeover or from the control panel, it puts the border back the way it found it. v0.50b1 Optimized text i/o code. Added boot icon/text, and icon file. Ok, so I can't draw. :) Put in some help during the system takeover for those who who never bothered to read this file. Added memory dump for hackers. Also saves the preferences to */system/preferences, not the desk.accs folder. v0.51b1 Cool new main menu format designed by Brian Tao. Copy of boot icon in resource fork, but not used. 2 segments to shoehorn into small system, and easier to customize for various languages. An options menu was added, but not everything was functional. v0.60b1 Reads rIcon off resource fork on boot for customizability. Rest of the options finished.... v1.00f1 Made printing routines better suited to deal with bank crossing, as the system loader can load the TEXTDATA segment across bank bounds. Sped up text i/o some more, removed some duplicated code. (Can you tell I have no life? :) Version # bumped to 1.00 for release. v1.01f1 Cleaned up text a little. Checks for ProDOS 8 before saving prefs. New icons thanks to Richard King and Noah Mittman, ability to display random icon at boot. v1.02f1 Two more icons by Frank M. Lin. rProgramInfo added for compatibility with something, dunno what yet. Actually uses 00c02e for random #s for more randomness. Ability to display any of a number of icons from resource fork, see hacker section above. ~~11 About the programmer: Since September 1992, I, Nathan Mates, have been an undergraduate at The California Institute of Technology, aka Caltech. As Caltech is a phenomenal university, it also costs a bit, so any donations ($, Disks, other programs) to help defray the costs of my time helping the Apple II community from within this prestigious university would be appreciated. My mailing address (good all year): MSC #850, Caltech Pasadena, CA 91126-0001 Email via Internet: nathan@cco.caltech.edu (Other systems can usually send email to the internet; ask your local wizard.) I've written a lot of little things, here's a few names off the top of my head. Some of these things are published, and if you see them floating around, report piracy!!!! Writing things to be published has given me a summer job, and some royalties. If you pirate my stuff, that means you're cheating me personally out of some $, and when caning is legal again in the U.S., you're gonna get hit! Some pirating bastards have said that "U can't/haven't program[ed] sh*t". Is that an insult? Watch who you throw that comment at before you say it. Well, just in case you idiots get around to reading this message, let me just say that GSHacker (my IRC nick) has been a busy little programmer, and programmed quite a lot of things, and they're quite fine in my mind. Go back to the rock you crawled out from under; you're a disgrace. If any of the freeware/shareware things on this list seems interesting, drop me a line, and I'll be more than happy to send it on to you. Patch Programs: FixKern204B, and FixFontMgr601. Freeware. Fix problems in the GNO 2.0.4 shell & TMTerm 1.1, and the Font Manager from System 6.0.1, respectively. Finder Extras: Rebuilder, published on SoftDisk G-S #47 or 48, I think. Rebuilds the system desktop by collecting up all of the rBundles on local disks. CDAs: GameHacker, MessageChecker, Inverter, Hacker's Helper, Wizardry 5 cheaters. All freeware. NDAs: PowerGrid, MultiTris, Minehunt. Shareware, about $5 each Shredder, Fun House, LED Message, Mouse Mileage, SoundFileFixer. All Freeware. Shortcuts. Published by Softdisk G-S, either #45 or 46 Twilight II blankers: Clocks, LED Message, MiniFireworks, Modern Art, Perspective, Sharks and Fish, TunnelGame. Published with Twilight II 1.1 Fish, Flames, Globe, MineHunt, PowerGrid, Snowflakes, Spirals, Swirls, Toast, Voting, some more that exist only in my mind. To be published with Twilight II 2.0 Unreleased: (too much of a hack to be used anywhere else, I guess) PSWidth, toP16, delta/undelta. Random shell utils. RandomT2. Init that shuffles modules every 45 seconds in Twilight II 1.1 As always, these programs are dedicated to Ahram Kim, my girlfriend! ~~12 Signoff Apple II Infinitum!!! (For those of you who don't know Latin, "Apple II Forever")