|||||| |||||| || || |||||| |||||| || || ||| || || || || ||| |||| |||||| || |||| Your || || || || ||| || || |||||| |||||| || || |||||| |||||| GEnieLamp Computing || |||||| || || |||||| RoundTable || || || ||| ||| || || || |||||| |||||||| |||||| RESOURCE! || || || || || || || ||||| || || || || || ~ WELCOME TO GENIELAMP A2Pro! ~ """"""""""""""""""""""""""" ~ Learning to Program ~ ~ New A2U Course ~ Windows Menus ~ ~ ORCA/Debugger 1.1 Ships ~ Splat! Ships ~ ~ Programmers Reference for System 6.0.1 Ships ~ ~ ORCA/Modula-2 RTC Transcript ~ Tour of 8/16 Central ~ ~ HOT NEWS, HOT FILES, HOT MESSAGES ~ ////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ GEnieLamp A2Pro ~ A T/TalkNET OnLine Publication ~ Vol.3, Issue 11 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Editor.......................................................Nate Trost Publisher.................................................John Peters Copy-Editor............................................Bruce Maples \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// ~ GEnieLamp IBM ~ GEnieLamp ST ~ GEnieLamp [PR] ~ GEnieLamp Windows ~ ~ GEnieLamp A2Pro ~ GEnieLamp Macintosh ~ GEnieLamp TX2 ~ ~ GEnieLamp A2 ~ A2-Central ~ LiveWire (ASCII) ~ GEnieLamp MacPRO ~ ~ Member Of The Digital Publishing Association ~ GE Mail: GENIELAMP Internet: genielamp@genie.geis.com FTP: sosi.com ////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ >>> WHAT'S HAPPENING IN THE APPLE A2Pro ROUNDTABLE? <<< """"""""""""""""""""""""""""""""""""""""""""""""""""""" ~ January 1, 1994 ~ FROM MY DESKTOP ......... [FRM] HEY MISTER POSTMAN ...... [HEY] Notes From The Editor. Is That A Letter For Me? A2PRO ROUNDTABLE STAFF .. [DIR] TOUR OF 8/16 CENTRAL .... [TOU] Directory of A2Pro Staff. Great Programmers Magazine. LIBRARY BIT BONANZA ..... [LIB] RTC WATCH .............. [UDU] HOT Files You Can Download. Tales from A2Pro RTCs. DEVELOPERS CORNER ....... [DEV] ORCA/MODULA-2 RTC ....... [OM2] News From Online Developers. The new compiler for the GS. CAMPUS GREEN ............ [CAM] LOG OFF ................. [LOG] New A2U Course Starts. GEnieLamp Information. [IDX]""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" READING GEnieLamp GEnieLamp has incorporated a unique indexing """"""""""""""""" system to help make reading the magazine easier. To utilize this system, load GEnieLamp into any ASCII word processor or text editor. In the index you will find the following example: HUMOR ONLINE ............ [HUM] [*]GEnie Fun & Games. To read this article, set your find or search command to [HUM]. If you want to scan all of the articles, search for [EOA]. [EOF] will take you to the last page, whereas [IDX] will bring you back to the index. MESSAGE INFO To make it easy for you to respond to messages re-printed """""""""""" here in GEnieLamp, you will find all the information you need immediately following the message. For example: (SMITH, CAT6, TOP1, MSG:58/M530) _____________| _____|__ _|O__ |____ |_____________ |Name of sender CATegory TOPic Msg. Page number| In this example, to respond to Smith's message, log on to page 475 enter the bulletin board and set CAT 6. Enter your REPly in TOPic 1. A message number that is surrounded by brackets indicates that this message is a "target" message and is referring to a "chain" of two or more messages that are following the same topic. For example: {58}. ABOUT GEnie GEnie's monthly fee is $8.95 for which gives you up to four """"""""""" hours of non-prime time access to most GEnie services, such as software downloads, bulletin boards, GE Mail, an Internet gateway, multi-player games and chat lines, are allowed without charge. GEnie's non-prime time connect rate is $3.00. To sign up for GEnie service, call (with modem) 1-800-638-8369. Upon connection type HHH. Wait for the U= prompt. Type: XTX99014,DIGIPUB and hit RETURN. The system will then prompt you for your information. Need more information? Call GEnie's customer service line (voice) at 1-800-638-9636. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" [EOA] [FRM]////////////////////////////// FROM MY DESKTOP / ///////////////////////////////// Notes From My Desktop """"""""""""""""""""" o TOP OF THE PAGE >>> TOP OF THE PAGE <<< """"""""""""""""""""""" HAPPY NEW YEAR! And welcome to the first 1994 issue of GEnieLamp A2Pro! """"""""""""""" A2Pro has been as busy as ever during the past holiday season, and you can read all about it in this issue! The Byte Works and Procyon continue to support Apple II programmers with new releases such as the long awaited Programmers Reference for System 6.0.1, the ORCA/Debugger 1.1 update and the Splat! debugger. The A2 University List Manager class has ended and a new class on eight-bit assembly programming will be starting this month. Be sure to check out the Campus Green column for more information. Enjoy, and have a happy 1994! Nate Trost GEnieLamp A2Pro [EOA] [DIR]////////////////////////////// A2PRO ROUNDTABLE STAFF / ///////////////////////////////// By Nate Trost [A2PRO.GELAMP] ______________________________________________ APPLE II PROGRAMMERS & DEVELOPERS ROUNDTABLE _____ ______ ______________________________________________ /_____|/______\ /__/|__| ___|__| Head Sysop: Matt Deatherage (M.DEATHERAGE) /__/_|__| /_____/ Assistants: Greg Da Costa (A2PRO.GREG) /________|/__/ __ __ __ Todd P. Whitesel (A2PRO.TODDPW) /__/ |__|__/______ /_//_// / Jim Maricondo (A2PRO.DYAJIM) /__/ |__|________// / \/_/ Nate Trost (A2PRO.GELAMP) [*][*][*] [EOA] [HEY]////////////////////////////// HEY MISTER POSTMAN / ///////////////////////////////// Is That A Letter For Me? """""""""""""""""""""""" By Nate C. Trost [A2PRO.GELAMP] o BULLETIN BOARD HOT SPOTS o WHAT'S NEW? o PROGRAMMER'S TIPS o HOT TOPICS o MESSAGE SPOTLIGHT >>>BULLETIN BOARD HOT SPOTS <<< """"""""""""""""""""""""""""""" [*] CAT8, TOP5, MSG{91}.................Using the GS Device Drivers [*] CAT8, TOP7, MSG{87}........Programming with ProDOS 16 and GS/OS [*] CAT9, TOP7, MSG{43}................Applesoft BASIC help please! [*] CAT11, TOP15, MSG{14}..................Macintosh FOND file format [*] CAT15, TOP4, MSG{84}................................QuickDraw II [*] CAT15, TOP6, MSG{66}...............................Event Manager [*] CAT22, TOP25, MSG{6}..............List Manager Tricks and Secrets [*] CAT29, TOP27, MSG{47}........................Programming in METAL [*] CAT36, TOP3, MSG{56}................Rumors, Wishes and Vaporware >>>BULLETIN BOARD NEW TOPICS <<< """""""""""""""""""""""""""""""" [*] CAT11, TOP19.................................MIDI data file formats [*] CAT30, TOP9.......................New Splat! Source-Level Debugger >>> WHAT'S NEW? <<< """"""""""""""""""" SYNTHLAB FILE FORMATS Does anyone happen to know where I can get the """"""""""""""""""""" format for a synthLAB song file? It doesn't seem to be on the System 6.0 CD ROM... Mike Westerfield (BYTEWORKS, CAT11, TOP19, MSG:4/M530) <<<<< I recently uploaded my MIDI Synth file printer and player, """"" synthfile, to the A2Pro library. It includes complete ORCA/C source, including a header file that defines offsets into each of the MIDI Synth file types. Note: synthfile only runs under a shell program (such as ORCA's or GNO's). GS+ Magazine will be publishing a program to convert MIDI files to MIDI Synth sequence format in the Jan/Feb '94 issue. If you subscribe and get the monthly disk, you will receive complete ORCA/C source code. MIDI Surgeon is a desktop program, and performs all sorts of interesting things to sequence files. (D.TRIBBY [Dave], CAT11, TOP19, MSG:7/M530) UPDATES FOR ORCA PRODUCTS ONLINE For those of you who have not signed """""""""""""""""""""""""""""""" up, we have private libraries here on GEnie for registered owners of ORCA products. I use them to upload beta versions of the software as bugs are fixed. Recent uploads fix bugs in PRIZM and the Linker. If you are a regsitered owner of ORCA/M 2.0.3, ORCA/Pascal 2.0.1, ORCA/C 2.0.1 or ORCA/Modula-2 1.0, and would like access to these libraries, please send your name AND ADDRESS to me by e-mail. Mike Westerfield (BYTEWORKS, CAT36, TOP3, MSG65/M530) >>> PROGRAMMER'S TIPS <<< """"""""""""""""""""""""" PRODOS 8 PATHNAME LIMITS Is the FILENAME$() command restricted to """""""""""""""""""""""" returning filenames that are only 60 characters max? For some reason, FILENAME$() is not returning the full path: /BBS/ANET2.EMPORIUM/ANET2/USERS/FONG/UPLOAD.QUEUE/COPYRIGHT.INFO (FILENAME$() will drop the last 3 characters.) Why's this? Derek Fong (M.POTTER4, CAT29, TOP27, MSG:54/M530) <<<<< That's a limitation of ProDOS 8, not of the FILENAME$() command. """"" ProDOS 8 can only handle a 64 character pathname. (JUST.DAVE, CAT29, TOP27, MSG:55/M530) >>>>> Really? I wasn't aware that ProDOS-8 couldn't handle paths >64 """"" chars. Can you suggest a workaround for my problem then? Derek Fong (M.POTTER4, CAT29, TOP27, MSG:56/M530) <<<<< Sure - easy workaround. """"" Change the directory/file names so that the total pathname is at most 64 characters. :) (A2PRO.HELP [Sloanie], CAT29, TOP27, MSG:57/M530) LEARNING TO PROGRAM I want to learn to program my GS. I want to learn """"""""""""""""""" more than Applesoft BASIC. What I want is something that is relatively easy to learn, relatively inexpensive, and recomendations for "a goal" like a simple program that I will have to write for myself, and is not in "the book". I learn fast if something is explained well, but I have no idea of what would be a reasonable project to start with. (knowing me I'd try to write AWGS all over again). Also, it would be nice to learn a language that will help me on other platforms beside the GS if I ever move. (EW.CHRISTIAN [PIZZAMAN], CAT16, TOP9, MSG:2/M530) >>>>> Bryan said this: """"" > Erick, > Get two things: Learn to Program Pascal -- study it, learn it, live it. > Then get "Toolbox Programming in Pascal" and become one with your GS. > If you don't want Pascal, there are also C versions, but Pascal is an > easier language to learn in my opinion. I pretty much agree with this. :) --Matt (M.DEATHERAGE [A2Pro Leader], CAT16, TOP9, MSG:2\3/M530) <<<<< Quality Computers and Resource Central are two reputable mail """"" order houses that carry our most popular products. Each would probably be happy to special order other products, too. You can get ORCA/Pascal or ORCA/C, along with our introductory programming course or toolbox programming course, from either company. Mike Westerfield (BYTEWORKS, CAT16, TOP9, MSG:6/M530) CHECKING GRAPHICS STATUS A few weeks ago I was asking how to detect if """""""""""""""""""""""" the double graphics mode is active on the GS. I knew that on the IIe location $C07F was somehow used for this. But when I experimented with this location, I didn't see any values being returned to indicate the state of Annunciator 3 (This is what turns double mode graphics on/off). The Apple IIgs Firmware Reference shows on page 290 that $C07F is part of the ROM interrupt code jump table. This confused me. Until I got the Apple IIe Technical Reference Manual and the Apple IIgs Hardware Reference. On the IIe, $C07F is obviously used. However, I can't figure out how it is used on the GS. No matter what I do, it seems to always return $FF. Fortunately, the GS has an alternate location for checking this. The INTFLAG byte ($C046) has a bit that holds the status of AN3 (bit 5). So I solved my problem and now my Screen Saver CDA fully supports the double graphics mode. The only thing I don't understand is why the GS doesn't seem to support the IIe softswitch. Strange. (B.WELLS5 [Brian], CAT12, TOP26, MSG:79/M530) >>>>> The IIe generally doesn't have multiple programs running at once """"" (each application owns the entire memory space), so being able to check graphics modes isn't that important since the application should know what it's done. So the IIgs has a real way to look at these things, and the IIe has a different way. --Matt (M.DEATHERAGE [A2Pro Leader], CAT12, TOP26, MSG:81/M530) WAITUNTIL AND TIMING Passing 960 as the delayAmount for the WaitUntil """""""""""""""""""" call should pause the GS for 1 second. Can I rely on that fact regardless of the acceleration? I would need a similar thing: I want to run a subroutine for a fixed amount of time (1/2 sec) and this must be independent from the processor speed. How can I accomplish this. Is there a system info somewhere that shows "real time" not processor relative time? And it should be accurate for 1/2 sec. (A.CORRIERI [Alex], CAT15, TOP3, MSG:21/M530) >>>>> WaitUntil was specifically created so that it wouldn't be """"" accelerator dependent. It uses the 60hz (50 in europe) interrupt in the IIgs to keep time - - this same facility is used by the tool call GetTick() which returns a "number of video scans since the system was booted" count, i.e. real time. Todd Whitesel (A2PRO.TODDPW [growf?], CAT15, TOP3, MSG:22/M530) <<<<< >>> A.CORRIERI [Alex] """"" > Can I relay on that fact regardless of the acceleration? No, but you can rely on it pausing for at _least_ one second. The only timing stuff available is the real-time clock and the timed interrupts, and WaitUntil uses the 60 Hz interrupt to time things on. (The finer 1/16-tick resolution is not implemented.) If interrupts are disabled, your delays may be longer than intended. There's no way around this without external timing hardware. >>> A2PRO.TODDPW > It uses the 60hz (50 in europe) interrupt in the IIgs to keep > time Last time I checked, the 60hz interrupt is 60hz throughout the world. It just doesn't coincide with VBL in Europe. We did investigate it, and I remember being surprised but this was the result. --Matt (M.DEATHERAGE [A2Pro Leader], CAT15, TOP3, MSG:23/M530) >>>>> Actually, no, you can't rely on WaitUntil. If someone has set """"" their WaitUntil scaling (in the battery ram) to a non-default value then waituntil will not behave the way you want it to. If you really want to wait one second, just drop into a GetTick() loop and watch for 60 ticks to go by or so. :-) (JWANKERL [Joe], CAT15, TOP3, MSG:29/M530) UNIDISK OR APPLE 3.5? Is there any way to reliably determine whether or """"""""""""""""""""" not a 3.5" drive is a UniDisk or a "normal" 3.5" drive? Both return device IDs of 3. SuperDrives aren't so bad, they return something else ($1e? MFM-encoded floppy) so they are not an issue. BTW: this question could be extended: is there any reasonable way to determine the manufactorer of a device? AE for their floppies, Vulcans etc, AI for the inner drive, flopticals, etc, etc?!? I realize there is not a GS/OS call to do this, but it'd be nice if we could figure out some "tricks" to identify each device. (SOFTDISK.INC [Bryan Zak], CAT8, TOP5, MSG:91/M530) <<<<< I've barely scratched the surface of the Device Driver docs, """"" so this may be of questionable "legality", but here goes.... Pages 113 and 120 of the device driver manual are pertinent to this, see the GetFormatOptions subcall for the DStatus call. Part of the information returned by this call is presented below (hopefully my formatting survives, unique items are marked with asterisks. (try a monospaced font:)) Apple 3.5 UniDisk 3.5 StatListLen $0000 0038 $0000 0018 * OptsInList $0003 $0001 * Opts2Disp $0003 $0001 * Default $0001 $0001 Current $0000 $0001 * Opt1 $0001 $0001 OptLnk $0000 $0000 AplFmt/K $0004 $0004 BlkCnt $0000 0640 $0000 0640 BlkSiz $0200 $0200 ILeav $0002 $0004 * MedSiz $0320 $0320 What I'd bet, is that one could issue a GetFormatOptions call if a 3.5" drive had been found (by other code that is common knowledge). Upon an error free return from this call, if the StatListLen = $0000 0018 and the ILeav = $0004 it would, with a fair degree of certanty, indicate the presence of a UniDisk style drive, whereas any other values would note that the drive was not a UniDisk. Like I said, I'm _no_ expert in this area, but I suspect that this would be an acceptable way of "nailing" a UniDisk drive as it uses only documented GS/OS calls and no "FTA style" hardware snooping. I'm unaware of any 3'rd party UniDisk style drives (or drivers) but if they exist there _might_ be some ambiguity introduced. Also if the UniDisk3.5 driver from Apple wasn't installed, this would not find a UniDisk (but that's an illegal configuration if a UniDisk is connected) The same concept _may_ be applicable to other type of drives, but I haven't researched that as of yet. I invite critique on this method. (H.HISLOP [Harold], CAT8, TOP5, MSG:92/M530) >>>>> Unfortunately, this method is hoping that all devices use """"" different drivers. They do not. For example, all those AMR 3.5" drives out there "pretend" to be Apple 3.5" drives (but not perfectly), so they'd all show up as Apple 3.5 Drives under this scheme. A driver for some other 3.5" card that doesn't have any formatting options would be "unknown" by this method. I don't like this, but it's the truth: There simply is no way to identify individual devices at a finer granularity than device type. Once you get to "3.5-inch drive," you can't get any further. I tried for _years_ to get the GS/OS team to add a new status call that returns a device-name string, and all I ever got back was "Why would you want to do that?" Then, of course, they needed to do it themselves in Archiver so they could make device-specific calls to the Apple tape backup unit -- they found that using the generic "SCSI Tape Backup" ID didn't confirm that the device would accept their device-specific calls. I thought I'd finally won the battle -- but no, they cheated. They allocated a _new_ device ID ($20, "Apple SCSI Tape Driver"). Never mind that no one else gets to do this, or that they could have just as easily defined a solution that worked for everyone. Sorry, but this subject really tees me off that folks wouldn't add five lines of code to return a string pointer in a buffer when dozens of developers asked for it. Normally they were very responsive to developer needs, but they just fell flat on their faces on this issue. --Matt (M.DEATHERAGE [A2Pro Leader], CAT8, TOP5, MSG:93/M530) USING USER TOOLS I am trying to find out if Apple registers user tools """""""""""""""" for the IIGS. If they assign tool numbers. I've written the developer support center and gotten a letter back about Macintosh Creator and File Type Registration. It didn't answer my question at all. I called the developer support center. The person that answered the phone didn't know if Apple registed user tools. He didn't even know anyone who was doing Apple II tech support. He suggested I contact Resource Central. I called Resource Central and they didn't know if Apple registered user tools. I have a hard time finding anyone that knows anything about Apple II support. (C.JUNIEL [Clayburn], CAT15, TOP1, MSG:74/M530) <<<<< Apple does not and will not assign user tool numbers for the """"" IIgs for one simple reason -- there aren't enough for everyone to have one. Apple IIgs Technical Note #73 talks about writing your user tool set so that it doesn't depend on the tool number -- the application should be able to install the user tool set as any user tool number it wants, and the tool can figure it out (if it needs to know) from the function number it's passed when it's first called. --Matt (M.DEATHERAGE [A2Pro Leader], CAT15, TOP1, MSG:75/M530) TRUETYPE FONT CONFLICTS I have run into some problems with some Mac """"""""""""""""""""""" TrueType fonts I aquired. The font ID numbers conflict with each other. I had to go in to each file and edit the font number with a disk editor. Afterward I thought it would be a good idea to make a program to do this. However, I can find no information on the format of TT font files. Does anyone have any idea how I can get the font number from a TT font (it can be done, Pointless does it, but doesn't allow you to change the font ID number). Any help would be appreciated. (J.HANNUM [JAMES], CAT11, TOP15, MSG:14/M530) <<<<< Bryan said this in Category 1: """"" >>> SOFTDISK.INC [Bryan Zak] > TrueType fonts are documented in a document available from APDA (I > believe it's $25 or $30). APDA's number is 1-800-272-APDA. This is true, in fact, but it won't help. TrueType font IDs in the current Macintosh world and in Pointless are the resource IDs of the 'FOND' resources that describe the font families. You'd need to get Macintosh resource information to read or change it, and it means mucking directly with the resource map on a IIgs (a slightly dangerous proposition). The format of resource forks is publicly available in "Inside Macnitosh: More Toolbox Essentials" which has _just_ hit the stores. (It was previously in Inside Macintosh Volume I.) Note that if you go changing TrueType font IDs, you must _not_ distribute those fonts to other people where they might wind up back on a Macintosh unless you follow all the rules for Macintosh font family numbering, which include specific ID ranges tied to specific international script systems. There are more fonts than there are available IDs on the Macintosh -- there _will_ be conflicts. Trying to resolve them on more than a system-by-system basis is a losing proposition. There is a range of the Macintosh font IDs allocated just for resolving system-specific conflicts, so if you used that range for Roman-only fonts, you should be safe. However, that discussion is outside of A2Pro's domain. Further information on how Macintosh font and script systems work belongs in MacPro, the Macintosh Programmer's and Developers RoundTable on page 480. --Matt (M.DEATHERAGE [A2Pro Leader], CAT11, TOP15, MSG:15/M530) >>>>> I uploaded a set of AWGS and TXT files that detail the format """"" of the Mac resource fork. I think it was called RES.AWGS.BXY and RES.TXT.BXY. Search for files uploaded by K.FLYNN (there shouldn't be TOO many of them [grin]). (K.FLYNN [ Chris ], CAT11, TOP15, MSG:16/M530) IMPLEMENTING A WINDOWS MENU I've used a windows menu in several of my """"""""""""""""""""""""""" programs and implemented it like this: In the "open window" procedure, besides calling NewWindow2, I also create a menu item by calling InsertMItem2. The menu item ID of is determined by incrementing a global variable called wndwMnuID. The menu item ID is stored within a record whose pointer is placed within the new window's refcon. When the program detects a menu item selection and can't match the ID with an application menu item, it cycles through the windows on the desktop looking for the correct ID in the refcon record. If it is found, that window is brought to the front; if not, the selection is ignored... I'm satisfied with this procedure in everything EXCEPT the way a menu item ID is assigned. I begin wndwMnuID at a # like 400. When assigning the ID, I check that it is not over, say 800. If it is, I return wndwMnuID to 400. This seems rather crude and not a "good" way to do it! If menu items had a refCon field, things would be peachy... but that implementation would _probably_ only be good for Windows_menu menu items and thus take up unnecessary memory. Anyway, does anyone have suggestions for a _better_ way to do a Windows menu? How does the Finder do it for that matter? Rick (R.ADAMS48, CAT15, TOP15, MSG:43/M530) >>>>> Rick, there's nothing at all wrong with the way you do things. """"" Menus don't have refcons largely because the entire ID space above about 256 is totally controlled by the application. It's unlikely you'll ever have more than 400 windows open at once (you do decrement the global variable when a window closes, right?), so you should be set. --Matt (M.DEATHERAGE [A2Pro Leader], CAT15, TOP15, MSG:44/M530) <<<<< I agree with you, but that doesn't really solve my problem... """"" decrementing the global variable won't "work" either. For example, say I have but 2 windows open: the first has the menu item ID (in the Windows menu) of 400, the second 401. If I close the second (401) and decrement the global variable, the next window I open will have the same menu item ID as the first window. That leads to the problem of someone opening a window and leaving it open through 400 windows (unlikely, but possible :). When the 401 window is opened, the procedure sees the global variable at 801, changes it to 400, and we again have 2 windows open with the same ID... Just thought I'd get everyones ideas since I sometimes don't always think up the best or shortest ways of doing things! :) Rick (R.ADAMS48, CAT15, TOP15, MSG:45/M530) >>>>> Yeah, I see how that could happen... i.e. if you have three """"" windows open, and close the second, then open another one, the new one would have the same ID as the third one... Maybe you could just keep a list of the IDs that are in use (keep it in numerical order) and any time a new window is opened, scan the list for the first gap in the ID numbers and use that one. It would take a little more work than what you're doing (not much more though) but it would solve the problem. (JUST.DAVE, CAT15, TOP15, MSG:46/M530) <<<<< In my programs I don't keep a list of ID's, but, I check for """"" special circumstances. For example, when all windows are closed- reset the counter. It is even less likely that a user will open up 400 windows, then 400 more without closing the first 400, right? Keeping a list wastes the list's memory use, although that is very small. This topic is in some ways kind of funny, but in another sense its important because programmers must always guard for the "crazy" user who does the unexpected. BTW, I have opened up 100 windows on my GS. The last 20 or so get created/drawn mucho slow so it is probably a safe bet so assume that no user will open more than 400 windows at one time. However, if you do not reset your counter to zero when all windows are closed, it is possible a user will open 1 window, close it, open another, close it, and repeat this process 400 times before quitting your program! Bill (W.TUDOR, CAT15, TOP15, MSG:47/M530) >>> HOT TOPICS <<< """""""""""""""""" MYTHS FABLES AND SHASTON 7 If a program specifies the font Shaston, """""""""""""""""""""""""" size 7 point, you wind up with characters the exact same size as Shaston 8, but the characters are printed closer together. Perhaps "non-proportionality" isn't the right word; now that I think about it, I think "Shaston 7" is still proportional, but just doesn't take up as much space horizontally. I find it useful for putting lots of text in narrow spaces. In fact, I think it's nicer-looking than standard Shaston 8 (I once tried to rig my system to use Shaston 7 as the system font... with no luck, but I felt like giving it a shot :). -- Eric S. (aka Sheppy) (E.SHEPHERD [Sheppy], CAT15, TOP4, MSG:84/M530) <<<<< When you request any font size that's not installed, it is """"" algorithmically created from one that does exist. For a one-point size difference, most of the dropout in the scaling comes from the right-side bearing, but that's just how it works. (In fact, I've seen Shaston 7 used extensively due to an accident, and it looks a little weird because the algorithm does strange things, just as it does to most non-integral multiple of an existing point size.) --Matt (M.DEATHERAGE [A2Pro Leader], CAT15, TOP4, MSG:85/M530) >>>>> Greg (and thus probably Eric) seem to think there is special """"" support in the system for Shaston 7. That when QuickDraw (or possibly the Font Manager) encounter it it just uses Shaston 8 but a charExtra of -1. True? False? (SOFTDISK.INC [Bryan Zak], CAT15, TOP4, MSG:86/M530) <<<<< I have not examined the source to verify this, but to my """"" knowledge, it's false. At one time, HyperCard IIgs was using Shaston 7 exclusively because Andy Stadler mistakenly believed the "size" field in a fontID record was zero-based instead of one-based, and it was not simply Shaston 8 with a pixel removed between the characters. It was irregularly spaced. --Matt (M.DEATHERAGE [A2Pro Leader], CAT15, TOP4, MSG:87/M530) >>>>> Nope, there is no specific Shaston 7 support. It just looks mostly """"" correct due to the quirky way in which the Font Manager's bitmap scaler works (as Matt has already mentioned). If you want to be assured that you're getting nicely scrunched text, use Shaston 8 with charExtra (and/or spaceExtra) set to -1.0. (MURPH [jim@apple], CAT15, TOP4, MSG:89/M530) >>> MESSAGE SPOTLIGHT <<< """"""""""""""""""""""""" There is a difference between the remainder from an integer division and the mathematical modulus. As it turns out, they are the same value when both arguments are positive, which is why you see people call an integer remainder a modulus. One cool way to think of the mathematical modulus is to think of it like a clock. Let's assume we're using a standard 12 hour clock, but the clock face was created by a programmer, so 12 o'clock is labeled 0. This works for taking a number mod 12, as in: x mod 12 {Pascal} x % 12 {C} Now, if x is a positive number, x mod 12 means to count around the clock x hours, and read off the result. So 15 mod 12 is 3, which also happens to be the remainder from an integer division. For negative arguments, though, you still start at 0 but count off the hours counterclockwise, so -1 mod 12 is 11. A number line works pretty well for this, too, and shows the continuous nature of the result. The difference between a modulus and an integer division pops up for negative arguments. In that case, Remainder(-1, 12) is not 11, like in a modulus. Instead, it's 1 or -1, depending on how your computer (or language) does business. One other interesting note: The remainder of an integer division is just as well defined when the denominator is negative as when the numerator is negative, so Remainder(1, -12) and Remainder (-1, -12) both make sense, although you can define the sign of the result any way you like. For the modulus operation, the second argument must be greater than 0. In Pascal, for example, 4 mod -2 is illegal, and if you have range checking turned on, ORCA/Pascal will flag an error. Different languages have handled mod different ways. In Pascal, from day one, mod is a true modulus. On the other hand, Jensen (of Jensen&Wirth fame) goofed in the original Pascal report! The manual part, though, got it right. Still, many Pascal compilers implement mod as an integer division, and don't bother to state that this is an exception to the ISO standard, the ANSI standard, and Jensen&Wirth. In C, things are just as mucked up. My favorite C manual is Harbison & Steele. They state that % is implemented a lot of different ways, and that in portable C programs, you should not count on any particular result from % if either argument is negative. All in all, not bad advice for any language, except perhaps Ada. In ORCA/C and ORCA/Pascal, % and mod are the true mathematical modulus operation. You can count on it staying that way for Pascal. For C, though, I have an open bug report from a person who says I got it wrong. They claim that ANSI C specifies % as an integer remainder, not a mathematical modulus. I haven't finished verifying this, but based on a quick look, I think he's right. As a result, the value you get from ORCA/C for -3 % 7, say, may change between versions 2.0.1 and 2.0.2. And that's the way it was, 2 Dec '93. :) Mike Westerfield (BYTEWORKS, CAT36, TOP11, MSG88/M530) [*][*][*] While on GEnie, do you spend most of your time downloading files? If so, you may be missing out some excellent information in the Bulletin Board area. The messages listed above only scratch the surface of what's available and waiting for you in the bulletin board area. If you are serious about your Apple II, the GEnieLamp staff strongly urge you to give the bulletin board area a try. There are literally thousands of messages posted from people like you from all over the world. [EOA] [DEV]////////////////////////////// DEVELOPER'S CORNER / ///////////////////////////////// News From The A2Pro Online Developers """"""""""""""""""""""""""""""""""""" By Nate C. Trost [A2PRO.GELAMP] >>> ONLINE SUPPORT IN A2PRO <<< """"""""""""""""""""""""""""""" CAT TOP COMPANY === === ======= 29 INDEPENDENT DEVELOPERS ONLINE 2 DYA/DigiSoft Innovations Online 8 Simplexity Software Online 14 Quality Computers Q-LABS Online 20 DreamWorld Software Online 26 METAL/FV Software Online 32 Kitchen Sink Software Online 30 PROCYON, INC. 31 SOFTDISK PUBLISHING 32 MORGAN DAVIS GROUP (MDG) 33 GS+ MAGAZINE 34 JEM SOFTWARE 35 PRODEV, INC. 36 THE BYTE WORKS Each month this column feature highlights and news from various developers who provide support via A2Pro. >>> NEWS FROM PROCYON INC. <<< """""""""""""""""""""""""""""" SPLAT! DEBUGGER SHIPS Writing software in a high level language for the """"""""""""""""""""" Apple IIGS has always been something of an adventure. Bugs are hard to track down because GSBug is ill-suited to high level langauges (which variable does the number $05 represent?), and "print-statement" debugging is slow and tedious. So, if your program had bugs, you had to fix them the hard way. Until now. Introducing: Splat!, the debugging tool you've been dreaming of! Splat! is a "source-level" debugger, meaning that when you step and trace through your code you see the program lines just as they are in your source code. Variables are displayed in their own window and program output is captured in yet another window! Splat! utilizes a text-based interface that works a lot like the standard IIGS desktop interface; this gives you the speed and flexibility of text with the ease-of-use of the desktop. Splat! is packed with powerful features to help you track down and squash those nasty bugs. o Supports the ORCA debugging standard, so it works with all the ORCA languages, present and future, including C 2.0 and Pascal 2.0. o Support for structures and arrays; expand them to view individual elements and fields, and modify them. Follow linked lists with the touch of a key! o Profiling allows you to find the slowest subroutines easily and concentrate on optimizing only where necessary. o Splat! works in the GNO/ME and ORCA shells, and also outside them. You can use Splat! to debug Desk Accessories, INITs and CDEVs as easily as applications - you're not limited by the debugger's environment. o Breakpoints and "Auto-Go" regions help you move quickly to the part of your program that is malfunctioning. o Unique "template" feature lets Splat! intelligently display structures even with older versions of the ORCA langauges. Splat! uses the GSBug template standard, which means the most common ToolBox data structures are pre-defined for you. You may be thinking "This all sounds neat but I'm just beginning to learn how to program; I'm not a professional programmer". If so, think again: Splat! will help you learn to program in record time, because it will help you find those "beginner's bugs" that everyone (yes, even us!) found so frustrating. Splat! helps beginners understand how their code works because they can see if work, step by step, right in front of them! Splat! is available right now at a bargain-basement Introductory price of just _$39.95_. Compare this to the $100's similar debuggers on other computers can cost! But don't delay, because this special offer expires on February 15, 1994. To take advantage of this special offer, simply send a check or money order for $39.95 ($44.95 for overseas orders to cover shipping) to: Procyon Enterprises, Inc. PO Box 620334 Littleton, CO 80162-0334 USA (We regret that we cannot currently accept credit purchases) Do you already own ORCA/Debugger? If so, then you can take advantage of our special competitive upgrade offer: Just send $24.95 ($29.95 overseas) and your original ORCA/Debugger disk and get the new features you want: _now_. (Your disk will be returned to you with your offer). For more information, you can contact Procyon through any of the following email addresses: America OnLine: GNO Jawaid GEnie: PROCYON.INC Delphi: JAWAIDB Internet: bazyar@cs.uiuc.edu Splat! Feature List: o Works with ORCA/C 2.0, ORCA/Pascal 2.0, and any other languages that support the ORCA debugging standard. o Intelligent handling of structures and arrays, even if your compiler does not directly support them o Subroutine profiling accurate to 1/7860 of a second o Not environment dependent; works in programming shells such as GNO/ME, but equally well in the Finder - debug your code where it's most convenient o Full debug-time control : breakpoints, auto-go regions, step into/over subroutines, step/trace, run at full speed, halt execution o Comes in two versions: Init and Shell Command. The Init version pops up whenever a program with debug codes is run; the Shell Command version runs only when you specifically want it to (and saves valuable main memory). o Configurable screen display - choose between Source/Variables/Output, Source/Double-wide Variables, and Source/Local Variables/Global Variables (some languages do not support the separate Local/Global display). Tab spacing for the Source window is also configurable. The Source window is always 80 characters wide, helping you see more of your source code at once. o "View source or text file" feature lets you cross-reference without leaving your current debugging session o View the subroutine call stack - see how your program got into the current function, and what source files the callers are in o Ability to manipulate the values of simple variables and complex data structures o "Address of next line" feature helps you use Splat! with such popular tools as GSBug and NiftyList o Written in machine langauge for the highest possible speed GSBug is a trademark of Apple Computer, Inc. ORCA/C, ORCA/Pascal and ORCA/Debugger are trademarks of The Byteworks, Inc. (PROCYON.INC, CAT30, TOP9, MSG1/M530) USING MORE WITHIN PROGRAMS I've been working away on my Star Trek game """""""""""""""""""""""""" and teaching myself C at the same time. I wrote a routine that displays text files to the screen (to print the instructions for the game), including pausing at the end of the screen. That, of course, is very similar to "more". Is there a way to pass a filename/pathname to "more" from within a program and then return back to the program? If so, can you provide some example C code? Thanks, Michael (still loving GNO!) (M.POTTER4 [AppleNET Pro], CAT30, TOP3, MSG87/M530) <<<<< Sure! """"" #include #include #include int morefile(char *filename) { char *cmdline; int result; /* allocate memory for cmd line */ cmdline = malloc(6+strlen(filename)); /* create the command line */ sprintf(cmdline,"more %s",filename); /* execute the command line */ result = system(cmdline); /* dispose the memory */ free(cmdline); return(result); } Basically, the core of this routine is the "system()" library routine, which takes a C string as input, and has the shell execute that string as if you'd typed the command at the shell's prompt. The other stuff is just C-junk to allow an input filename of arbitrary length. I hope this does it for you! Jawaid (PROCYON.INC, CAT30, TOP3, MSG88/M530) GNO PTY USE I've been experimenting with PTY's and I have some """"""""""" questions (and some other subjects too). 1) I've written a piece of code which will open a .ptyq0 and a .ttyq0 and run login on it. I can then copycat over to it and all works normally ... until ... I attempt to open another one. What is the proper protocal to open a PTY and know if its already in use? There is no error generated. When I run my application and then use Finder and TMTerm I crash (lock up) because we both try to use the same one. Just to clarify, I want to be able to determine if a PTY has been previously opened, not really if an application is running on it. 2) Is there an approved way to tap into the GNO/ME keyboard scan routine so that my application can watch for a certain key sequence (no matter what other application is running) and if it is for me (ie. Option Keypad) grab it and switch another terminal to the current STDIN (& etc)? A practical application for console switching. 3) This may have been asked previously but ... Is the GNO/ME device driver format documented any where? Is it the same as GS/OS and are the requirements the same. By this I mean the format and requirements for PRINTER and MODEM type DRVs. 4) I also believe I saw this somewhere else but I couldn't find it when I needed it ... If I crash into the monitor in GNO/ME what is the address to execute to re-start/re-connect 'things'? This may seem a strange request BUT I'm sure I saw it some where. Thanks in advance for any light you can shed. (D.MITTON [Doug], CAT30, TOP2, MSG59/M530) <<<<< Trying to open a PTY that is already open should result in an """"" error (check for -1 coming back from open, or NULL from fopen). So, basically you just try opening ptyq0; if that fails, try ptyq1; keep going (up to the max of ptyqf). > A practical application for console switching. Something like this would have to be added directly into the kernel (i.e., there's currently no way to install "hotkeys" that a process act on). At the moment, the bank 0 limitation has kept us from adding console switching into the system, but we hope to fix this limitation. > Is the GNO/ME device driver format documented any where? No, and they're nothing at all like GS/OS drivers. If there is a particular device you want support for, let me know (a lot of folks want Super Serial Card drivers, and this will probably be the next one I do). > If I crash into the monitor in GNO/ME what is the address to execute > to re-start/re-connect 'things'? There's no vector like that, but very often you can use ^C (or the GNO Snooper) to kill the monitor process and return to the shell. We recommend a reboot shortly after this, but it can be useful when trying to find bugs. Jawaid (PROCYON.INC, CAT30, TOP2, MSG60/M530) GNO DRIVER DOCUMENTATION Are there any sort of detailed """""""""""""""""""""""" documentation on your printer and modem drivers that come with GNO? As I become more comfortable with C, I'd like to work on some communications software. This should be made easier because I've seen quite a few books on serial communications using C. I checked all my folders on my HD and didn't see the yankit man page. I saw the list of missing man pages on the internet topic and am looking forward to all of them eventually showing up. I know that I'll be writing a man page for my star trek game . Michael (who's now awaiting splat) (M.POTTER4 [AppleNET Pro], CAT30, TOP1, MSG37/M530) <<<<< Yes.. the manpage in particular you want to read is TTY(4). """"" It describes the various device control calls you'll be using. Otherwise, you just: fd = open(".ttya",O_RDRW); read(fd...) write(fd...) close(fd) As you can see, it's very very easy to use GNO's device drivers :) Jawaid (PROCYON.INC, CAT30, TOP1, MSG38/M530) GNO SPOOLING AND APPLETALK Is there any current way to support """""""""""""""""""""""""" printing to an AppleTalk ImageWriter II from GNO? Supporting the print-spooling feature would be great as well! I'm in a bit of a quandry right now - I like the print-spooling capabilities of GNO when hooked up to a serial printer, but I want to network my GS and Mac for file-sharing (and yes I do have an AppleTalk card for the printer already). And I don't have enough slots available to consider using an SSC for the IWII. (A.BELYEA [Allan], CAT30, TOP2, MSG49/M530) >>>>> If GNO supports GS/OS devices as I believe it does, you should """"" be able to print to the .RPM device while networked and have everything work just fine. (RPM == Remote Print Manager) --Matt (M.DEATHERAGE [A2Pro Leader], CAT30, TOP2, MSG50/M530) <<<<< Matt's right. It should work, but there's currently no way """"" to tell the print spooler to use .RPM. This will surely be changing in the future :) Jawaid (PROCYON.INC, CAT30, TOP2, MSG52/M530) PIPES GNO AND ARCHIVERS Under Unix when FTPing, is it possible to do """"""""""""""""""""""" something like: get labels-ps.tgz|gunzip|tar xfv If so, would it also be possible under GNO (after the IP stuff comes out)? (D.BROWN109 [Dan], CAT30, TOP2, MSG55/M530) >>>>> I assume so, since we'll likely be porting the BSD Unix FTP """"" program directly. Obviously we don't have gunzip, and GNO's tar doesn't accept standard input yet, but we can fix that for ya :) Jawaid (PROCYON.INC, CAT30, TOP2, MSG56/M530) <<<<< You're porting gunzip? Cool! (-: How about this: """"" rz|sscii (or descii)|tee file.bxy|yankit xv I tried the sscii file.bsq|yankit xv, and yankit returned a usage message. Does this mean it doesn't like pipes either? (D.BROWN109 [Dan], CAT30, TOP2, MSG57/M530) >>>>> No, yankit does work with pipes, you just have to give it """"" a filename which indicates a pipe: sscii file.bsq|yankit xv - However, I don't believe sscii will output to standard output. Perhaps the descii utility could be modified to do this? (it's a lot faster than sscii anyway). One final note: yankit's pipe feature is kinda slow because Andy uses a TextTools call to read data from the pipe, instead of a GS/OS Read call. He's needed a good reason to do this, and hopefully he's watching now that someone really wants to do it :) Jawaid (PROCYON.INC, CAT30, TOP2, MSG58/M530) <<<<< Dan, in some sense it's not really safe to pipe anything out """"" of a binscii decoder, because of the way binscii works. At its heart, binscii is a fairly unintelligent engine that decodes a segment, opens the filename it belongs to, sets the file mark, and writes it. This is fundamentally incompatible with pipes except when the input to sscii is perfectly ordered and only contains one file. The kind of input binscii decoders are designed to handle has multiple files mixed together with their parts in any convenient order, and converting that to something that can be piped to another process is a pretty obnoxious problem. Todd Whitesel (A2PRO.TODDPW [growf?], CAT30, TOP2, MSG63/M530) >>>>> OK, I understand that. Would uudecode file.uu|uncompress """"" theoretically be safe? (D.BROWN109 [Dan], CAT30, TOP2, MSG64/M530) <<<<< Yes, you can fully pipe uudecode because it always operates on """"" single files. (Which incidentally is why splitting uuencoded stuff into pieces is such a hassle -- it's not built into uuencode.) Todd Whitesel (A2PRO.TODDPW [growf?], CAT30, TOP2, MSG65/M530) >>> NEWS FROM GS+ MAGAZINE <<< """""""""""""""""""""""""""""" NOV/DEC GS+ MAILS Well, we've mailed out the latest Nov/Dec GS+ """"""""""""""""" already... things to look forward to in case you don't have yours yet are a program to let you get stuff off of CD-ROMs which have volume names containing spaces, a new MiscLib version, a groovy game, and last but not least, a finder extension which will extract files from ShrinkIt archives. (JWANKERL [Joe], CAT33, TOP4, MSG45/M530) >>> NEWS FROM PRODEV, INC. <<< """""""""""""""""""""""""""""" WORKING WITH THE DDT I received DDT16 in the mail awhile ago and """""""""""""""""""" have it installed in my GS. I used the INIT to automatically initialize the DDT16 upon booting my computer. I see the screen briefly while it initializes and then my boot goes on its merry way. I have one question that may sound very very lame :) After DDT16 is initialized, how do I invoke it? I know that there is a HOT key that does something... like the default is but it doesn't enter the DDT debugging mode. I read over the manual several times thinking that I surely missed something but I don't think I did. Could you take me through a quick session? Here's what I'd like to do: o From the finder I run BASIC.SYSTEM. o From there I launch my 8-bit program that I am working on. o I want the the program to break on the first instruction so that I can start stepping through the code in debug. o Say I load the program at $6000, I'll have to set a breakpoint at $01/6000 before launching the program right? But how do I get back to the DDT? Do I have to enter the monitor and type Cn00G every time? (R.NIELSON1 [Russ!], CAT35, TOP2, MSG10/M530) >>>>> The purpose of the DDT Init is to set up the 6522 VIA chip on the """"" DDT and also to set the NMI vectore at $00/03FB in the IIGS to point to the DDT. After the DDT is initialized it will trap any break (BRK) instruction that occurs and pressing the button on the DDT cable will generate a Non Maskable Interrupt (NMI) that is also trapped by the DDT. When I am debugging GSOS applications I just put a BRK instruction in the code where I want to interrupt it. When I assemble and run the app. the DDT will take control at the spot of the BRK. I then press the down arrow key to skip over the BRK instruction and then begin tracing the code with the DDT. For 8 bit applications I generally know the address the application will load to so I load the app., start up the DDT, then put the program counter at the start of the app. and start tracing, or put breakpoints in the code and start the app. running. Be careful when you are debugging 8 bit app's. ProDOS 8 over writes the NMI vector at $00/03FB which prevents the DDT from trapping breaks or interrupts. You need to restart the DDT after running ProDOS 8. The simplest way to do this is wby writing a little program that does a JSR $Cn04 where "n" is the slot number of the DDT. The DDT will initialize the NMI vectors at $00/03FB and return to you with an "RTS". Make sure the IIGS is in emulation mode when you do the JSR. You might also add the code to the start of your app. so that it initializes the DDT each time you start it up. Another option would be to modify ProDOS 8 so that it did not overwrite the NMI vector. One more option is to use the GS's built in "Visit Monitor" CDA to start the DDT after running your application program. This is explained in the DDT manual in the DOs and DON'Ts section, 2nd page from the last. Last but not least, your idea of a hot-key sequence to get into the DDT is a good one. Or a CDA that does a DDT Init. I am so busy right now I doubt if I will get much of a chance to work on these items. Perhaps someone else will contribute to a worthy cause. I know this was a wordy answer, I thought someone else might benefit from it. (PRODEV [Chuck], CAT35, TOP2, MSG11/M530) >>> NEWS FROM THE BYTE WORKS <<< """""""""""""""""""""""""""""""" ORDERING BYTE WORKS PRODUCTS Many of our products are carried by major """""""""""""""""""""""""""" mail-order houses like Quality Computers and Resource Central. Their prices are frequently far below retail, so unless we are doing a special promotion, like the introductory offers for ORCA/Modula-2, Programmer's Reference for System 6.0.1 and the upgrade for ORCA/Debugger (all from December 1993), you should look to these major distributors first to get the best price. For upgrades, special introductory offers, and lower volume products that these dirstibutors don't carry, you'll want to order directly from the Byte Works. You can order several ways: Online: Send the following to my address by e-mail. I will send back a short note as soon as I read your order to let you know it has been received. Name UPS Mailing Address VISA or MC Card Number & Expiration Date What you are ordering. What you expect to pay, with shipping. Phone: Call us at (505) 898-8183. We can take credit card orders over the phone. Mail: Send the same information or a personal check instead of the credit card information to: Byte Works, Inc. 4700 Irving Blvd NW, Suite 207 Albuquerque, NM 87114 (BYTEWORKS, CAT36, TOP1, MSG3/M530) PROGRAMMERS REFERENCE FOR 6.0.1 SHIPS It's here! Programmer's Reference """"""""""""""""""""""""""""""""""""" for System 6.0.1, the long awaited addendum to Programmer's Reference for System 6.0, is now final. We're printing them now, and will start shipping them early next week. This new addendum is 50 pages of documentation, telling you all about the changes Apple made in System 6.0.1. This is the OFFICIAL REFERENCE for programmers who want to use the new features in System 6.0.1. This is the documentation Apple will expect you to have to use System 6.0.1 features! You'll find out about: o New tool calls, like AlertMessage (a quick and easy way to display alerts). o Correction of errors and clarifications to Programmer's Reference for System 6.0 and Apple IIGS Toolbox Programming, volumes 1-3. o Changes to GS/OS, including programmer documentation for the new MS-DOS FST. o Changes to the Sound Control Panel. o New variables in the battery RAM. o New features in Finder 6.0.1. Programmer's Reference for System 6.0.1 fits right into your current notebook for Programmer's Reference for System 6.0. Best of all, it's just $10. If you don't have Programmer's Reference for System 6.0, now is the time to fill out your entire reference library. Programmer's Reference for System 6.0 is the official Apple documentation for all of the changes to the Apple IIGS System disk from System 5.0.2 through System 6.0. Its 468 pages tell you all about the new tool calls added in System 6.0; describe changes to GS/OS that occurred after Addison Wesley published "Apple IIGS GS/OS Reference;" and tell you all about the new Finder. Order now, and you can get Programmer's Reference for System 6.0 _and_ Programmer's Reference for System 6.0.1 for the old price of $45. Hurry, though: On January 1st, 1994, the price for the combined documentation goes up to $50. If you order this month, you miss the price hike and save $5! Shipping charges for Programmer's Reference for System 6.0.1 are free in the U.S. Shipping charges for Programmer's Reference for System 6.0 and Programmer's Reference for System 6.0.1 are $5 in the U.S. For customers outside the U.S., please e-mail your location, and I'll get back to you with the exact shipping charges. (BYTEWORKS, CAT36, TOP25, MSG14/M530) ORCA/DEBUGGER 1.1 SHIPS It's here! ORCA/Debugger 1.1 is the newest """"""""""""""""""""""" version of our highly regarded debugger for the Apple IIGS. ORCA/Debugger is a source level debugger for ORCA/Pascal, ORCA/C, ORCA/Integer BASIC and ORCA/Modula-2. Unlike PRIZM, which comes with these languages, ORCA/Debugger is not restricted to a particular environment. It's an Init that sits in the background, ready for you when you need it. You can debu almost anything -- 320 mode desktop programs, other Inits, CDevs, and HyperStudio NBAs, for example. Once you pop into ORCA/Debugger, you see the actual source code from your program, not the machine code you get from machine language debuggers like GSBug. You can look at your variables using the same names and formats you used in the program itself. You can even change the value of a variable while you run! ORCA/Debugger 1.1 now supports records, objects and pointers, too. If your program uses a Rect, for example, ORCA/Debugger shows you the address of the record in memory, then automatically expands the record to show you all of the fields, with no extra typing! Here's what you would see: myRect: 06/B544 v1 10 h1 10 v2 100 h2 20 ORCA/Debugger 1.1 is shipping now. If you have ORCA/Debugger 1.0 or 1.0.1, you can get the new version of the debugger for just $10. (Overseas customers: Please add $3 for shipping and handling.) If you don't have ORCA/Debugger yet, rush to your nearest wallet and send us $30 plus shipping before 28 February 1994, and we'll send you the most useful debugging tool available for high-level language Apple IIGS programming. ORCA/Debugger is normally $50, so you SAVE $20 from the retail price. Shipping is $5 in the US; please write for overseas shipping rates. And if you order online before 31 December 1993, we'll give you FREE SHIPPING in the U.S., and $5 off of shipping to any other location. (BYTEWORKS, CAT36, TOP29, MSG34/M530) ORCA/MODULA-2 REFERENCES Well, I said I'd do it :-). Here is a listing """""""""""""""""""""""" of all the books I have on Modula-2: Modula-2, A Seafarer's Manual & Shipyard Guide Edward J. Joyce Addison-Wesley, 1985 ISBN 0-201-11587-5 Programming in Modula-2 (Third, Corrected Edition) Niklaus Wirth Springer-Verlag, 1985 ISBN 0-387-15078-1 A Guide to Modula-2 Kaare Christian Springer-Verlag, 1986 ISBN 0-387-96242-5 Advanced Modula-2 Herbert Schildt Osborne/McGraw-Hill, 1987 ISBN 0-07-881245-3 Modula-2 Programming Ian Kaplan and Mike Miller Hayden, 1986 ISBN 0-8104-6480-2 Modula-2 Library Modules, A Programmer's Reference Robert D. Walker TAB Books, 1988 ISBN 0-8306-2737-5 Modula-2, A Software Development Approach Gary A. Ford & Richard S. Wiener Wiley, 1986 ISBN 0-471-84443-8 Modula-2 Wizard, A Programmer's Reference Wiley, 1986 ISBN 0-471-84853-0 The Joyce book is a bit "cutesy", but very well written and informative for the beginning M2 programmer. The Wirth book is necessary, but about as much fun to read as the Clinton Health Plan. Most of the others have their various high points (which I don't really recall with any degree of accuracy). The two Wiener books are _outstanding_. I was amused to note that both of these mention "Includes Turbo Modula-2" on the cover! Yes, Borland did have a CP/M hosted Modula-2 compiler. They will not admit it if you call them, but I own several copies. It was a killer, and despite it's ideosyncrasies generated incredibly fast, tight code. In 1988, I developed a control application hosted on an HD64180 CPU (under a CP/M-like O/S) written in Turbo Modula-2. It ran to about 5,000+ lines of source code, broken into 38 modules. Properly written Modula-2 is largely self-documenting, and I have little trouble diving in for changes - even after not looking at it for over four years! There is NO question in my mind that M2 is the perfect language for development of embedded control systems. Alas, it seemed that the world had just passed it by.. I am VERY curious as to how Orca/M2 will deal with the dependancy issues. I would have been up the creek without a ported version of Unix "make" and the file date-stamping capabilites of the Z-System environment. A true M2 linker will barf on final pass if it detects an "out of sync" situation _anywhere_ in the entire hierarchy. It's far more fanatical than any Pascal implementation. My MS-DOS M2 environment (Topspeed M2) takes care of this automatically in the IDE shell. What does Orca do? I HOPE you aren't cheating on this facet.. Tell me more! The Modula-2 construct that is generally used for interrupt-driven task switching is IOTRANSFER. I couldn't think of it during the RTC. Is this supported in Orca M2? It's a standard part of M2, according to Wirth 3rd- Edition.. Relative to dependancies, let's say that I have two implementation modules "FOO.MOD" and "BAR.MOD". Both of these import from definition module "FOO.DEF". Now, if I make a change to "FOO.DEF" in between the compilation of "FOO.MOD" and "BAR.MOD", then try to link the whole program, will I get an error? Turbo Modula-2 will abort link phase with a "Version Conflict" error when the second of the two implementation modules is linked - recognizing that they are out of sync. TopSpeed M2 will step back and force a re-compile of "FOO.MOD", then re-try the link (as I recall). At first, this behavior seemed annoying - but actually is right in keeping with the philosophy of Modula! If the makeup of a RECORD type changed between compilation of the two modules, and both relied upon this structure, you would WANT the link to fail. On large projects, with complex dependancies, a "make" utility or smart IDE is almost essential, IMHO. You haven't lived until you've gotten a 30 module project so scrambled that it won't link for love or money. Before CP/M file-stamping and "make", I ended up working out the dependancy tree on paper and tediously re- building the entire thing manually - arrghh! What checking does Orca M2 perform to ensure that sync problems like the one outlined above would be caught? (STEVE.HIRSCH [64180], CAT36, TOP13/17, MSG12/M530) <<<<< Steve, ORCA/Modula-2 does have IOTRANSFER. It's a slightly """"" non-standard implementation, so you can hook into an interrupt handler, and Peter put a note in the documentation saying it wasn't a very efficient mechanism for interrupt handling. I'm not sure what all of the implications are in those comments, but yes, the procedure exists. As for the syncrinization, there are two levels of checking. The first is at compile time, which is better, since the compiler can report errors that make sense to Modula-2 programmers, while the linker is set up for multiple languages. If you IMPORT incorrectly, the compiler flags an error. The seonc occurs at link time, and is based on forcing errors in the initialization procedure, whose name changes with each compile. I'm aware that these checks are in place, since I've had both flagged against me. :) I have not fully explored all of the implications of the checks, so I'm not sure if they are 100% airtight, as they should be in Modula-2. I don't _know_ of any problems, you understand -- I just didn't personally test to see if I could fool the compiler. It's certainly caught me several times, though. Mike Westerfield (BYTEWORKS, CAT36, TOP13, MSG19/M530) A QUESTION CONCERNING THE USE OF OBJECTS What if an overridden method """""""""""""""""""""""""""""""""""""""" calls its inherited method and while in that inherited method, a Dispose( self) call is made (like on an error or something)? Should I check after an inherited method call to make sure that Self still exists before doing anything else with it? Can I just inherited theMethod; If self <> NIL then begin Any better suggestions? Rick (R.ADAMS48, CAT36, TOP33, MSG6/M530) >>>>> I'm not sure that's a particularly good way to handle most """"" errors. When you code your objects, you need to be sure that no reference is made to self, or to the object in any other way, after you have used Dispose or Free. Once that's done, the object is gone. The methods are still there, and will continue to function -- so you can back out of the message gracefully -- but you really can't access anything, even a flag, in the object once it has been disposed. Having said that, if you _try_ it, it may work. If the memory for the object hasn't been reused, and if you're accessing something beyond the first 8 bytes (which ORCA's memory manager uses), things will look OK. Don't let that lull you, though. Just when you least suspect it, your house of cards will tumble down. Basically, if a method can dispose of the object, the only safe thing I can think of that also seems reasonable to me is to use a function method, and have it return a boolean that tells you if the object still exists. Better still, though, is not to reference the object in any way after a call that might dispose of it. Mike Westerfield (BYTEWORKS, CAT36, TOP33, MSG7/M530) MEMORY AND ORCA/PASCAL I am writing an ORCA/PASCAL version of the """""""""""""""""""""" Hangman game, linked as a S16 program. Below is a segment of my program where I am having problems. I have the array "words", which is populated by reading in an ASCII "dictionary" of single words. procedure DeleteDict is used to delete words from the array, by first changing their value to 'XXX', copying the array elements to array "newwords" (skipping the 'XXX' entries), and finally copying array newwords back to array words. I have shown the segment which copies newwords to words. ----------------------------------------------------------------- program Hangman (input, output); uses Common, QuickDrawII, EventMgr, MemoryMgr, msctoolset; var words: array[1..2000] of string[20]; procedure DeleteDict; var newwords: array[1..2000] of string[20]; j, k: integer; k := 0; for j := 1 to count do {count is number of words read into the array} begin; if words[j] <> 'XXX' then begin; k := k + 1; newwords[k] := words[j]; <----- program crashes here end; end; When I test with a dictionary of just a few words, everything works. But when I use a dictionary of several hundred words, the program crashes during the above loop which moves words to newwords. With a dictionary of 400 words, the crash occurs when j = 115. When I comment out the indicated line, the program does not crash. I originally though that perhaps the array size of 2000 is too large for ORCA/P to handle, so I tried other sizes down to 500 elements, but the program still crashes. I found in the ORCA/P manual (p. 196) that ORCA/P has a maximum single array size of 65536 bytes. Is this the declared size or the actual size of the populated array? In either case, assuming that one element of the array in my program is 20 bytes long, I would never have exceeded 65536. Is there some other memory condition that I am violating or can control from within the program, and could linking it as S16 cause any special problems? (M.SAND1 [Mark], CAT36, TOP10, MSG95/M530) <<<<< Local variables in procedures are allocated on the stack. You're """"" trying to allocate 2000 * 20 = 40000 bytes on the stack. That's pretty much all the bank zero memory that's available. You should allocate your memory as a handle and set a pointer to the array to point to the handle you allocate. --Matt (M.DEATHERAGE [A2Pro Leader], CAT36, TOP10, MSG96/M530) >>>>> Actually, I would discourage allocating memory as a handle. Handles """"" are slow. Every handle slows the system down just a bit, and after a while it adds up. In addition, when you go to access something in a handle, you have to lock it, do a double pointer dereference, then unlock it. Handles aren't bad, but they should not be used indiscriminantly, either. For your application, my first choice would be a global array, since that can be accessed the quickest. Second choice would be an array allocated with Pascal's new function. That still creates a new handle internally, but you deal with it as a pointer, so there is a single dereference to access the array, not the double dereference required by a handle. Of course, opinions vary. This is an opinion, not a hard-and-fast rule. Your program will work either way. Mike Westerfield (BYTEWORKS, CAT36, TOP10, MSG97/M530) <<<<< > Actually, I would discourage allocating memory as a handle. """"" > Handles are slow. Every handle slows the system down just a > bit, and after a while it adds up. Yeah, when you get to about one or two _thousand_ handles, sure. Allocating one handle to hold a 40K array is _exactly_ what the IIgs memory management scheme is for. > In addition, when you go to access something in a handle, you have to > lock it, do a double pointer dereference, then unlock it. This is completely incorrect. You do _not_ have to lock a handle to use it unless _your_ code does something which moves memory, like calling a system routine. And even then, all you need to do is dereference it again if it moves. The system software absolutely, positively will not move memory behind your back. (Any other software which might is buggy.) Allocating a handle to hold an array that won't fit on the stack is exactly the correct thing to do. Allocating it with new() is very similar, but leaves the array locked and possibly causing fragmentation all the time. If it's only being used briefly in a subroutine and no other memory allocation calls happen around it, that's probably just fine, but otherwise you need to keep an eye out for fragmenting memory. --Matt (M.DEATHERAGE [A2Pro Leader], CAT36, TOP10, MSG98/M530) [EOA] [OM2]///////////////////////// ORCA/MODULA-2 RTC / ///////////////////////////// Info on the Latest IIGS Compiler! """"""""""""""""""""""""""""""""" By Nate Trost [A2PRO.GELAMP] My name is Dave (if you didn't already know) and this is the Formal Conference for ORCA/Modula-2. I'd like to introduce you to Mike Westerfield, of the Byte Works, publisher of the ORCA series of languages. Hi folks! To start off, I 'll let Mike explain a little bit about what ORCA/Modula-2 is. Tonight we'll be talking about ORCA/Modula-2, the first new compiled language for ORCA (and I think for the GS) since ORCA/C was introduced. It's also the first compiler I've published that I didn't write! It's a new feeling. In addition to answering your questions, I'll also chat about two things tonight. The first is the 5 minute course in Modula-2, designed to make all of you who know Pascal competent at Modula-2! The other is a few of the cool _new_ things that Modula-2 (hereafter M2) has that Pascal, and in some cases C, doesn't have. I'll sprinkle those comments throughout the hour as the number of questions seems to lag a bit. :) So, if you have questions already, I'm ready for you! While we wait, here's the course: I'm assuming you know Pascal. Start with Pascal, and make these changes: 1. Instead of starting your program with Program, start it with IMPLEMENTATION MODULE. 2. Don't use BEGIN-END to bracket statements. All Modula-2 statements are compound, and need an END. For example, here's a Modula-2 FOR loop: FOR i := 1 TO 10 DO DoSomething; END; 3. Procedures and programs all end with a name. That helps the compiler help you! For example: PROCEDURE Foo; BEGIN END Foo; That helps the compiler identify problems with compound statements a lot quicker and more accurately than C or Pascal compilers can! 4. M2 is case sensitive! All keywords use capital letters. 5. M2 uses import statements to pull things from modules. (Modules are like Pascal units.) They look like this: FROM module IMPORT whatever; 6. There are a few other minor details to learn like the ELSIF statement. (It works like Pascal's ELSE IF). It's not too inaccurate to say that all of you who know Pascal are now Modula-2 programmers! It's really very, very easy for a Pascal programmer to get going with Modula-2. I heard something about running two (or more things) parallel??? Explain. That's called concurrent programming, and it's one of the new features I alluded to earlier. Modula-2 implements a small number of primitives that let you literally run more that one "process" (like a program) at a time, sort of like cooperative multi-tasking. There are several uses for it, but to understand why it works like it does, we need to back up and realize where the current research in computer architecture seems to be going. Today we are buying computers with faster and faster CPUs to run our programs faster. That's one way. Another way is to split the task up, letting several computers do the job. That's called multi-tasking. For example, if the GS was a multitasking computer, and you wanted your programs to run faster, you wouldn't buy an accelerator card, you'd buy a card with 4 more CPUs and plug it into a slot! Modula-2's system is really designed to take advantage of this idea. You start another "process" with a procedure called NEWPROCESS. It works like another program. It has it's own variable space and everything. TRANSFER is used to shuffle back and forth between it and any other processes, including the main program. You can send messages back and forth, and there is a way for programs to share data. On the GS, with a single processor, you end up with something very like multi-tasking. Is the Modula-2 compiler more efficient than the current Pascal compiler? In other words: If I ported a program from Pascal to M2, would it run any faster? No. It might run a little slower. In general, ORCA/Modula-2 is faster than, say, TML Pascal or ORCA/Pascal with no optimizations, but slower than ORCA/Pascal with optimizations on. There may be a few programs where this isn't true, though. Another way of looking at it is that M2 is not bad, but not an improvement on speed, either. What about the sensitive case? Can this be turned on or off? Nope. As with C, it's a part of the language that can't be changed without breaking programs. For example, BEGIN is a reserved word, but Begin is a perfectly legal identifier. Thanks, GE Mike. My first question is concerning the flyer mentioning compatability with the current ORCA languages ... could you elaborate? All of the ORCA languages are designed to work together in two important ways. First, they all share common conventions for dealing with the programming environment, so they can all use the ORCA shell and PRIZM -- which, in turn, were designed from day one to handle more than one language. That means you don't have to switch shells an editors to switch languages. Second, all ORCA languages coexist, and share some library routines and a common memory model. That means you can write a program in more than one ORCA language. The most common use for this is to write a program partly in, say, Modula-2, with some assembly language subroutines. It's possible to mix languages in other ways, too, though. For example, a library of routines written in C could be called from Modula-2. Ok... so you could mix some subroutines in M2 using concurrent programming with a C main program? Also, will ORCA/Debugger be compatable? Yes, you could do the concurrent part in M2 and call C. And yes, ORCA/Debugger and the PRIZM debugger both support M2 -- but you need to get ORCA/Debugger 1.1. That's the version designed to support ORCA 2.0 level languages. Oh, a quick note: The recent ads say ORCA/Debugger will be version 1.0.2, but if you order, you'll get version 1.1. Describe the "direct access to memory" (or whatever it's termed...) that M2 has over Pascal and shares with C. Can I directly push to and pull from the stack? Is type casting as stringently required as in Pascal? etc... You can't push and pull from the stack. That would be Very Bad. It would, basically, be a great way to test crash handling on the GS, but not much else. :) M2 is basically a lot freer with pointers than Pascal, more like C. You can take the address of a variable, or event a procedure. Typing is still strong (thank goodness!) but type casting is much better defined than in Pascal. In fact, for pointer use, C is also strongly typed, although some pre-ANSI compilers were a bit lax in that area. Modula-2 is very similar to C in the way pointers must be cast to be used. Describe the usefulness of the direct access (I don't know C) It basically means you're not restricted to working on the actual variable space of your program, the way FORTRAN, BASIC, Pascal, etc. all try to limit you. (In many Pascal's, including ORCA/Pascal, there are ways around this, but they are not in the language standard.) For example, if you want to read the keyboard latch at 00C000x directly, you can in Modula-2, while you cannot -- without using extensions -- do that in Pascal. Mike, in your BB posting, you mention that ORCA/Modula-2 shares features with Pascal. Does this include records, sets, functions, procedures, and other elementary features of Pascal (not OOP/Pascal)? (I jumped in a little late ;) Yes. Modula-2 has all of those, and is also so similar to Pascal that any Pascal programmer can pick up the language in a matter of hours. In fact, a little earlier, I gave a 5 minute course in Modula-2 for Pascal programmer's. It's worth checking the log for it. :) It's that I have some books on Pascal programming and was wondering how hard it would be to use M2 instead (standard Pascal). Modula-2 is so similar to Pascal (but with additional features) that I really think you'll be able to learn it in an evening, or perhaps a weekend. Once you do, it's very easy to look at a Pascal program from a listing, and just type the Modula-2 equivalent. I'm going to start mentioning a few M2 features that are not in Standard Pascal while I wait for typing. Don't let it interrupt your questions! A. Unsigned integers. Modula-2 calls them CARDINAL values. B. Hexadecimal and Octal constants! C. You can put ' characters in strings! D. Procedures can be types!!!! That means you can have arrays of pointers to procedures, call procedures through pointers, etc. E. Infinite loops are legal. :) There is a LOOP-END statement that loops until you execute an EXIT statement. F. There is a RETURN starement! You can bail out early! G. Open arrays! You can pass two different size arrays to the same procedure. H. Concurrent programming. As long as I have the floor, I'll mention a book I have that explains Modula-2 quite well: "An Introduction to Computer Science with Modula-2" published by Heath. It's basically designed for a 100-level college textbook, but it's quite orderly. It's designed for teaching Modula-2 as a first programming language. Any other suggestions on books, Mike? Nope. I saw some great listings in A2Pro a few days ago, but I have to admit, I learned from Wirth's book, and I would not recommend it. :) Hello all! I was _quite_ surprised to see mention of a Modula-2 compiler for any computer coming to market now, never-mind the //gs! Congrats! I did a fairly massive amount of programming in M2 for the Z80/64180 environment a few years ago. I currently own every single M2 compiler ever written for CP/M. I also have literally a shelf full of text books on the subject. Rather than take up net bandwidth, I'll maybe list the ISBN #'s and titles and upload it to the library if people want to see such a thing? You may see more. A couple of things to keep in mind: Most languages don't peak very fast. C and Pascal are very old. Modula-2 is relatively new. Also, Wirth's group started licensing the source to their M2 compiler recently. That brings the development time down, and is the reason there is an ORCA/Modula-2. I'd love to see your library listing. I'm sure others would, too! Ok, then this will happen. Given my copious amounts of spare time , it may be a week or so. But, I promise and cross my heart! I missed the beginning of this RTC and am curious if you will be supporting interrupt driven co-routine switching? The current coroutines all depend (I think) on TRANSFER. I'll bring that up with Peter, though. For those who didn't know (it hasn't been said in here yet tonight) Peter Easdown is the author of the ORCA/Modula-2 compiler. Ok, some of the stuff I wrote was for real-time control and absolutely _required_ that co-routines be invoked on hardware interrupts - say from serial I/O, etc. Thanks for bringing this out, Mike! Steve, post some stuff about the interrupt driven coroutines in A2Pro, too. We'll discuss it in depth, and maybe figure something out quicker. How does the speed of compilation compare to the other ORCA languages? Modula-2 is pretty similar. It seems to handle the interfaces a bit better, and maybe be just a tad slower at the actual compiling. All in all, I'd say it's a wash. Who will be handling the bug fixes and possibly upgrades? As publisher, we'll do it. I do have the source, so if Peter falls off the bottom of the world (he's from Australia) I can pick up, but the intent is that he will do the bug fixes. (The "we'll do it" means we puiblish upgrades, of course.) Different languages are good for different types of programs. What types of programs are Modula-2 good at? Anything you can't do well in this language? Modula-2 is a general purpose language, but unlike Pascal it's closer to being a medium level language (like C) rather than a true high-level language, like Pascal. The difference is that Pascal tries to hide the machine from you so you can concentrate on theory, while Modula-2 encourages you to get personal with the bits and bytes so you can do wierd things and do them efficiently and easily. Because of this, Modula-2 is well suited for things like operating systems, utilities, and (due to concurrent programming) multiprocesing. It also shares some high-level support with Pascal that is missing in C, though. It has things like sets, and enumerations are an integral part of the language, not an afterthought stuffed into the language by someone who didn't seem to care (read: C). This makes it a good choice for a lot of high-level programming jobs, too. For example, our C compiler is written in Pascal, since Pascal is a better language for programs like compilers than C. Modula-2 is written in Modula-2. I would happily use it for other compilers, too. Our Logo is written in C, because I needed to get down and muck with the bytes to make the memory management efficient; Modula-2 would do that job well, too. I'd say it's a language with more breadth of scope than either C (which I see as a true mid-level language, unsuitable for high-level programming) or Pascal (which I see as a high-level language that, without extensions, is not suitable for systems programming). Does that answer your question well enough? Does Modula-2 support the toolbox and GS/OS the same way as Pascal? And does it have the same internal file manipulation? Modula-2 supports the toolbox fully, and has a complete toolbox interface that is similar in organization and scope to the ones for ORCA/C and ORCA/Pascal. It does have an internal file package, but the file packages in all of the languages are different enough at the top level that they are all different in the library, too. All of our languages share the same console I/O routines, but when you use the built-in disk access routines, they all go their separate ways. I'd like to announce our universal door prize for tonight. All of you here are eligable for a 10% discount off of ORCA/Modula-2 if you place the order in the next 72 hours! That's over and above the offer for free shipping that's still in effect for all GEnie folks until the 15th! And, for those who have ordered it already, you can claim a 10% discount coupon good for any order for any product in the next 6 months. Just send a note with your mailing address. And thanks for comming tonight! How much is ORCA/Modula-2? (I don't think this was mentioned :) Retail is $150, like ORCA/Pascal and ORCA/C. We're running an intorductory special now through Feb 28th for $75 plus shipping. Here on GEnie, we're doing a special offer for GEnie subscribers for free shipping (a $5 value) in the US, and $5 off of shipping for overseas orders. Regarding feature D:, calling procedures via a table of pointers... sounds real cool for doing clever things, but maintaining the code could be a real chore. Does the debugger translate addresses to procedure names? No it doesn't. And you're right: You can get in trouble with careless use of procedure pointers. Used properly, though, they are quite nice. For example, you can fake most of object oriented programming. Also, for programs like our Logo interpreter, you can call the right routine based on an array of procedures. The fact that Pascal did not have this feature was one of the two killer reasons for using C, instead. Ok, and is there any easy way to error check at runtime, like checking address range of the pointers? You could cross-check with a link map. That's all I can think of off hand. How easy is it to port (non-Toolbox) ORCA/Modula-2 programs to other platforms? That is, is there anything that would be considered machine-specific in the language itself? There are a few places where you could get in trouble. Things like word size (how big is an INTEGER, anyway?) and extensions. It's safer than C, as a language, and less safe than Pascal for porting. A lot of portability comes from your own style, practices, and care, though, not the language, so individual results may vary. :) Hi Mike.. I just wanted to say that I really look forward to working with Modula-2. I've gotta run now (they're waiting to take me out for my birthday. It's only a little after 6pm here) Do we send the order info to BYTEWORKS? Yes, you can. Or you can phone. The number is (505) 898-8183. If you sent an order by e-mail, be sure and include: Name Address VISA or MC card # and expiration date What you are ordering What you expect to pay You will get a reply from me as soon as I read the order. Ok.. thanks... that's all.. C-YAH.. :) Thanks for comming! And Happy Birthday. :) [EOA] [LIB]////////////////////////////// LIBRARY BIT BONANZA / ///////////////////////////////// HOT Files You Can Download """""""""""""""""""""""""" By Tim Buchheim [T.BUCHHEIM] >>> Misc Files <<< """""""""""""""""" File #3764 APPIICAT2.9.BXY (ALL) Uploaded on 12/18/93 by S.BEHRENS About 45K (d/l time approx. 4 minutes 30 seconds @ 2400 baud) This is a catalog of development tools available for the Apple // series, both 8-bit and 16-bit, old and new. New version 2.9. File #3762 RESLIN.BXY D42 (GS) Uploaded on 12/18/93 by RICHARD.B About 68K (d/l time approx. 7 minutes @ 2400 baud) This new version of ResLin now displays rPicture resources. File #3754 CLAYS.TOOL.BXY (GS) Uploaded 12/13/93 by C.JUNIEL About 10K (d/l time approx. 1 minute @ 2400 baud) This is a music playing users tool. It can play Music Studio, Sound Smith and Synth LAB files. If you have wanted to put music ability into your program, check this out! File #3753 SPLASH.EDIT.BXY (GS) Uploaded on 12/13/93 by C.JUNIEL About 243K (d/l time approx. 24 minutes 30 seconds @ 2400 baud) This is a program that allows you link a dynamic segment to a program you write that can put up a splash screen when your program starts. It also can play opening music. It comes with a graphic editor. File #3745 Name: SYNTHFL.1.4.BXY (GS) Uploaded on 12/11/93 by D.TRIBBY About 48K (d/l time approx. 5 minutes @ 2400 baud) Synthfile version 1.4, a program designed to be run under the ORCA or GNO shell, prints a description of the contents of MIDI Synth sequence, wave, and instrument files and will also optionally play the sequence files. Complete ORCA/C source code is provided, with enough comments so a programmer can learn the "secrets" of using the MIDI Synth toolset. This version is "GNO aware" and will respond to kill and interrupt; it will also play without writing to stdout and sleeps while waiting for a song to quit, using much less of the CPU. Fixes crash situation that could occur with v1.3. Freeware by Dave Tribby. Packed with GS Shrinkit. File #3737 SPICE.INFO.BXY (GS) Uploaded on 12/8/93 by B.TAO About 42K (d/l time approx. 4 minutes @ 2400 baud) This archive contains a few text files describing source code distributions for the SPICE circuit simulation software. Uploaded by request of Tim Tobin. >>> RTC Transcripts <<< """"""""""""""""""""""" File #3766 RTC.MODULA2.BXY (GS) Uploaded on 12/19/93 by A2PRO.GELAMP About 11K (d/l time approx. 1 minute @ 2400 baud) This is the transcript from the ORCA/Modula-2 Real Time Conference held with Mike Westerfield of The Byte Works, Inc. Shrink-It version. File #3765 RTC.MODULA2.TXT (GS) Uploaded on 12/19/93 by A2PRO.GELAMP About 24K (d/l time approx. 2 minutes 30 seconds @ 2400 baud) This is the transcript from the ORCA/Modula-2 Real Time Conference held with Mike Westerfield of The Byte Works, Inc. ASCII text (no compression). File #3743 SEMINAR.4.TXT (GS) Uploaded on 12/10/93 by BYTEWORKS About 13K (d/l time approx. 10 minutes @ 2400 baud) Here's the transcript from the last in a series of 4 seminars covering the Logo language, and 3D Logo in particular. This seminar covered a lot of topics. The main focus was the 3D Sphere Movie, which was assigned as a problem in an earlier seminar. You can find the movie itself in the library, too: Search for Logo. ASCII text (no compression). >>> Utilities <<< """"""""""""""""" File #3761 COPYFORK.BXY V1.4 (GS) Uploaded on 12/18/93 by RICHARD.B About 8K (d/l time approx. 1 minute @ 2400 baud) Merlin EXE command to copy data/resource forks. v1.4 includes resource fork compaction (optional) and some other minor changes. File #3674 SETPFX.BXY V1.0 (GS) Uploaded 11/25/93 by RICHARD.B About 3K (d/l time approx. 20 seconds @ 2400 baud) Allows you to specify a full GS/OS pathname for prefix setting, which may include special characters, such as spaces and commas. Handy for use with COPYFORK to and from HFS/AppleShare volumes with deep directory structures, or simply for accessing HFS or like volumes. >>> Source Code <<< """"""""""""""""""" File #3746 READ.TIMEGS.BNY (GS) Uploaded on 12/11/93 by C.JUNIEL About 2K (d/l time approx. 20 seconds @ 2400 baud) This is an Applesoft program that uses a short machine language subroutine to read the clock on the IIgs using the ReadTimeHex tool call. Comments abound. Applesoft basic file in Binary II. (no compression) File #3730 AVL.TREES.BXY (GS) Uploaded on 12/7/93 by SOFTDISK.INC About 24K (d/l time approx. 2 minutes, 30 seconds @ 2400 baud) AVL trees are a type of binary tree that remain "almost balanced" thus ensuring that the tree doesn't degenerate into anything like a linked list. This package was written by Philippe Manet using ORCA/C 2.0 without optimizations. The source is well commented. File #3684 DDT8.SRC.BXY (ALL) Uploaded 11/27/93 by PRODEV About 110K (d/l time approx. 11 minutes @ 2400 baud) This is the complete source code for the ProDev DDT8 debugging card. The files are in Merlin 16+ format. These files represent the finest collection of spaghetti code ever assembled (pun intended). Use at your own risk. Requires the ProDev DDT8 debugging card. Assemble the file "CHAIN". Modify CHAIN to output to only one binary file (eg DSK DDT8OBJ) to create a file for programming an EPROM with. >>> GNO Utilities <<< """"""""""""""""""""" File #3699 FIGLET2.0.BXY Uploaded on 12/1/93 by B.TAO About 51K (d/l time approx. 5 minutes @ 2400 baud) Figlet is a shell utility for GNO which takes standard input and transforms it into large, ASCII-based letters. Unlike other banner programs, figlet is not limited to a single font. Figlet fonts: (about 2K each) File #3726 SMSLANT.BXY File #3725 SMSHADOW.BXY File #3724 SMSCRIPT.BXY File #3723 SMALL.BXY File #3722 SLSCRIPT.BXY File #3721 SLANT.BXY File #3720 SHORT.BXY File #3719 SHADOW.BXY File #3718 SCRIPT.BXY File #3717 PUFFY.BXY File #3716 MINI.BXY File #3715 LEAN.BXY File #3714 JERUSALEM.BXY File #3713 BUBBLE.BXY File #3712 BLOCK.BXY File #3711 BIG.BXY File #3710 ALPHABET.BXY File #3709 A3X5.BXY File #3698 MPAGER1.1.BXY (GS) Uploaded 12/1/93 by B.TAO About 50K (d/l time approx. 5 minutes @ 2400 baud) This is a utility that takes plain ASCII files and formats them as multiple "pages" on a single sheet of paper and outputs the results as PostScript code. Has options for size and number of pages per sheet, output font and sheet header. Ported by Kent Radek. File #3697 NENSCRIPT.BXY (GS) Uploaded 12/1/93 by B.TAO About 65K (d/l time approx. 6 minutes 30 seconds) This is a utility that takes plain ASCII text files and converts them to PostScript code suitable for output on any PS-equipped printer (e.g., an Apple LaserWriter-series printer). Has options for landscape, titles, font changes, page size and more. Includes documentation and source. 'nenscript' is a freely-available clone of the 'enscript' utility. Ported to GNO by Jeremy Rand. File #3696 BED1.0.BXY (GS) Uploaded on 12/1/93 by B.TAO About 24K (d/l time approx. 2 minutes 30 seconds @ 2400 baud) This is the only editor for GNO that can handle infinitely long lines, null bytes in a file and allow binary editing. It is intended to replace Prosel-16's "Block Warden" for patching files without leaving GNO. Written by Phil Vandry. [EOA] [TOU]/////////////////////////////// TOUR OF 8/16 CENTRAL / ////////////////////////////////// The Great Programmers Magazine """""""""""""""""""""""""""""" Chris Budewig [K.FLYNN] I'll Have a DLT On Rye, Please! Included with each issue are two """"""""""""""""""""""""""""""" general-purpose navigation programs called DLT 8 and DLT 16. DLT stands for Display Launcher Thingamajigs, which are text and graphics viewer programs that allow you to page through articles and source code listings, view diagrams, and launch programs & demos. The DLT's included with the first issue were not finished versions, but were completed in later issues and other features were added as time went on. Minimum requirements for these programs are a IIGS for DLT 16, or a 128K //e or better for DLT 8. >> 8/16-Central - September, 1990 - File #3393 << """"""""""""""""""""""""""""""""""""""""""""""""" A full directory of all files on each issue of 8/16 and 8/16-Central can be found in file #3382 (ESC.INDEX.BXY). A condensed directory of the contents of this issue is included below. The code letters in parentheses next to each item mean: S : Source code -- what you need to create a program X : Executable program -- you can run this directly! D : Documentation -- tells how the program works and what to do with it A : Article -- explains a subject and probably the source code that demonstrates it /Es.cENTRAL.9009/ ..READ.ME Intro and Welcome ..GENERAL ....ARIEL.AD.TXT Err... an empty file. ....LETTERS.TXT Reader's write ....PUB.PEN.TXT Editor's editorial ..CLASSIC.APPLES ....README.8 Description of 8-bit contents! ....ZBASIC/ (SA) ZStatus Report, FN Angle2Radians, and FN Stats ....GEN.SHUTDOWN/ (SA) How to properly quit any 8-bit application ....DOGPAW/ (SXD) The source code to Karl Bunker's file viewing and text compression programs! ....ASOFTWORDWRAP/ (SXA) Universal Applesoft Text Output - how to automatically wrap text output in your Applesoft programs ..IIGS/ ....README.16 Description of 16-bit contents! ....CPFX.CMD/ (SXD) Bill Tudor's Change Prefix shell utility ....LLRE.FOLDER/ (XD) Low-Level Resource Editor v1.1 - edit ANY type of resource (only as hex or ASCII data though) ....IIGS.ARTICLES/ ......M.DAVIS/ (SXA) To Shell With It - How to write utilities in APW C compatible with ANY shell environment ......TOOLSMITH/ (A) Review of Nifty List and LLRE (with pictures!) For anyone producing lots of text in their Applesoft programs, the Universal Applesoft Text Output routine will automatically wrap your text to fit the 40- column text screen and, if it is running on a ][+, convert all lowercase to uppercase before printing. In the article To Shell With It, you can see how to modify APW C's START.ROOT file to let you write utilities that will accept a command line from ANY shell... even Finder! >> 8/16-Central - October, 1990 - File #3396 << """"""""""""""""""""""""""""""""""""""""""""""" /Es.centRAL.9010/ ..READ.ME Intro and Welcome ..GENERAL/ ....VAPORWARE Murphy Sewall's industry snapshot ....PUB.PEN.OCT90 Editor's editorial ....LETTERS Readers write ..CLASSIC.APPLES/ ....READ.ME8 Description of 8-bit contents! ....EOC.FRANCE/ (SXD) External Overlay Command system - external command manager for BASIC.SYSTEM that dynamically loads external commands; includes five external commands: COPY - copies/moves files TYPE - displays the contents of any text file LINEN - displays names of all online volumes ATTRIB - changes file/aux types CRYPT - encrypts/decrypts files ....ZBASIC/ (D) Compilation of ZBASIC Technotes ....JERRYK/ (SA) "ProDOS Power from Applesoft" - Using the ProDOS Machine Language Interface from BASIC ..IIGS/ ....READ.ME16 Description of 16-bit contents! ....ARTICLES/ ......XCMDS/ (SXA) Hyperstudio XCMDs - how they work and how to make them; includes an XCMD exerciser and four sample XCMDs: XCMD.Beep - Make a beep XCMD.Beep2 - Make multiple beeps XCMD.Date - Find today's date in stack text XCMD.Dial - Dial a Hayes-compatible modem ......OVERSCAN/ (SXA) How to draw in the GS screen border area using scanline interrupts ....FREDA/ (XD) Handy little debugging init activated by COP instructions you insert into your code ....PIXIEV211/ (XD) Memory search/display CDA by Robert Bennett ....XTEND.KBD/ (SX) Config program for the Keyboard Lights init Note that the sequel to Doni Grande's extended keyboard article, the Config.Lights program, is present on this issue. It was promised two issues ago, but it seems that 8/16 had been going through some deadline changes to give the readers their issues faster. As a result, the program and Murphy Sewall's regular Vaporware column didn't get published until this issue. Have you ever been using added external commands with Applesoft and run out of memory? The External Overlay Command (EOC) system will allow you to leave your external commands on disk until they're needed, only taking up 1.5K of memory when not being used. When you invoke a command, it will be loaded from disk and executed. [EOA] [CAM]////////////////////////// CAMPUS GREEN / ///////////////////////////// A2 University News """""""""""""""""" By Nate Trost [A2PRO.GELAMP] NEW COURSE ANNOUNCEMENT Eric Bush of Kitchen Sink Software will be """"""""""""""""""""""" starting a new course on 8-bit programming with MicroDot starting in January. This course will be the basis for a future course on 8-bit Graphical Interface programming to be taught later in the year. Be sure and watch the A2Pro front door and the Bulletin Board for more on this exciting new course! [EOA] [RTC]////////////////////////// RTC WATCH / ///////////////////////////// Bits and Pieces from A2Pro Real Time Conferences """""""""""""""""""""""""""""""""""""""""""""""" By Tim Buchheim [T.BUCHHEIM] >>> MENU MANAGER KEY GLITCH <<< """"""""""""""""""""""""""""""" The menu manager doesn't seem to care about whether a menu item really has a key equivelent...it'll let you use command-control-2 for the first menu item w/o a key equivilent. :) Tim: Are you sure? Maybe that's an AWGS feature. Yes, I'm sure...it'll bring up the Finder's About box just as well. :) Tim: That's like really, really weird, man. 'specially since I don't remember seeing any documentation of it. Toolbox easter eggs. Wow. :) Try it in any program...if the About box is something like command-?, it'll bring up an NDA. Whatever the first menu item w/o a key equivilent is MenuKey doesn't seem to check to see if there is an equivilent..just sees a zero...the ASCII value of control-shift-2. I discovered it a long time ago Hmmm... weird, huh? So if I hit OA-Ctl-A, it would do the second menu item? nope Why not? Ctl-A is ASCII 1. (unless it had a $01 in the key-equivelent field... the $00 is just how it marks "no equivelent") Tim: Oh, right. Good call. :) Putting a $01 there would make it show open-apple inverse question mark because then Control-A would be a key equivilent Yup. So you can't define a menu item to be command-control-shift-2 unless it is the first menu item w/o a key equivelent. >>> BUTTON ANIMATIONS IN HYPERSTUDIO <<< """""""""""""""""""""""""""""""""""""""" So John, what kinds of things have you been doing in HyperStudio? Been trying to play with button animation. Like in the Studio City demo? Yea. Just like oh...I did that in one of my unfinished games. Tried to splice that apart to see what makes it tick. Not too much luck. :( It's not too hard, there are a few ways to do it. I can't remember right now how I did it...hmmm...I think I used "hide" and "show" on graphics objects...but I don't remember the exact SimpleScript program Hmmm. I may just break down and get the back issue of SC to see how they did it. If I can find it, I'll see how I did it. :) Tim, how about a simple script that would play some kind of animation and then SHOW another graphic object over the button? Yeah, I think that's what it did Have to experiment a little more. :) Used some global variables to keep track of the status on "locking" ones That sounds reasonable It was pretty simple, there's one in the Button Ideas stack that might also work, I think. BTW, I realize no one has asked, but here's how I'd do a button animation in HyperTalk, assuming I had some icons numbered 1 through 10: Repeat with i = 1 to 10 set the icon of cd button "myAnimation" to icon i end repeat In HS I'd set it to run a PaintWorks animation or have a loop w/graphic objects Is there an equivalent program for SimpleScript? Yes, a loop that Hides/Shows graphic objects. The graphics objects would be created as invisible on top of the button. I could write one real quick, just a sec.... for x = 1 to 10 show graphic x hide graphic x next end of script I think that will work. Thanks, I'll give it a try. BTW, the graphics should be called "1".."10" and be invisible (set the name in "Graphic Info") (BTW, there are better ways to do this, but this should work. :) There are ALWAYS better ways. Hmmm...better animated button script in just a sec... -- animated button show graphic "ButtonA1" for x = 1 to 9 show graphic "ButtonA" & x+1 hide graphic "ButtonA" & x next x hide graphic "ButtonA10" end of script This might work better, has better names and might look better on the screen. The graphics objects would be "ButtonA1".."ButtonA10" Figured that one out. :) This one uses better names than just "1"..."10" The reversed order of hide/show might look better, too, but you should test both ways to see which workds best. >>> SYSTEM 6.0.1 REFERENCE? <<< """"""""""""""""""""""""""""""" Was there ever a toolbox update for 6.0.1? I've got the 6.0 manual from Byteworks, but don't know the 6.0.1 enhancements if there are any, that is... Yes. It will be available from ByteWorks Real Soon! :) It's shipping this week, Paul. Mike's been posting about it in the Byte Works category in the bulletin board, and he's been giving regular updates there as well. How much? How big is it? $10 update from Programmer's Ref. for 6.0, I think. I think it's supposed to be around 50 pages >>> RESOURCE FORKS ON FILES <<< """"""""""""""""""""""""""""""" I have a question for consideration: Can a MIDI Synth sequence file (Type $D5, Aux $0001) have a resource fork? I wouldn't think it would matter since only GS/OS will be accessing it... It should allow one, at least so a user can attach a comment in the Finder That's a good Q Brian. I thought *almost* any file could have a resource fork (for rVersion rComment etc.) Hmm. I'd say that it can, but you can't rely on the resources staying there if other programs read/save the file. That would be OK, Matt. I was just wondering if a resource could be saved there for use by a Music program, etc. I suppose as long as the resource isn't required to exist by the program, everything will be cool :) I'd say it's like adding extra resources to Teach files. Is that bad, Matt? There's no problem with putting rComments on virtually every file I distribute is there? As long as they aren't on P8 files. :) (BOC) I was just thinking it would be cool if a MIDI message could be added to a song that will tell my program to play a sound stored in the resource fork. Defining sysex MIDI messages that refer to things like resource forks is mostly a way to be sure that folks without your program find your MIDI files useless. The hope that everyone will switch to your program to hear a song is a bit, shall we say, optimistic. :-) Won't most programs filter out sysex MIDI messages that are unrecognized? sounds like a cool idea, as long as everyone else's programs still work. :) Yes, but if the message says "play this 90 seconds of music," filtering that out isn't going to do what you want! My idea is that the sounds would be optional to the actual song. Whoever writes the song should make it sound good either way. Yeah, but it would just make people to want Brian's program. :) Well, the program isn't real yet and won't be for some time. It's just an idea I was throwing around and wondered if it was feasable. [EOA] [LOG]////////////////////////////// LOG OFF / ///////////////////////////////// GEnieLamp Information """"""""""""""""""""" o COMMENTS: Contacting GEnieLamp o GEnieLamp STAFF: Who Are We? GEnieLamp Information GEnieLamp is published on the 1st of every month """"""""""""""""""""" on GEnie page 515. You can also find GEnieLamp on the main menus in the following computing RoundTables. RoundTable Keyword GEnie Page RoundTable Keyword GEnie Page """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" DigiPub DIGIPUB 1395 Atari ST ST 475 Macintosh MAC 605 IBM PC IBMPC 615 Apple II A2 645 Apple II Dev. A2PRO 530 Macintosh Dev. MACPRO 480 Geoworks GEOWORKS 1050 BBS BBS 610 CE Software CESOFTWARE 1005 Mini/Mainframe MAINFRAME 1145 Windows (Coming Soon!) GEnieLamp is also distributed on CrossNet, Internet, America Online, Delphi and many public and commercial BBS systems worldwide. o To reach GEnieLamp on Internet send mail to genielamp@genie.geis.com OR jpeters@sosi.com o Our Internet anonymous FTP address is: sosi.com. All current versions of GEnieLamp are available in the ~/pub/GEnieLamp directory. Due to the added expense involved, we ask that when you get GEnieLamp via the anonymous ftp for GEnieLamp, that it _not_ be ftp'd during the hours of 9AM and 5PM Eastern Standard Time. We appreciate your cooperation in this matter. o Current issues of all versions of GEnieLamp as well as back issues of GEnieLamp IBM are File Requestable (FREQable) via FidoNet (Zones 1 through 6) from 1:128/51 and via OURNet (Zone 65) from 65:8130/3. SysOps should use the following "magic names" to request the current issue of the indicated GEnieLamp platform (FREQ FILES for names of back issues of GEnieLamp IBM): Platform Magic Name To Use """""""" """"""""""""""""" GEnieLamp IBM .................. GLIBM GEnieLamp ST ................... GLST GEnieLamp A2Pro ................ GLA2PRO GEnieLamp Macintosh ............ GLMAC GEnieLamp TX2 .................. GLTX2 GEnieLamp A2 ................... GLA2 o Back issues of GEnieLamp are available in the DigiPub RoundTable Library #2 on page 1395. M1395;3 o GEnieLamp pays for articles submitted and published with online GEnie credit time. Upload submissions in ASCII format to library #42 in the DigiPub RoundTable on page 1395 (M1395;3) or Email it to GENIELAMP. On Internet send it to: genielamp@genie.geis.com o We welcome and respond to all E-Mail. To leave comments, suggestions or just to say hi, you can contact us in the DigiPub RoundTable (M1395) or send GE Mail to John Peters at [GENIELAMP] on page 200. o If you would like to meet us "live" talk to us every Wednesday night in the Digi*Pub Real-Time Conference, 9:00 EDT. M1395;2 o The Digital Publishing RoundTable is for people who are interested in pursuing publication of their work electronically on GEnie or via disk-based media. For those looking for online publications, the DigiPub Software Libraries offer online magazines, newsletters, short-stories, poetry and other various text oriented articles for downloading to your computer. Also available are writers' tools and 'Hyper-utilties' for text presentation on most computer systems. In the DigiPub Bulletin Board you can converse with people in the digital publishing industry, meet editors from some of the top electronic publications and get hints and tips on how to go about publishing your own digital book. The DigiPub RoundTable is the official online service for the Digital Publishing Association. To get there type DIGIPUB or M1395 at any GEnie prompt. >>> GEnieLamp STAFF <<< """"""""""""""""""""""" GEnieLamp o John Peters [GENIELAMP] Publisher/Editor """"""""" IBM o Bob Connors [DR.BOB] EDITOR """ o David C. Leithauser [D.LEITHAUSER] HyperRead Editor o Brad Biondo [B.BIONDO] IBM Staff Writer o Tippy Martinez [WIN.LAMP] IBM Staff Writer o David Holmes [D.HOLMES14] IBM Staff Writer o Don Lokke [D.LOKKE] Cartoonist WINDOWS o Tippy Martinez [WIN.LAMP] EDITOR """"""" o John C. Osarczuk [J.OSARCZUK] Windows Staff Writer o Brad Biondo [B.BIONDO] Windows Staff Writer MACINTOSH o Richard Vega [GELAMP.MAC] EDITOR """"""""" o Tom Trinko [T.TRINKO] Mac Staff Writer o Bret Fledderjohn [FLEDDERJOHN] Mac Staff Writer o Ricky J. Vega [GELAMP.MAC] Mac Staff Writer ATARI ST o John Gniewkowski [GENIELAMP.ST] ST EDITOR """""""" o Mel Motogawa [M.MOTOGAWA] ST Staff Writer o Sheldon Winick [S.WINICK] ST Staff Writer o Richard Brown [R.BROWN30] ST Staff Writer o Al Fasoldt [A.FASOLDT] ST Staff Writer o Fred Koch [F.KOCH] ST Staff Writer o Sandy Wolf [S.WOLF4] ST Staff Writer ATARI ST/TX2 o Cliff Allen [C.ALLEN17] EDITOR/TX2 """""""""""" ATARI [PR] o Bruce Faulkner [R.FAULKNER4] EDITOR/GEnieLamp [PR] """""""""" APPLE II o Doug Cuff [EDITOR.A2] EDITOR """""""" o Tara Dillinger [TARA] Co-Editor o Phil Shapiro [P.SHAPIRO1] A2 Staff Writer o Mel Fowler [MELSOFT] A2 Staff Writer o Darrel Raines [D.RAINES] A2 Staff Writer o GEna E. Saikin [A2.GENA] A2 Staff Writer o Steve Weyhrich [S.WEYHRICH] A2 Staff Writer A2Pro o Nate C. Trost [A2PRO.GELAMP] EDITOR """"" o Tim Buchheim [T.BUCHHEIM] Co-Editor ETC. o Jim Lubin [J.LUBIN] Add Aladdin/Scripts """" o Scott Garrigus [S.GARRIGUS] Search-ME! o Bruce Maples [B.MAPLES] Copy Editor o Mike White [MWHITE] (oo) / DigiPub SysOp o Susie Oviatt [SUSIE] ASCII Artist \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// Bulletin board messages are reprinted verbatim, and are included in this publication with permission from GEnie and the source RoundTable. GEnie, GEnieLamp Online Magazines, and T/TalkNet Online Publishing do not guarantee the accuracy or suitability of any information included herein. Opinions expressed are those of the individual, and do not represent opinions of GEnie, GEnielamp Online Magazines, or T/TalkNet Online Publishing. Material published in this edition may be reprinted under the follow- ing terms only. Reprint permission granted, unless otherwise noted, to registered computer user groups and not for profit publications. All articles must remain unedited and include the issue number and author at the top of each article reprinted. Opinions present herein are those of the individual authors and does not necessarily reflect those of the publisher or staff of GEnieLamp. We reserve the right to edit all letters and copy. Please include the following at the end or the beginning of all reprints: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// (c) Copyright 1994 T/TalkNET Online Publishing and GEnie. To join GEnie, set your modem to 2400 baud (or less) and half duplex (local echo). Have the modem dial 1-800-638-8369. When you get a CONNECT message, type HHH. At the U#= prompt, type: XTX99014,DIGIPUB and hit the [return] key. The system will then ask you for your information. Call (voice) 1-800-638-9636 for more information. ////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ [EOF]