home *** CD-ROM | disk | FTP | other *** search
/ Old Hackers Atari User Group Newsletter / Old_Hackers_Atari_User_Group_Newsletter_OHJA95A.atr / jbastips.txt < prev    next >
Text File  |  2023-02-26  |  13KB  |  1 lines

  1.                *><*<>*¢ 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.¢                 <<>><<>>¢¢