|||||| |||||| || || |||||| |||||| || || ||| || || || || ||| |||| |||||| || |||| Your || || || || ||| || || |||||| |||||| || || |||||| |||||| GEnieLamp Computing || |||||| || || |||||| RoundTable || || || ||| ||| || || || |||||| |||||||| |||||| RESOURCE! || || || || || || || ||||| || || || || || ~ WELCOME TO GENIELAMP A2Pro! ~ """"""""""""""""""""""""""" ~ Handling Interrupts ~ Source Code ~ ~ GNO/ME Help ~ Developer Announcements ~ ~ TIPS AND TECHNIQUES: Writing Ampersand Routines " ~ HOT NEWS, HOT FILES, HOT MESSAGES ~ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// GEnieLamp A2Pro ~ A T/TalkNET Publication ~ Vol.6, Issue 33 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Publisher.................................................John F. Peters Editor....................................................Tim Buchheim \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// ~ GEnieLamp IBM ~ GEnieLamp Atari ~ GEnieLamp PowerPC ~ ~ GEnieLamp A2Pro ~ GEnieLamp Macintosh ~ GEnieLamp TX2 ~ ~ GEnieLamp Windows ~ GEnieLamp A2 ~ LiveWire (ASCII) ~ ~ Member Of The Digital Publishing Association ~ GE Mail: GENIELAMP Internet: genielamp@genie.com ////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ >>> WHAT'S HAPPENING IN THE A2Pro ROUNDTABLE? <<< """"""""""""""""""""""""""""""""""""""""""""""""" ~ January 7, 1996 ~ FROM MY DESKTOP ......... [FRM] A2PRO ROUNDTABLE STAFF .. [DIR] Notes From The Editor. Directory of A2Pro Staff. TIPS AND TECHNIQUES ..... [TIP] HEY MISTER POSTMAN ...... [HEY] Writing Ampersand Routines. Is That A Letter For Me? DEVELOPERS CORNER ....... [DEV] LIBRARY BIT BONANZA ..... [LIB] News From Online Developers. HOT Files You Can Download. LOG OFF ................. [LOG] 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: A2PRO ROUNDTABLE STAFF .. [DIR] Directory of A2Pro Staff. To read this article, set your find or search command to [DIR]. 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) _____________| _____|__ _|___ |____ |_____________ |Name of sender CATegory TOPic Msg. Page number| In this example, to respond to Smith's message, log on to page 530 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 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, award- winning multi-player games and friendly chat lines. GEnie's non-prime time connect rate is only $3.00 per hour. Prime Time (8:00 am to 6:00 pm local time on weekdays) is only $5.00 per hour. To sign up for GEnie, just follow these simple steps: 1. Set your communications software to half duplex (local echo) 8 bits, no parity and 1 stop bit, at 300, 1200, 2400 or 9600 baud. 2. Call (with modem) 1-800-638-8369 (US) or 1-800-387-8330 (Canada). 3. Wait for the U#= prompt. Type: JOINGENIE and hit RETURN. When you get the prompt asking for the signup/offer code, type: DSD524 and hit RETURN. 4. Have a major credit card ready, as the system will prompt you for your information. If you need more information, call GEnie's Customer Service department at 1-800-638-9636. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" [EOA] [FRM]////////////////////////////// FROM MY DESKTOP / ///////////////////////////////// Notes From My Desktop """"""""""""""""""""" by Tim Buchheim [A2PRO.GELAMP] o TOP OF THE PAGE >>> TOP OF THE PAGE <<< """"""""""""""""""""""""" ~ A Letter From the Editor ~ DECEMBER? If you're a regular reader of GEnieLamp A2Pro, then you're """"""""" probably wondering what happened to the December issue. Well, I simply was not able to complete it, for several reasons. The main reason was that I was sick with the flu (I think it was the type-A Texas strain) for several weeks. During this time it made me dizzy to sit up or read, so I was unable to use the computer. :/ I got better around the 10th of December, and inteded to finish the issue and call it the Mid-December issue, but I was unable to do so due to the large amount of homework I had to make up. (I'm a senior in high school.) Thus I decided to skip the December issue and wait for January. GOOD NEWS On December 22 I received a phone call from the Dean of """"""""" Admissions at Harvey Mudd College in Claremont, CA. I am one of thirty people admitted Early Decision. I think it's cool that they called me before Christmas.. I had planned to finish my Caltech and MIT applications after Christmas, and this way I was able to throw them in the trash instead. :) -- Timothy Carl Buchheim Editor, GEnieLamp A2Pro P.S. Once again we have a feature article on 8-bit programming by Russ Nielson, so there wasn't room for the usual "RTC Watch" article and the continuing "Spotlight On" column. Next month, though, "Spotlight On:" will be taking a look at Russ Nielson, and if there is enough room in the issue there will be an "RTC Watch" column. [*][*][*] Do you have something to say about GEnieLamp A2Pro? Please post any questions or comments you may have in Category 1, Topic 15 in A2Pro's BB (m530;1). Or, feel free to talk to me (A2PRO.GELAMP) anytime you see me in a Real Time Conference. Readers out there on the Internet: feel free to email me at a2pro.gelamp@genie.com When writing, please tell me where you got your copy of GEnieLamp, if it wasn't on GEnie. I'm always interested to see how many places GEnieLamp ends up :) By the way, the current issue and most back issues are available online in many places. GEnie users should check Library #2 in the DigiPub libraries (DIGIPUB, page 1395;3) Those of you not on GEnie should use gopher software to connect to gopher.genie.com for issues; all recent issues and most older ones are there. I know that many people get GEnieLamp from various Apple II ftp sites. For example, ftp://grind.isca.uiowa.edu/ has many backissues. Note that I am not the one who puts the issues there, (GEnie's ftp software currently has the "put" command disabled) so if an issue is missing from there, I can't do anything about it. The only internet distribution site which I can update myself is gopher://gopher.genie.com [*][*][*] [EOA] [DIR]////////////////////////////// A2PRO ROUNDTABLE STAFF / ///////////////////////////////// By Tim Buchheim [A2PRO.GELAMP] o A2Pro STAFF LIST >>> A2Pro STAFF LIST <<< """""""""""""""""""""""" ______________________________________________ APPLE II PROGRAMMERS & DEVELOPERS ROUNDTABLE _____ ______ ______________________________________________ /_____|/______\ /__/|__| ___|__| Head Sysop: Hangtime (HANGTIME) /__/_|__| /_____/ Your Sysops: Greg Da Costa (A2PRO.GREG) /________|/__/ __ __ __ Todd P. Whitesel (A2PRO.TODDPW) /__/ |__|__/______ /_//_// / Nathaniel Sloan (JNSLOAN) /__/ |__|________// / \/_/ Tim Buchheim (A2PRO.GELAMP) Dave Miller (JUST.DAVE) _______________________________ Russ Nielson (R.NIELSON1) [EOA] [TIP]////////////////////////// TIPS AND TECHNIQUES / ///////////////////////////// Writing Ampersand Routines """""""""""""""""""""""""" By Russell Nielson [R.NIELSON1] INTRODUCTION Programming in Applesoft is a very convienent way to write """""""""""" quick and simple programs to do ordinary things, but there comes a time when Applesoft just isn't powerful enough to do all the things we want, or need it to do. Anyone who has ever programmed in Applesoft extensively, knows that writing small machine language routines is almost essential to do such tasks that are impossible with Applesoft. One common example would be sound generation; you cannot produce any "real" sound or music from using Applesoft instructions because it is just way too slow. In order to produce sound or musical notes, you need to access the softswitch at the speaker location repeatedly and at a very high rate, which through Applesoft is not possible. It's easy enough to write the small machine language routine and call it from Applesoft to generate the sounds, but that usually involves having you POKE in the routine and then CALLing it. There's nothing wrong with this method, but it can get very cumbersome when you need to pass several parameters and start using many called routines. In using the normal CALLing conventions you need to POKE in all the values into the right memory locations so the routine that is CALLed can pick up these values and do its thing. Maintaining these CALLing structures can be very confusing and lead to unnecessary aggrivation. AMPERSAND (&) COMMAND But things are looking up because there is a very """"""""""""""""""""" useful command at our disposal called the Ampersand command. This calling convention is used directly from Applesoft to call machine language routines in a "civilized" fashion. The Ampersand command works by setting up a vector into your machine language program. The Ampersand vector is located at $3F5. A vector is simply a JuMP instruction to your machine language routine that handles the Ampersand command string. So in order to set it up you would do this: Amper equ $3f5 ; Ampersand vector SetAmper lda #$4c ; opcode for JMP sta Amper ; put at &-vector address lda #AParse ; get high order byte sta Amper+2 ; store it for the JMP rts ; leave AParse (code here) If you look at the code you will see that we store a $4C into the first byte of the Ampersand vector, then we store the address of 'Aparse' in the next two bytes. This sets up our vector and all '&' commands from Applesoft will be routed to 'AParse'. This setup is essentially a 'JMP AParse', so when the '&' command sends control to the vector, it jumps to our 'AParse' routine and the command is parsed and executed. CREATING A COMMAND CENTER This is all and well when all you have is one """"""""""""""""""""""""" command, but you will probably want to set up a way to use the '&' command to call many routines, otherwise it wouldn't be of much use to us. What we are going to do is follow each '&' command with a function number which tells our 'AParse' routine which routine is to be performed. On that note let's look at some code to set that up. ptr equ $eb ; general usage pointer GetByte equ $e6f8 ; evaluate expression to x-reg AParse jsr GetByte ; get function number cpx #3 ; validate function number (max of 3) bcc :valid rts ; not valid, return with error :valid txa ; convert function number into index asl ; for accessing the function address table tax lda :F_Table+1,x sta ptr+1 lda :F_Table,x sta ptr jmp (ptr) ; jump to function routine :F_Table da Function1 da Function2 da Function3 Function1 (do your stuff) Function2 (do your stuff) Function3 (do your stuff) If you look at this code example you will see how it works. First thing we will do is get the first parameter after the '&' command which will be our function number. The 'JSR GetByte' evaluates this expression from the command line and puts the value into the x-register. In this case the function will always be a number from (0-x) where 'x' is the maximum number of functions we define. If you look further you will see that we take the x-register and convert it into an index to address our function table, which contains the addresses of all our functions. Using this method limits our function table to 128 entries, because the maximum value that an 8-bit register can hold is 256, but I cannot imagine having near that many functions. We use a neat trick called indirect jumping, this works by putting the address of the routine into 'ptr' and jumping to where 'ptr' points to. If you understand indirect addressing then you will see that this is no different. We even valid the function number with the 'cpx #3' instruction which will only allow a function number from 0 to 2, if the number is not in this range control is passed back to Applesoft via the 'rts' and Applesoft prints a 'SYNTAX ERROR'. The reason a SYTAX ERROR is generated is because the '&' command was never finished and the program pointer was in the middle of the '&' command, and when Applesoft regained control it got confused and program execution halted. This is a very useful method when designing and testing our '&' routines because if you pass the wrong number of parameters or use a wrong function number, you will get a SYNTAX ERROR. Let me illustrate the format for an '&' command: & value, value, variable, etc... If our case we would do: & function_number, value, value, etc.. Now is a good time to explain some of the routines that manipulate the command line pointer. When the '&' command is first envoked and control is passed to 'AParse' the '&' command line pointer is at the first value in the command, which is the first parameter. We will use commands to pull values from the command line and advance the pointer. Note: By using these routines you can pass parameters in any format, including straight numbers, variables, and expressions. Here are some very useful Applesoft parameter passing routines. Please realize that some of these are the same routines that Applesoft uses to manipulate strings and variables. PtrGet $dfe3 find named variable GetByte $e6f8 evaluate expression to x-reg ComByte $e74c gobble comma, evaluate expression to x-reg StrIni $e3d5 create new string space MovStr $e5e2 move string into space ChkCom $debe gobble comma EndData $d995 advance to end of data PTRGET This routine finds the address of the variable. GETBYTE This routine evaluates the next parameter on the command line and places the value into the x-register. COMBYTE This routine will eat the comma from the command line and then evaluate the next parameter on the command line. STRINI This routine will create new string space for a string variable. MOVSTR This routine will move the contents of one string to the new one. CHKCOM This routine will gobble the comma from the command line. ENDDATA This routine will advance the command line pointer to the end of the command line, hence ignoring all remaining parameters. Using these expression routines, valid commands would look like this: & 0, 10,20, A$ & 0, X, H, A$ & 0, 1*2+5-(10+4)-X, A-B+(B=1), ST$ The routines will evaluate the expressions and return the values. AN ACTUAL ROUTINE At this point we have our Ampersand vector set up, and """"""""""""""""" we have our parser routine directing control to the appropriate function, so all that is left is to write an actual routine which will pull the parameters from the command line and act on them. Let's use a print string command as our first function. Here's the format we'll use for our print function: & 0, vtab, htab, string The '0' is the function number, then the 'vtab' would be the vtab position to print the string, the 'htab' would be the htab position, and lastly the 'string' would be the string to print. A real example would be this: A$ = "Hello World!" & 0, 2, 0, A$ This would translate to "print at vtab 3, htab 1, string A$". Please be aware that the true vtab values are 0-23 and the true htab values are 0-39; in Applesoft the first position would be VTAB 1, because the '1' translates to '0'. Let's start with the code, please note that I changed 'Function1' to 'APrint'. Htab equ $24 ; htab Vtab equ $25 ; vtab VarPtr equ $83 ; pointer to variable value Cout equ $fded ; character out routine DoTabs equ $fb5b ; set tabs from a/x regs APrint jsr ComByte ; get Vtab cpx #24 ; greater than 23 is no good bcs :out stx Vtab ; store it jsr ComByte ; get Htab cpx #40 ; greater than 39 is no good bcs :out stx Htab ; store it jsr ChkCom ; gobble comma jsr PtrGet ; get address of string lda Vtab ; position cursor for output ldx Htab jsr DoTabs ldy #0 lda (VarPtr),y ; get length of string tax iny lda (VarPtr),y ; get LOB of string address sta :print+1 iny lda (VarPtr),y ; get HOB of string address sta :print+2 txa tay ldx #0 :print lda $ffff,x ; get character (self-modified!) ora #$80 ; make it ASCII printable jsr Cout ; character out inx dey bne :print :out rts ; return to Applesoft The first thing we are going to do when entering our routine is to gobble the comma after the function code and get our vtab value from the command line. The 'JSR ComByte' does this for us and the value is waiting in the x-register. We take the initiative to validate the vtab value with a range from 0-23. Anything outside this range will cause the program to jump to the ':out' routine with a 'rts' to Applesoft and a SYNTAX ERROR will be generated. This is good practice because from Applesoft we will determine the range problem and fix it. The vtab value is then stored in a variable. Next we gobble the comma after the vtab parameter, get our htab value, and store it as well. The same type of validation is done here as with the vtab value. Now we have a string value coming up next, so we gobble just the comma with 'JSR ChkCom'. Now the command line pointer is at our string parameter. A call of 'JSR PtrGet' causes the routine to locate the address for the string variable (notice that this is NOT the string, it's the variable address!), and store it in zero page location 'VarPtr'. We call the tabs routine to set our tabs which positions the cursor on the text screen. Now 'VarPtr' points to the string variable. The next three bytes at this address defines the variable. The length of the string comes first, then the address where the string is located. So we grab the length byte and transfer it to the x-register to use as a loop counter for the print routine. Next we grab the address of the string and store it in the code itself at label ':print'. This is called self-modifying code, so when the 'lda $ffff' is executed, the '$ffff' has been changed to point to the address of the string. Now we print the string, and we're done with a successful 'rts' back to Applesoft. THE BASICS That's all there is to an '&' command! The print string """""""""" routine illustrates how to handle values and strings from the command line, and how to use these values in a practical example. Now I want to give you the source to a complete three-function program and explain a few of the concepts. ========================== CODE BEGIN ============================= Sample equ $666 ; Nothing org $6000 ; assemble address lst on ; turn on listing case off ; no case sensitivity tr on ; expand macros tr adr xc off ; 6502 opcodes only dsk Ampersand *------------------------------------------------- * Zero page usage *------------------------------------------------- Pitch equ $d6 ; holds pitch for tone ptr equ $eb ; general usage pointer Htab equ $24 ; htab Vtab equ $25 ; vtab *------------------------------------------------- * Zero page constants *------------------------------------------------- Cout equ $fded ; character out routine DoTabs equ $fb5b ; set tabs from a/x regs Tabs equ $fc22 ; set tabs from $24/$25 Ch equ $24 ; monitor HTAB value Inverse equ $32 ; Applesoft inverse flag location VarPtr equ $83 ; pointer to variable value DscTmp equ $9d ; string descriptor: length, lo, hi * Softswitches Key equ $C000 ; keyboard buffer SKey equ $C010 ; clear buffer Spkr equ $C030 ; speaker location *------------------------------------------------- * Monitor routines *------------------------------------------------- Amper equ $3f5 ; Ampersand vector Cout equ $fded ; character out routine DoTabs equ $fb5b ; set tabs from a/x regs Tabs equ $fc22 ; set tabs from $24/$25 PtrGet equ $dfe3 ; find named variable, addr in VarPtr GetByte equ $e6f8 ; evaluate expression to x-reg ComByte equ $e74c ; gobble comma, evaluate expression to x-reg StrIni equ $e3d5 ; create new string space MovStr equ $e5e2 ; move string into space ChkCom equ $debe ; gobble comma EndData equ $d995 ; advance to end of data *------------------------------------------------- * Setup Ampersand Vector *------------------------------------------------- SetAmper lda #$4c ; opcode for JMP sta Amper ; put at &-vector address lda #AParse ; get high order byte sta Amper+2 ; store it for the JMP rts ; leave *------------------------------------------------- * Ampersand command line parser *------------------------------------------------- * Function 0 = Print string * & 0, vtab, htab, string-variable * eg. & 0,10,8,A$ * * Function 1 = Do tone * & 1, pitch, duration * eg. & 1,40,66 * * Function 2 = Line Input * & 2, vtab, htab, input limit * eg. & 2,4,1,20 * *------------------------------------------------- AParse jsr GetByte ; get function number cpx #3 ; validate function number bcc :valid rts ; not valid, return with error :valid txa ; convert function number into index asl ; for accessing the function address table tax lda :F_Table+1,x sta ptr+1 lda :F_Table,x sta ptr jmp (ptr) ; jump to function routine :F_Table da APrint ; Function 0 = print string da DoTone ; Function 1 = do tone da LineInput ; Function 2 = line input *------------------------------------------------- * Ampersand print *------------------------------------------------- APrint jsr ComByte ; get Vtab cpx #24 ; greater than 23 is no good bcs :out stx Vtab ; store it jsr ComByte ; get Htab cpx #40 ; greater than 39 is no good bcs :out stx Htab ; store it jsr ChkCom ; gobble comma jsr PtrGet ; get address of string lda Vtab ; position cursor for output ldx Htab jsr DoTabs ldy #0 lda (VarPtr),y ; get length of string tax iny lda (VarPtr),y ; get LOB of string address sta :print+1 iny lda (VarPtr),y ; get HOB of string address sta :print+2 txa tay ldx #0 :print lda $ffff,x ; get character (self-modified!) ora #$80 ; make it ASCII printable jsr Cout ; character out inx dey bne :print :out rts ; return to Applesoft *------------------------------------------------- * Tone routine *------------------------------------------------- DoTone jsr ComByte ; get pitch stx Pitch ; save it jsr ComByte ; get duration txa ; transfer to y-reg tay Tone ldx Pitch ; create tone from pitch value :2 dex bne :2 bit Spkr ; click speaker dey ; loop bne Tone :out rts ; return to Applesoft *------------------------------------------------- * Tone routine for internal use *------------------------------------------------- IDoTone stx Pitch jmp Tone *------------------------------------------------- * Line Input *------------------------------------------------- LineInput jsr ComByte ; get Vtab cpx #24 ; greater than 23 is no good bcs :out stx Vtab ; store it jsr ComByte ; get Htab cpx #40 ; greater than 39 is no good bcs :out stx Htab ; store it jsr ComByte ; get input limit stx :Limit ; store it jsr ChkCom ; gobble comma jsr PtrGet ; get address of string lda :Limit ; length of new string jsr StrIni ; create new string of given size ldy #0 lda DscTmp ; copy new descriptor to variable sta (VarPtr),y ; string length descriptor iny lda DscTmp+1 sta (VarPtr),y ; string LOB descriptor sta ptr ; pointer to string LOB iny lda DscTmp+2 sta (VarPtr),y ; string HOB descriptor sta ptr+1 ; pointer to string HOB jmp :ok :out rts ; return to Applesoft :ok jsr Tabs ; position cursor for output lda #0 ; character counter sta :Count :getchar jsr :flash ; flash cursor and get character bpl :getchar ; non-ASCII, get another character sec sbc #128 ; convert to low ASCII cmp #141-128 ; check for RETURN beq :return cmp #136-128 ; check for left arrow beq :delete cmp #255-128 ; check for DELETE beq :delete cmp #","-128 ; check for comma beq :getchar cmp #":"-128 ; check for colon beq :getchar cmp #160-128 ; only accept certain characters bcc :getchar ; for input cmp #255-128 bcs :getchar ldx :Count cpx :Limit ; number of characters reached limit yet? bne :printit ; not yet, print this guy ldx #230 ; if so, then allow no more! ldy #4 jsr IDoTone jmp :getchar :printit ora #$80 ; make it ASCII printable jsr Cout ldy :Count sta (ptr),y ; store character in string inc :Count ldx #30 ; some sound ldy #2 jsr IDoTone jmp :getchar ; get next character :delete ldx :Count ; delete a character only if there is one cpx #0 beq :getchar ldx :Count ; only erase cursor if it's there cpx :Limit beq :delete2 lda #" " jsr Cout dec Htab ; cursor back one position :delete2 dec Htab ; cursor back one position jsr Tabs dec :Count ldx #30 ; some sound ldy #2 jsr IDoTone jmp :getchar :return ldx :Count ; only erase cursor if it's there cpx :Limit beq :return2 lda #" " jsr Cout :return2 ldy #0 lda :Count ; store character count of string length sta (VarPtr),y ldx #44 ; some sound ldy #4 jsr IDoTone rts :flash bit SKey ; clear strobe :flash2 lda #"_" ; print underline and move jsr :bprint ; cursor back jsr :delay ; wait a bit bcs :gotkey lda #" " ; print space and move jsr :bprint ; cursor back jsr :delay ; wait a bit bcs :gotkey jmp :flash2 ; loop :gotkey rts :bprint ldx :Count cpx :Limit ; number of characters reached limit yet? beq :bout ; yep, don't print a cursor jsr Cout ; print character dec Htab ; cursor back one position jsr Tabs :bout rts :delay ldx #0 :d1 dex ldy #55 lda Key ; if key bmi :key ; get out :d1a dey bne :d1a cpx #0 beq :d2 bne :d1 :key sec rts :d2 clc rts :Count ds 1 ; holds character count :Limit ds 1 ; holds input limit ========================== CODE END =============================== Let's start from the beginning. The program will assemble to address $6000 which is simply a convienent location in memory that I chose. The listing will show as the compile is in progress, case sensitivity is off (mix and match upper/lower case), macros will expand (we don't have any), we'll use 6502 opcodes only, and the object code will assemble to a file called 'Ampersand' on disk. Zero Page usage: The 'Pitch' variable holds the pitch for our Tone routine, the 'ptr' variable is a general usage pointer, and the 'Htab' and 'Vtab' are used in both the print string routine and the input routine. The 'VarPtr' will point to the string variable after a 'PtrGet' call. 'Cout' is the standard character out routine, 'DoTabs' will set the cursor position depending on the a-register and the x-register, 'Tabs' will set the cursor position depending on the 'Vtab' and 'Htab' values. The softswitches are self-explanatory. The monitor routines have been described in detail, as have the 'SetAmper', 'AParse', and 'APrint' routines. The next new routine is 'DoTone'. 'DoTone' first grabs the pitch value from the command line and stores it. Then the duration is grabbed and transferred to the y-register to be used as a duration counter. Next the tone sound is generated by accessing the speaker softswitch at a rate determined by the 'Pitch' constant, thus generating the given tone. After the sound is done, control is returned to Applesoft. RESTRICTED INPUT INSTRUCTION? The last routine is the 'LineInput' """"""""""""""""""""""""""""" routine. Have you every wanted an input routine which restricts the user from entering to many characters? In Applesoft the INPUT instruction puts no restrictions on the users input (except for the 224 character limit) and this can cause major problems. I thought it would be nice to have an input routine which restricts the user to a given number of characters. So here it is, the 'LineInput' routine. If you look you will see that four values are passed to the routine. The first two are the 'vtab' and 'htab' values of where to place the prompt on the screen. The third value is the maximum number of characters allowed to be entered, and the fourth and final value is the string of where to place the entered string. The new routine here is the 'JSR StrIni' routine. If you look closely you will see that we get the address of the passed string, create a new string variable with the given length (the input limit), copy the new variable descriptor information to the new variable and lastly setup 'ptr' to point to the new string, so all entered characters are stored directly into the new string. APPLESOFT INTERFACING If you examine the Applesoft program below you'll """"""""""""""""""""" see how each of the three functions could be used. 1 REM *********************** 2 REM * * 3 REM * Amperand Tester * 4 REM * --------------- * 5 REM * * 6 REM * By Russell Nielson * 7 REM * On November 25, 1995* 8 REM * * 9 REM *********************** 10 D$ = CHR$ (4) 20 PRINT CHR$ (21): TEXT : HOME 21 : 22 PSTRING = 0: REM Function 0 24 SOUND = 1: REM Function 1 26 LINE = 2: REM Function 2 29 : 30 INVERSE : PRINT SPC( 40 * 3): VTAB 2: HTAB 6: PRINT "A M P E R S A N D T E S T E R";: NORMAL 40 POKE 34,4 45 PRINT D$"-ampersand" 50 VTAB 6: HTAB 5: PRINT "Please choose an option:" 60 VTAB 8: PRINT "1. Ampersand print string" 70 PRINT "2. Ampersand tone routine" 80 PRINT "3. Ampersand line input" 90 PRINT : PRINT "4. Quit" 100 VTAB 20: HTAB 5: PRINT "Please choose by number:";: GET Z$ 110 Z = VAL (Z$): IF Z = 0 OR Z > 4 THEN PRINT CHR$ (7): GOTO 100 120 HOME 130 ON Z GOSUB 200,300,400,500 135 POKE 49168,0 140 POKE 34,4: POKE 35,24: HOME : GOTO 50 199 REM Ampersand Print 200 VTAB 5: HTAB 13: PRINT "Print routine" 201 GOSUB 900 202 A$ = "Testing" 210 FOR B = 1 TO 35 220 V = INT ( RND (1) * 16) + 6 230 H = INT ( RND (1) * (40 - LEN (A$))) 240 & PSTRING,V,H,A$ 250 IF PEEK (49152) < 128 THEN NEXT : HOME : GOTO 210 298 RETURN 299 REM Ampersand Tone 300 VTAB 5: HTAB 14: PRINT "Tone routine" 310 GOSUB 910 320 FOR A = 1 TO 2 330 FOR X = 10 TO 240 STEP 10: & SOUND,X,10: NEXT 340 FOR X = 230 TO 20 STEP - 10: & SOUND,X,10: NEXT 350 NEXT 360 FOR A = 1 TO 75 370 & SOUND, INT ( RND (1) * 256), INT ( RND (1) * 120) + 1 380 NEXT 398 RETURN 399 REM Ampersand Line Input 400 VTAB 5: HTAB 11: PRINT "Line Input routine" 410 GOSUB 910 420 VTAB 10: HTAB 1: PRINT "Enter your name: |"; 430 & LINE,9,17,22,N$: POKE 49168,0 440 VTAB 16: HTAB 5: PRINT "Thank you, "N$"!" 450 VTAB 23: HTAB 13: PRINT "Press a key...";: GET Z$ 498 RETURN 499 REM Quit 500 POP : TEXT : HOME : END 900 VTAB 24: HTAB 10: PRINT "Press a key to stop";: POKE 35,23 910 POKE 34,5: RETURN CONCLUSION Now you have the knowledge to create powerful interfaces """""""""" between Applesoft and machine language. Using the Ampersand command definetly has its advantages as you can plainly see, and it should be used as much as possible. SUPPLEMENT There is a file in the A2Pro Software Libraries that contains """""""""" this source code, the Applesoft program listed above, and the object code that is generated by the source code. That file number is 4882. [*][*][*] We want your articles! If you want to write an article for GEnieLamp A2Pro, then contact the editor, A2PRO.GELAMP for more information. We pay for articles with usage credits. [*][*][*] [EOA] [HEY]////////////////////////////// HEY MISTER POSTMAN / ///////////////////////////////// Is That A Letter For Me? """""""""""""""""""""""" By Tim Buchheim [A2PRO.GELAMP] o BULLETIN BOARD HOT SPOTS o WHAT'S NEW o PROGRAMMERS' TIPS o MESSAGE SPOTLIGHT >>> BULLETIN BOARD HOT SPOTS <<< """""""""""""""""""""""""""""""""" ~ Where All the Action Is! ~ [*] CAT 1, TOP 25, MSG {8}......Important GEnie Announcements [*] CAT 2, TOP 13, MSG {39}.....Handling Interrupts [*] CAT 7, TOP 6, MSG {76}.....Programming with ProDOS (8-bit) [*] CAT 11, TOP 27, MSG {95}.....File Type Assignments [*] CAT 13, TOP 2, MSG {76}.....Where to find information [*] CAT 16, TOP 5, MSG {2}......KansasFest '96 >>> WHAT'S NEW <<< """""""""""""""""""" ~ Announcements ~ GENIE FOR SALE A Letter from GEnie Acting President, Horace Martin """""""""""""" Dear GEnie Subscriber, GE Information Services, the owner of GEnie Online Services, announced yesterday that the company is working with the investment firm of Allen & Company to identify potential buyers for GEnie. The decision to seek a buyer for GEnie was a difficult one for GE Information Services. We feel tremendous loyalty to our customers, and we considered very carefully the options available to us. Finally, our business decision was based on a desire to focus on GE Information Services' main mission -- to provide business productivity solutions to businesses around the world. We lead this market, and we derive more than 95% of our revenues from this market. In 1995, GE Information Services has invested in GEnie with a new graphical user interface, new multi-player game offerings, faster access speeds, and simplified pricing. We believe that GEnie presents a good fit within a company whose main focus is in the consumer market. GEnie subscribers are the best in the world, and we are keeping you front and center as we seek a new owner for GEnie. We assure you that you will receive top quality service and support throughout this process. We will make every effort to make this transition transparent to you. In the long run, we hope that this transaction will make GEnie a better and even more exciting service for you, our customer. Please check GEnie's logon announcements periodically. Updates will be provided whenever new information can be released. (Type "GENIE" at any menu prompt and select Item #2 from the menu which is presented to access the announcements if you're already online, or take a moment to review them each time you logon.) Sincerely, Horace Martin Acting President GEnie Online Services (JUST.DAVE, CAT1, TOP25, MSG:8/M530) MOVING The snail address for A2Pro Technical Support (where you get """""" filetype assignments) has changed. The new address is: A2Pro Technical Support P.O. Box 8553 Rolling Meadows, IL 60008-8553 As always, you can send e-mail to a2pro@genie.com to request a filetype also. A2Pro Technical Support (A2PRO, CAT11, TOP27, MSG:95/M530) TECHNOTES ON WWW Tony Morales, aka Hexman writes: """""""""""""""" If you've got some time sometime, check out my home page. It's far from done, but it's kind of interesting. Its URL is http://www.best.com/~hexman Oh yeah, one last tidbit of "maybe" interest. I have put all the Apple II FTNs and TNs on the WWW, with a really nice hypertext method of selecting notes to read. The URLs are: FTNs: http://www.best.com/~hexman/a2ftn.html TNs: http://www.best.com/~hexman/a2tn.html (R.NIELSON1, CAT13, TOP2, MSG:76/M530) KANSASFEST '96 I'm here to make an official announcement that KansasFest """""""""""""" 1996 will be July 17-21, 1996, at Avila College, Kansas City, Missouri. That's about all the details I can give for now. Cindy (KFest Big Cheese) (CINDY.A, CAT16, TOP5, MSG:2/M530) >>> PROGRAMMERS' TIPS <<< """"""""""""""""""""""""""" ~ Helpful Advice from the Experts ~ HANDLING INTERRUPTS Hello. I'm working on some software, and I've finally """"""""""""""""""" hit the great wall I've been trying to avoid. I need to install an interrupt, and I don't have a clue how one works, or how to install-remove one. This is what I need to do: 1. Make it so when something comes in through slot 2, it will automatically jump to , let's say, $1234. 2. I've been trying hard ro understand, and I still can't understand. But I think I know that there is a priority thing in the intterupts, like a 1-4, and 1 is the first one checked. Well, I need this priority 1. Maybe there's a file here that describes the MLI and interrupts? I have all the manuals that describe all theese things, but they don't help at all. Also, can somebody define exactly what 'DA' does? I know it's Define Address, but wouldn't that be the same as DOO EQU $4534? Also, DFB, and DB if there is one could also use some definition. My Stupid assembly book is gone. Well, if anybody could help me, then i could continue. Richard Noordhof -- R.NOORDHOF Delivered by CoPilot V2.55 and ProTERM 3.1 (R.NOORDHOF, CAT2, TOP13, MSG:39/M530) >>>>> There are several kinds of interrupts, and a lot of details on how """"" to use them. I'd suggest reading the material about interrupts in the Apple IIGS Toolbox Reference, Volume 1. Follow up with a scan of the appropriate tech notes. If you need to dig deeper, the Hardware and Firmware reference manuals would be next. As far as I know, you can't generate an interrupt when something comes in through slot 2--not without rewriting the slot 2 firmware, at least. The best you could do is write an interrupt handler that would check to see if anything was available there, and if so, handle it. On the other hand, I'm not the expert on low-level interrupts. Someone else may come along who knows something about some interrupts that are generated for low-level I/O events, and they may fill you in on some trick I/m not aware of. Unless that happens, though, start with the info above. Mike Westerfield (BYTEWORKS, CAT2, TOP11, MSG:40/M530) >>>>> Aha... serial interrupts... a subject I hold dear to my heart! """"" :) Interrupts are a risky business, and a misplaced interrupt can bring the whole system crashing down on you! :) That said, they can also be great allies to speedy processing and avoiding data loss. Tread with care here and interrupts will be great friends. :) First thing I should warn you... if you plan on running any faster than 2400 baud on an unaccelerated GS, you can forget about the standard serial interrupt. It's too far down the chain to be responded to in a reliable manner going any faster (i.e. in the number of cycles used checking the interrupt chain, another interrupt may have already occurred). The best method I've seen for handling this reliably (which also happens to be quite dangerous - play with great care) is to change the interrupt table so that the very FIRST vector in the list is to a routine which checks to see if your serial device is theone that generated the interrupt, and if not, chains to whatever was in that spot in the chain previously. The biggest reason this is dangerous is because in GS/OS you're usually not alone, and who know's who else (init's, DA's, whatever)has already patched out that vector. The patch in itself isn't what's dangerous, it's what happens when you quit. If an init or DA installs a 'rupt handler in this method after yours, then you disinstall yours, you have now effectively not only disintalled yours, but the inits or DA's routine as well. The safest method I've seen for dealing with this is to NOT deinstall your routine, but leave a stub in memory (real short, with it's own handle and UserID) that does nothing but pass control on to the previous owner of that interrupt vector. A 4-byte handle if you will... JML prev_vector Oh, Lock it down, too... the vector is a pointer, not a handle, so if your stub moves, it'll break. The best way to deal with serial interrupts is to have your interrupt handler do ABSOLUTELY AS LITTLE AS POSSIBLE (actually, this holds true for just about any kind of interrupt). When you are inside an interrupt routine, EVERY MICROSECOND COUNTS! The faster you can get your job done and get out, the better. If you can pass anything off on your main program by setting a flag to be checked later, then by all means do it. :) If all you are doing is checking for incoming data, set up a buffer inside your program, and then all your routine needs to do is drop the incoming character in the buffer, update the "last character" pointer, and back out again. Then your program can deal with the contents of that buffer next time it goes through your event loop. Most of the specifics can be found in the places Mike mentioned. :) Dave (JUST.DAVE, CAT2, TOP13, MSG:41/M530) <<<<< Well, I'm programming on a GS with a TWGS. Yeah, I want a routine """"" that would check if anything came in, then put it somewhere in memory. How would I do this? Richard Noordhof -- R.NOORDHOF Delivered by CoPilot V2.55 and ProTERM 3.1 (R.NOORDHOF, CAT2, TOP13, MSG:42/M530) >>>>> > I need to install an interrupt, and I don't have """"" > a clue how one works, or how to install-remove one. Another good source which explains interrupts rather well is "Advanced Programming Techniques for the Apple IIgs Toolbox" by Morgan Davis and Dan Gookin. It has a whole chapter devoted to this topic. You could probably buy it cheaply from someone. Michael (ANIMASIA, CAT2, TOP13, MSG:43/M530) >>> MESSAGE SPOTLIGHT <<< """"""""""""""""""""""""""" ~ Important or Interesting Messages ~ COMMAND LINE? Hi... Anyways, I have a couple of questions about some """"""""""""" ProDOS 8 things... First, where in memory is the 'command line' passed to a program stored. Various program launchers for the II (which, of course, I cannot remember now...) pass along the name of a file to the app being opened, so that it can deal with it in an appropriate manner (eg, open it, or whatever). I want to access this from Applesoft so that I can pass along a filename to a filename to a SYS file that I am starting. Also, where is the ProDOS quit code stored in memory, and how can I access it? I want to program it to re-start BASIC.SYSTEM after the program exits, but I'm not sure where the code is. (Now that I think about it, I think I have a util on one of my old Softdisks that does this, but I need to practice using the MLI anyways.) (C.HARKE, CAT7, TOP6, MSG:76/M530) >>>>> The 'command line' info is being passed in the message center. This """"" is a IIgs thing and you'll find it in one of the tech notes. You have to call the toolbox to get at it. The P8 quit code is 3 pages ($300 bytes) starting at $D100 in the other bank of the language card area. Those pages get copied to $1000 when you use the MLI QUIT and then the MLI does a JMP $1000. Todd Whitesel (A2PRO.TODDPW, CAT7, TOP6, MSG:77/M530) <<<<< OK, thanks. I thought that it might be thru the message center """"" (although I don't know what the message center is since I'm mainly an 8-bit programmer). Funny, though, since the program I am passing the parameter to ('INFOLOAD', for those who are interested) is an 8 bit, 6502 assembly language program, and I'm sure I read somewhere that ProSel 8 could pass an initial file along, as well. Maybe these functions only work if you have a GS. (C.HARKE, CAT7, TOP6, MSG:78/M530) >>>>> I only glanced at your previous post, but I think you were asking """"" about the passing of program names under ProDOS 8. Yes it can be done and no, it doesn't use the message center. If you have Gary Little's book "Exploring Apple GS/OS and ProDOS 8" look on page 222 - 'The Structure of a ProDOS 8 System Program'. If you don't have the book here's a quick overview. A system program that follows the auto-run protocol has the following header: 3 bytes - $4C $xx $xx: A JMP instruction to the start of program code 2 bytes - $EE $EE: Two ID bytes indicate auto-run protocol 1 byte - $xx Size of buffer that follows ? bytes - A pascal string (leading length byte) with the name of the auto-run file. The length of this string (including length byte) must not exceed the buffer size given above. A default filename is usually placed in the buffer, "STARTUP" in the case of BASIC.SYSTEM. The launching program may place a different file name in the buffer after checking for the ID bytes and making sure the buffer length is long enough to hold the filename string. By the way, isn't INFOLOAD part of a program that allows you to run INFOCOM programs under ProDOS 8? If I recall, there was a bug in the program and I had to change one byte to get it to work correctly. \ ___\ ___\ \ !\ \ A Bob, H AF6C (R.ECKWEILER, CAT7, TOP6, MSG:79/M530) >>>>> ProDOS 8 also has a filename passing mechanism, and the Message """"" Center has nothing to do with it. It only works on SYS files, and only on those that have been configured for it. In order to work, a SYS file needs to be set up sothat there is a 64 byte (or whatever, but 64 is standard) "buffer" at byte offset +06 into the file. A launcher will first load the file, then copy the passed parameter into that buffer as a p-string before executing it. The SYS file must be set up as follows: +$00: 4C 47 20 JMP $2047 (or wherever the buffer ends) +$03: EE EE Parameter-capable signature bytes +$05: 41 Length of buffer (including the p-string length byte) +$06: buffer pstring of parameter passed. Should be zeroed at load time in case no parameters are passed. +$47: actual code (if the buffer isn't 64 bytes, this may not be +$47) The Finder (6.0 and later) has been set up to deal with this when launching P8 files (for example, I have an icon set up for PTD.* files that is mapped to PT3.System, and I can double-click on a dial entry file in my PT3.DIAL directory and have ProTERM launched and have it automatically dial that service when it comes up). Dave (JUST.DAVE, CAT7, TOP6, MSG:80/M530) <<<<< Thanks. I thought there must be a way to do that from pure ProDOS 8 """"" Yes, INFOLOAD is the program that lets you load Infocom games from ProDOS. It was acting up for me at first, breaking into the monitor whenever I loaded an adventure. I had to go inside the INTERPRETER file and change the first 3 bytes from BRKs to NOPs ($EA? I can't remember). Now it works perfectly, I have 6 or 7 games on one disk, and this program will be a menu for it. Anyhow, thanks again for the help. (C.HARKE, CAT7, TOP6, MSG:81/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 urges you to give the bulletin board area a try. There are literally thousands of messages posted from people like you from around the world. [*][*][*] [EOA] [DEV]////////////////////////////// DEVELOPER'S CORNER / ///////////////////////////////// News From The A2Pro Online Developers """"""""""""""""""""""""""""""""""""" By Tim Buchheim [A2PRO.GELAMP] o ONLINE SUPPORT IN A2Pro o GNO/ME o DEVELOPER ANNOUNCEMENTS >>> 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 38 EdIt-16 (Bill Tudor) 30 PROCYON, INC. 31 SOFTDISK PUBLISHING 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. >>> GNO/ME <<< """""""""""""""" WHAT IS THIS THING? Well, I may as well admit it, """"""""""""""""""" ........I love the IIgs, but in the scheme of things am truly just a beginner. I am actually very interested in this program, from what I've heard of it, but I'm still very unclear about what it does. If people in the know could describe it a little, I'm sure many of us would appreciate. Thanks, Toby (T.REITER2, CAT30, TOP2, MSG:206/M530) >>>>> Toby, """"" > I love the IIgs, but in the scheme of things am truly just a > beginner. I am actually very interested in this program, from what I've > heard of it, but I'm still very unclear about what it does. If people > in the know could describe it a little, I'm sure many of us would > appreciate. You asked for this, remember, so no complaints :). I just hope GEnie doesn't choke on message length. [Editor's note: It didn't. :)] Sure. GNO/ME (precise pronouncement of this is not really known, though it has been proposed to pronounce it _with_ the G, since GNO is a recursive acronym for "GNO's Not ORCA" --- OTOH, that is probably a rumour, and all the bad puns like "I don't GNO any more" or "the GNO/MEs have gotten to my GS again" seem to suggest the G not be pronounced) is a multi-tasking, multi-user environment for the GS. It has some mechanisms that are highly analogous to Unix, and some things that are quite unlike Unix. I could probably waffle on like that, but I'll just give some examples, shall I? GNO/ME is multitasking: What's that mean, exactly? Means several processes (programs) can be run at once. Only one of these programs may be graphical (use the GS desktop), and no P8 programs can be run inside GNO/ME. For example, say I want to convert a bunch of files from Unix to Apple text format, but I don't want to wait for it to happen, so I could do: udl -r texts/* & If that syntax looks familiar, that is not by accident. GNO/ME's shell (gsh) supports automatic wildcard expansion (my program does not need to know how to handle); I can push programs into the background by using &. I could now list my processes with a ps, and I would see that udl is running, its state, and how long it has been running. That GNO/ME does preemptive multitasking also means that you can kill rogue processes with a Ctrl-C or, if that fails, a kill -9 (there is even a CDA to do that if you can't access the console any more). In practice, the number of processes you can _actually_ run at any one time is limited by 64k of DP space, every program needs a bit of this. Some grab as much as 24k of this space, others need only a meek 1k. So, even though you might have another 4MB of RAM free, if your DP space runs out, you're shafted. This is a limit imposed by how the 65SC816 was designed, not by GNO/ME. The fabled 65SC832 was supposed to add a full 24-bit DP register instead of a 16-bit one, but the 65SC832 is naught but a wet dream for us right now, alas :). GNO/ME is multi-user, you say? You mean several people can use my GS at once? Well, yes, kind of. You get a spiffy login: screen and can type "root" and feel really in control. You can have a friend use his P6-150 to connect to your GS's serial port (directly or through modem) and have his own console and shell. Way rad! But not really useful ... the GS does not have enough DP space to run a lot of processes, so two users on one machine may already get tight if both of you actually want to do things, the GS does not, presently, have an FST that supports access rights, so you GOT to trust your friend since there is no way you can restrict his access to your machine (other than giving him a very restricted login shell instead of gsh, of course), and on the GS, you are in control all the time anyway, so typing "root" on a machine that doesn't really have any paranoid security alerts and automatic guns trained on you at login is a bit dull. :) That said, the multi-user feature probably has its uses. I am not really a GNO/ME guru. So, GNO/ME is kinda like Unix ... do I have to learn Unix? No, but you have to learn to find your way around a Unix-like shell. It's not really hard ... GNO/ME comes with a lot of the "popular" utilities, so it might be perfect for getting the feel of a Unix shell without actually having to _be_ at a Unix shell. I can ps to see my processes, have ls show me my directory contents, I can cd /usr/local/bin (yes, GNO/ME has support for fake root directories, /usr/local/bin is actually :applications:gno:usr:local:bin on my machine, but I don't have to know that), I can man to look up a command, there's less and df and du and syslogd and dmake and many many many more. So, who do you think should get GNO/ME? Programmers. You program for the GS? Get GNO/ME. Don't wait. Order it now. It _will_ be worth it. GNO/ME simply has many life-saving features ... the only shell that will let you ^C a process (don't need to reboot just because you went into an INF loop), the only shell that has a port of dmake (excellent Unix make command, ported by Devin Reade. A must if you want to automate your builds), the only shell that has more programming utilities than one can shake a stick at. Students and people who want to/have to learn Unix. As a first contact with the daunting world of a Unix shell prompt, GNO/ME is perfect. The security limitations it has also mean that you _cannot_ lock yourself out of the system inadvertently, furthermore, you are alone on your machine, so no sysadmin will come chasing you because you filled up the lpd queue or core-dumped once too often. :) Anyone who is into the Internet. GNO/ME is currently at version 2.04, version 2.06 should be out RSN, and it will have BSD sockets support! If that doesn't mean anything to you, don't worry. There will be a free TCP/IP stack, and a commercial SLIP dialer add-on. In essence, this means that you will be able to surf the net from your GS ... ftp, archie, telnet, email, news and, dare I say it, the WWW are finally in your reach without having to go through a shell account or use a PC/Mac to make the connection. If you want to run shell utilities of any kind, GNO/ME is also an excellent choice because I find it more productive to use than say ORCA/Shell (which leads the race when it comes to robustness, though). Some/many utilities are only available as shell utilities. Some popular examples: - descii. Sure, you can use GSCII NDA, but GSCII NDA has a bug that will sometimes decode incorrectly. descii decodes correctly, every time. Plus, you can have it do its thang in the background. - unarj/booz/unpp. Clanging my own bell here, but these utilies are currently the only way to unpack ARJ 2.41, ZOO 2.1 or PP archives on the GS. - gzip, tar. That's right, you can access gzip and tar archives. ShrinkIt _this_, dude! You can't. - udl. Am I really the guy who said "the sound of your horn is far sweeter if blown by somebody else"? Awww what the heck, I'm an ugly bastard anyway. To my knowledge the only utility that will batch-convert text files between Unix/Apple/MS-DOS formats, including any subdirectories encountered (the latter feature added by Devin Reade). Or, use cr2lf for more speed but less bells and whistles and the good conscience of using a 100% US product instead of an imported German one. - mtools. Write to and read from MS-DOS disks with this set of shareware utilities. Sure, mtools comes with its own mini-shell, command.com, but I find GNO/ME _much_ easier to use. Ok, Ok, you've got me cornered, I'll buy. What kind of hardware should I have? Well, a IIgs, obviously. 2MB of system memory minimum, though I'd recommend 4MB or more (Sequential has great deals on 4MB memory cards). A hard drive. No kidding here, if you don't have a HD, don't even try to use GNO/ME. Some kind of accelerator like a ZIP or TWGS helps, but is not essential. Heck, it helps with using a GS at all, if you can bear using the Finder at 2.8MHz, you can use GNO/ME, and you'll get the feeling its blazing along as well, probably (well, compared to a desktop program anyway :). To learn more and get all the errors that I made in this post corrected, drop bazyar@hypermall.com an email, he's the mastermind behind GNO/ME. Soenke -- God despises money: Look whom He gives it to (S.BEHRENS1, CAT38, TOP2, MSG:207/M530) MAN HELP Hi All, """""""" I dlded a couple of utilities from A2Pro libs the other night. The man pages contain a bunch of formatting chars and don't display properly for me. A sample; .TH AWK 1 .CT 1 files prog_other .SH NAME awk \- pattern-directed scanning and processing language .SH SYNOPSIS .B awk [ .BI -F .I fs ] [ .BI -v .I var=value ] Is there some way I should be processing them? Am I doing something wrong? What editor uses .B .SH .CT .BI etc. ? Thanks for any help. Mark Wade (M.WADE7, CAT30, TOP3, MSG:192/M530) >>>>> Mark, """"" That is nroff/troff source. Move the file into the /usr/man/man1 directory and use the man command to view it. GNO's -man macro package doesn't support some of the commands (.DT, .BI, .IB, etc.), however, so you may seem some error messages. (S.REEVES2, CAT30, TOP3, MSG:193/M530) MISSING FILES I recently installed GNO/ME v2.0.4 and I have a problem. """"""""""""" Specifically, I cannot find two utilities: runover and dialup. These are supposed to be present, according to /GNO.Disk1/Release.Notes. I have examined all three installation disks, including the archives on the disks. Are they available? If so, where can I get them? Thanks. Kevin P. Reid (P.S. GNO/ME is my first experience with a UNIX system. It's GREAT!!!!!!!!) (G.W.HOFFMAN, CAT30, TOP3, MSG:199/M530) >>>>> Dialup is indeed available on GEnie. Right here in A2Pro as a """"" matter of fact (and it's been there about a year and a half :) 4082 DIALUP.V121.BXY X D.MITTON 940424 30080 37 30 Desc: DialUp V1.2.1 for GNO/ME V2.0. I believe Runover is included as part of the MultiUser Package: 3852 MULTIUSER.BXY X B.TAO 940123 156672 27 30 Desc: Multi-user package for GNO If the manual says runover is for single-user mode, I think it's an error. It's most definately a multi-user mode utility. Init uses it when setting up the alternate access points. If you'll be installing the multi-user package, you'll also need the "Multi- User Update" which I noticed is NOT in A2Pro. If someone wants to upload it, please do. :) I might if I get time, but no guarantees. Dave (JUST.DAVE, CAT30, TOP3, MSG:201/M530) >>> DEVELOPER ANNOUNCEMENTS <<< """"""""""""""""""""""""""""""""" JAWAID BAZYAR """"""""""""" >Newsgroups: comp.sys.apple2 >Subject: Jawaid Bazyar & Sequential >Date: 26 Nov 1995 23:05:07 GMT >Organization: SuperNet Inc. (303)-296-8202 Denver Colorado >Lines: 30 >Message-ID: <49arr3$lug@news-2.csn.net> >Reply-To: bazyar@hypermall.com >NNTP-Posting-Host: 199.117.27.22 >Summary: I'm not a number, I'm a free man! >X-Newsreader: TIN [version 1.2 PL2] It's now time to tell everyone: I, Jawaid Bazyar, am no longer associated with Sequential Systems, Inc. in any fashion. I will no longer provide technical support for any of Sequential's products, either via telephone, email, Sequential BBS, GEnie or USENet. I will not develop any new products in the future for Sequential Systems, nor will I enhance or fix existing Sequential products. I _am_ still standing behind all products of Procyon Enterprises Inc. GNO/ME, Switch-It!, Pick'n'Pile, and Splat! will continue to be sold and supported by myself. In addition, I look forward to the release of GNO 2.0.6 and Derek Taubert's TCP/IP package. And if anyone needs inexpensive and professional Internet/WWW services, that's exactly what I'm doing now, so please contact me! :-) I would appreciate it if someone could post this note to GEnie, as I won't have time to get on there for a while. I will come back soon to handle the Procyon category in A2Pro. I cannot at this time discuss the exact circumstances of this separation, as it would potentially jeopardize legal proceedings, so please don't ask me about it. -- Jawaid Bazyar | Affordable WWW & Internet Solutions Interlink Advertising Svcs | for Small Business bazyar@hypermall.com | P.O Box 641 (303) 781-3273 --The Future is Now!-- | Englewood, CO 80151-0641 (303) 789-4197 fax (JUST.DAVE, CAT30, TOP5, MSG:43/M530) EGO SYSTEMS """"""""""" EGO Systems is Moving! ---------------------- Effective November 16th, 1995 EGO Systems will be moving to a new location. After this date, you can contact by one of the following means: Voice phone: 423-843-1775 FAX: 423-843-0661 ORDERS ONLY: 800-662-3634 Snail Mail: EGO Systems 7918 Cove Ridge Rd. Hixson, TN 37343 e-mail: Diz@genie.com GSPlusDiz@aol.com In order to get everything moved on time (so we don't have to pay another month's rent on our old office) EGO Systems will be closed on November 13th through November 15th. We will re-open on November 16th at our new location. As before, our hours will be 9 am to 5 pm Eastern Time, Monday through Friday. Please pass this new contact information along to every Apple IIGS owner that you know! Diz EGO Systems (DIZ, CAT33, TOP3, MSG:74/M530) [EOA] [LIB]////////////////////////////// LIBRARY BIT BONANZA / ///////////////////////////////// HOT Files You Can Download """""""""""""""""""""""""" By Tim Buchheim [A2PRO.GELAMP] o KARL BUNKER SOURCE CODE o MORE SOURCE CODE o MISCELLANEOUS >>> Karl Bunker Source Code <<< """"""""""""""""""""""""""""""""" File # 4894 FLOORTILES.BXY(GS) (xxx) Uploaded on 1/4/96 by A2.TIM About 47K (d/l time approx. 4 minutes @ 2400 baud) Karl Bunker's source for FloorTiles 2.0 is included in this archive. The source is copyrighted, but Karl has allowed online distribution. See the included text file for details. Brought to you by Lost Classics. Requires the Lisa 816 Assembler to use. Packed with GS-Shrinkit. File # 4893 FAT104.BXY (GS) Uploaded on 1/4/95 by A2.TIM About 79K (d/l time approx. 8 minutes @ 2400 baud) Karl Bunker's source for File-A-Trix 1.0.4 is included in this archive. The source is copyrighted, but Karl has allowed online distribution. See the included text file for details. Brought to you by Lost Classics. Requires the Lisa 816 Assembler to use. Packed with GS-Shrinkit. File # 4892 FAT103.BXY (GS) Uploaded on 1/4/96 by A2.TIM About 88K (d/l time approx. 9 minutes @ 2400 baud) Karl Bunker's source for File-A-Trix 1.0.3 is included in this archive. The source is copyrighted, but Karl has allowed online distribution. See the included text file for details. Brought to you by Lost Classics. Requires the Lisa 816 Assembler to use. Packed with GS-Shrinkit. File # 4891 ANTWARS.BXY (GS) Uploaded on 1/3/96 by A2.TIM About 78K (d/l time approx. 8 minutes @ 2400 baud) Karl Bunker's source for AntWars is included in this archive. The source is copyrighted, but Karl has allowed online distribution. See the included text file for details. Brought to you by Lost Classics. Requires the Lisa 816 Assembler to use. Packed with GS-Shrinkit. >>> More Source Code <<< """""""""""""""""""""""""" File # 4886 JPEG.6.SRC.BXY (ALL) Uploaded on 12/10/95 by A2.TONY About 981K (d/l time approx. 90 minutes @ 2400 baud) This is the official source code for the IJG JPEG utilities v6. Please note that this source code will NOT compile as-is on the IIgs. I am providing it unaltered, as is the custom when distributing other people's source code. This version has already been compiled for the IIgs, see file #25931 in the A2 Library for the actual working programs. That said, the source isn't too hard to port to the IIgs because the IJG has provided lots of documentation, sample makefiles, a configuration program, etc. If you are fluent in C and have a working knowledge of your shell (ORCA, GNO, etc.) then you should be able to get the programs to compile and run. This is a HUGE archive so a hard drive is obviously a requirement. Packed with ShrinkIt GS 1.1. File # 4884 AMPERSAND.BXY (ALL) Uploaded on 11/28/95 by R.NIELSON1 About 6K (d/l time approx. 1 minute @ 2400 baud) Here are three files which show how the Ampersand (&) command works between Applesoft and machine language. There is an Applesoft program, Merlin source file, and the object code to the routines in this archive. If you've ever wanted to use this method for parameter passing, then you will most definitely want this file! :) Archived with ShrinkIt v.3.4. >>> Miscellaneous <<< """"""""""""""""""""""" File # 4877 OCC113.BXY (GS) Uploaded on 11/14/95 by S.BEHRENS1 About 81K (d/l time approx. 8 minutes @ 2400 baud) occ is a command-line front end for ORCA/C that gives you more Unix-like syntax. Useful when used with Devin Reade's dmake port. occ requires an Apple IIgs, GNO/ME or ORCA/Shell and ORCA/C 2.0.3 or later. [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 Programming PROGRAMMING 1445 Data Comm. DATACOMM 1450 IBM PC Prog IBMPCPRO 617 PowerPC PPC 1435 PowerPCProg PPCPRO 1440 GEnieLamp is also distributed on CrossNet and many public and commercial BBS systems worldwide. o To reach GEnieLamp on Internet send mail to genielamp@genie.com o Back issues of GEnieLamp are available in the DigiPub RoundTable Library #2 on page 1395 (M1395;3). Internet users should use the GEnie gopher (gopher.genie.com) which has most back issues (but might be missing a few of them). After you connect to gopher.genie.com, choose the "Magazines and newsletters" item and then choose the menu item for the Apple II. o GEnieLamp pays for articles submitted and published with online GEnie credit time. Upload submissions in ASCII format to library #31 in the DigiPub RoundTable on page 1395 (M1395;3) or Email it to GENIELAMP. On Internet send it to: genielamp@genie.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 the GEnieLamp staff "live" we meet every Wednesday night in the Digi*Pub Real-Time Conference at 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 """"""""" o Mike White [MWHITE] Managing Editor APPLE II o Doug Cuff [EDITOR.A2] EDITOR """""""" o Ray Pasold [R.PASOLD] A2 Staff Writer o Charlie Hartley [A2.CHARLIE] A2 Staff Writer A2Pro o Tim Buchheim [A2PRO.GELAMP] EDITOR """"" ATARI o Sheldon H. Winick [GELAMP.ST] ATARI EDITOR """"" o Bruce Smith [B.SMITH123] EDITOR/TX2 o Mel Motogawa [M.MOTOGAWA] Atari Staff Writer o Richard Brown [R.BROWN30] Atari Staff Writer o Al Fasoldt [A.FASOLDT] Atari Staff Writer o Timothy V. Steed [T.STEED1] Atari Staff Writer o Lloyd E. Pulley [LEPULLEY] Atari Staff Writer IBM o Sharon La Gue [SHARON.LAMP] IBM EDITOR """ o Tika Carr [LAMP.MM] MULTIMEDIA EDITOR o Susan M. English [S.ENGLISH1] Multimedia Graphics Artist o Wayne & Chris Ketner[C.KETNER] IBM Staff Writers MACINTOSH o Richard Vega [GELAMP.MAC] MACINTOSH 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 POWER PC o Ben Soulon [BEN.GELAMP] POWER PC EDITOR """""""" o Eric Shepherd [SHEPPY] Power PC Staff Writer WINDOWS o Bruce Maples [GELAMP.WIN] EDITOR """"""" o Tika Carr [LAMP.MM] Windows Staff Writer ETC. o Jim Lubin [J.LUBIN] Add Aladdin Scripts """" o Scott Garrigus [S.GARRIGUS] Search-ME! o Mike White [MWHITE] (oo) / DigiPub SysOp o John Peters [GENIELAMP] DigiPub SysOp o Phil Shapiro [P.SHAPIRO1] Contributing Columnist o Sanford E. Wolf [S.WOLF4] Contributing Columnist o Douglas Parks [DELUXE] Contributing Columnist \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////// Opinions expressed herein are those of the individual authors, and do not necessarily represent opinions of GEnie Information Services, GEnieLamp Online Magazines, or T/TalkNet Online Publishing. Bulletin board messages are reprinted verbatim, and are included in this publi- cation with permission from GEnie Information Services and the source RoundTable. GEnie Information Services, GEnieLamp Online Magazines, and T/TalkNet Publishing do not guarantee the accuracy or suitability of any information included herein. We reserve the right to edit all letters and copy. Material published in this edition may be reprinted under the fol- lowing 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. Please include the fol- lowing at the end of all reprints: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////// The preceeding article is reprinted courtesy of GEnieLamp Online Magazine. (c) Copyright 1996 T/TalkNET Publishing and GEnie Infor- mation Services. Join GEnie now and receive $50.00 worth of online credit. To join GEnie, set your modem to 9600 baud (or less) and half duplex (local echo). Have the modem dial 1-800-638-8369 in the United States or 1-800-387-8330 in Canada. When you see the U#= prompt, type: JOINGENIE and hit the RETURN key. When you get the prompt asking for the signup code, type DSD524 and hit RETURN. GEnie will then ask you for your signup information. For more information call (voice) 1-800-638-9636. ////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ [EOF]