*><*<>*› This article reprinted from the› M.A.G.I.C. Newsetter Nov. 1990, by OL'› HACKERS, with thanks. It adds to the› prior reported PEEKS and POKES, along› with machine language programming› tips.›› Atari BASIC Programming Helps› By Hawke, Sysop of the Nine Hells› Information Exchange of Philadelphia,› (215) 785-2625›› As a whole, standard Atari BASIC› is not the best programming medium in› existence. One of the major problems› stems from the fact that it was› created too many years ago. Be that› as it may, new programmers are being› subjected to it now, unnecessarily,› and must deal with a user unfriendly› language. (Editor. I strongly› disagree. I find BASIC a fun› programing tool, in spite of its› limitations. A.P.)›› Inspired by a set of PASCAL› notes, I venture to write these helps,› so that BASIC programmers can learn› from my experience, as well as the› Phoenix, with whom I have consulted› about this text. Any questions or› comments are welcomed. Contact myself› or Phoenix through the above Bulletin› Board number.›› The following sections deal with› POKE's, PEEK's, small machine language› routines, some program listings, BASIC› tricks, and other such nonsense.›› ROUTINE ONE:› (Three Lower case H's), (INVERSE› asterisk), (Capital L), (Capital V),› (INVERSE Lower case D)›› ROUTINE TWO:› (Lower case H), (INVERSE Quote),› (Control P), (SPACE), (Upper case V),› (INVERSE lower case D), (INVERSE› control A), (INVERSE capital T),› (INVERSE close parenthesis), (Control› ,), (INVERSE control E), (INVERSE› capital U), (Control .)›› (Ed. note: When typing in the above› routines, DON'T type in the commas.)›› Section One:›› Machine Language Routines›› Many BASIC programmers are fearful of› using machine language subroutines in› their programs. I know this to be› true, because I was one of them. I› have since gotten over that fear,› after collaboratively writing the P-› Net 4.5 BBS system with the Phoenix,› and have converted a few others.›› If you have ever used Character› Fonts, made with any number of font› editor programs (Envision, SuperFont,› etc.), you know that they can be used› to create fancy text, graphics, or› maps. The problem with them is that› one must enter in 1,024 bytes, poke› them into a page of memory, and then› change the register holding the› address of the ROM set to the new set. › To do all this takes a bit of time to› do. The following machine language› subroutine loads in a character set› and adjusts the register in seconds.›› 1 POKE 881,0:OPEN #3,4,128,"D:SET.DAT"› :POKE 884,0:POKE 885,112:POKE 888,0› :POKE 889,4:POKE 882,7› › 2 AA=USR(ADR("ROUTINE ONE"),48):CLOSE› #3:POKE 54277,4:POKE 756,112›› * SET.DAT would be the font.›› * Poking 885,112 tells the machine› which page of memory the redefined› character set will be stored in (since› a character set MUST start at the› beginning of a page).›› * To return to the ROM set, simply› POKE 756,224. To go back to the› redefined font, POKE 756,112.›› **› The next machine routine deals› with speedy Disk I/O. Atari BASIC› programmers know that using the INPUT› and GET commands with disk files is› SLOW, especially when using large› amounts of data. The following› machine language subroutine solves› this problem by allowing you to read› an entire file into a string,› virtually, in seconds. This can be› useful when printing out text files or› editting machine language programs (by› string search, etc.).›› 900 CLOSE #1:OPEN #1,4,0,"D1:filename› .ext"›› 1000 CE=INT(MEM/256):POKE 857,CE:POKE› 856,MEM-256*CE:BUF$(MEM)=" ":BOF=C1›› 1010 POKE 853,INT(ADR(BUF$)/256):POKE› 852,ADR(BUF$)-PEEK(853)*256›› 1020 DUM$="ROUTINE TWO":POKE 850,7:IF› USR(ADR(DUM$))=136 THEN BOF=C0›› 1030 X=PEEK(856)+256*PEEK(857):BUF$› =BUF$(1,X):RETURN›› * MEM is the amount of characters› that BUF$ is dimensioned to hold.›› * In line 1000, the routine divides› up that number into two numbers with a› formula (16-bit conversion). This› tells the subroutine the maximum› length the string can hold. It then› sets the last character in BUF$ equal› to a character, thus, it defines BUF$› as being full.›› * Line 1010 divides the address› (starting location) of BUF$ by the› same 16-bit conversion, and stores it› for the subroutine, so that it knows› where to start putting the incoming› data.›› * Line 1020 executes the machine› routine, and reads in the data,› checking for an End Of File (EOF)› error; #136. If such an error is met,› the variable BOF is set to zero.›› * Line 1030 retrieves the number of› bytes long the routine loaded, and› tells BUF$ that it is X number of› characters long.›› * If BOF=0, the user may account for› the EOF and jump back to the routine› after clearing BUF$.› * By using this routine, one can copy› files through BASIC. Simply, after› reading in a file, print the string to› disk.›› 10 CLOSE #1:OPEN #1,8,0,"D1:destinat.› ion":PRINT #1;BUF$:CLOSE #1›› **› The last machine language routine› is a clock. The Atari has a built in› clock and doesn't even use it. It› follows the electrical current in the› U.S., which flows at 60Mhz. The› following routine, written by the› Phoenix, sets up a clock, using page 6› memory (1536) to store the data, and› operates during each VBI (Vertical› Blank Interrupt). You merely have to› supply the current hour, minutes,› seconds, and 60ths of a second. You› can retrieve the current time by› merely using PEEK commands. The only› stricture is that if you use a› graphics command (eg. GRAPHICS 0) you› must re-initialize the clock.›› 32700 FOR A=1 TO 105:READ B:POKE› 1535+A,B:NEXT A›› 32705 ? "Enter Military Time as Hours,› Minutes,Seconds,60ths":INPUT H,M,S,SS›› 32710 X=USR(1611,H,M,S,SS)›› 32720 DATA› 238,115,6,173,115,6,201,60,240,3,76,› 95,228,169›› 32730 DATA› 0,141,115,6,238,114,6,173,114,6,201,› 60,240,3,76,95,228,169,0,141› › 32740 DATA› 114,6,238,113,6,173,113,6,201,60,240,› 3,76,95,228,169,0,141,113,6› 32750 DATA› 238,112,6,173,112,6,201,24,240,3,76,› 95,228,169,0,141,112,6,76,95› › 32751 DATA› 228,104,104,104,141,112,6,104,104,141,› 113,6,104,104,141,114,6,104,104,141›› 32752 DATA› 115,6,169,6,170,160,0,76,92,228,0›› * The PEEK locations for the time› are:› Hours - 1648› Minutes - 1649› Seconds - 1650› 60ths - 1651›› * The program first pokes the› machine language subroutine into page› 6 memory, and then prompts you to› enter the time.› * It then GOSUBS the machine› subroutine, sending with it the values› of the current time, and then starts› the clock.› * After a GRAPHICS command, just› PEEK in the values of the correct time› into H, M, S, and SS, and reintialize› the clock.›› *****› Section Two: BASIC Tricks›› Since Atari BASIC hasn't many special› features, one must compensate by› "tricking" the system. These "tricks"› are actually ways around BASIC that› speed up processing, format output,› etc.›› The first trick deals with filling a› string with one character. To fill a› string with 1,000 spaces, one would› usually do this:›› 10 DIM L$(1000)› 20 FOR A=1 TO 1000› 30 L$(A,A)=" "› 40 NEXT A›› This method, though fine programming,› is SLOW. The trick around it is a› quirk in the BASIC; well, not actually› a "quirk", but a hidden back door. › The line below is the aforementioned› routines equivalent.›› 10 DIM L$(1000):L$="":L$(1000)="":› L$(2)=L$›› * Not only is this routine shorter,› but it's almost instantaneous,› depending on the size of the string. › I find a one second wait for strings› in the xx,xxx digit range, but I think› that it's worth the wait.›› * Side Note: If you DIMension a› string at 1000, and aren't filling the› ENTIRE string with one character, say› 500 from a 1,000 character string, and› use the formula [L$=" ":L$(500)="› ":L$(2)=L$], it will fill it with 501› spaces. To clear this up, all you› need do, is put "L$=L$(1,500))" after› setting it. This is true, even when› filling 998 of the 1,000 characters.›› **› The next "trick" deals with the› INPUT statement. Anyone who has› programmed using the INPUT statement› knows that it puts a "?" on the screen› to signify an input request. This can› be bothersome to some, especially me,› when they want to make prompts look› nice. That "?" just looks outta› place, and sometimes is included in› the returned variable.›› There are two solutions. One is to› write your own "Get-Line" routine,› using an open keyboard buffer, getting› keypresses, adjusting for backspaces› and control characters, and using up› memory, OR...›› Use the following Input command that› is totally the equivalent of your› regular INPUT.›› INPUT #16,variable›› That's right! An input through› standard Atari BASIC without the› dreaded "?". It works exactly like› the standard INPUT command. Sure, you› could open a channel to the editor› (E:) yourself, but this method› requires no additional open buffers.›› **› Ever want to intialize a disk from› BASIC? No, I don't mean just format› it, I mean put DOS on it too. Well, I› have good news and bad news. The GOOD› news is that you can, the bad news is› that that's ALL you can put on it;› DOS, no DUP. In fact, the writing of› DOS to the disk is as fast as writing› from DOS itself!›› OPEN #1,8,0,"D1:DOS.SYS":CLOSE #1›› Yes, that's it! All DOS's except› SpartaDOS and TOPDOS will work, even› the OSA+ DOS's. You have just written› DOS to your disk from BASIC.›› **› Did you ever want to Re-Boot (Warm› Boot) the computer from BASIC without› hitting System Reset? Try this:›› X=USR(58487)›› This will "Warm Boot" the computer,› but unlike the RESET key, it is the› equivalent of turning the machine OFF› and ON again; so you might call it an› artificial COLD boot. You may hold› down OPTION as this boot takes place› to disengage BASIC. Its Hexadecimal› number is E477. You can do it from a› DOS as well.›› ******› Section Three: PEEK's and POKE's›› Did the speed of Atari BASIC› processing ever bug you? Well,› there's a way to increase data› processing 33%. It will increase› problem solving speed, data› processing, and graphic plotting.›› POKE 559,0›› This POKE will shut down ANTIC, thus› shutting off the screen, so that› processing speed is increased. To› turn it back on, use POKE 559,34.›› **› To find out what version of Atari› BASIC you have in your computer, you› simply:›› PRINT PEEK(43234)›› A number 32 or less is revision A. › The value 64 or less is revision B;› built into most XL's. And a number› greater than 64 is revision C; the› current version built into the XE› line. Though I have an old 800XL, for› some reason I have revision C built› in; a blessing!›› **› Here are some keyboard POKE's to› play with:›› * 755,004 - Turns character set› Upside -Down, and disables Inverse› video.›› * 755,008 - Right-Side up character› set WITHOUT Inverse video.›› * 755,013 - Upside-Down characters› WITH Inverse video.›› * 755,010 - Right-Side up character› set with Inverse video (Normal mode).›› ******› Special recognition to XLent software› and David Castell for creating the› fine word processor used to create› this text. BRAVO. (Editor: I concur.› Have been using it for years to make› up the newsletter! Am now trying to› learn about another FANTASTIC Word› Processor! A.P.)›› Please send me comments concerning› these notes. A positive response› might warrant a Part Two.› Hawke ----------------› › I downloaded this article from the› Pandora BBS (614) 471-9209 on› 10/22/89. It looks like it came from› the Nine Hells Information Exchange of› Philadelphia (PA) BBS, (215) 785-2625. › I thought it might be good for those› still programming in Atari BASIC. I› hadn't seem most of the tips before› except the one on getting rid of the› question mark. I'll bet others› haven't either. I hope you find this› article helpful. › GRANT, 8 BIT librarian for M.A.G.I.C.› <<>><<>>››