Index

COMPUTER SHOPPER / JANUARY 1985 / PAGE 119 

Applying The Atari

by Jeff Brenner

Hello 1985! 1984 brought some more rough times to Atari. First there was the realization that profits were gone for good. Then there was Atari’s typical management confusion followed by massive layoffs and more layoffs. Later in the year, Jack Tramiel, the former president of Commodore who killed Atari in the first place, bought the company with its multi-million dollar debt from Warner Communications. In his efforts to consolidate Atari, more layoffs were made and Atari divisions around the country were shut down. Even Atari’s famed toll-free telephone number was eliminated. Then we witnessed more layoffs and still more layoffs. By the end of the year, I would guess that Atari employed maybe five workers, a telephone operator and 150 lawyers.

Atari has told us that they’ll be bringing out new 16-bit and 32-bit machines with incredibly low prices this year. Well, I can’t even be 100% certain that Atari will still exist by the time you read this. Let’s think positively, though, and hope that Atari will be able to change things around in 1985.

Last month we concluded with Program Perfect, a routine to prevent, typing errors in programs entered from this column. This month we’ll learn how to use Program Perfect and we’ll test it on a program dedicated to the new year. Before we do that, let’s take a look at the reader mail and some new books.

Reader Mail

There are two errors in the first ATARI disk directory program (August). First, the line, 6 IF FILE$(5,16)="FREE" THEN 8, blows up with an ERROR message! It should be IF FILE$(5,8)="FREE" Second, the DIM FILE$(15) is too short and you lose the size of files in sector count. I would suggest DIM FILE$(99).

Tom Snow
W. Lafayette, Indiana

You’re absolutely right, and I apologize for the error. As you suggest, line 6 could be changed to:

IF FILE$(5,8)="FREE" THEN 8 

However, this will cause the program to stop if it happens to encounter a file name such as “AZFREEZE.BAS.” The line should have read:

IF FILE$(5,16)="FREE SECTORS" THEN 8 
The “SECTORS” was omitted.

You’re also correct in stating that FILE$ is not dimensioned at a large enough value. It should have been dimensioned at 17 for proper operation. Any larger value, such as 99, will work as well. Following is the complete corrected routine:

1 REM DIRECTORY PROGRAM 
2 DIM FILE$(17) 
3 OPEN #1,6,0,"D:*.*" 
4 INPUT #1:FILE$ 
5 PRINT FILE$ 
6 IF FILE$(5,16)="FREE SECTORS" THEN 8 
7 GOTO 4 
8 CLOSE #1:END 
Those of you with DOS III should change line 6 to:
6 IF FILE$(5,15)="FREE BLOCKS" THEN 8 
since this DOS works with blocks instead of sectors.

I am using the Atari assembler-editor cartridge and want to combine two source files I have created separately. When I use ENTER, it loads in the second file, but erases the first. Any ideas?

A. Robinson
New York, New York

Yes. In BASIC, the ENTER command will merge a program with the program residing in memory. When using the assembler/editor, you must tack on a “,M” for merging files. For example, to merge SOURCE.ASM with a source code already in memory, use:

ENTER #D:SOURCE.ASM,M for disk or ENTER #C:,M for cassette.

Books

I received two books for the Atari from Little, Brown and Company (Boston, MA) which might interest you. The first is Let’s Learn BASIC—a kid’s introduction to BASIC programming on ATARI home computers by Ben Shnejderman (194 pages, softcover, $8.95). Intended for eight through 14 year olds, adults interested in learning BASIC should find it equally helpful. The book discusses the PRINT command, the INPUT command, the FOR-NEXT loop, the IF-THEN statement and other BASIC commands in a relatively straightforward style. The random and integer functions are described, as well as strings and variable.arrays. However, the Atari’s graphics and sound, which the young appreciate the most, are not covered. Other versions of this book are available for IBM, Commodore 64, and Apple users.

Home Applications and Games for the ATARI Home Computers by Timothy P. Banse (134 pages, softcover, $14.50) contains 31 short BASIC programs such as Checkbook Balancer, Home Inventory Log, Trip Cost Tabulator, and games such as Beowulf versus Grendel, and, of course, Ghost Town Vampire Girls. Some are useful, though others seem to be there to take up space. The book shows how each program works by explaining important lines, and listing the variables used. The author offers a disk of all the programs for $9.95. If you lay out the $14.50 for the book, I’d suggest spending another $9.95 for the disk to save you the time of entering the programs.

Using Program Perfect

Now we’ll learn how to use Program Perfect, which was listed here last month. If you’re new to Computer Shopper and did not get last month’s issue, send me a self addressed stamped envelope for a listing of this program.

If you haven’t entered last month’s program yet, why not? If you have entered it, check it over a few times and make sure there are no mistakes. A mistake in a program which checks other programs is bad news!

Since last month, I’ve made a few minor, improvements to the program, so change lines 30000, 30070, 30020, 30250 and 30260 to the following:

30000 CLR:CLOSE #1:CLOSE #2:N1=1:N2=N1+N1:N84=84:N85=N84+N1:N39=39:N65=65 
30070 POKE 702,64:POKE 694,0:GET #N2,N:IF N=126 AND I>N1 THEN PRINT CHR$(30);" - ";CHR$(30);:I=I-N1:GOTO 30070 
30220 POSITION N2,10:PRINT CHR$(156);LN$(5,LEN(LN$)):PRINT :PRINT :PRINT CHR$(157);"CONT" 
30250 T=NL:POSITION N2,10:INPUT #N1;LN$:FOR I=N1 TO LEN(LN$):T=T+ASC(LN$(I,I)) 
30260 IF T>650 THEN T=T-650 

You must make these changes for the program to be compatible with the codes we’ll be entering. Note that in effect, CLR:CLOSE #1:CLOSE #2 is added to line 30000 while N676=676 is deleted, POKE 702,64:POKE 694,0: is added to line 30070, CHR$(156); and a PRINT : are added to line 30220, T=NO is Changed to T=NL in line 30250, and the two N676s in line 30260 are changed to 650s.

Now Program Perfect should be ready to use, and we’ll first test it with a short. four-line program. Before you do anything, though, SAVE it to cassette or diskette. Since Program Perfect erases itself from memory after it helps you enter a program, it is important that you save it before you use it.

Following is the program we will enter with Program Perfect:

CTJ 10 REM TEST OF PROGRAM PERFECT 
LAJ 20 PRINT "THIS IS A TEST"
WMJ 30 GOTO 20 
OJZ 40 END 

Note the three letters to the left of each line number. This is the code used by Program Perfect to check the line for errors, and to determine the next line of the program for its automatic line numbering feature.

When you RUN Program Perfect, you are asked to enter the Starting line. This is the first line of the program you are entering. Since the first line of our demonstration program is ten, enter 10 for this prompt. The line below will now show the following:

--- 10 

The three hyphens preceeding the 10 are for the three-letter code. Type the code for line 10, CTJ. The display will now show:

CTJ-10 ■

The cursor will have moved past the line number to allow you to enter the line. Type in the remainder of line ten. The display should show:

CTJ 10 REM TEST OF PROGRAM PERFECT■

Press RETURN. Program Perfect will perform a few screen manipulations below the line you have entered as it checks the line for errors and places it in the computer’s memory as a real program line. You’ll get a buzz with an “ERROR - TRY AGAIN” message if you’ve made a syntax error, or if the line does not check against the code. The line doesn’t necessarily have to be in error; a mistake in the three-letter code will also trigger the error message. You’ll have to re-enter the three-letter code, but the rest of the line will remain intact so you may correct it using the cursor control keys. To erase the entire line and the code, press SHIFT-CLEAR. Program Perfect, will not allow you to move the cursor out of its three-line entry area.

If the line is entered correctly, the program will automatically display the next line number of-the program. Enter the codes and program lines for each line number that appears until the entire program is entered.

Program Perfect allows you to use all abbreviations, such as GR. for GRAPHICS and G. for GOTO. However, do not use ? for PRINT or vice versa as the computer treats these as two different commands. The same goes for GOTO and GO TO. Use PR. as an abbreviation for PRINT, and stick to the one-word GOTO, as this is the only form that will appear in the programs in this column:

You do not have to follow the exact spacing of the program line unless the spacing is within quotes. For example:

10 PRINT "HELLO":GOTO 10 
can be entered as:
10 PRINT   "HELLO"  : GOTO 10 
following:
10 PRINT  " HELLO ": GOTO 10 
you’ll get an error message.

If you like to leave out all spaces (which, incidentally, does not save you any memory on the Atari) you could enter:

10PRINT"HELLO":GOT010 
and it will be accepted. But be careful, of lines such as:
10IFA=BTHENGOTO10 
as the computer will interpret BTHENGOTO10 as a single variable and will give you an error. In this case, you must put a space after the variable:
10IFA=B THENGOTO10 

This does not only apply when you are using Program Perfect, but whenever you are using Atari BASIC.

After you enter the last line of the program (which has a three-letter code ending with a “Z”), Program Perfect will print “END OF PROGRAM - STAND BY.” It will then take about five seconds while it erases itself from memory and leaves you only with the lines you have entered. You can then list, save or run your program.

What if you don’t enter the whole program in one sitting? You can press BREAK and SAVE what you’ve already typed. Since Program Perfect is in memory, you will be saving it as well as the lines of the program you have entered. When you are ready to enter more of the program, simply LOAD it back in and type GOTO 30000 (the beginning line of Program Perfect). Then enter the line number at which you left off for the “Starting number:” prompt and enter the rest of the program.

If you tried to enter the four-line sample program but couldn’t, you’ve probably made some mistakes in entering Program Perfect. Re-check it carefully—make sure you’ve made all the changes that were mentioned previously. Remember to save any corrections you make to Program Perfect before you run it.

New Year’s Program

HAPPY NEW YEAR!

Now, how would you like a longer program with which to test Program Perfect? Our program for the new year is one which prints banners. You can use it to make giant “HAPPY NEW YEAR” signs if you want. It requires a printer and fan-fold paper.

Enter the banner program with Program Perfect. If you are not using Program Perfect, ignore the three letters preceding each line number when you type the program. When you RUN the program, you are asked for the height. This is the height of each letter of the banner. Since the banner’s letters are printed sideways, an 80-column printer can produce letters which are 80 characters in height, so enter 80. If you have a 40-column printer, or if you want smaller sized letters, enter a smaller number.

Next, you are asked for the length. This is the number of lines of characters which form the length of each letter. 24 is a typical value. Enter a greater or lesser number for wider or thinner letters.

Now the program asks for a character. This is the character the printer will use to form the letters of the banner. An asterisk or the letter X are good choices.

When the “ENTER MESSAGE” prompt appears, enter what you want to be printed on the banner, such as HAPPY NEW YEAR. Your banner will be printed.

Next time, we’ll learn where the banner program gets its characters from, we’ll enter a test/study program for teachers and students, and more.

Readers’ questions, comments and contributions welcome. Address all correspondence to:

Jeff Brenner’s
“Applying the Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781
EBJ 10 REM BANNER PROGRAM 
GKJ 20 OPEN #1,4,0,"P:":DIM A#(100),S$(20),Z$(20),C$(20),B(7),S(7),H(7)
VTJ 30 CS=PEEK(756)*256:FOR I=0 TO 7:B(I)=INT(2^I+0.5):S(I)=0:NEXT I 
XFJ 40 PRINT "HEIGHT (80)";:INPUT H:PRINT "LENGTH (24)";:INPUT L:H=H/8:L=L/8 
UUJ 50 PRINT "CHARACTER (*)";:INPUT S$:S$(20)=S$:S$(2)=S$
MOJ 60 Z$(1)=CHR$(32):Z$(20)=CHR$(32):Z$(2)=Z$
BMJ 70 Z$=Z$(1,H):S$=S$(1,H):PRINT "ENTER MESSAGE";:INPUT A$:FOR I=1 TO LEN(A$)
QSJ 80 D-ASC(A$(I,I)):INV=0:IF D>128 THEN D=D-128:INV=1 
TYJ 90 IF D<32 THEN D=D+96:GOTO 110 
ACJ 100 IF D<96 THEN D=D+32 
NYJ 110 A=(D-32)*8:FOR C=0 TO 7:S(C)=0:NEXT C:FOR D=7 TO 0 STEP -1 
IIJ 120 FOR T=7 TO 0 STEP -1:PK=ABS(255*INV-PEEK(T+CS+A))
FAJ 130 IF PK-B(B)-S(T)>=0 THEN S(T)=S(T)+B(B):H(T)=1:GOTO 150 
URJ 140 H(T)=0 
SIJ 150 NEXT T:FOR D=1 TO L:FOR J=7 TO 0 STEP -1:IF H(J)=1 THEN PRINT #1;S$;
UIJ 160 IF H(J)=0 THEN PRINT #1;Z$;
XFJ 170 NEXT J:PRINT #1:NEXT D:NEXT B:NEXT I:RUN 
COMPUTER SHOPPER / FEBRUARY 1985 / PAGE 113 

Applying The Atari

by Jeff Brenner

This month we’ve got an interesting test/study program for students and teachers. We’ll also look into January’s banner program, reader mail and DOS 3, plus I’ll reveal Atari’s new address. But first let’s see what has been going on in Sunnyvale, CA.

Atari News

$119.95—that’s the retail price of the Atari 800XL announced by Jack Tramiel in the midst of the holiday buying season. That’s quite an unbelievable price (several years ago, a 48K Atari 800 would have cost over ten times the amount) and I would find it even more unbelievable if Atari were actually making money from them.

The Atari people tell us that the price break is the result of “lower production costs.” Maybe, but let’s look at the real situation that resulted in the dramatic price change: The data is November 1984. Atari is in debt—it seems like they owe millions to every company in the United States. While these companies are trying to quickly get their money from what they perceive to be a good Chapter 11 candidate. Jack Tramiel and his crew are drowning in unsold Atari 800XLs. So, Tramiel proudly announces his “$119.95 Atari 800XL” plan (or more accurately, his “quick-cash” plan), Commodore headquarters explodes in confusion and perspiration, and everybody runs out to get the lowest-priced 64K computer on the market.

Atari probably drew away a significant portion of sales from Commodore over the holiday season, but no one can really be sure. The new price had an even more important effect for Atari in that many retailers who had dropped their line resumed selling Atari products with the irresistible prices. This means that Atari might have a wider distribution network for its newer computers. Incidentally, we’ll have complete information on Atari’s new units as soon as it becomes available.

Programming Tips

Every few months I’ll be printing a Programming Tips section in which useful hints and ideas sent in by readers will be listed. If you have any programming suggestions or short, handy programs from which others may benefit, send them in. If your idea is printed, I’ll send you a three-dimensional laser-etched hologram sticker. Some of these fascinating stickers were produced under license from Atari when designers were attempting to develop a holographic video game.

Reader Mail

Please send me some literature pertaining to software for the Atari Home Computer 800. Software programs are limited here in Panama. Therefore, we must rely on computer supplies from companies abroad.

Candida B. Carteret
Panama—APO Miami

I am sending you a list of some Atari software distributors and manufacturers that sell to the public. Others who want this list should send a self-addressed stamped envelope. Your best bet is to write to these companies and request their catalogs. You also might want to make some contacts with Atari users groups in the United States. Many of these groups have public domain software which they trade or sell at inexpensive prices. Computer Shopper’s “Users Groups” section has a generous listing of these groups.


I am trying to translate a short BASIC program into assembly language. My problem is that I cannot figure out how to translate a BASIC line such as “IF A>B THEN GOTO 100.” I know I need to use a CMP and a branch statement, but I become confused with the carry bit. Both A and B are less than 256 so there is no need for comparisons greater than one byte. I am relatively new to assembly language, so any help you can give me would be greatly appreciated.

Bill Foster
Fayetteville, NC

The CMP operation compares the quantity following the CMP with the value in the accumulator. When one quantity is compared with another, the computer, in effect, subtracts one from the other, although neither quantity is actually changed. The result of this subtraction determines the combination of internal flags that are set. If the two quantities are equal, the result of the subtraction is zero and the zero flag is set. Thus, a BEQ or BNE instruction causes the computer to refer to the zero flag to determine whether or not to branch.

What you need to be concerned with is the carry flag. When a larger quantity is compared to a smaller quantity, as in:

LDA #50 
CMP #100 
the carry bit is cleared. This condition can therefore be checked with the BCC, or Branch if Carry Clear, operand. On the other hand, when a smaller quantity is compared to an equal or larger quantity, as in:
LDA #100 
CMP #50 
or in:
LDA #100 
CMP #100 
the carry bit is set, and the condition can be checked with the BCS, or Branch if Carry Set, operand. Since the computer performs its own subtraction when comparing two quantities, these same carry flag rules apply when subtracting one quantity from another. Figure 1 gives sample IF-THEN statements and their assembly language equivalents.
IF-THEN
MACHINE LANGUAGE EQUIVALENTS
BASIC ASSEMBLY
IF A>B THEN NUM 
(or IF B<A) 
LDA #B 
CMP #A 
BCC NUM 
IF A>=B THEN NUM 
(or IF B<=A) 
LDA #A 
CMP #B 
BCS NUM 
Figure 1

DOS 3

I finally received DOS 3 from Atari a few weeks ago and will be answering questions about it in the future. I purchased my 1050 drive months before DOS 3 was released and have been waiting for it ever since. Those of you who have a 1050 drive but do not have DOS 3, you’re entitled to it. I managed to discover Atari’s customer relations address, so write to them, tell them your drive’s serial number, and ask for a copy:

ATARI Customer Relations
390 Caribbean Drive
Sunnyvale, CA 94089
(408) 745-4851
Figure 2

Regarding DOS 3, many have questioned as to whether a DOS 3 disk can be converted to DOS 2. While it is possible to convert DOS 2 files into DOS 3 files (by selecting the ACCESS DOS 2 function), as of yet I know of no program to do the opposite. However, I see no reason why such a program cannot be produced. If any readers know of such a program or have developed one, tell us about it. Meanwhile, here is a simple solution for those of you who are reluctant to permanently “DOS 3” a program: Use DOS 3 to create your programs. When you want to change a DOS 3 program to a DOS 2 one, save the program to cassette. Then turn off the computer, boot up with DOS 2 and load the program from cassette. You can then save it on the DOS 2 disk. Let’s hope a faster solution is available soon.

Banner Program Mystery

For those of you who have been wondering how January’s 17-line banner program produces its characters, the mystery is hereupon solved. Observant individuals will have noticed that the characters look remarkably similar to those which appear on your Atari’s screen. The reason is that the banner program actually uses the character data to plot its characters. Now, that’s clever! More on this topic in upcoming months.

Computer Assisted Study

Here’s the program thousands of students across the country have been waiting for: A program designed to make studying more efficient and enjoyable. Teachers will find this program equally useful for teaching and testing purposes. The three-letter codes preceeding each program line are to be used with December’s “Program Perfect,” which checks for typing errors. If you do not have “Program Perfect” send me a SASE and request a listing.

This program is most effective with study material that can be arranged in question/answer form. Foreign languages, vocabulary, social studies facts, math formulas, and the like work excellently. It might be necessary, especially when studying foreign languages, to substitute another character for one not existing on the keyboard. For example, the Spanish word for music is MUSICA, with an accent over the “U.” It can be entered into this program as “MU’SICA,” with an apostrophe following the “U.”

After you type in the Computer Assisted Study program, RUN it. A menu will be displayed with the following options:

ENTER NEW DATA
SAVE
LOAD
TEST
ADD DATA
CHANGE DATA
DISPLAY DATA
Enter New Data

When you first RUN this program, you will want to enter some study material. Press the “E” key. You are asked to enter question #1, and then answer #1. Enter a question you want to be asked when you are being tested. If you are entering a vocabulary list, you can just enter one of your vocabulary words. Press RETURN and then enter the answer. If you had typed in a vocabulary word as a question, then you would enter the definition as the answer.

Continue entering questions and answers until you reach a desired number of questions. You may enter up to 100 questions and answers, depending upon the amount of memory your Atari has. A 16K Atari will allow about 21 questions and answers. It is recommended that you test yourself on less than 30 at a time for the best effectiveness. After the last question and answer is entered, enter an asterisk “*” for the “QUESTION” prompt. This returns you to the menu.

Save

After you enter your study data, you can save it on a cassette or diskette. Press the “S” key to select the save option. When asked, specify cassette or disk, and if using a disk, enter a file name. The data you entered previously is saved, and you are returned to the menu.

Load From Cassette/Disk

Whenever you wish to load a previously saved file, press “L.” You can save files on all your subjects, and recall them at the end of the year to study for finals! As with the “Save” option, you must specify cassette or disk. If you are loading from disk, enter the name of the file you wish to load. When the file is loaded completely, you are returned to the main menu.

Test

After you enter your study material, press the “T” key. Now you will begin to study. One question is selected at a time from all that you entered. The questions are given in a random order; not in the order in which they were entered. You simply enter the correct answer to each question. If you answer correctly, the computer will print “CORRECT” and will continue with the next word. If, however, you do not enter the right answer, the computer will print “INCORRECT. CORRECT ANSWER:” followed by the answer you should have typed. One powerful feature of this program is that it will give you an incorrectly answered question again at a later time in the testing period. The question will continue to be given until it is correctly answered, thus impressing the answer in your mind. You are not additionally penalized, however, for getting the same question wrong more than once (to prevent negative scores). When all questions are correctly answered, a score is given. The score is the percentage of the number of questions answered correctly the first time given out of the total number of questions. The score allows you to see your progress and to determine how much more studying you need. A score above 90 is given an “EXCELLENT SCORE” reward. After the test is over, you are asked if you wish to take it again. You should continue retaking the test until you get a satisfying score.

Add Data

Press “A” on the menu screen when you want to add more questions and answers to the ones already in memory. Enter an asterisk when you finish entering the data.

Change Data

Press “C” when you wish to change a question or answer in memory. Enter the number of the question/answer that you wish to change. If you want to change the question, enter a “Y” for the “DO YOU WANT TO CHANGE THIS” prompt. To change the answer, enter an “N” for the first prompt, and a “Y” for the second. After a question/answer is changed, you are asked if you wish to make more changes. Enter “Y” to make more changes or “N” to return to the menu.

Display Data

Press “D” to see the data that is currently in memory. Each question and answer is displayed with its corresponding number. You can use this option to make sure the correct data was loaded from cassette or diskette, and to check for errors after material has been entered.

Final Notes

A good rule of thumb is to study the same material over a period of days. Of course, the more you try to study at once, the less effective your studying becomes.

“Isn’t it cheating?” concerned parents and teachers might ask. No. Studying by computer is simply another alternative for a student. The material is actually learned, but can be done so in a shorter period of time due to an interest in studying with a computer.

Good luck with Computer Assisted Study. After using it, you might discover that studying does not have to be such a tedious, boring task.

Next Month

We’ll have a software alarm clock, more reader mail and some surprises. Stay tuned.

Readers’ questions, comments and contributions are welcome. Address all correspondence to:
Jeff Brenner’s
“Applying the Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781
FXJ 10 REM COMPUTER ASSISTED STUDY 
ENJ 20 REM BY JEFF BRENNER 
PAJ 30 N1=1:N2=N1+N1:N4=N2*N2:N8=N4*N2:N75=75:N76=N75+N1:N100=100:N152=N76*N2 
WAJ 40 N151=N152-N1:FM=FRE(N0)-600:DIM A$(FM),I$(N100),QU$(N76),AN$(N76) 
SQJ 50 DIM IN$(N76),NAME$(11),K$(11),TEST$(N100) 
UVJ 60 OPEN #N1,N4,N0,"K:":I$(N100)=CHR$(N0):A$(FM)=CHR$(N0) 
LGJ 70 GRAPHICS N0:POSITION N4,N0:PRINT " COMPUTER ASSISTED STUDY PROGRAM" 
DSJ 80 POSITION N2,N4:PRINT "PRESS KEY:" 
XEJ 90 PRINT :PRINT "ENTER NEW DATA":PRINT :PRINT "SAVE":PRINT :PRINT "LOAD" 
AKJ 100 PRINT :PRINT "TEST":PRINT :PRINT "ADD DATA":PRINT :PRINT "CHANGE DATA" 
JWJ 110 PRINT :PRINT "DISPLAY DATA":PRINT :PRINT ">";:GET #N1,K:PRINT CHR$(K) 
FUJ 120 RESTORE 130: FOR I=N1 TO 7; READ T:IF T<>K THEN NEXT I:GOTO 70 
LZJ 130 ON I GOTO 140,250,370,440,680,700,840:DATA 69,83,76,84,65,67,68 
DFJ 140 GRAPHICS N0:PRINT "ENTER NEW DATA":IF NUM=N0 THEN GOTO 170 
EXJ 150 PRINT "ERASE OLD DATA";:INPUT IN$:IF IN$(N1,N1)="N" THEN GOTO 70 
XNJ 160 NUM=N0 
IAJ 170 PRINT "CAN ENTER UP TO ";INT(FM/N152);" QUESTIONS." 
DOJ 180 FOR D=NUM+N1 TO N100:I=D*N152-N151:PRINT :PRINT :PRINT 
FOJ 190 IF FM-D*N152<N0 THEN PRINT "OUT OF MEMORY":NUM=D-N1:GOTO 920 
IYJ 200 PRINT "QUESTION #";D;INPUT QU$:IF QU$="*" THEN NUM=D-N1:GOTO 70 
HVJ 210 PRINT :PRINT "ANSWER #";D;":":INPUT AN$ 
OEJ 220 QU=LEN(QU$):AN=LEN(AN$) 
PLJ 230 A$(I,I+QU)=QU$:A$(I+N76,I+N76+AN)=AN$ 
XIJ 240 I$(D*N2-N1)=CHR$(QU-N1):I$(D*N2)=CHR$(AN-N1):NEXT D 
GKJ 250 GRAPHICS N0:PRINT "SAVE TO CASSETTE/DISK":GOSUB 950:PRINT 
AQJ 260 GOSUB 270:GOTO 330 
FDJ 270 PRINT "CASSETTE OR DISK>";:GET #N1,K:K$=CHR$(K):PRINT K$ 
YOJ 280 IF K$<>"C" AND K$<>"D" THEN PRINT CHR$(28);:GOTO 270 
ITJ 290 IF K$="C" THEN NAME$="C:":GOTO 320 
FZJ 300 POKE 764,255:NAME$="D:":PRINT "FILE NAME:";:INPUT K$ 
FHJ 310 NAME$(LEN(NAME$)+N1)=K$ 
AVJ 320 RETURN 
AOJ 330 TRAP 360:OPEN #N2,N8,N0,NAME$ 
LNJ 340 PUT #N2,NUM:PRINT #N2;I$:FOR I=1 TO NUM*N152 STEP N76 
RTJ 350 PRINT #N2;A$(I,I+N75):NEXT I:CLOSE #N2:GOTO 70 
ADJ 360 CLOSE #N2:PRINT "SAVING ERROR #";PEEK(195):PRINT :GOTO 270 
IYJ 370 GRAPHICS N0:PRINT "LOAD FROM CASSETTE/DISK":PRINT :IF NUM=N0 THEN 390 
LCJ 380 PRINT "ERASE OLD DATA";:INPUT IN$:IF IN$(N1,N1)="N" THEN GOTO 70 
ENJ 390 GOSUB 270 
AGJ 400 TRAP 430:OPEN #N2,N4,N0,NAME$ 
NPJ 410 GET #N2,NUM:INPUT #N2;I$:FOR I=N1 TO NUM*N152 STEP N76 
LTJ 420 INPUT #N2;IN$:A$(I,I+N75)=IN$:NEXT I:CLOSE #N2:GOTO 70 
CGJ 430 CLOSE #N2:PRINT "LOADING ERROR #";PEEK(195):PRINT :GOTO 390 
OMJ 440 GRAPHICS N0:PRINT "TEST - ";NUM;" QUESTIONS/ANSWERS":GOSUB 950 
MFJ 450 TEST$(N1)=CHR$(N0):TEST$(N100)=CHR$(N0):TEST$(N2)=TEST$ 
RNJ 460 WRONG=N0:D=N0 
OBJ 470 RM=IN$(RND(N0)*NUM)+N1:I=RM*N152-N151:IF TEST$(RM,RM)="A" THEN 470 
RPJ 480 IF TEST$(RM,RM)=CHR$(N0) THEN TEST$(RM,RM)="A" 
UUJ 490 QU=ASC(I$(RMTN2-N1)):AN=ASC(I$(RMTN2)) 
YZJ 500 PRINT :PRINT "QUESTION":PRINT A$(I,I+QU) 
YYJ 510 PRINT "ANSWER":INPUT IN$ 
HZJ 520 IF IN$=A$(I+N76,I+N76+AN) THEN 570 
NMJ 530 PRINT "INCORRECT, CORRECT ANSWER";:PRINT A$(I+N76,I+N76+AN):D=D-N1 
SLJ 540 IF TEST$(RM,RM)="A" THEN WRONG=WRONG+1:TEST$(RM,RM)="B" 
YNJ 550 FOR I=N100 TO 255 STEP N4:SOUND N1,I,10,N8:NEXT I 
TFJ 560 SOUND N1,10,N0,N8:GOTO 590 
NVJ 570 PRINT "CORRECT!":TEST$(RM,RM)="A" 
SJJ 580 FOR I=10 TO N0 STEP -N1:SOUND N1,N2,6,I:NEXT I 
REJ 590 FOR T=N1 TO N100:NEXT T:SOUND N1,N0,N0,N0:D=D+N1:IF D<NUM THEN 470 
YQJ 600 SC=IN$(((NUM-WRONG)/NUM)*N100+0.5):? "TESTING OVER. YOUR SCORE: ";SC 
VIJ 610 IF SC<90 THEN 640 
QPJ 620 PRINT "EXCELLENT SCORE":FOR I=200 TO N0 STEP -N2:SOUND N0,I,10,N8 
FQJ 630 SOUND N1,I+30,10,N8:NEXT I:SOUND N0,N0,N0,N0:SOUND N1,N0,N0,N0 
SFJ 640 PRINT "DO YOU WANT TO TRY AGAIN";:INPUT IN$ 
AKJ 650 IF IN$(N1,N1)="N" THEN GOTO 70 
CTJ 660 IF IN$(N1,N1)="Y" THEN GOTO 440 
BWJ 670 GOTO 640 
CTJ 680 GRAPHICS N0:PRINT "ADD DATA" 
BWJ 690 GOTO 170 
KHJ 700 GRAPHICS N0:PRINT "CHANGE DATA":GOSUB 950 
FEJ 710 PRINT "QUESTION/ANSWER NUMBER YOU WANT":PRINT "TO CHANGE":INPUT D 
VTJ 720 IF D>NUM OR D<N0 THEN PRINT "THAT NUMBER DOES NOT EXIST":GOTO 710 
TRJ 730 I=D*N152-N151:QU=ASC(I$(D*N2-N1)):AN=ASC(I$(D*N2)) 
VBJ 740 PRINT "QUESTION #";D;":":PRINT A$(I,I+QU) 
HCJ 750 PRINT "DO YOU WANT TO CHANGE THIS";:INPUT IN$:IF IN$(N1,N1)="N" THEN 780 
QZJ 760 PRINT "ENTER NEW QUESTION:":INPUT IN$:QU=LEN(IN$)-N1 
CYJ 770 I$(D*N2-N1,D*N2-N1)=CHR$(QU):A$(I,I+QU)=IN$:PRINT "QUESTION NOW READS:" 
QJJ 780 PRINT IN$:PRINT :PRINT "ANSWER #";D;":":PRINT A$(I+N76,1+N76+AN) 
SKJ 790 PRINT "CHANGE THIS";:INPUT IN$:IF IN$(N1,N1)="N" THEN 820 
SXJ 800 PRINT "NEW ANSWER:":INPUT IN$:AN=LEN(IN$)-N1:I$(D*N2,D*N2)=CHR$(AN) 
YNJ 810 A$(I+N76,I+N76+AN)=IN$:PRINT "ANSWER NOW READS":PRINT IN$ 
HMJ 820 PRINT "MORE CHANGES";:INPUT IN$:IF IN$(N1,N1)="N" THEN GOTO 70 
BSJ 830 GOTO 710 
OUJ 840 GRAPHICS N0:PRINT "DISPLAY DATA":GOSUB 950 
BPJ 850 FOR D=N1 TO NUM:I=D*N152-N151 
NVJ 860 QU=ASC(I$(D*N2-N1)):AN=ASC(I$(D*N2)) 
XWJ 870 PRINT :PRINT "QUESTION #";D;":" 
VQJ 880 PRINT A$(I,I+QU) 
NXJ 890 PRINT "ANSWER #";D;":" 
NEJ 900 PRINT A$(I+N76,I+N76+AN) 
XRJ 910 NEXT D 
OLJ 920 PRINT "PRESS RETURN FOR MENU" 
UWJ 930 GET #N1,K:IF K<>155 THEN 920 
YXJ 940 GOTO 70 
NMJ 950 IF NUM>N0 THEN RETURN 
YGZ 960 PRINT :PRINT "NO DATA HAS BEEN ENTERED.":PRINT :GOTO 920 
COMPUTER SHOPPER / MARCH 1985 / PAGE 60 

Applying the Atari

by Jeff Brenner

This month’s feature program is an on-screen alarm clock, ideal for those of you who have difficulty pulling away from your Atari to sleep, eat, work, etc. We’ll also enter a joystick-tester program and a printer utility, and we’ll look at two children’s programs from Mindscape.

Adios Adam

At this writing, Coleco Industries Inc. officially dropped its Adam computer. It had been a tough, long year and a half for the Adam from the day of its planned introduction in June of 1983. If not for their Cabbage Patch Kids, Coleco’s story might have been a much, much sadder one. So you see, folks. Atari has lived to witness the fall of yet another competing computer product.

Atari News

A few days after Coleco’s announcement, Atari displayed several of its new computers at the Las Vegas Winter Consumer Electronics Show. The new machines make up the “XE” line. One is a 64K, XL-compatible portable. The others are Atari’s first 16-bit units. We’ll have more details on these models next month.

Reader Mail

I got this idea for a joystick testing program after an incident I had with a new game program. For days I tried to figure out why the game wasn’t working like it was supposed to. Just when I was ready to bring the game back to the store, I found out that my joystick was not registering the up, or diagonally-up directions! Just run the program and move the joystick to each of the positions shown in the picture on the screen. If the joystick is O.K. the program will say so. Otherwise, it will not let you go on past the non-working direction. It also checks the joystick trigger. I hope your readers find it handy.

Ricky Freeman
Baton Rouge, Louisiana

I’m sure they will. The program is listed under the “JOYSTICK TESTER” heading and has been slightly modified to facilitate its printing in the magazine. Thanks for writing.

JOYSTICK TESTER 
INE 10 REM JOYSTICK TESTER 
PNE 15 POKE 82,15:PRINT CHR$(125) 
MJJ 20 READ A:IF A=-1 THEN PRINT :GOTO 20 
NEE 30 IF A>-2 THEN PRINT CHR$(A);:GOTO 20 
SNE 35 POKE 82,2:PRINT 
MOJ 40 FOR I=1 TO 8:READ VALUE 
CKJ 50 PRINT "MOVE JOYSTICK TO POSITION #";I 
HPJ 60 IF STICK (0)<>VALUE THEN GOTO 60 
OEJ 70 SOUND 0,10,12,8:FOR J=1 TO 50:NEXT J 
KTJ 80 SOUND 0,0,0,0:PRINT "GOOD":NEXT I 
FHJ 90 PRINT :PRINT "PRESS TRIGGER" 
VAE 100 IF STRIG(0)=1 THEN GOTO 100 
HTE 105 PRINT "GOOD" 
YUJ 110 PRINT :PRINT "JOYSTICK IS WORKING!" 
POJ 120 END 
MKJ 130 DATA 49,32,32,50,32,32,51,-1 
ENJ 140 DATA 32,7,32,124,32,6,-1 
YIJ 150 DATA 32,32,7,124,6,-1 
HNJ 160 DATA 52,18,18,20,18,18,53,-1 
YKJ 170 DATA 32,32,6,124,7,-1 
FAJ 180 DATA 32,6,32,124,32,7,-1 
MXJ 190 DATA 54,32,32,55,32,32,56,-2 
FLZ 200 DATA 10,14,6,11,7,9,13,5 

I’m a novice Atari user and recently bought an Epson RX-80 printer. I’m very interested in using the printer to create graphics. A salesman told me I need a “screen dump,” but since I am not familiar with this I am asking for your help.

B.E. Grant Newark,
New Jersey

Very simply, a screen dump is a routine which prints, or “dumps,” the contents of the screen to the printer. The best way to draw graphics on your printer is to first create the image on the screen and then transfer the contents of the screen to the printer. Many graphics programs on the market contain a built-in screen dump that allows you to print displays created with the program. A screen dump to print displays created by your own BASIC programs is not difficult to design, and one is listed under the “GRAPHICS DUMP UTILITY” heading.

This program will print graphics created in GRAPHICS 6, 7, 8, 9, 10, 11, 14 and 15. GRAPHICS 8 works best. As is, it will work with most Epson, Gemini, or graphics-compatible printers. To use, simply GOTO 31000 after creating a display on a graphics screen. If your printer is properly connected and its power on, the graphics will be printed. The program will automatically compensate for graphics modes with or without a text window.

Higher horizontal resolution on the printer is possible by changing the MODE variable on line 31020. When MODE = 1, the resolution is 60 dots-per-inch. When MODE = 2, the resolution is 120 dots-per-inch. On the Epson FX-80 and RX-80, and on the Gemini 10X and 15X, two additional modes (MODE = 3 and MODE = 4) may be used by adding the appropriate characters to the data in line 31080 of the subroutine. When MODE = 3, the double-speed, 120 dots-per-inch mode is activated. Quadruple density is available when MODE = 4. This gives a resolution of 240 dots-per-inch.

If you have an Epson, add ,Y,Z to the data statement in line 31080 so it reads:

31080 DATA K,L,Y,Z 

If you have a Gemini, the two additional letters must be lower-case. Line 31080 will read:

31080 DATA K,L,y,z 

Demo 1 and Demo 2 are sample BASIC graphics listed under their respective printer outputs. Enter Demo 1 without erasing lines 31000-31220 of the Graphics Dump Utility and run it. Your printer should display the same output. For the second demonstration, type NEW, load the Graphics Dump Utility into memory again, add Demo 2 and run it.

The Graphics Dump Utility differs from other screen dumps in that it prints horizontally on the paper, as it appears on the screen. Normally, a graphics dump would print the image on its side. To correct this, our utility reads the screen sideways to yield an upright image printout.

GRAPHICS DUMP UTILITY 
EXJ 31000 REM GRAPHICS DUMP UTILITY 
KHJ 31010 REM BY JEFF BRENNER 
VHJ 31020 MODE=2:DIM A$(150),B$(320),S$(1):OPEN #1,8,0,"P:":RESTORE 31040 
OXJ 31030 FOR I=1 TO PEEK(87)-4:READ BPL,VERT:NEXT I 
ULJ 31040 IF BPL=0 THEN PRINT "UNSUPPORTED MODE":END 
SJJ 31050 DATA 0,0,20,80,40,80,40,160,40,160,40,160,40,160,0,0,0,0,20,160,40,160 
DZJ 31060 IF PEEK(703)<>4 THEN VERT=VERT+VERT/5 
UEJ 31070 RESTORE 31080:FOR I=1 TO MODE:READ S$:NEXT I 
FXJ 31080 DATA K,L 
ROJ 31090 RESTORE 31160:FOR I=0 TO 91:READ A:POKE 1536+I,A:NEXT I 
BQJ 31100 S=PEEK(88)+256*PEEK(89):PRINT #1;CHR$(27);CHR$(64);:BPL=BPL*8 
LYJ 31110 PRINT #1;CHR$(27);CHR$(65);CHR$(8);:HI=INT(BPL/256):LO=BPL-HI*256 
SRJ 31120 FOR I=1 TO INT(VERT/8+0.5):POKE 207,INT(S/256) 
RIJ 31130 POKE 206,S-PEEK(207)*256:B$(1)=CHR$(0):B$(320)=CHR$(0):B$(2)=B$ 
VFJ 31140 A=USR(1536,ADR(B$)):PRINT #1;CHR$(27);S$;CHR$(LO):CHR$(HI): 
CPJ 31150 PRINT #1;B$(1,BPL):S=S+BPL:NEXT I:END 
TLJ 31160 DATA 104,104,133,205,104,133,204,160,0,162,8,177,206,157 
HYJ 31170 DATA 92,6,24,165,206,105,40,133,206,165,207,105,0,133 
YMJ 31180 DATA 207,202,208,235,198,207,56,165,206,233,64,133,206,165 
ONJ 31190 DATA 207,233,0,133,207,169,8,133,203,162,8,177,204,62 
RZJ 31200 DATA 92,6,42,145,204,202,208,245,198,203,165,203,240,16 
PJJ 31210 DATA 24,165,204,105,1,133,204,165,205,105,0,133,205,76 
XJZ 31220 DATA 51,6,200,192,40,208,174,96 

Demo 1 
10 REM DEMO 1 
20 GRAPHICS 24:COLOR 1:X=0:Y=191:I=X 
30 TRAP 70 
40 PLOT X,Y:DRAWTO 319-X,191-Y 
50 PLOT X,191-Y:DRAWTO 319-X,Y 
60 X=X+Y:Y=Y+X 
70 IF X>319 THEN X=X-319:GOTO 70 
80 IF Y>191 THEN Y=Y-191:GOT0 80 
90 I=I+1:IF I<30 THEN GOTO 30 
100 GOTO 31000 

Demo 2 
10 REM DEMO 2 
20 GRAPHICS 24:COLOR 1:TRAP 90 
30 FOR X=0 TO 300 STEP 10 
40 Y=INT(X/2+0.5) 
50 PLOT X,Y:DRAWTO X,Y+50 
60 DRAWTO X+80,Y+70:DRAWTO X,Y 
70 DRAWTO X+80,Y+20:DRAWTO X+80,Y+70 
80 NEXT X 
90 GOTO 31000 

Reminder

Next month’s column will contain our first “Programming Tips” section. Programming hints and ideas sent in by readers will be included here. If you have any programming suggestions, or short, handy programs from which others may benefit, send them in. Contributors whose ideas are printed will receive three-dimensional, laser-etched hologram stickers. Let me hear from you.

Imperfect Program Perfect

January’s column contained some modifications to Program Perfect which originally appeared here in December. If you followed the article carefully, you should have had no problems in making the changes. However, I would understand if there was some confusion, as two lines of the program got squashed together in the typesetting department. Line 30260 should read as follows:

30260 IF T>650 THEN T=T-650 

Program Perfect is used to prevent typing errors in programs entered from this column. It makes use of a three-letter code which precedes each line of the longer programs which appear here. If you’re new to Computer Shopper (and I understand we’re still gaining new readers at an amazing rate), you will find a complete listing of Program Perfect in next month’s column. If you can’t wait, you can send me a self-addressed, stamped envelope for a listing, or send a cassette or formatted disk and $2.00 for handling and return postage and I will make a copy for you. Make sure you specify DOS II or DOS III if you send a disk.

Tink!Tonk!

Several months ago, I reviewed “Tonk in the Land of Buddy-Bots,” an excellently designed children’s program from Mindscape, Inc. Well, the Mindscape people have sent me two of their newer programs from their Tink!Tonk! software line which are equally appealing.

“Tuk Goes to Town” is intended to build spelling, vocabulary, and shape and pattern recognition skills through five games. “Tink’s Adventure” is designed to teach ABC order and the computer keyboard layout through five games. Both of these programs combine an interactive story with an animated character controlled by the child. They also feature attractive, colorful graphics, and music.

The instruction manuals are easy to understand and well-illustrated, although I can’t resist mentioning one small item that appeared in the “Tuk Goes to Town” manual. It gives the software copyright date as the year 1874. Either these people have been preparing this program quite some time, or, more likely, someone made a typographical error. I should point out, however, that this typo is in no way indicative of the overall quality of the manual or the game itself. If you have some four to eight year olds at home, I highly recommend that you consider these Mindscape programs.

Alarm Clock

Beep-beep-beep. It’s time for our alarm clock program (yes, pun intended). Not only will it provide a constant display of the time on the screen while you program, but it can sound its alarm at any time you select.

The program is listed under the “ALARM CLOCK” heading. Enter it, save it and then run it. You are first asked to enter the current hour. That’s easy enough — type the hour and press RETURN. Next, you’re asked for the current minute. Since the clock will not start immediately, enter a value one minute past the current minute.

Once the current hour and minute have been specified, you are asked to enter the alarm hour. Type the hour of the time you wish the alarm to sound. Following this, you’re asked for the alarm minute. Enter the minute of the alarm time.

Now you’ll get a “PRESS RETURN TO START THE CLOCK” message. When you press RETURN, the clock will appear on the top line of the screen and will start at zero seconds of the time you have entered. A flashing colon indicates that the clock is working. Since the clock lies on the first line of the display, you will not be able to type on this line — the machine language routine contained within Alarm Clock will automatically move the cursor off this line, so you need not worry about it.

Granted, the clock is not 100% precise; it may lose about six seconds per hour. But for the time period you would be using your computer, this time loss is not very significant. The clock will also slow down somewhat while the disk drive is being accessed, and even more so while the cassette recorder is being used, so you should limit these operations if you desire to keep the clock more accurate.

When the clock reaches the time set for the alarm time, the alarm will begin beeping through the television speaker. Out of kindness, I will tell you that you can turn the alarm off by pressing the START key. The clock itself will remain operational.

You don’t need to keep the alarm clock program in BASIC’s memory for the clock to function. Alarm Clock stores a machine language routine onto page six of the computer’s memory (a relatively safe area of RAM) where it is executed as part of the Atari’s vertical blank routine. Therefore, you can type NEW and begin your own programming projects.

One more note: Alarm Clock should only be used with a Graphics 0 screen as it was designed to be used while programming in this mode.

Next Month

We’ll learn how the alarm clock program works, and I’ll include an assembly language listing. Also, we’ll start our exciting Programming Tips section. And, don’t be too surprised if you encounter an April Fools’ program!

Readers’ questions, comments and contributions are welcome. Address all correspondence to:

Jeff Brenner’s
“Applying The Atari”
P.O. Box F
Titusville, FL 32781-9990
ALARM CLOCK 
TBJ 10 REM ALARM CLOCK 
EWJ 20 REM BY JEFF BRENNER 
YGJ 30 RESTORE 100:TOT=0 
NEJ 40 FOR I=0 TO 192:READ N:POKE 1536+I,N:TOT=TOT+I+N:NEXT I 
YTJ 50 IF TOT<>42303 THEN PRINT "ERROR - CHECK DATA":END 
PVJ 60 PRINT "CURRENT HOUR";:INPUT A:GOSUB 140:POKE 207,A:IF E=1 THEN 60 
VQJ 70 PRINT "CURRENT MINUTE";:INPUT A:GOSUB 160:POKE 206,A:IF E=1 THEN 70 
LCJ 80 PRINT "ALARM HOUR";:INPUT A:GOSUB 140:POKE 1726,A:IF E=1 THEN 80 
BZJ 90 PRINT "ALARM MINUTE";:INPUT A:GOSUB 160:POKE 1727,A:IF E=1 THEN 90 
EOJ 100 PRINT "PRESS RETURN TO START CLOCK":POKE 764,255 
MQJ 110 IF PEEK(764)=255 THEN 110 
MTJ 120 POKE 204,0:POKE 205,0: SOUND 0,0,0,0:A=USR(1536) 
PPJ 130 END 
NUJ 140 E=0:IF A<0 OR A>12 THEN A=0:E=1:RETURN 
MYJ 150 E=0:IF A<0 OR A>60 THEN A=0:E=1:RETURN 
OXJ 160 B=INT(A/10):C=A-B*10:A=B*16+C:RETURN 
YOJ 170 DATA 104,162,6,160,16,169,7,32,92,228,169,0,141,192,6,96,248 
EDJ 180 DATA 162,0,181,204,24,105,1,149,204,201,96,208,24,169,0,149,204 
GEJ 190 DATA 232,224,3,208,236,165,207,24,105,1,133,207,201,19,208,4,169 
FOJ 200 DATA 1,133,207,224,2,144,17,165,207,205,190,6,208,10,165,206,205 
YCJ 210 DATA 191,6,208,3,238,192,6,216,160,18,162,1,181,206,74,74,74 
EIJ 220 DATA 74,9,144,145,88,200,181,206,41,15,9,144,145,88,200,200,202 
OSJ 230 DATA 16,232,136,136,136,136,169,154,166,204,224,48,144,2,169,128,145 
FOJ 240 DATA 88,136,136,177,88,201,144,208,4,169,0,145,88,173,192,6,240 
FDJ 250 DATA 23,165,204,201,48,144,12,169,32,141,0,210,169,200,141,1,210 
BUJ 260 DATA 208,5,169,160,141,1,210,173,31,208,201,6,208,11,169,0,141 
ZAJ 270 DATA 0,210,141,1,210,141,192,6,165,84,208,5,169,143,141,252,2 
XUZ 280 DATA 76,98,228,0,0,0 
COMPUTER SHOPPER / APRIL 1985 / PAGE 55 

Applying The Atari

by Jeff Brenner

This month we’ve got all the exciting details on Atari’s new products, which Atari expects to begin shipping to stores this month. We’ll learn how last month’s Alarm Clock Program works, have a look at the reader mail and take some programming tips from readers. Also, I’ll list the complete version of Program Perfect.

Atari News

So, it looks as though Jack Tramiel did keep his promises. With the introduction of the 130ST and 520ST, Atari’s first non-8 bit computer products. Atari has shown that it is indeed alive. Let’s get a brief run-down of the new units.

The XE Line

Atari describes the XE line as the 1985 Atari XL models. Basically, the 65XE is an 800XL with an attractively redesigned case, a sculptured, high-quality keyboard, and a lower price. The PIO connector of the XL models, which was intended for future hardware expansion, is not included on the XE models. The 130XE has the same features as the 65XE, but contains 128K RAM. The 65XE and 130XE are to retail for approximately $100 and $180 respectively. Other Atari products, announced at the Winter CES in Las Vegas but not as official, are the 65XEM, a 65XE with 8-voice, music synthesizer capabilities, and the 65XEP, a portable XE with a built-in 3.5 inch disk drive and 5-inch screen.

A variety of printers were announced for the XE models, including a dot matrix impact, a letter quality daisy wheel, and a dot matrix thermal transfer printer. The impact and thermal printers offer near-letter quality print styles.

The ST Line

The ST models will no doubt put Atari in the spotlight for 1985. The big question is whether any Atari model can tackle the seemingly impervious Apple Macintosh, even if the ST proves superior and costs a fraction of the price. Also, what happens if and when Commodore brings out its Macintosh-like Amiga computer? The battle is beginning all over again, folks. Whether the ST line is a success or a failure will depend largely upon the quantity and quality of software that is developed for it, as well as Jack Tramiel’s marketing strategy.

The 130ST and 520ST offer 128K and 512K RAM (actually 131,072 and 524,288 bytes), respectively. The units use the same MC68000 CPU as the Macintosh, although Atari more accurately calls it a 16/32 bit microprocessor; Apple advertises the Macintosh as a 32-bit machine. The ST models use the CPM/86-k operating system and Graphics Enviroment Manager, developed by Digital Research, to give the icons, pull-down menus, windows and mouse-controlled operation that have brought the Macintosh so much acclaim. The Atari ST brings this all one step further by offering color graphics, a capability not available on the Macintosh. The three graphics modes on the ST consist of a 320-by-200 pixel, 16 color mode, a 640-by-200, four color mode, and a 640-by-400, one color mode.

Other features of the ST models include both an RS232C serial input/output port and a Centronics-type parallel port, a high-speed (1.3 megabytes/second) hard disk interface, monitor jacks for TV, RGB and monochrome, A sculptured keyboard with numeric keypad, a three-voice sound generator and a Musical Instrument Digital Interface (MIDI). Including the MIDI interface was a great idea and may make the ST models extremely practical musician’s tools. Many of the newest synthesizers and electronic instruments utilize the MIDI standard.

A 500K, 3.5 inch disk drive will be sold in a separate component for the ST units. A 10-megabyte, 3.5 inch hard disk drive is to be available for the ST for under $600. Utilizing the 1.3 megabytes/second data transfer rate, this drive should be incredible at the price.

Atari has talked about even another computer to be introduced in Hannover, Germany this month. This one is to have a true 32-bit microprocessor and over 1 megabyte of RAM storage (1 megabyte is 1000K). It’s surely an Atari product I’m anxious to see.

Reader Mail

Are there any POKE commands which would allow older cartridges (for 400/800 series) to run on an 800XL?

John B. Neff
East Brunswick, NJ

Many older programs for the 400/800 will still run on the XL models, especially software produced by Atari. For those that are incompatible, there are no simple POKE commands to make them work on an XL, but you can get a “translator” disk. This disk gives your XL the operating system of the 400/800 and allows it to run almost all of the older software. It’s available from Atari (Customer Relations, P.O. Box 61657, Sunnyvale, CA 94088, Attn: Translator Disk) for $9.95 + $2.50 postage and handling. You can also purchase one from Dynacomp (1064 Gravel Road, Webster, 65 XE PERSONAL COMPUTER NY 14580) for $5.00 + $3.00 p. & h.


I have run into problems due to the format my writing must be in. Simply, I write scripts, i.e., screenplays. The format demands whole page action description, smaller margin dialog, and approximately centered but left-justified names. My problem is that with AtariWriter, I must continually use control codes for screen directions for action descriptions. The TAB won’t work because I don’t know of a way to, say, insert a few new lines of dialog later when editing. I think I need an 80-column card (to be able to see exactly where I am tabbing). Do you know where a good 80-column card for the 800XL can be got, or do you have any other suggestions, say in the area of my getting another word processor?

Fred Walters
Oklahoma City, OK

Your use of the control codes to change the printing margins is probably the best way to get the format that you need when using AtariWriter. As you realized, the tab is not appropriate for your needs since you would have to tab at the beginning of each printed line for a dialog of more than one line. During editing, there’s no easy way to know where the next line will begin on a 40-column screen.

I assume that your problem is the inconvenience of constantly adding control codes for your ever-changing margins. I see no easier way of doing this with your present system. An 80-column card, by itself, is not the answer. AtariWriter and almost all other word processors for the Atari were designed for a 40-column screen, so an 80-column card would make things worse, not better. However, an 80-column card combined with a compatible word processor might simplify your problem by making tabbing feasible, since you would be able to see exactly what will appear on paper without the tedious, scrolling preview mode of AtariWriter. One word processor that supports 80-columns that I have seen advertised recently is Atari Paper Clip from Batteries Included. It works with their Atari B.I. 80-column display adapter for XL systems. (Contact: Batteries Included, 17875 Sky Park North, Suite P, Irvine, CA 92714, 416 596-1405).

Another alternative is Home Word from Sierra On-Line. At $69.95/disk it might be just what you are looking for. In the lower, right-hand corner of the screen, HomeWord gives you a smaller screen that shows you how the finished page will look. Each character is represented by a small graphics pixel. A flashing cursor on this mini-screen lets you see your position on the page as you type your document. Thus, it would let you see the exact position to which you are tabbing. Additionally, it gives you a preview of the printed page, as AtariWriter does, but has the advantage of giving you an 80-column display. No adapter is needed since it uses the Atari’s high resolution graphics to form the letters. (Contact: Sierra On-Line, Inc., P.O. Box 458, Coarsegold, CA 93614.)


I’d just love to have an Atari 800XL computer. But I hesitate getting one because on every one I’ve seen being demonstrated, the letters on the screen are “fuzzy”. They seem to look fuzzy even on a monitor. I thought maybe my eyes were going away so I had a friend check it out and he noticed that when letters are typed on the screen they are not sharp. He even went to another store — same story! Any idea what’s going on? All the 800XLs I looked at did not have any software running. Maybe the picture is sharper with software running. I don’t want to have to purchase a Commodore if possible.

M.L. McCrery
Lewiston, ID

Your problem is a most unusual one in that the Atari has always been noted for its excellent display. You should be able to tune the television to get a sharp, clear image. Or, perhaps it is the blue background. If that is the case, try typing:

POKE 710,0 
and press return. This will turn the background black. You can POKE 710 with other values for other background colors. Aside from changing the screen color or the brightness of the text, running software will make no difference on the letters.

Personally, I own both Atari and Commodore systems and have always been more satisfied with my Atari’s display.

If you are interested in the 800XL, I suggest at this time that you look into the newer 65XE or 130XE which should be available this month.

Programming Tips

This section contains programming hints and suggestions sent in by readers. If your tip is printed, you’ll receive a three-dimensional holograph sticker.

From M. Rose (Cambridge, MA):

If you need a fast, reliable renumbering program for Atari BASIC programs, and if you own Microsoft BASIC, you can use Microsoft to renumber Atari BASIC! First, LIST your Atari BASIC program on cassette or diskette. Boot up with Microsoft and LOAD the program. Execute the RENUM command and SAVE the renumbered program back to cassette or diskette. Then, ENTER the program back in with the Atari BASIC. Microsoft will renumber all Atari BASIC statements with line numbers except for TRAP.

From Marvin Oppenheim (Monsey, NY):

In order to make it easier for me to type in program listings (especially long ones) I do the following: (1) I first dictate the entire listing into a tape recorder. (2) I then play it back while listening to it through a pair of headphones. (3) Since I am not a speed typist, I control the playback with the use of a foot pedal activator (available at any Radid Shack).

This sure makes typing in listings a lot easier.

Users Groups

I received an issue of the Pokey Press, “the official newsletter” of the Atari Computer Club of the Palm Beaches (Contact: Jim Woodward, 15993 S.W. 8th Ave. B-101, Delray Beach, FL 33444, Editor: Marvin Cox). It’s interesting to see what’s happening in Atari users groups around the country. Many of these newsletters have been useful and important information to share with the rest of the Atari world. I’d like to receive newsletters from other Atari users groups. Send them in. I’ll try to mention as many as I can in the column. Hopefully, this column can serve as a national communications link among the many Atari users groups across the country.

Alarm Clock Operation

Let’s take a brief look at how last month’s Alarm Clock program works. The BASIC program you entered for the Alarm Clock contains a machine language program which is placed on Page 6 of memory. Page 6 is the area which does not interfere with your BASIC program memory.

The machine language program is then set up as part of the Atari’s vertical blank routine. Every 1/60th of a second, the Atari jumps to a program in its operating system which updates the color registers, increments or decrements internal counters, and performs a variety of other tasks. This program is called the vertical blank routine. The clock program is added as an extension of this routine, and thus it runs 60 times per second.

The machine language clock routine keeps track of the number of times it has been executed. When it counts to 60, the program updates a counter containing the number of seconds which have elapsed. When the second-counter reaches 60, a minute counter is incremented, and, in turn, when the minute-counter reaches 60, the hour-counter is increased. Collectively displayed, these counters tell you the time.

In addition to incrementing counters, the routine checks if the current time is the same as the time set for the alarm. If they are equal, the alarm sounds and continues to beep until it detects that the START button has been depressed.

For those interested in assembly language, an assembly listing of this routine appears under the “Alarm Clock Assembly Code” heading.

ALARM CLOCK 
ASSEMBLY LISTING 
10  *=$600 
20  PLA 
30  LDX #START/256 
40  LDY #START&255 
50  LDA #$07 
60  JSR $E45C 
70  LDA #$00 
80  STA VAR3 
90  RTS 
0100 START SED 
0110  LDX #0 
0120 BACK LDA $CC,X 
0130  CLC 
0140  ADC #$01 
0150  STA $CC,X 
0160  CMP #$60 
0170  BNE NONE 
0180  LDA #$00 
0190  STA $CC,X 
0270 SKIP INX 
0280  CPX #3 
0290  BNE BACK 
0300  LDA $CF 
0310  CLC 
0320  ADC #1 
0330  STA $CF 
0340  CMP #$13 
0350  BNE NONE 
0360  LDA #$01 
0370  STA $CF 
0380 NONE CPX #2 
0381  BCC NONE2 
0382  LDA $CF 
0383  CMP VAR1 
0384  BNE NONE2 
0385  LDA $CE 
0386  CMP VAR2 
0387  BNE NONE2 
0388  INC VAR3 
0389 NONE2 CLD 
0390  LDY #$12 
0400  LDX #1 
0410 LOOP LDA $CE,X 
0420  LSR A 
0430  LSR A 
0440  LSR A 
0450  LSR A 
0460  ORA #144 
0470  STA ($58),Y 
0480  INY 
0490  LDA $CE,X 
0500  AND #$0F 
0510  ORA #144 
0520  STA ($58),Y 
0530  INY 
0540  INY 
0550  DEX 
0560  BPL LOOP 
0570  DEY 
0580  DEY 
0581  DEY 
0582  DEY 
0590  LDA #154 
0600  LDX $CC 
0610  CPX #$30 
0620  BCC COLON 
0630  LDA #128 
0640 COLON STA ($58),Y 
0650  DEY 
0660  DEY 
0670  LDA ($58),Y 
0680  CMP #144 
0690  BNE NOTHING 
0700  LDA #0 
0710  STA ($58),Y 
0720 NOTHING LDA VAR3 
0730  BEQ JUMP 
0740  LDA $CC 
0750  CMP #$30 
0760  BCC SOUND1 
0770  LDA #$20 
0780  STA $D200 
0790  LDA #$C8 
0800  STA $D201 
0810  BNE JUMP 
0820 SOUND1 LDA #$A0 
0830  STA $D201 
0840 JUMP LDA $D01F 
0850  CMP #$06 
0860  BNE NOPRESS 
0870  LDA #0 
0880  STA $D200 
0890  STA $D201 
0900  STA VAR3 
0910 NOPRESS LDA $54 
0920  BNE NOTOP 
0930  LDA #$8F 
0940  STA $2FC 
0950 NOTOP JMP $E462 
0960 VAR1 .BYTE 0 
0970 VAR2 .BYTE 0 
0980 VAR3 .BYTE 0 
0990  .END 

Program Perfect

For the benefit of those new to Computer Shopper, and to those who had difficulty in entering this program due to its listing and revision over two issues, a complete, final, never-to-be-changed listing appears under “Program Perfect.”

Next Month

We’ll have a program to liven up your Graphics 0 display, plus we’ll start entering a business applications program for those who keep mailing lists. As usual, we’ll cover reader mail and learn more programming tips.

Reader’s questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope for a personal reply.

A cassette or diskette of any program appearing in this column is available from the author for $5.00 per program, postpaid. Specify DOS 2 or DOS 3 when requesting a disk.

Address all correspondence to:

Jeff Brenner’s
“Applying the Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781
PROGRAM PERFECT 
30000 CLR :CLOSE #1:CLOSE #2:N1=1:N2=N1+N1:N84=84:N85=N84+N1:N39=39:N65=65 
30010 DIM LN$(120):OPEN #N1,9,N0,"E:":OPEN #N2,4,N0,"K:" 
30020 PRINT CHR$(125):POSITION 12,N0:PRINT "PROGRAM PERFECT":POSITION 12,N1 
30030 PRINT "By Jeff Brenner":IF ST THEN PRINT :PRINT "Current line: ";ST 
30040 IF NOT ST THEN PRINT :PRINT "Starting line: ";:INPUT #16;ST 
30050 POSITION N39,5:? " ":POSITION N39,6:? " ":POSITION N39,7:? " " 
30060 POSITION N2,5:PRINT "--- ";ST;:POKE N85,N2:PRINT "-";CHR$(30);:FOR I=N1 TO 3 
30070 POKE 702,64:POKE 694,0:GET #N2,N:IF N=126 AND I>N1 THEN PRINT CHR$(30);"-";CHR$(30);:I=I-N1:GOTO 30070 
30080 IF N<N65 OR N>90 THEN GOSUB 30310:GOTO 30070 
30090 PRINT CHR$(N);:NEXT I:SP=LEN(STR$(ST)) 
30100 FOR I=N1 TO SP+N2:? CHR$(31)::NEXT I:Y=PEEK(N84):X=PEEK(N85):ES=N0 
30110 GET #N2,N:IF N=155 THEN POSITION N2,5:INPUT #N1;LN$:GOTO 30200 
30120 IF N=156 OR N=157 THEN 30110 
30130 IF ES THEN 30160 
30140 IF (N=29 AND PEEK(N84)=Y+N2) OR (N=28 AND PEEK(N84)=Y) THEN 30110 
30150 IF N=125 THEN 30020 
30160 PRINT CHR$(N);:ES=N0:IF PEEK(NB4)>Y+N2 THEN 30190 
30170 IF PEEK(N84)=5 AND PEEK(N85)=SP+6 THEN 30060 
30180 GOTO 30110 
30190 GOSUB 30310:POKE N85,N39:POKE N84,Y+N2:PRINT CHR$(28):CHR$(29);:GOTO 30110 
30200 POSITION N39,10: ? " ":POSITION N39,11:? " ":POSITION N39.12:? " " 
30210 T2=26*(ASC(LN$(N1,N1))-N65)+ASC(LN$(N2,N2))-N65:NL=ASC(LN$(3,3))-N65+N1 
30220 POSITION N2,10:PRINT CHR$(156):LN$(5,LEN(LN$)):PRINT :PRINT :PRINT CHR$(157);"CONT" 
30230 POSITION N2,8:POKE 842,13:STOP 
30240 POKE 842,12:POSITION N2,10:PRINT CHR$(156);:POSITION N2,9:LIST ST 
30250 T=NL:POSITION N2,10:INPUT #N1;LN$:FOR I=N1 TO LEN(LN$):T=T+ASC(LN$(I,I)) 
30260 IF T>650 THEN T=T-650 
30270 NEXT I:IF T=T2 AND NL<26 THEN ST=ST+NL:GOTO 30020 
30280 IF T=T2 AND NL=26 THEN 30320 
30290 POSITION N2,9:FOR I=N1 TO 5:PRINT CHR$(156);:NEXT I 
30300 PRINT :PRINT "ERROR - TRY AGAIN":GOSUB 30310:GOTO 30060 
30310 SOUND N0,N85,12,8:IF N1^N1 THEN SOUND N0,N0,N0,N0:RETURN 
30320 PRINT CHR$(125);"END OF PROGRAM - STAND BY..." 
30330 FOR I=30000 TO 30320 STEP 10:POSITION 2,4:PRINT I:PRINT "CONT" 
30340 POSITION 2,2:POKE 842,13:STOP 
30350 NEXT I:PRINT CHR$(125):FOR I=30300 TO 30370 STEP 10:PRINT I:NEXT I 
30360 LN$="PROGRAM ENTRY COMPLETED.":PRINT "POKE 842,12:PRINT CHR$(125);LN$" 
30370 POSITION 2,0:POKE 842,13:STOP 
COMPUTER SHOPPER / MAY 1985 / PAGE 53 

Applying The Atari

by Jeff Brenner

This month’s feature program utilizes a capability of the Atari called the display list interrupt to help you liven up your Graphics 0 display. We’ll also look at the reader mail, programming tips, and a recap of instructions for Program Perfect for our newer readers.

Reader Mail

While readers’ questions are far from in short supply, I would like to see more letters with contributions, such as short programs or helpful advice, from which other readers may benefit. A three-dimensional, holograph sticker will be sent to each contributor of an item printed in this column. Also, if you have an idea for a program but cannot implement it yourself, send me a program request. If the program will be useful to other readers, it may be developed and printed in a future issue.


I have a Trade-Wind Instruments model A-1 Anemometer I would like to interface with an old Atari 600XL I have. The anemometer has a generator on it so when the wind spins it around it produces a variable voltage which translates into wind speed in mph.

I asked the Trade-Wind folks if they knew anything about doing this but they didn’t. They sent me the enclosed reprint from BYTE magazine, but I can’t understand what the article is talking about.

I would like to get the wind speed from the anemometer through one of the joystick ports. Then have a program to get the wind speed say once an hour and store it for later retrieval.

I have no idea how to go about doing this; maybe it’s impossible? Any help you can give me would be greatly appreciated.

Greg Matlock
Hays, Kansas

The joystick ports on the Atari can be used to read a wide variety of instruments, including your anemometer, providing that interfacing is properly done. A digital anemometer might be the easiest to interface to the Atari since its output is binary-coded decimal data. This could be read through the ports with a minimum amount of extra circuitry; however, you would have to write a routine to interpret the incoming data.

Since you did not specify whether or not your unit is a digital anemometer, I am assuming that your model simply generates a voltage relative to the wind speed. In that case, you would have to either use a circuit to convert the signal to binary-coded decimal data, or convert the varying voltage into a varying resistance, which could then be read like a game paddle. Specific details for doing this are beyond the scope of this column.

I recommend that you try contacting the author of the article enclosed with your letter. His article discussed interfacing an anemometer to an S-100 system, and he might be able to help you to do the same with your Atari.

I also recommend that you and any other readers interested in interfacing external devices with their Atari computers read “Control Your Environment with the Atari 400/800” (by David Alan Hayes, BYTE, July 1983). This gives some general information on controlling and monitoring devices through the joystick ports. Most of what is discussed applies to the XL and newer XE Atari units as well.

You might also attempt to contact a technician at Atari (1265 Borregas Ave., Sunnyvale, CA 94086) to assist you or direct you to other sources.

Interfacing your anemometer to your computer is not an impossibility. First get the details on doing so. Then, if you are not experienced in constructing circuits, get the help of a friend familiar with electronics.


I am strongly considering buying one of the new Atari ST machines when they are released. I have two questions: (1) Are they Macintosh compatible? (2) Would you support the new machines in your “Applying The Atari” column?

Rob Murray
Montgomery, Pennsylvania

Although the Atari ST is known as the “Jackintosh” in certain circles (after Jack Tramiel), it is not software compatible with Apple’s Macintosh. Come on now — ultra-high resolution color graphics, multiple ports and interfaces, sound capatibilities, and Macintosh compatibility for under $1000? That would be too much to ask for!

If the new Atari units catch on and if there is demand among readers for information on them, I would certainly devote space to these new models.

Programming Tips

It isn’t necessary to go to DOS when you want to format a disk to save a program. Loading DOS (if no MEM.SAV is present) will wipe out the program you’re working on. A truly useful method of formatting a disk without leaving BASIC is the XIO command. To format a disk in single density, enter:

XIO 253,#1,33,87,"D:" 
For double density (available on the 1050 drive only), enter:
XIO 253,#1,33,127,"D:" 
If you do this on a disk that already has programs on it, you will erase the disk, so be careful.
Herb Collins
Long Beach, California

I have discovered one cause of the infamous Atari 400/800 BASIC hang-up in which the Atari refuses to process user input. It seems that pressing SYSTEM RESET while the computer is in the middle of certain operations can mess things up.

For example: you type PRINT A$ to print out A$, a long string. The computer hesitates, and you, fearing that a system crash might be developing, press SYSTEM RESET in your attempt to avert disaster. However, when you now try to enter a line, the computer hangs up. Had you waited two to three seconds for the string to be printed out, everything would have been fine — Atari BASIC normally hesitates when printing out a long string while it rearranges its memory. But pressing SYSTEM RESET might leave the Atari in some kind of half-rearranged memory state — probably sufficient cause for a BASIC crash.

You should wait for the READY prompt before pressing SYSTEM RESET, and use BREAK instead of the reset key to interrupt program execution to greatly reduce the occurrence of the hang-up. [Atari says that this bug has been rectified in the BASIC in the XL and XE models, so this tip applies only to 400 and 800 owners.]

G. Scott
Bronx, New York

Program Perfect Recap

Last month, Program Perfect was listed in its entirety for those new to Computer Shopper and for those who missed the revision that followed the original listing. This also allows us to point to one single issue (April 1985) when referring to this program. This month we’ll review the features of Program Perfect and how to use them. If you are already familiar with Program Perfect, you can skip to the “Multi-Luminance Graphics 0” section to start entering this months program.

Before we start using Program Perfect, check over your typing a few times to be sure there are no errors. You don’t want a bug in a program that checks other programs for errors!

We’ll use the short program listed under the “SAMPLE PROGRAM” heading to test Program Perfect. The three letters to the left of each line number is the code used by Program Perfect to check the line for errors, and to determine the next line for its automatic line numbering feature.

SAMPLE PROGRAM 
CTJ 10 REM TEST OF PROGRAM PERFECT 
LAJ 20 PRINT "THIS IS A TEST" 
WMJ 30 GOTO 20 
OJZ 40 END 

RUN Program Perfect. When you’re asked to enter the starting line, enter the first line of the program you are entering. In the case of this demonstration program, enter 10 and press RETURN. Figure 1 shows how the line below will now appear.

--- 10 
FIGURE 1 

The three hyphens preceding the 10 are for the three-letter code. When you type the code for line 10, the display will appear as in Figure 2.

CTJ-10 ■
FIGURE 2 

The cursor will have moved past the line number to allow you to enter the program line. Type in the remainder of line 10 and press RETURN. Program Perfect will perform a few screen manipulations below the line you have entered as it checks the line for errors and places it in the Atari’s memory as a real program line. You’ll get a buzz and an “ERROR - TRY AGAIN” message if you’ve made a syntax error, or if the line does not otherwise check against its three-letter code. An error in typing the three-letter code will also trigger the error message. After the error message is printed, you’ll have to enter the three-letter code again, but the rest of the line will remain intact so you may correct it using the cursor control keys. To erase the entire line and the code, press SHIFT-CLEAR. Program Perfect will not allow you to move the cursor out of its three-line entry area.

If the line is entered correctly, the program will automatically display the next line number of the program. Enter the codes and program lines for each line number that appears until the entire program is entered.

Program Perfect allows you to use all abbreviations, such as GR. for GRAPHICS and G. for GOTO. However, do not use ? for PRINT or vice versa as the computer treats these as two different commands. The same goes for GOTO and GO TO. Use PR. as an abbreviation for PRINT, and stick to the one-word GOTO, as this is the only form that will appear in the programs in this column.

You do not have to follow the exact spacing of the program line unless the spacing is within quotes.

After you enter the last line of the program (which has a three-letter code ending with a “Z”), Program Perfect will print “END OF PROGRAM - STAND BY.” It will then take about five seconds while it erases itself from memory and leaves you only with the lines you have entered. You can then list, save or run your program.

If you don’t enter the whole program in one sitting, you can press BREAK and SAVE what you’ve already typed. Since Program Perfect is in memory, you will be saving it along with the lines of the program you have entered. When you are ready to enter more of the program, simply LOAD it back in and type GOTO 30000 (the beginning line of Program Perfect). Then enter the line number from which you want to continue for the “Starting number:” prompt and enter the rest of the program.

Multi-Luminance
Graphics 0 Screen

This month’s program gives you the chance to enhance your Atari’s Graphics 0 screen. Graphics 0 is the mode in which you program. With the SETCOLOR command, characters on the Graphics 0 screen can be set to any one of eight luminance levels. However, the Atari operating system does not provide for mixing text of different luminance on the same screen; a feature which can greatly add to the visual appeal of the display. To accomplish this, a display list interrupt could be set up.

The display list is a section of computer memory which contains a series of mode-display instructions for each line of the screen. A Graphics 0 screen would contain 24 instructions to display a line of graphics mode zero text, thereby creating a 24 line display. A display list interrupt is an instruction in this display list which causes the computer to temporarily halt its current operation and to instead jump to some routine in memory. After this routine is executed, the Atari resumes its normal activities. The most important aspect of this display list interrupt routine is that it is executed while the screen is being drawn. Therefore, the Atari’s color registers could be changed mid-screen if desired, and the change would be visually apparent on the video display.

The Multi-Luminance program that follows works on this principle. It uses 24 interrupts, one for each line of the screen, and is therefore able to assign a new luminance level to each line of text.

Enter the Multi-Luminance program under Program 1 and LIST it to cassette or diskette so that you may merge it with other BASIC programs. Now, without erasing Program 1, enter Program 2. Program 2 is a sample application program which shows off one use of a display with multi-luminances.

RUN the program. After a few seconds, a display is generated which takes advantage of the many different intensities available. The sample menu shows CHOICE 1 illuminated, while the other choices are dark. By pressing the SELECT key, the next choice is illuminated, and so forth. Pressing START would initiate a particular selection if this menu were being used in a full-length program. In this demonstration, pressing START will tell you what choice was selected.

This attractive method of menu operation could not have been done on the normal Graphics 0 screen. The Multi-Luminance routine (Program 1) sets the line containing the selected choice at the highest intensity, while it sets the other at the lowest intensity, to obtain this interesting effect.

Next Month

You’ll learn how to use the Multi-Luminance program to set each screen line to the luminance of your choice, and how to incorporate this into your own BASIC program. Next month’s feature program is a powerful mailing list keeper (name/address/category) for disk systems with search, editing, and double-width label printing capabilities. It works with either single or double density (DOS 2 or DOS 3). This program is one you won’t want to miss.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed stamped envelope (SASE) for a personal reply.

A cassette or diskette of any program listed in this column is available from the author for $5, postpaid. Specify DOS 2 or DOS 3 when requesting a diskette.

Program Perfect is a utility used to check for typing errors in programs entered from this column. Readers may send a SASE for listing.

Address all correspondence to:

Jeff Brenner’s
“Applying The Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
PROGRAM 1 
KLJ 30000 REM MULTI-LUMINANCE PROGRAM 
KHJ 30010 REM BY JEFF BRENNER 
CFJ 30020 RESTORE 30070:I=0 
FHJ 30030 READ NUM:IF NUM=-1 THEN 30050 
YDJ 30040 TOT=TOT+NUM+1:POKE 1664+I,NUM:I=I+1:GOTO 30030 
RAJ 30050 IF TOT<>13108 THEN PRINT "ERROR-CHECK PROGRAM":STOP 
HNJ 30060 A=USR(1664):RETURN 
TTJ 30070 DATA 104,173,48,2,133,204,173,49,2,133,205,160,26,169,10 
IFJ 30080 DATA 153,230,6,136,208,250,160,0,177,204,9,128,145,204,160 
UKJ 30090 DATA 3,177,204,9,128,145,204,160,6,177,204,9,128,145,204 
OBJ 30100 DATA 200,192,28,208,245,169,197,141,0,2,169,6,141,1,2 
TPJ 30110 DATA 173,14,128,141,14,212,96,72,152,72,173,11,212 
TBJ 30120 DATA 201,7,240,18,201,8,240,14,230,204,164,204,185,231,6 
SBX 30130 DATA 141,23,208,104,168,104,64,169,0,133,204,240,238,-1 
PROGRAM 2 
WQJ 10 REM MULTI-LUMINANCE DEMONSTRATION 
MHJ 20 GRAPHICS 0:GOSUB 30000:RESTORE 50 
EGJ 30 FOR I=1767 TO 1791:READ N:POKE I,N:NEXT I 
DOJ 40 SETCOLOR 2,5,2:POKE 752,1 
NZJ 50 DATA 4,6,8,10,12,14,0,0,0,0,0,0,0,0,0,0,0,0,14,12,10,8,6,4 
KJJ 60 FOR I=0 TO 5:POSITION 19-I,I:PRINT CHR$(8); 
BLJ 70 IF I<>0 THEN FOR J=1 TO I*2:PRINT CHR$(160);:NEXT J 
JRJ 80 PRINT CHR$(10);:NEXT I 
TYJ 90 FOR I=0 TO 5:POSITION 19-I,23-I:PRINT CHR$(138); 
OBJ 100 IF I<>0 THEN FOR J=1 TO I*2:PRINT CHR$(160);:NEXT J 
NMJ 110 PRINT CHR$(136);:NEXT I 
UWJ 120 FOR I=1 TO 4:POSITION 16,(I-1)*3+7:PRINT "CHOICE ";I:NEXT I:CHOICE=1 
EDJ 130 FOR I=1774 TO 1783 STEP 3:POKE I,0:NEXT I 
NIU 140 POKE 1774+(CHOICE-1)*3,14 
DFJ 150 CONSOL=PEEK(53279):IF CONSOL=7 THEN 150 
PRJ 160 IF CONSOL=5 THEN SOUND 0,100,10,8:CHOICE=CHOICE+1:IF CHOICE=5 THEN CHOICE=1 
PPJ 170 IF PEEK(53279)<>7 THEN 170 
CXJ 180 IF CONSOL<>6 THEN SOUND 0,0,0,0:GOTO 130 
BJJ 190 PRINT CHR$(125):POSITION 6,5 
RWJ 200 PRINT "YOU HAVE SELECTED CHOICE #";CHOICE;"." 
ULZ 210 STOP 
COMPUTER SHOPPER / JUNE 1985 / PAGE 47 

Applying The Atari

by Jeff Brenner

This month we have a handy mailing list program featuring search, editing and double-width label printing capabilities. Well also learn more about last month’s Multi-Luminance program and answer some reader mail.

Programming Tip Correction

M. Rose’s programming tip printed in April’s column (page 56) said to SAVE a renumbered program from Microsoft BASIC and then ENTER it back in with Atari BASIC. However, as several readers keenly discovered, in order for Atari BASIC to read the program, Microsoft BASIC must have saved the program in an untokenized format. The LIST command, not the SAVE command, must be used for the program to be stored on disk or cassette in the untokenized form. The corrected procedure for using Microsoft BASIC to renumber a program written in Atari BASIC follows:

First, LIST your Atari BASIC program on cassette or diskette. Boot up with Microsoft and LOAD the program. Execute the RENUM command and LIST the renumbered program back to cassette or diskette (LIST“C:” or LIST“D:filename”). Then ENTER the program back in with Atari BASIC. Microsoft will renumber all Atari BASIC statements with line numbers except for the TRAP statement.

Reader Mail

I hesitate buying disk programs that can’t be copied. If I pay that kind of money for a program, then I feel that I should have the right to make a backup copy, as I did with my DOS 3. If you are familiar with a method that will produce backups, please let me know.

Elwood Ethridge
Georgetown, SC

For making backup copies without expensive disk drive modifications, independent diskette duplicating machinery, and the like, I can only recommend that you try using the “Duplicate File” option from DOS. Today’s computer software for the Atari is highly protected from most copying schemes, and the majority of so called “copy programs” that I have tested in the past are not any more successful than DOS in making backups.

A program’s ability to be copied should not be of consequence when deciding whether or not to purchase the program. In many cases, the better a program is, the more difficult it is to copy, since the manufacturer puts more work into protecting it.

I have always supported manufacturers’ use of copy-protection methods except in cases where the legitimate user is inconvenienced.

Software piracy makes copy-protection a necessity. Indeed, piracy has contributed to the decline in good software titles being released for the Atari today. It is also responsible for the high cost of new computer programs. Ultimately, copy-protection is in the best interests of both the software manufacturers and the legitimate users.


MAILING LIST PROGRAM 

ADD NAMES 

EDIT 

PRINT 

LIST NAMES 

FREE DISK MEMORY 

SELECT: 

Figure 1 
EDIT 


Computer Shopper         
FULL NAME 

P.O. BOX F               
ADDRESS 

Titusville, FL 32781     
CITY/STATE/ZIP 

MAGAZINE 
CATEGORY 


SEARCH FOR WHAT NAME?Shopper 
FOUND 
PRESS > TO MOVE FORWARD 
PRESS < TO MOVE BACKWARD 
PRESS ESC FOR MENU 

Figure 2 

As a former owner of an Atari 800 system who has recently purchased an Atari 800XL, I am very upset with the lack of documentation included with the XL. My 800, I recall, came with a manual describing the BASIC commands and other useful information. My XL, however, included basically a set-up guide and that’s all. I am mainly interested in learning about the POKEs and the PEEKs unique to the XL but don’t want to start spending hundreds of dollars on books. I hope you can include this topic in your column. I think many of your other readers would also appreciate this information on the XL.

Douglas Mann
Santa Rosa, CA

As the price of Atari computers declined, so did the amount of documentation included with the machines. This is unfortunate, but don’t fear… Next month I’ll list some of the important memory locations on the XL and how to use them.

More on Multi-Luminance

Those of you who entered last month’s Multi-Luminance program might be interested in adding this attractive shading capability to your own BASIC programs and Graphics 0 screens. The sample application program demonstrated two of the many uses of the simultaneously displayed screen tints. It printed a menu, bordered on top and bottom by triangles composed of varying shades of color. This makes for a truly appealing display, otherwise unattainable without the use of the display list interrupts employed by the Multi-Luminance routine. The menu operation further illustrates this ability to mix luminances on the screen by highlighting the selected option.

To use the Multi-Luminance program in your own BASIC program, your program must first GOSUB 30000 to initialize the routine. The routine must be reinitialized after a GRAPHICS statement, and therefore a GOSUB 30000 should follow every GRAPHICS 0 command.

The luminance values are stored in memory locations 1767 through 1790, one location for each line of the screen. There are eight possible luminance levels ranging from zero through 14 on every even number (two, four, six, and so forth). Upon initialization, all locations are loaded with a luminance level of ten, the value that is normally used for the GRAPHICS 0 display.

Let’s try changing some luminances. Enter the Multi-Luminance program (Program 1 of last month) and type GOSUB 30000. When you get the READY prompt, type:

POKE 1767,0 

This will set characters on the first line of the screen to the lowest intensity. This corresponds to the command, SETCOLOR 1,0,0, but affects only the line controlled by location 1767 — the first line. Now when you type or print on the first line, the characters will be darker than those on the other lines of the screen.

The following formula can be used to set a specific line of the screen to a certain luminance, where LINE is the line of the screen (zero through 23) and TINT is the luminance value (zero through 14, even numbers):

POKE 1767+LINE,TINT 

Note that the first line of the display is numbered line zero; the second line, line one; etc.

Dynamic luminance changes are possible as well. Type in this example and RUN it:

10 FOR I=0 TO 23 
20 POKE 1767+I,PEEK(20) 
30 NEXT I 
40 GOTO 10 

Have fun with the Multi-Luminance routine. If you dream up any fascinatingly unique applications for this program, please write and tell us about it.

Mailing List Program

This month’s feature program, Mailing List, is our longest one ever — over 130 lines. It’s a program that stores names and addresses, allows user categorization, searches by name, and prints by category on mailing labels. You’ll truly appreciate this program whenever you have to send anything to anybody — greeting cards to friends and relatives, letters to clientele, etc. In future months, we might add additional routines to this program to make it even more powerful.

Disk Drive Required

Since Mailing List relies extensively on random access storage, a disk drive is needed.

Random access means that any portion of the data can be read at any time. In the mailing list program, random access allows the program to read one of the last names on the disk, and then go back and read one of the first names if necessary.

Names on a cassette tape can only be read sequentially, or in the order in which they were saved on the tape. For searching or editing to be feasible, all of the data on cassette would have to be loaded into the computer memory and then resaved when operations on the data were finished. This would limit the amount of data storage to the amount of memory remaining in the computer.

Even if the memory limitations are of no concern to you, the cassette recorder is far too slow for comfortable mailing list work.

The Program

Type in Mailing List. It is highly recommended that you use Program Perfect to enter this one, since there is a great chance for error. When you’ve entered the entire program, SAVE it to diskette. (See the end of this article for information on Program Perfect and on purchasing a diskette of Mailing List. Since Mailing List stores its data on diskette. You might want to insert a blank, formatted diskette into the disk drive before running the program. This will let you store the greatest number of names and addresses. This disk will be referred to as the data disk. You can use the disk on which you’ve saved the program, if you really want to, but you’ll have less room remaining for storage.

Now RUN the program. Figure 1 shows the menu screen that is displayed if everything is working properly.

Adding Names

Naturally, little can be done with a mailing list program without the names and addresses. Hence, the first thing you’ll want to do is select the ADD NAMES option. Press A for this operation. A data file will be created on the diskette. In a few seconds you’ll be on the ADD DATA screen.

If you want to use both upper and lower case letters for your mailing list, press the CAPS/LOWR key (or the CAPS key on the XL/XE) before you start typing. Don’t use all capitals for some names and a combination of capitals and lower case for others or you’ll run into problems when searching for a name. A maximum of 32 characters can be typed for each data line. The CTRL (CONTROL on the XL/XE) and arrow keys can be used to move the cursor around to change anything you have typed. Use the BACK SPACE and CONTROL-INSERT keys for their respective, one-character operations. To delete an entire line, use SHIFT-DELETE. The inverse video and graphics characters cannot be typed so as to facilitate the use of the search feature and also because the majority of printers cannot print these characters.

Now type in a name and press RETURN. Next type in the street address, press RETURN, and enter the city, state and zip code.

The next line is the category. Up to eight characters can be entered as a category name to classify the name you have entered. Later, names can be printed out according to category. For example: You can classify your relatives as RELATIVE, and your clients as CLIENT. Then, to invite your relatives to a get-together, you would specify the RELATIVE category when printing labels. To send out information to your clientele, you would specify the CLIENT category.

You could put the category name to good use in a birthday-oriented mailing list: All acquaintances with a birthday in, say, March, would be given the name MARCH as a category. Then, just before March comes around, you could print out labels with the names and addresses of those with a birthday in that month. Stick the labels on some card envelopes and no more late or forgotten birthdays! As you can see, this program’s ability to categorize is an extremely practical and versatile feature.

After you’ve typed the category, press RETURN. You’ll get a “MORE NAMES (Y/N)?” prompt. If you’ve got more names to enter, press Y and type them in, otherwise press N to get back to the menu.

Editing

Once you’ve built your mailing list, you might have to go back to change some entries, especially if you’ve discovered a typographical error or someone has changed his address. Press E for the Edit screen.

On the Edit screen you’ll get a “CYCLE OR SEARCH (C/S)?” prompt. Press C if you want to cycle back and forth among the various entries. The “<” and “>” keys are used to move backwards and forwards, respectively. Attempting to go beyond the last entry will give you a nasty “LAST NAME IN FILE” message, while trying to move ahead of the first entry will give you a “FIRST NAME IN FILE” message. At any point, you can use the editing keys to change an entry. The changes will automatically be recorded on disk.

Deleting a name is accomplished by changing the category of the name to DELETED. The name isn’t actually deleted (thus you can reinstate it at a later time if necessary) but it is ignored when printing out labels. You can replace a name in the DELETED category with a new name if you so desire, but be sure to change the category name.

Press ESC when you’ve finished making changes and you’ll be returned to the menu screen.

Search Feature

Pressing S for the “CYCLE OR SEARCH” prompt lets you search for a name. You’ll be asked whether you want to “SEARCH BY FULL NAME OR LAST (F/L)?”; Press F to search for an entire name, or for any portion of the beginning of the full name. For example: to find our editor-in-chief, Stan Veit, we could search for “Stan Veit” or, if there’s only one Stan in our list, we could search for “Stan.” If we are using only capital letters, then we’d search for “STAN.” (Now you can see why it is important to be consistent with the use of either all capitals, or both capitals and lower case.)

Your other option is to search for the last name (Press L). This time, to find Stan, we’d enter “VEIT.” Figure 2 shows how we can find “Computer Shopper” by searching for “Shopper.”

Once you find the name you’ve searched for, you can make changes in the data with the editing keys, or you can use the “<” and “>” keys to move to see (and change if desired) the data preceding and following the displayed data.

Printing The Names

Now for the fun stuff. Of course, you’ll need a printer — any land will do. Position your mailing labels in your printer. If you are using double-width labels (two labels horizontally) then press 2 for the “NUMBER OF LABELS ACROSS (1/2)?” prompt, otherwise press 1. Next you’ll be asked to input the spacing between horizontal labels (if you have two labels across) and the spacing between vertical labels. Six and four are the values for these inputs, respectively, for labels of standard size and spacing. If you are using labels of other sizes, you should experiment to find the correct values for proper printing.

Mr. J. Smith 
100 Disk Drive 
Baltimore, MD 21219 

Mrs. C. Douglas 
100 RAM Road 
Pawcatuck, CT 06379 

Mr. B. Rogers 
100 BASIC Blvd. 
Floral Park, NY 11004 

Ms. S. Jackson 
100 POKE Place 
Lima, OH 45805 

Mr. E. Carson 
100 LIST Lane 
Burlington, IA 52601 

Figure 3 

Once all spacing has been set, you’re asked which category to print out. If you want to print every name and address on the data disk, regardless of its category (except for those marked DELETED), enter “ALL,” otherwise type the specific category of the names you want printed (i.e. “CLIENTS”). When the “PRESS RETURN WHEN READY” prompt appears, press RETURN and your labels will be printed. Figure 3 shows a sample output.

List Names

For a simple list of the names stored on the data disk, press L on the menu. Only the names, not the addresses, will be printed. Those names that have been deleted will also be printed, but they will be preceded by an asterisk (*).

Free Disk Memory

This will tell you how many sectors or blocks are remaining on your diskette. When this number becomes very low, you are running out of room and should begin using an additional diskette. Incidentally, the data diskette should only be changed when on the main menu screen so that the proper files will be opened on the new disk.

Next Month

We’ll get into more detail on Mailing List, look at some POKEs and PEEKs on the XL, learn how to add a numeric keypad to the Atari, enter a new program called ATASCII Lister, and (whew!) look at some more reader mail.

Readers questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A cassette or diskette of any program listed in this column is available from the author for $5.00, postpaid. Specify DOS 2 or DOS 3 when requesting a diskette.

Program Perfect is a utility used to check for typing errors in programs entered from this column. Readers may send a SASE for a listing or $5.00 for a cassette or diskette.

Address all correspondence to:

Jeff Brenner’s
“Applying The Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
MAILING LIST 

UIJ 10 REM MAILING LIST PROGRAM 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
MBJ 30 DIM NAME$(32),ADDR$(32),CSZ$(32),CAT$(B),Q$(1),KB$(255),SP$(32),L$(1) 
BHJ 40 DIM NAME2$(32),ADDR2$(32),CSZ2$(32),CAT2$(8),NUL$(1) 
BHJ 50 SP$(1)=CHR$(32):SP$(32)=CHR$(32):SP$(2)=SP$:L$=CHR$(155) 
VRJ 60 KB$(1)=CHR$(0) :KB$(255)=CHR$(0):KB$(2)=KB$:RESTORE 80 
INJ 70 KB$(30)="K":KB$(122)="K":KB$(31)=KB$(30):KB$(60,60)=SP$:KB$(62,62)=SP$ 
IFJ 80 FOR I=1 TO 7:READ J:KB$(J,J)="K":NEXT I:DATA 95,155,156,126,127,254,255 
EBJ 90 DIM A$(110),B$(2),C$(1),FILE$(30),FILE2$(30),E$(2) 
BHJ 100 E$=CHR$(156):E$(2,2)=CHR$(157):FILE$="D:FILE.DAT":FILE2$="D:POINT.DAT" 
CYJ 110 B$=CHR$(30):B$(LEN(B$)+1)=CHR$(31) 
KIJ 120 OPEN #1,4,0,"K:":OPEN #3,4,0,"E:":OPEN #4,9,0,"E:" 
RVJ 130 CLOSE #5:CLOSE #2:PRINT CHR$(125);"MAILING LIST PROGRAM":POKE 84,4 
BZJ 140 RESTORE 160:FOR I=1 TO 5:READ A$:PRINT CHR$(ASC(A$)+120);A$(2,LEN(A$)) 
LEJ 150 PRINT :PRINT :NEXT I 
BDJ 160 DATA ADD NAMES,EDIT,LIST NAMES,PRINT,FREE DISK MEMORY 
RAJ 170 POKE 694,0:POKE 702,64:PRINT CHR$(156);"SELECTS ";:GET #1,A 
RGJ 180 RESTORE 150:FOR I=1 TO 6:READ A$:IF ASC(A$)<>A THEN NEXT I:GOTO 170 
UEJ 190 PRINT CHR$(125); 
BKJ 200 FOR J=1 TO LEN (A$):PRINT CHR$(ASC(A$(J))+128);:NEXT J:PRINT :PRINT 
BIJ 210 PRINT :ON I GOTO 230,650,1040,1120,1350 
CPJ 220 POKE 85,2:FOR I=1 TO 32-(J=4)*24:PRINT CHR$(13);:NEXT I:POKE 85,2:RETURN 
PCJ 230 TRAP 250:OPEN #2,9,0,FILE$:OPEN #5,4,0,FILE2$:TRAP 40000:INPUT #5;S,B 
MVJ 240 CLOSE #5:GOTO 280 
BYJ 250 IF PEEK(195)<>170 THEN PRINT "ERROR #";PEEK(195):GOTO 1020 
BPJ 260 CLOSE #2:B=-1:S=-1:OPEN #2,8,0,FILE$:CLOSE #2:OPEN #2,8,0,FILE2$ 
SBJ 270 PRINT #2;S;L$;B;L$:CLOSE #2:GOTO 230 
SHJ 280 GOSUB 290:EDIT=0:GOTO 320 
HSJ 290 POKE 84,6:RESTORE 310:FOR J=1 TO 4:GOSUB 220 
MPJ 300 READ A$:GOSUB 640:PRINT A$:PRINT :PRINT :NEXT J:GOSUB 1030:RETURN 
GRJ 310 DATA FULL NAME,ADDRESS,CITY/STATE/ZIP,CATEGORY 
OKJ 320 X=0:POKE 84,5:PRINT B$;:Y=PEEK(84) 
OZJ 330 POKE 694,0:CC=CC+1:M=0:IF PEEK(84)=14 THEN M=24 
ODJ 340 GET #1,K:IF KB$(K,K)="K" AND PEEK(85)<34-M+(K=155) THEN PRINT CHR$(K); 
OZJ 350 IF K>64 AND K<123 THEN 330 
HFJ 360 IF K=27 AND EDIT=1 THEN RETURN 
SJJ 370 IF K=27 THEN 130 
YTJ 380 IF (K=60 OR K=62) AND EDIT=1 THEN TRAP 880:RETURN 
KLJ 390 IF PEEK(85)>34-M. THEN POKE 85,34-M:PRINT B$; 
OOJ 400 IF (K=126 OR K=30) AND PEEK(85)=34-M THEN POKE 85,34-M:PRINT CHR$(K); 
RVJ 410 Y=Y-(K=28)*3:Y=Y+(K=29)*3:Y=Y+(K=155)*3:IF Y<4 OR Y>14 THEN Y=PEEK(84) 
BZJ 420 IF Y<>PEEK(84) THEN POKE 84,Y:PRINT B$; 
KTJ 430 IF PEEK(84)=14 AND PEEK(85)>10 THEN POKE 85,10:PRINT B$; 
ULJ 440 IF K<255 THEN 460 
ATJ 450 X=PEEK(85):POKE 85,34-M:PRINT CHR$(254);:POKE 85,X:PRINT B$; 
CLJ 460 IF K=156 THEN PRINT CHR$(157); 
TDJ 470 IF PEEK(84)=15 AND EDIT THEN GOTO 32,0 
BHJ 480 IF PEEK(84)=15 THEN NAME$=SP$:ADDR$=SP$:CAT$=SP$:CSZ$=SP$:GOTO 500 
BSJ 490 GOTO 330 
YYJ 500 POKE 84,5:INPUT #4;NAME$:POKE 84,8:INPUT #4;ADDR$ 
XZJ 510 POKE 84,11:INPUT #4;CSZ$:POKE 84,14:INPUT #4;CAT$ 
NEJ 520 IF LEN(NAME$)<32 THEN NAME$(32)=SP$ 
HTJ 530 IF LEN(ADDR$)<32 THEN ADDR$(32)=SP$ 
JHJ 540 IF LEN(CSZ$)<32 THEN CSZ$(32)=SP$ 
EFJ 550 IF LEN(CAT$)<8 THEN CAT$(8)=SP$ 
DJJ 560 IF EDIT=1 THEN POINT #2,IS,IB 
GGJ 570 NOTE #2,S1,B1:PRINT #2;S;L$;B;L$;NAME$;L$;ADDR$;L$;CSZ$;L$;CAT$ 
HNJ 580 IF EDIT=1 THEN RETURN 
EHJ 590 S=S1:B=B1 
EUJ 600 POKE 84,21:PRINT "MORE NAMES (Y/N)?";:GET #1,0:IF Q=89 THEN 630 
WWJ 610 OPEN #5,8,0,FILE2$:PRINT #5;S;L$;B;L$;:NOTE #2,S,B 
OIJ 620 PRINT #5;S;L$;B;L$:CLOSE #5:CLOSE #2:GOTO 130 
BOJ 630 PRINT CHR$(125);:GOTO 280 
DLJ 640 FOR I=1 TO LEN(A$):A$(I,I)=CHR$(ASC(A$(I,I))+128):NEXT I:RETURN 
BSJ 650 TRAP 670:OPEN #2,12,0,FILE$:NOTE #2,IS,IB:TRAP 40000 
BYJ 660 CLOSE #5:OPEN #5,4,0,FILE2$:INPUT #5;FS,FB,FS,FB:GOTO 680 
PHJ 670 PRINT "ERROR #";PEEK(195):GOTO 1020 
FNJ 680 POKE 84,19 
RJJ 690 PRINT "CYCLE OR SEARCH (C/S);:GET #1,Q:IF Q=83 THEN SE=1:GOTO 720 
LTJ 700 PRINT CHR$(Q);:IF Q<>67 THEN PRINT CHR$(156);:GOTO 680 
IGJ 710 PRINT :SE=0 
KBJ 720 IF SE=1 THEN GOSUB 890 
NEJ 730 PRINT "PRESS > TO MOVE FORWARD":PRINT "PRESS < TO MOVE BACKWARD" 
EOJ 740 GOSUB 290 
FOJ 750 ST=IS:BT=IB:NOTE #2,IS,IB:INPUT #2;S,B,NAME$,ADDR$,CSZ$,CAT$ 
DJJ 760 POKE 85,2 
RJJ 770 POKE 84,5:PRINT NAME$:POKE 84,8:PRINT ADDR$:POKE 84,11:PRINT CSZ$ 
IUJ 780 POKE 84,14:PRINT CAT$ 
EHJ 790 POKE 84,3:PRINT SP$ 
IOJ 800 CC=0:EDIT=1:GOSUB 320 
HNJ 810 IF CC>1 THEN POKE 85,2:POKE 84,15:PRINT B$;:GOSUB 480 
SJJ 820 IF K=27 THEN 130 
ECJ 830 IF K=60 AND (S>=0 OR B>=0) THEN POINT #2,S,B:GOTO 750 
JTJ 840 IF K=62 THEN NOTE #2,S1,B1:IF S1<>FS OR B1<>FB THEN 750 
NCJ 850 IF K=62 THEN A$="LAST NAME IN FILE":GOTO 1010 
NKJ 860 IF K=60 AND S+B<0 THEN A$="FIRST NAME IN FILE":GOTO 1010 
BHJ 870 GOTO 800 
PFJ 880 TRAP 40000:PRINT "ERROR #";PEEK(195):GOTO 1020 
ROJ 890 POKE 85,2:PRINT E$;"SEARCH BY FULL NAME OR LAST (F/L)?"; 
OAJ 900 GET #1,Q:IF Q<>76 AND Q<>70 THEN 890 
IHJ 910 POKE 85,2:PRINT E$;"SEARCH FOR WHAT NAME";:INPUT A$ 
OVJ 920 POINT #2,IS,IB:TRAP 1000 
OBJ 930 NOTE #2,ST,BT 
OCJ 940 INPUT #2;S,B,NAME$,ADDR$,CSZ$,CAT$ 
IEJ 950 IF Q=70 THEN IF NAME$(1,LEN(A$))<>A$ THEN 930 
TGJ 960 IF Q=70 THEN 990 
NGJ 970 FOR I=1 TO LEN (NAME$):IF NAME$(I,I)<>CHR$(32) THEN NEXT I:GOTO 930 
IJJ 980 TRAP 930:IF NAME$(I+1,I+LEN(A$))<>A$ THEN 930 
YTJ 990 PRINT "FOUND":POINT #2,ST,BT:RETURN 
BOJ 1000 PRINT "NOT FOUND":GOTO 1090 
UVJ 1010 POKE 85,2:POKE 84,3:GOSUB 640:PRINT A$:GOTO 800 
FHJ 1020 FOR I=1 TO 500:NEXT I:GOTO 130 
IRJ 1030 POKE 84,23:A$="PRESS ESC FOR MENU":GOSUB 640:PRINT A$;:POKE 85,2:RETURN 
IHJ 1040 TRAP 1090:OPEN #2,4,0,FILE$:OPEN #5,4,0,FILE2$:INPUT #5;I,I,FS,FB 
SIJ 1050 NOTE #2,S,B:INPUT #2;I,I,NAME$,ADDR$,CSZ$,CAT$ 
UYJ 1060 IF CAT$(1,7)="DELETED" THEN PRINT "*"; 
UHJ 1070 PRINT NAME$:IF PEEK(764)=28 THEN 1100 
FGJ 1080 GOTO 1050 
BRJ 1090 PRINT :GOSUB 1030 
TJJ 1100 GET #1,Q:IF Q<>27 THEN 1100 
DCJ 1110 GOTO 130 
OEJ 1120 NAME$=NUL$:NAME2$=NUL$ 
FBJ 1130 PRINT E$;"NUMBER OF LABELS ACROSS (1/2)?";:GET #1,Q:? CHR$(Q); 
PHJ 1140 IF Q<49 OR Q>50 THEN 1120 
FBJ 1150 Q=Q-49:PRINT :IF Q=0 THEN 1170 
DCJ 1160 PRINT :PRINT "SPACING BETWEEN HORIZONTAL ":PRINT "LABELS (6)";:INPUT HS 
JVJ 1170 PRINT :PRINT "SPACING BETWEEN VERTICAL":PRINT "LABELS (4)";:INPUT VS 
OVJ 1180 CAT2$=SP$:PRINT :PRINT "CATEGORY (ALL) ";:INPUT CAT2$ 
VDJ 1190 IF CAT2$<>"ALL" THEN IF LEN(CAT2$)<8 THEN CAT2$(8,8)=CHR$(32) 
SSJ 1200 PRINT :PRINT "TURN PRINTER ON AND POSITION LABELS." 
FPJ 1210 A$="PRESS RETURN WHEN READY":GOSUB 640:PRINT A$; 
UVJ 1220 INPUT #1;A$:OPEN #5,8,0,"P:" 
TZJ 1230 TRAP 1330:OPEN #2,4,0,FILE$ 
PSJ 1240 INPUT #2;S,B,NAME$,ADDR$,CSZ$,CAT$ 
BRJ 1250 IF CAT2$<>"ALL" AND CAT$<>CAT2$ THEN 1240 
FRJ 1260 IF CAT$(1,7)="DELETED" THEN 1240 
IYJ 1270 IF Q=0 THEN NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$:GOTO 1290 
VUJ 1280 IF LEN(NAME2$)=0 THEN NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$:GOTO 1240 
UIJ 1290 PRINT #5;NAME2$;:IF Q THEN PRINT #5;SP$(1,HS);NAME$;:NAME$=NUL$ 
TKJ 1300 PRINT #5;L$;ADDR2$;:IF Q THEN PRINT #5;SP$(1,HS);ADDR$;:NAME2$=NUL$ 
LOJ 1310 PRINT #5;L$;CSZ2$;:IF Q THEN PRINT #5;SP$(1,HS);CSZ$; 
FLJ 1320 FOR I=1 TO VS:PRINT #5:NEXT I:GOTO 1240 
VRJ 1330 IF LEN(NAME$)*LEN(NAME2$)*Q=0 THEN 130 
PSJ 1340 NAME$=NUL$:TRAP 1330:Q=0:GOTO 1290 
MFJ 1350 OPEN #5,6,0,"D:*.*" 
XCJ 1360 INPUT #5;A$:IF A$(1,1)=CHR$(32) THEN 1360 
DSZ 1370 PRINT A$:GOTO 1090 

[END OF LISTING] 
COMPUTER SHOPPER / JULY 1985 / PAGE 57 

Applying The Atari

by Jeff Brenner

In store for this month is a routine for using a numeric keypad, some much needed info of PEEKs and POKEs on the XL, and a printer utility called ATASCII Lister. But first, let’s look at some readers’ questions...

Reader Mail

Q. I have recently become the proud owner of the Atari 800XL, an Atari 1050 disc drive and an Okimate 10 printer. I purchased the Synapse series, Syncalc, Synfile and Syntrend and this is where my problem lies. My Okimate 10 printer will not print the graphs in the Syntrend program. Mechanically the printer is sound but apparently it is incompatible with the program.

Although Okidata has not responded to my questions, Synapse has told me “You can print your graphs on the Okimate if you use a screen dump program for the Okimate that works with Graphics Mode 8 disk files—possibly available from Okidata.” I called Okidata and they have never heard of “Graphics Mode 8 disk files” and neither have I. However, in an advertisement I did see an ad for “Printwiz” which seems to be what I am looking for, but I am not sure. Is this the answer or is there something else, and if there is what is it?

Robert Lavoie
Chicopee, MA

A “Graphics Mode 8 disk file” is the data of a Graphics 8 screen which has been saved on disk. Therefore, to print Syntrend graphs, you can save the screens to disk and then use a dump program to print the disk files.

While Printwiz, ($29.95 from Allen Macroware, P.O. Box 2205, Redondo Beach, CA 90278, 213-376-4105) is advertised to work with Okidata printers, this does not necessarily mean it is compatible with the newer Okimate printers. Remember, Okidata makes and has made many other printer models besides its new Okimate color units. To find out for sure, I contacted Jerry Allen of Allen Macroware. Allen said that the program seems to work with the Okimate 10 and 20, although it was not specifically designed for those units. He assured me that a fully compatible version would be available by May (1985), which means it should be out by the time you read this.

If you decide to purchase this program, I suggest you enclose a note with your order describing exactly what you need it for: printing the graphs from Syntrend on an Okimate 10.

I have requested an Okimate manual from Okidata and hopefully I’ll be able to publish a Graphics 8 disk file printer dump in a future column. If you can’t wait, though, Printwiz looks like it should help you. In addition to its screen dump capability, the program offers several other useful features.


Q. I’m new to Atari and to Computer Shopper and it’s good to have published resources and personal replies to questions. One question that may be useful to all your readers: For those of us who have invested in the Atari touch tablet (for its more appropriate features for the Atari, as opposed to the Koala), we now find there is no new software (despite earlier rumors) and there are no published listings for incorporating it into our BASIC (or other) programs. How can I program the Touch Tablet into my own programs and other graphic modes? It would be extremely useful if the touch tablet could be made to work with graphics software such as Reston’s Movie Maker and Epyx’s Fun with Art. Is it possible to do this with the touch tablet?

Lattie Smart
Havre de Grace, MD

Q. I was wondering if you know the code of an Atari touch tablet. For example, a joystick code is A=STRIG(0). Could you please give information on the touch tablet code?

Charles Flanders
Ottuma, IA

The touch tablet can be read as if it were two paddles, with PADDLE(0) and PADDLE(1). As you move the stylus horizontally over the pad, PADDLE(0) changes; vertically, PADDLE(1) changes. The values of PADDLE(0) and PADDLE(1) range from 0 through 228. When the stylus is removed from the tablet, both values are zero. The touch tablet buttons can be read in a similar manner as they correspond to the paddles’ triggers. PTRIG(0) or PTRIG(1) returns a value of zero when the corresponding button is depressed, and a value of one when it is not depressed.

By multiplying or dividing PADDLE(0) and PADDLE(1) and subtracting an offset value from them, you can make the pad “fit” into any graphics mode screen.

Since the touch tablet is an extremely sensitive device, the values of PADDLE(0) and PADDLE(1) will often vary slightly even while the stylus is held at one point on the pad. This same effect occurs with a paddle or a light pen. To compensate for this, you must choose a threshold level of movement, below which any movement is ignored. This threshold level is the least value that PADDLE(0) and PADDLE(1) must change by before the movement is recorded on the screen. This usually involves storing the previous PADDLE values, and then checking them against the new values. For example, if you decide on a threshold of five, you might use a program segment as follows:

10 IF ABS(OLDPAD0-PADDLE(0))>=5 THEN GOTO 60 
20 IF ABS(OLDPAD1-PADDLE(1))>=5 THEN GOTO 60 
30 OLDPAD0=PADDLE(0):REM Did not make threshold; store old values. 
40 OLDPAD1=PADDLE(1) 
50 GOTO 10:REM Go back and try again. 
60 REM Routine to plot the changes would go here. 

Lines 10 and 20 check if the difference between either of the new PADDLE values and the corresponding old values (stored in the OLDPAD variables) are at least five. If this minimum is achieved, the plotting is performed. Otherwise, the new PADDLE values become the old values and the program attempts to read the tablet again.

I don’t have room this month, but in a future column I’ll list a complete touch tablet routine in BASIC.

Regarding the use of the touch tablet with other software, programs not specifically designed for the touch tablet generally will not work with it. The touch tablet is a much more complicated device than the joystick and hence requires a more elaborate routine to incorporate it into software. However, programs which are compatible with game paddles can be used with the touch tablet; horizontal and vertical motion on the tablet correspond to the rotation of the first and second paddles, respectively. This is not to say that the touch tablet can effectively replace the paddles; indeed, in most cases, the tablet will be terribly cumbersome to use in place of the paddles.

Typesetter Update

In the November 1984 issue of Computer Shopper I reviewed Typesetter. I gave it a two-star overall rating (fair), and among my many comments were that users should be able to design their own typefaces and that the program should support the higher resolution modes available on the current Epson, Gemini, and compatible printers. Sure enough, the manufacturer (DataArts Software, P.O. Box 1613, Troy, NY 12181) has released a font editor ($24.95) and a new double-density version of Typesetter ($29.95). If you’ve already purchased the lower density version, you can get an update from DataArts for $9.95.

Typesetter offers a variety of additional typefaces (at $11.95 for 5) and has an advantage over The Print Shop ($44.95 from Broderbund Software, 17 Paul Drive, San Rafael, CA 94903) in that it can print lower case characters. Therefore, it is better suited for some applications. But for ease-of-use and specific applications such as printing greeting cards, banners and signs, The Print Shop is hard to beat.

Numeric Keypad

Many readers took advantage of a recent B.G. Micro advertisement in Computer Shopper which offered Atari numeric keypads for $7.95. Considering that the keypad originally sold for over ten times the price, this is a great buy. If you can still get one at this price and haven’t gotten one yet…GET ONE! There is a catch, however; no supporting software or documentation is included except for a schematic and a truth table. Fortunately, I’m here to make it easier for you to apply your Atari, and a numeric keypad is often a welcomed convenience when programming. So get out your Atari CX85 Numeric Keypad, plug it into Port 1, enter the program listed under Program 1, save it, press SYSTEM RESET, and run it! It is necessary to press SYSTEM RESET at any time before the program is run to properly initialize the joystick port.

When you run this BASIC program, it incorporates a machine language program into the Atari’s vertical blank routine, which is executed each time a screen frame is drawn, or 60 times per second. The machine language program decodes any key pressed on the keypad. It then makes the Atari think that the key has been pressed on the keyboard by storing an appropriate value into the keyboard register at location 764. As a result, the keypad functions like your Atari keyboard, except a key pressed on the keypad will not repeat when held down. The YES and NO keys return Y and N respectively, and the +/RETURN key is interpreted as the RETURN key. DELETE is used to back space, and ESCAPE functions like the Atari ESC key.

Once you’ve run Program 1, you can erase it from memory with NEW and proceed with your own BASIC programming. The keypad will be active. If SYSTEM RESET is pressed, it will be necessary to reinitialize the keypad program by typing A=USR(1536).

Program 2 contains the same program except when the YES key is pressed, a comma is printed instead of a Y. You’ll truly appreciate this when entering many lines of data statements. With your right hand on the keypad you can type in the line number, use your left hand to type DATA on the regular keyboard, and use your right hand again to type the numbers, commas and RETURN. Next month you’ll learn how to redefine any key on the numeric keypad.

PROGRAM 1 
FMJ 10 REM NUMERIC KEYPAD PROGRAM #1 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
JWJ 30 TOT=0:FOR I=1536 TO 1607:READ NUM 
OOJ 40 POKE I,NUM:TOT=TOT+I+NUM:NEXT I 
KQJ 50 IF TOT=120212 THEN A=USR(1536):END 
FBJ 60 PRINT "ERROR - CHECK DATA":END 
LCJ 70 DATA 104,162,006,160,011,169 
LUJ 80 DATA 007,032,092,228,096,174 
LAJ 90 DATA 016,208,240,006,202,134 
MWJ 100 DATA 204,076,051,006,165,204 
MIJ 110 DATA 240,002,208,023,230,204 
MJJ 120 DATA 173,000,211,041,015,170 
MBJ 130 DATA 173,001,210,201,001,240 
NCJ 140 DATA 002,162,016,189,054,006 
NLJ 150 DATA 141,252,002,076,098,228 
NAJ 160 DATA 052,024,029,027,035,051 
MWJ 170 DATA 053,048,043,031,030,026 
NHZ 180 DATA 050,034,012,014,028,155 
PROGRAM 2 
FNJ 10 REM NUMERIC KEYPAD PROGRAM #2 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
JWJ 30 TOT=0:FOR I=1536 TO 1607:READ NUM 
OOJ 40 POKE I,NUM:TOT=TOT+I+NUM:NEXT I 
KOJ 50 IF TOT=120201 THEN A=USR(1536):END 
FBJ 60 PRINT "ERROR - CHECK DATA":END 
LCJ 70 DATA 104,162,006,160,011,169 
LUJ 80 DATA 007,032,092,228,096,174 
LAJ 90 DATA 016,208,240,006,202,134 
MWJ 100 DATA 204,076,051,006,165,204 
MIJ 110 DATA 240,002,208,023,230,204 
MJJ 120 DATA 173,000,211,041,015,170 
MBJ 130 DATA 173,001,210,201,001,240 
NCJ 140 DATA 002,162,016,189,054,006 
NLJ 150 DATA 141,252,002,076,098,228 
NAJ 160 DATA 052,024,029,027,035,051 
HUJ 170 DATA 053,048,032,031,030,026 
NHZ 180 DATA 050,034,012,014,028,155 

XL Pokes and Peeks

As I promised last month, I’m including a list of a few PEEKs and POKEs unique to the XL. Table 1 shows whether the location is generally PEEKed or POKEd, the values to POKE and their effects or the meaning of values which are PEEKed. We’ll get into the more complicated PEEKs/POKEs in future months.

SELECTED PEEKS AND POKES FOR THE XL
PEEK/POKE LOCATION(S) NAME VALUE=EFFECT/MEANING
PEEK/POKE 621 KEYDIS 55 =Keyboard use disabled.
0 =Keyboard use enabled.
POKE 622 FINE 255=Prepare for fine scrolling.
0=Prepare for normal scrolling.
Takes effect after GRAPHICS 0 command.
PEEK/POKE 731 NOCLIK 255=Keyboard click disabled.
0 =Keyboard click enabled.
PEEK 732 HELPFG 17=Help key pressed.
Clear with POKE 732,0 after reading.
PEEK/POKE 756 CHBAS 224=Normal character set.
204=International character set.
“Table 1”

ATASCII Lister

Listing BASIC programs to the printer can present a problem to the programmer, especially when the program is written in Atari BASIC. The reason is that the Atari features numerous non-ASCII characters which can be placed in a program. ASCII characters form the American Standard Code for Information Interchange. Virtually all printers can print the ASCII characters. “ATASCII” is short for Atari ASCII, and includes most of the ASCII characters but also contains Atari’s special characters. These characters include all the control key graphics characters, the inverse video characters, and the cursor control characters. Often a program uses inverse video to highlight words, or a wide variety of characters representing machine language code in a USR statement. When these are listed to the printer, the printer might substitute its own characters for the codes it receives, or it might interpret some of the characters as control codes and do unpredictable things.

The non-printable Atari characters presented a problem to me, as a programmer, when copyrighting Software. To obtain a copyright, the Library of Congress requires, among other things, a listing of the program. (Unfortunately, they don’t deal with disks or cassettes yet.) However, my program was 20% BASIC and 80% machine language stored as characters in USR statements. I needed a routine to print these characters, and thus the ATASCII Lister evolved. It can, of course, be used for any application requiring an exact listing of an Atari program.

The ATASCII Lister uses the high-resolution graphics capability available on most of today’s printers to print the Atari’s characters. It will work with the Epson MX-80, MX-100, FX-80, RX-80, Gemini 10X, 15X or graphics-compatible printer.

10 REM This program listing was generated by ATASCII Lister. 
20 REN Note how all of the Atari's characters can be printed. 
30 REM Even graphics characters are printed: 
40 REM ...... 
50 REM Control characters too: 
60 REM ...... 
"Figure 1" 

Using the Program

Enter the program and SAVE it to cassette or disk. Next, load in the program that you wish to list and LIST it to cassette or disk with the LIST“C” or LIST“D:filename” command. When you SAVE a program, the program is saved in its tokenized form, which means that BASIC words such as PRINT and GOTO saved as single byte codes. By LISTing the program, each character is saved as is (i.e. PRINT is saved as five bytes for the “P,” “R,” “I,” “N,” and “T”), thus making it readable by our ATASCII Lister program.

ATASCII Lister 

EEJ 10 REM ATASCII LISTER 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
NTJ 30 OPEN #3,8,0,"P:" 
KYJ 40 RESTORE 290:FOR I=0 TO 218:READ N:POKE 1536+I,N:NEXT I 
RJJ 50 DIM N$(15),DN$(17),TMP$(2040),C$(120),D$(1),E$(1),MS$(30):POKE 766,0 
HGJ 60 DN$="D:":OPEN #1,4,0,"E:" 
VVJ 70 PRINT "CASSETTE OR DISK";:INPUT E$:IF E$="C" THEN DN$="C":GOTO 90 
QCJ 80 PRINT "FILENAME: D:";:INPUT #1;N$:IF N$(1,2)="D:" THEN N$=N$(3,LEN(N$)) 
AHJ 90 DN$ (LEN(DN$)+1)=N$:OPEN #2,4,0,DN$:GOTO 110 
LIJ 100 PRINT "ERROR #";PEEK(195):GOTO 80 
IZJ 110 TRAP 110:PRINT "DENSITY (1-2) :";:INPUT #1;D:IF D<1 OR D>2 THEN 110 
YZJ 120 RESTORE 120:FOR I=1 TO D:READ C:NEXT I:D$=CHR$(C):DATA 75,76 
HZJ 130 TRAP 130:PRINT "CHARACTERS PER LINE (NORM=38) ";:INPUT #1;CPL 
OFJ 140 CL=CPL*8:H1=INT(CL/256):L1=CL-H1*256 
MQJ 150 TRAP 260:POKE 766,1:INPUT #2;C$:PRINT C$:LN=LEN(C$):C=1 
LVJ 160 C$(LEN(C$)+1)=CHR$(155):TMP$(1)=CHR$(0):TMP$(2040)=CHR$(0):TMP$(2)=TMP$ 
SXJ 170 A=USR(1536,ADR(C$),ADR(TMP$)):I=0:L=1:A=USR(1716,ADR(TMP$)) 
IEJ 180 TRAP 270:PRINT #3;CHR$(27);CHR$(64);:I=0:L=1 
HPJ 190 IF LN<(CPL+1) THEN 230 
GTJ 200 LN=LN-CPL 
EXJ 210 TRAP 270:PRINT #3;CHR$(27);CHR$(64);CHR$(27);D$;CHR$(L1);CHR$(H1); 
NAJ 220 PRINT #3;TMP$(I*8+1,(I+CPL)*8);CHR$(10);:I=I+CPL:GOTO 190 
ABJ 230 K=LN*8:H=INT(K/256):L=K-H*256 
BGJ 240 TRAP 270:PRINT #3;CHR$(27);CHR$(64);CHR$(27);D$;CHR$(L);CHR$(H); 
HHJ 250 PRINT #3;TMP$(I*8+1,I*8+K+1);CHR$(10);:GOTO 150 
MEJ 260 PRINT "END OF LISTING. ":CLOSE #3:END 
GJJ 270 PRINT "RESET PRINTER - PRESS RETURN":INPUT #1;E$ 
VEJ 280 GOTO PEEK(186)+256*PEEK(187) 
JJJ 290 DATA 104,104,133,205,104,133,204,104,133,207,104,133,206,169,0,168 
AOJ 300 DATA 133,203,177,204,170,232,224,156,208,3,76,169,6,10,38,203 
UEJ 310 DATA 74,201,96,176,22,201,64,176,9,201,32,176,11,105,64,76 
OMJ 320 DATA 59,6,56,233,32,76,59,6,56,233,32,133,208,169,0,133 
MBJ 330 DATA 209,24,162,3,24,38,208,38,209,202,208,248,24,173,244,2 
COJ 340 DATA 101,209,133,209,160,7,162,1,177,208,157,171,6,136,232,224 
SOJ 350 DATA 9,208,245,169,8,141,170,6,160,0,162,8,177,206,62,171 
CHJ 360 DATA 6,42,145,206,202,208,245,165,203,240,6,177,206,73,255,145 
DVJ 370 DATA 206,24,165,206,105,1,133,206,165,207,105,0,133,207,206,170 
PTJ 380 DATA 6,173,170,6,240,3,76,106,$,24,165,204,105,1,133,204 
BPJ 390 DATA 165,205,105,0,133,205,76,13,6,96,0,0,0,0,0,0 
GMJ 400 DATA 0,0,0,0 
JJJ 410 DATA 104,104,133,205,104,133,204,169,154,133,206,230,206,162,8,160 
CXJ 420 DATA 0,177,204,197,206,208,4,169,151,145,204,200,192,0,208,241 
TOZ 430 DATA 230,205,202,208,234,96,15 
Figure 2 

Once the program has been listed, load the ATASCII Lister and RUN it. You are asked whether you are using a cassette or disk. If you are loading from disk, you are asked for the filename.

Next, you are asked to enter the print density. This can be a value of one or two, which corresponds to a resolution of 60 dots per inch (d.p.i.) and 120 d.p.i., respectively. Quadruple density produces characters too thin to be legible and is thus not supported by the program. Figure 1 shows a sample program listing printed by ATASCII Lister in density 2.

Next, you are asked for the number of characters per line. Make sure you don’t select too many characters per line for the particular resolution you chose. Each character requires eight dots. Thus, an eight-inch line printer using a 60 d.p.i. resolution can print a total of 480 (8 inches x 60 d.p.i.) dots, or 60 characters per line (480 dots per line/8 dots per character). This computation can be used to determine the maximum number of characters per line for your particular printer and for the resolution you are using.

When the number of characters per line has been entered, the listing will be printed — in the Atari’s own characters! If you get an “ERROR - CHECK DATA” message, then check the program carefully for errors. You’ll get a “RESET PRINTER - PRESS RETURN” message if your printer goes off-line for some reason, such as when the paper is out. Press RETURN when the printer is back on-line.

The ATASCII Lister makes your printer and your Atari fully compatible. No longer will you have restrictions when you need to list programs to your printer.

Next Month

Well learn how ATASCII Lister works, enter a program to read a light pen, learn how to redefine the keys of the numeric keypad, answer more reader mail, and look at some other good stuff.

Reader’s questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A cassette or diskette of any program listed in this column is available from the author for postpaid. Specify DOS 2 or DOS 3 when requesting a diskette.

Program Perfect is a utility used to check for typing errors in programs entered from this column. Readers may send a SASE for a listing or $5.00 for a cassette or diskette.

Address all correspondence to:

Jeff Brenner’s
“Applying The Atari”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
(Atari is a trademark of Atari Corp.)
COMPUTER SHOPPER / AUGUST 1985 / PAGE 54 

Applying The Atari

by Jeff Brenner

This month marks the first anniversary of the “Applying The Atari” column. A lot of work has gone into this column over the past year to develop practical applications for your Atari for the home, office and school, and to teach you more about the capabilities of this versatile machine. Of course, some bugs and errors have been made along the way, but the overwhelming support from individual readers and from users groups indicates that this column has been a success and, makes writing it all the more worthwhile to me personally.

Responses to this column in the form of questions, contributions and comments from readers have increased more than ten fold over the past six months and indeed this is a healthy sign. Hopefully more advertisers for Atari products will recognize this growing audience and will place their ads in Computer Shopper. This will not only add more interest to the Atari section (many Atari owners read computer magazines for the ads as much as the articles) but will enable Computer Shopper to devote more space for Atari articles in the future.

The new Atari computers have created a great deal of enthusiasm among Atari fans and among many software developers. Yet with the Commodore Amiga slated to be out by the time you read this, there is some caution and concern out there as Computer War II, battle of the Mac lookalikes approaches. In any event, I won’t be giving up any column space to programs for the new Atari units until there is a significant number of them out there.

Even more exciting stuff is in store for your Atari in the months ahead. In fact, next month we embark upon our grandest project ever, an artificial intelligence program. This month, we’ll discover how ATASCII Lister works, incorporate a light pen into a BASIC drawing program, and redefine keys on the Atari numeric keypad. Ah, but first your letters…

Reader Mail

Q. I have an Atari 800XL and would like to use it with an Olympia Compact 2 built-in Centronics parallel port. Do you know of any interface cable which would connect the Olympia Compact 2 to the parallel processor bus which is in the back of the Atari 800XL? In general, what interfaces work well between the Atari 800XL and printers with Centronics parallel ports?

Jack Epstein
Kingston, NY

To my knowledge, there are no printer interfaces available which connect to the parallel processor bus of the XL. Unfortunately, the newer XE line, which replaces the XL computers, does not have this parallel processor bus, which makes it unlikely that any products will be developed to utilize this bus. The available interfaces plug into the serial port on the Atari.

Any Atari printer interface should work well between your XL and your Olympia. An interface either works or doesn’t work, so there is no real way to judge how good one is compared to another. You can, however, spend a little extra to get an interface equipped with a buffer. This would allow the computer to quickly transfer its data to the buffer and then be free for programming while the buffer independently sends the data at a slower rate to the printer. Some interfaces for the Atari for parallel printers (aside from Atari’s 850): ape Face, Microbits 1150, Cardco AT, Interfast.


A suggestion for two paragraphs in your next “Applying The Atari” column:

One would cover how the multi-luminance program presented in the May 1985 issue on page 54 could have Program Perfect checksums listed as both programs contain line numbers 30000 - 30130. (It is not a pretty sight watching one program eat up the other.)

The other paragraph, of course, would cover why you didn’t tell us your method in the June issue.

Your column is interesting and informative and I enjoy reading it. I hope Atari’s new machinery revives all kinds of interest in Atari.

Donald McEntee
Webster Groves, MO

Indeed, both the multi-luminance program and Program Perfect contain identical line numbers. You are one of the few readers who realized that the problem in entering typewriter/printer which has a the multi-luminance program was due to the coinciding line numbers and not from an error in Program Perfect itself.

The multi-luminance program was created prior to the development of Program Perfect and unfortunately the conflicting line numbers were not apparent until after publication. I apologize for any inconvenience this may have caused you or other readers.

Each line of the multi-luminance program that is entered will take the place of a line of the executing Program Perfect — a mess. The whole ordeal eventually ends in an error message. I agree that the sight of one program being consumed by another is ugly, at best. To the novice Atarian, such an occurrence can be a terrifying experience. Listed under the heading, “Multi-Luminance Revision,” is a renumbered version of the original program. This version can be entered with Program Perfect. Note that this renumbered version begins at line 25000. Therefore, if the demonstration program (Program 2 in May column) is being used with this renumbered version, line 20 of the demo should be changed from:

20 GRAPHICS 0:GOSUB 30000:RESTORE 50 
to:
20 GRAPHICS 0:GOSUB 25000:RESTORE 50 

I only wish this could have happened in the April issue so I could have dismissed it as an April Fools’ joke. Oh well...there’s always next year!

MULTI-LUMINANCE PROGRAM 

KPJ 25000 REM MULTI-LUMINANCE PROGRAM 
KQJ 25010 REM BY JEFF BRENNER 
CMJ 25020 RESTORE 25070:I=0 
FPJ 25030 READ NUM:IF NUM=-1 THEN 25050 
YLJ 25040 TOT=TOT+NUM:+1:POKE 1664+I,NUM:I=I+1:GOTO 25030 
REJ 25050 IF TOT<>13108 THEN PRINT "ERROR-CHECK PROGRAM":STOP 
NRJ 25060 A=USR(1664):RETURN 
TXJ 25070 DATA 104,173,48,2,133,204,173,49,2,133,205,160,26,169,10 
XTJ 25080 DATA 153,230,6,136,208,250,160,0,177,204,9,128,145,204,160 
UOJ 25090 DATA 3,177,204,9,128,145,204,160,6,177,204,9,128,145,204 
OFJ 25100 DATA 200,192,28,208,245,169,197,141,0,2,169,6,141,1,2 
TTJ 25110 DATA 173,14,212,9,128,141,14,212,96,72,152,72,173,11,212 
TFJ 25120 DATA 201,7,240,18,201,8,240,14,230,204,164,204,185,231,6 
SFZ 25130 DATA 141,23,208,104,168,104,64,169,0,133,204,240,238,-1 

First I want to state how much I enjoy your column and the friendly attitude of your approach. I think the software presented is intelligently selected and more useful to the serious beginner than the childish nonsense found in the pop Atari mags. Pity I can’t do an accurate job of entering the programs.

Part of the problem, in addition to my own shortcomings, is the minisclule amount of space allotted for the program listing. I cannot read the list without a magnifier and then I find it difficult to debug and/or adapt due to the lack of REM statements. All of this I attribute to the publishers of Computer periodicals selling Atari down the river and counting them out instead of down. Their lack of support for Jack Tramiel is self-defeating because he is one dynamic guy who can breathe new life into the dying so called “low-end” computer industry.

I believe that in the future the Atari section will be significantly expanded as well as the respect the computer so greatly deserves.

Donald Nadler
New Hempstead, NY

Many readers have written that the small space provided for the program listings makes it difficult to read the programs. However, enlarging the program listing would mean less room for other items in the column. Program Perfect was developed to help readers to enter the programs and I highly recommend that you take advantage of this utility when you enter programs from this column.

CHESSBOARD PAYOFF 

MGJ 10 REM CHESSBOARD PAYOFF 
VCJ 20 REM BY CARL WADE 
UTJ 30 OPEN #1,12,0,"E:":PRINT "Press RETURN to continue" 
AXJ 40 N=1:POW=1:SUM=1:H=100:T=10*H:MIL=T*T:BIL=MIL*T:TRIL=BIL*T 
GZJ 50 DIM SP$(1):SP$=CHR$(32):TRAP 70:INPUT #1;ZK 
EAJ 60 N=N+1:POW=POW*2:SUM=SUM+POW 
YWJ 70 PRINT N;".";SP$;:IF SUM<H*TRIL THEN 90 
NLJ 80 PRINT SP$;"$";INT(SUM/H)/TRIL;SP$;"TRILLION":GOTO 170 
GNJ 90 IF SUM<H*BIL THEN 110 
HIJ 100 PRINT SP$;"$";INT(SUM/H)/BIL;SP$;"BILLION:":GOTO 170 
IPJ 110 IF SUM<H*MIL THEN 130 
IGJ 120 PRINT SP$;"$";INT(SUM/H)/MIL;SP$;"MILLION":GOTO 170 
XLJ 130 IF SUM<H THEN 150 
AKJ 140 PRINT SP$;"$";SUM/H:GOTO 170 
XFJ 150 PRINT SUM;SP$;"CENT";:IF SUM>1 THEN PRINT "S"; 
WSJ 160 PRINT 
PVZ 170 TRAP 60:INPUT #1,ZK:END 

I agree with your comments about the lack of support given to Atari by most computer magazines. Unfortunately, this has always been the case, Names such as “game machine” and “toy computer,” branded on the Atari in its first years of existence, have obscured the true power and versatility of this machine. I feel, though, that there is currently some genuine interest and support among these magazines for Jack Tramiel and for the new Atari. If the new Atari computers prove successful, we may witness a change in the way the Atari computers (the new ones, at least) are treated. Meanwhile, we should give much credit to Computer Shopper’s editor-in-chief, Stan Veit, for realizing the existence of a large base of Atari users in need of information and for providing a section in this magazine for them.

I too hope that, with the rebirth of Atari, we’ll see a growth in Atari related articles and advertisements in this magazine and in others as well.

Chess is said to have originated in India, and one of its early proponents is said to have taught his king how to play. The monarch, pleased with his new knowledge, asked his teacher to name his own payment, and the teacher made a very simple request. He asked to have a grain of wheat placed on the first square of the chessboard, two grains of wheat on the second square, four on the square after that, and so on, doubling the previous amount of each successive square. That seemed like an easy request and the satrap ordered his aides to start carrying it out, but of course they could not finish. There was not enough wheat in the whole kingdom.

I thought that you or your readers might like to see a simple BASIC program that describes the situation. I have used pennies instead of grains of wheat, and the amount soon exceeds the Gross National Product. To use the program, just press the RETURN key repeatedly and the accumulated total for successive squares will appear on the screen. To end the program just type in 99 or any other number before pressing the RETURN key.

Carl Wade
Fort Collins, CO

The program is listed under the “Chessboard Payoff” heading. You are being sent a 3-D Holographic Sticker for your interesting contribution. Thanks for writing.

ATASCII Lister

Let’s get an idea of how last month’s ATASCII Lister program worked.

The ATASCII Lister does not require any character data of its own, as it uses the data stored in the Atari’s character-set ROM. Actually, ATASCII Lister lists programs in the character set pointed to by location 756 (the character base address), thus enabling you to list programs in your own custom character set, or in any character set you load into the computer.

ATASCII Lister reads a program from cassette or disk. Through a machine language subroutine, each character is converted into a series of numbers which the printer interprets as graphics data. The printed graphics look exactly like the Atari’s characters with one exception — the inverse “A.” It just so happens that when the inverse “A” is broken down into bytes to be sent to the printer, two of the bytes equal 155. This value is automatically converted to a 13 before it reaches the printer, since the Atari’s line feed code is 155, and the printer is 13. The altered pieces of data would make a mess of the character. To solve this problem, the bar of the inverse “A” is moved up one line by the program. Figure 1 illustrates this. The result is a routine which can list programs that utilize all the Atari’s special characters.

 ■ ■ ■ ■ ■ ■ ■ ■  128  ■ ■ ■ ■ ■ ■ ■ ■ 
 ■ ■ ■ □ □ ■ ■ ■  64   ■ ■ ■ □ □ ■ ■ ■ 
 ■ ■ □ □ □ □ ■ ■  32   ■ ■ □ □ □ □ ■ ■ 
 ■ □ □ ■ ■ □ □ ■  16   ■ □ □ ■ ■ □ □ ■ 
 ■ □ □ ■ ■ □ □ ■   8   ■ □ □ □ □ □ □ ■ 
 ■ □ □ □ □ □ □ ■   4   ■ □ □ ■ ■ □ □ ■ 
 ■ □ □ ■ ■ □ □ ■   2   ■ □ □ ■ ■ □ □ ■ 
 ■ ■ ■ ■ ■ ■ ■ ■   1   ■ ■ ■ ■ ■ ■ ■ ■ 
 2 2 1 1 1 1 2 2       2 2 1 1 1 1 2 2 
 5 2 9 5 5 9 2 5       5 2 9 5 5 9 2 5 
 5 5 3 5 5 3 5 5       5 5 3 1 1 3 5 5 

NORMAL INVERSE "A"  REVISED INVERSE "A" 

Light Pen Drawing Program

Last month we discussed incorporating a touch tablet into your BASIC programs. This month, a program is presented to allow you to draw with a light pen. Many of the techniques mentioned in last month’s column for reading the touch tablet have been employed in this light pen program. Of course, you must have a light pen in order to use the program. The program is listed under the “Light Pen Program” heading.

This program lets you draw in four colors on a Graphics 7 mode screen. If you have the Graphics Dump Utility listed in the March 1985 column, you could merge it with the Light Pen Program and print your artistic creations on a printer.

Before you run the program, you must determine a way for the computer to detect when you press the button on the light pen, since some light pens differ in this regard. To do this, type in this short program:

10 IF STICK(0)<>15 THEN PRINT "IF STICK(0)=15":END 
20 IF STRIG(0)=0 THEN PRINT "IF STRIG(0)=1":END 
30 IF PTRIG(0)=0 THEN PRINT "IF PTRIG(0)=1":END 
140 GOTO 10 

RUN this program, plug in the light pen, and press the button on the light pen. If IF STICK(0) = 15 is printed, you can use the light pen program as listed. If IF STRIG(0)=1 is printed, then replace the IF STICK(0)<>15 in line 100 of the Light Pen Program with this segment so that line 100 reads as follows:

100 IF STRIG(0)=1 THEN OX=200:FLAG=0:GOTO 90 

If IF PTRIG(0)=1 is printed, then change line 100 to read as follows:

100 IF PTRIG(0)=1 THEN OX=200:FLAG=0:GOTO 90 

Now the program is ready for use.

Turn the brightness level of your television up, plug in the light pen, unplug everything else from the other joystick ports and RUN the Light Pen Program. You’ll be asked to position the light pen on a white dot in the center of the screen. While holding the light pen over this dot, press RETURN. This sets the light pen for proper vertical and horizontal alignment.

Now the screen will turn white since the light pen can only read bright colors on the screen. Put the light pen to the screen and press the button when you want to draw. You can press 1, 2 or 3 for the colors sets by lines 40, 50 and 60 respectively. Pressing 4 gives you the background color and its effect is to erase the other colors. You can change the SETCOLOR statements on lines 40 through 60 to obtain the colors of your choice, but remember to use bright colors so that the light pen will be able to read them. If you’ve added the Graphics Dump Utility, you can press P to get a printout of the screen. If using the MPP-1100 printer interface (the kind that plugs into the third joystick port of the Atari 400 or 800) you’ll have to unplug it from the joystick port while using the light pen. But be sure to plug it back in again when you are ready to print. Those using other interfaces need not worry about this. If you want to use your own BASIC graphics dump utility, merge your utility with the Light Pen Program and change the GOSUB 31000 in line 210 to GOSUB to the beginning line of your graphics dump. Or, if you have a machine language commercial printer dump utility, follow the directions for using it in conjunction with a BASIC program.

The sensitivity of the program to the light pen can be decreased or increased by respectively lowering or raising the value for the variable THRESHOLD on line 80. Generally, the better the quality of your light pen, the lower you should be able to set the THRESHOLD. As described last month, the threshold value is the amount of movement the light pen must register before the movement is actually plotted on the screen. If you are getting erratic plotting on the screen when you draw, you should raise the THRESHOLD level.

Figure 2 shows what happens when Jeff Brenner gets his hands on a light pen. The drawings were created with the Light Pen Program and printed out using the Graphics Dump Utility. (Yes, the third drawing was an attempt at the Atari logo.)

Have fun. If you print anything really nice, send it in and we’ll try to print it.

LIGHT PEN PROGRAM 
IAJ 10 REM LIGHT PEN DRAWING PROGRAM 
IIJ 20 REM COPYRIGHT 1985 JB 
LIJ 30 OPEN #2,4,0,"K:":GOSUB 230:GRAPHICS 7+16:COL=1 
QMJ 40 SETCOLOR 0,4,10 
BSJ 50 SETCOLOR 1,8,10 
SHJ 60 SETCOLOR 2,13,10 
QTJ 70 SETCOLOR 4,0,14 
LIJ 80 THRESHOLD=4 
SAJ 90 X=PEEK(564):Y=PEEK(565):IF PEEK(764)<255 THEN 200 
FEJ 100 IF STICK(0)=15 THEN OX=200:FLAG=0:GOTO 90 
NQJ 110 IF OLDX+OLDY=0 THEN 140 
UXJ 120 IF ABS(OX-X)<THRESHOLD AND ABS(OY-Y)<THRESHOLD THEN 90 
IYJ 130 OX=X:OY=Y 
YOJ 140 POSX=X-XFIX:POSY=Y-YFIX 
TFJ 150 TRAP 90:COLOR COL:PLOT POSX,POSY 
DHJ 160 IF FLAG THEN PLOT OLDX, OLDY 
DSJ 170 DRAWTO POSX,POSY 
GDJ 180 OLDX=POSX:OLDY=POSY:FLAG=1 
YOJ 190 GOTO 90 
DQJ 200 GET #2,N:N=N-48:IF N>0 AND N<5 THEN COL=N 
IJJ 210 IF CHR$(N+48)="P" THEN GOSUB 31000 
YOJ 220 GOTO 90 
FHJ 230 GRAPHICS 7:POKE 710,0:POKE 708,14:COLOR I:PLOT 80,48 
TPJ 240 PRINT "POSITION LIGHT PEN ON DOT AND PRESS" 
DDJ 250 PRINT "PRESS THE SPACE BAR. " 
AHJ 260 GET #2,N 
HHJ 270 X=PEEK(564):Y=PEEK(565) 
QSJ 280 XFIX=PEEK(564)-80:YFIX=PEEK(565)-48 
BRZ 290 RETURN 

Programmable Numeric Keypad

Last month we typed in a program which let us use the Atari Numeric Keypad while programming. This month’s program lets you redefine any of the keys on the keypad to your liking.

Type in the program listed under “Programmable Keypad” and plug in your Atari CX85 keypad. Before you run the program, press SYSTEM RESET to reset a register used by the keypad.

When the program is run, all the keys on the keypad will be listed on the left side of the screen. The computer will print “PRESS KEYPAD.” Press the key on the keypad that you want to redefine. The particular key you press is highlighted on the left side of the screen and the message “PRESS KEYBOARD” is displayed. Now press the key on the keyboard that is to be defined by the key you pressed on the keypad. This key will be printed on the right side of the screen. You can program keys to function as the inverse video and the caps/lower keys as well as any of the others.

You only need to program the keys you wish to redefine. Keys which you do not program will retain their standard characters. Hence, you need not reprogram numbers one through nine, for example, each time you program the keypad.

When you’ve finished programming, press the START key and the redefined key data will be saved in memory and the program will end. Pressing keys on the keypad will now display the redefined characters.

Next Month

We’ll look at more reader mail, plus we’ll enter an amazing artificial intelligence program. You won’t want to miss this one.

Readers questions, comments and original contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A cassette or diskette of the programs listed in this month’s column is available from the author for $5.00, postpaid. Specify DOS 2 or DOS 3 when requesting a diskette.

Program Perfect is a utility used to check for typing errors in programs entered from this column. Readers may send a SASE for a listing or $5.00 for a cassette or diskette.

Address all correspondence to:

Jeff Brenner’s
“Applying The Atari 8/85”
C/O Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
PROGRAMMABLE KEYPAD 

QPJ 10 REM PROGRAMMABLE NUMERIC KEYPAD 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
PHJ 30 DIM DEE(16),PR(16),KEY$(10),SP$(10):OPEN #1,4,0,"K:" 
XGJ 40 SP$(1)=CHR$(32):SP$(10)=CHR$(32):SP$(2)=SP$ 
PHJ 50 RESTORE 200:FOR I=0 TO 16 
SNJ 60 READ NUM:DEF(I)=NUM:PR(I)=-1:NEXT I 
JOJ 70 RESTORE :TOT=0:FOR I=1536 TO 1607:READ NUM 
QSJ 80 POKE I,NUM:TOT=TOT+I+NUM:NEXT I 
VPJ 90 IF TOT=120212 THEN A=USR(1536):GOTO 250 
GSJ 100 PRINT "ERROR - CHECK DATA":END 
HTJ 110 DATA 104,162,006,160,011,169 
NLJ 120 DATA 007,032,092,228,096,174 
HRJ 130 DATA 016,208,240,006,202,134 
NAJ 140 DATA 204,076,051,006,165,204 
HHJ 150 DATA 240,002,208,023,230,204 
HNJ 160 DATA 173,000,211,041,015,170 
HFJ 170 DATA 173,001,210,201,001,240 
NGJ 180 DATA 002,162,016,189,054,006 
NPJ 190 DATA 141,252,002,076,098,228 
HVJ 200 DATA 052,024,029,027,035,051 
HRJ 210 DATA 053,048,043,031,030,026 
HRJ 220 DATA 050,034,012,014,028,155 
CPJ 230 DATA DELETE,4,5,6,NO,7,8,9,YES 
ALJ 240 DATA 1,2,3,0,.,+ENTER,-,ESCAPE 
ADJ 250 PRINT CHR$(125);"KEYPAD":CHR$(127);"KEYBOARD":PRINT 
IHJ 260 FOR I=0 TO 16:READ KEY$:PRINT KEY$;:PRINT CHR$(127); 
PLJ 270 IF PR(I)>-1 THEN PRINT CHR$(PR(I)); 
RPJ 280 PRINT :NEXT I 
NAJ 290 POKE 84,23:PRINT "PRESS START WHEN FINISHED"; 
HDJ 300 POKE 85,2:POKE 84,21:PRINT CHR$(156);CHR$(157);"PRESS KEYPAD"; 
EFJ 310 GOSUB 450 
IHJ 320 FOR I=0 TO 16:IF DEF(I)<>PEEK(764) THEN NEXT I:GOTO 300 
JRJ 330 RESTORE 230:FOR J=0 TO I:READ KEY$:NEXT J 
BCJ 340 POKE 85,2:POKE 84,I+2:FOR K=1 TO LEN(KEY$):CHR=ASC(KEY$(K,K)) 
XTJ 350 PRINT CHR$(CHR+128);:NEXT K:POKE 84,21 
FNJ 360 POKE 85,2:PRINT "PRESS KEYBOARD"; 
TAJ 370 GOSUB 450:PR(I)=PEEK(764):POKE 84,I+2:POKE 85,15 
XYJ 380 IF PR(I)=39 THEN PRINT "INV";:GOTO 440 
CCJ 390 IF PR(I)=60 THEN PRINT "LOWR";:GOTO 440 
COJ 400 IF PR(I)=124 THEN PRINT "CAPS";:GOTO 440 
ADJ 410 GET #1,N 
ATJ 420 IF N=155 THEN PRINT "RETURN";:GOTO 440 
CAJ 430 POKE 766,1:PRINT CHR$(N);SP$;:POKE 766,0 
FRJ 440 POKE 85,2:PRINT KEY$;:GOTO 300 
JHJ 450 POKE 764,255 
NHJ 460 IF PEEK(53279)=6 THEN 490 
NHJ 470 IF PEEK(764)=255 THEN 460 
BCJ 480 RETURN 
RNJ 490 FOR I=0 TO 16:IF PR(I)>-1 THEN POKE 1590+I,PR(I) 
XRJ 500 NEXT I 
TOJ 510 A=USR(1536):PRINT :PRINT :PRINT :PRINT "PROGRAMMING COMPLETED" 
QIZ 520 END 
COMPUTER SHOPPER / SEPTEMBER 1985 / PAGE 59 

Applying The Atari

by Jeff Brenner

Our feature program this month is a long one and will take some time to type in, but I think you’ll enjoy it. I had to forcefully pull myself away from playing with it so I could write this month’s column. Before we discover what this program is, let’s answer some reader mail and take care of a few other matters.

Reader Mail

Q. I have an Atari 800XL, the AtariWriter cartridge and a Gorilla Banana Printer. I understand there is some sort of utility floating around (a driver routine?) that makes the AtariWriter cartridge and the Banana more compatible. If you know anything about it, I would appreciate some information.

Jim Cassoutt
Pensacola, FL

Originally, Atari was to distribute these “printer driver routines” for various printers through the Atari Program Exchange. However, the Atari Program Exchange has long been shut down and Atari users have since been complaining that they are unable to get these routines.

But there is still hope. A company called At-A-Glance (86 Ridgedale Avenue, Cedar Knolls, NJ 07927) produces a “Printer Formatted Data Disk,” essentially the driver routine you are interested in. The price is $14.95. The company claims that this program “will give you all the available options possible with your printer and AtariWriter.” Their ad lists the availability of versions for the following dot-matrix printers: “BMC, C-ITOH, EPSON, GEMINI, LEGEND, OKIDATA, PANASONIC, ATARI, RITEMAN, CITIZEN, plus others.” Hopefully, the “plus others” includes your Banana Gorilla.

I recommend that you write a letter to them before ordering to see whether a version is available specifically for your model.


Q. My wife and I have recently gotten involved in doing lineage charts (genealogical trees) of our families and realized it would be so much simpler to do this on our computer (Atari 800XL).

Somewhere I remember seeing some software just for that purpose, but was disappointed to find it was for a computer other than my Atari. It may have been for a Commodore 64 but I’m not exactly sure of that. However, if you know of one for the Atari, please let me know or ask your readers if they know of such a program.

Darwin K. Garrison
Lee’s Summit, MO

Although I have seen several genealogical programs for other computers, I am sorry to say I am not familiar with any available for the Atari. The following companies have produced genealogical software for other computers:

Acorn Software Products, 7655 Leesburg Pike, Falls Church, VA 22043: Family Tree
Array Systems, P.O. Box 295, Brigham City, UT 84302: Treesearch
Comsoft, 655 Maybell Avenue, Palo Alto, CA 94306: Roots
Quinsept, P.O. Box 216, Lexington, MA 02173: Family Roots
Soft-Gene, 11 John Swift Road, Acton, MA 01720: Ancestry
Wagstaff Computer Services, 1050 E. 800 South, Provo, UT 84601: Family Ties

Most of these addresses are more than a year old, and in that time versions might have been developed for the Atari. (Several of these companies have probably gone out of business during this time as well.) I recommend that you write to these companies and ask if an Atari version is available.

You also might be interested in the following companies:

Data Transfer Associates, Inc., 5102 Pommeroy Drive, Fairfax, VA 22032, (703) 938-8490: Publishes bimonthly newsletter, Genealogical Computing
National Genealogical Society’s Computer Interest Group, 1921 Sunderland Place, NW Washington, DC 20036
Posey Enterprises, P.O. Box 338, Orem, UT 84057, (801) 374-6168: Publishes quarterly Genealogical Computer Pioneer

If any readers produce or know of a genealogical program for Atari computers, please write and tell us.

>I'M CHECKING TO SEE IF YOU WORK PROPERLY. RAP: FOR HOW LONG HAVE YOU BEEN CHECKING TO SEE IF I WORK PROPERLY? >I'VE JUST BEGUN. RAP: TELL ME MORE. >YOU'RE BEING QUOTED FOR A MAGAZINE. RAP: WHY DO YOU.THINK I AM BEING QUOTED FOR A MAGAZINE? >BECAUSE I'M DOING THE QUOTING! RAP: IS IT REALLY BECAUSE YOU'RE DOING THE QUOTING? >YES IT IS. RAP: ARE YOU CERTAIN? >I'M ABSOLUTELY POSITIVE. RAP: ARE YOU WORRIED BECAUSE YOU ARE ABSOLUTELY POSITIVE? >WHAT DO YOU MEAN? RAP: WHAT DO YOU THINK DO I MEAN? >YOU GOT ME - DO YOU MIND IF I PRINT WHAT YOU ARE SAYING? RAP: DO YOU THINK I KNOW WHAT I AM SAYING? >THAT'S TRUE - YOU ARE A COMPUTER PROGRAM. RAP: HAVE YOU EVER WANTED TO BE A COMPUTER PROGRAM? >NEVER! RAP: NEVER AT ALL? >THAT'S RIGHT. RAP: THAT IS INTERESTING - GO ON. >CAN YOU THINK? RAP: DO YOU THINK I CAN THINK? >THAT'S WHAT I AM TRYING TO FIND OUT. RAP: WHAT DO YOU THINK YOU ARE TRYING TO FIND OUT? >I WANT TO SEE IF YOU CAN IMITATE HUMAN INTELLIGENCE. RAP: WHAT IF YOU CAN'T GET TO SEE IF I CAN IMITATE HUMAN INTELLIGENCE? >THEN I MAY GET MAD AT YOU. RAP: IT'S UNHEALTHY TO BE ANGRY OFTEN. >I SELDOM GET ANGRY. RAP: WHAT DOES ANGER DO TO YOU? >I DON'T WANT TO DISCUSS THIS IN FRONT OF MY READERS. RAP: ARE YOU SURE YOU DON'T WANT TO DISCUSS THIS IN FRONT OF YOUR READERS? >ABSOLUTELY SURE - INSTEAD I WANT TO GO FINISH MY COLUMN. RAP: IS THAT WHAT YOU REALLY WANT? >YES, SO GOODBYE! RAP: IT'S BEEN A PLEASURE TALKING WITH YOU.
Figure 1
"Conversation with RAP."

Q. I’ve been having some problems with Atari’s customer service. The problem concerns their form letter and non-response, mostly. I bought a 130XE and I asked them simply how to access the additional memory that they have advertised and how to use it with their AtariWriter program. The reason I bought a 130XE was because I wanted the additional memory to keep more pages at a time in the computer. They sent me a form letter with the address of Atari associations in my area and no further response. I really got upset at that point and wrote a letter to the president and told him that I thought their “there’s 130K available but you can’t use it” philosophy was false advertising and Consumer Reports and the Federal Trade Commission ought to know about it. I got another “the user associations in your area are as follows:” form letter about one month later—really user-unfriendly if you compare this with their former helpfulness.

So much for preamble. Can you help me—how do you get the full 130K. I don’t understand their instructions in their manual.

Terry Joslin
Oakton, VA

It is unfortunate that it is so difficult to correspond with Atari, but you are one of the lucky ones. Many readers have complained that they have not received any response—not even a form letter. Ironically, calling Atari by phone gives a recording which tells the caller that the phone lines are too busy and suggests that the caller mail in his question. I had hoped that once Atari settled down with its new management, its toll-free “help” line would be set up again. But the new Atari has apparently remained negligent in the area of consumer support and I do hope this changes in the future.

Regarding your questions about the 130K RAM in the 130XE, the full 130K is indeed in your machine and 64K of it can be used as a RAM “disk drive.” You can save data or programs to this area and then access them when desired. I intend to cover various aspects of Atari’s newer computers in a future column.

Since AtariWriter was not designed with the 130XE in mind, it cannot access the additional memory. Therefore you must wait until a word processor is released that is compatible with the 130XE. As of this writing I know of no 130K word processors for the Atari 130XE, but will inform you if I hear of one being developed.

Newsletters

I recently received two more well-designed newsletters from Atari user’s groups. One is Pokey, printed by the Western New York Atari User’s Group (P.O. Box 59, Buffalo, NY 14216). The other is Bits, Bytes & Pieces Computer Digest printed by the Bits, Bytes, & Pieces Atari user’s group (1103 Arrowbend Drive, Williamson, NY 14589). If your user’s group prints a regular newsletter, send it in and I’ll try to mention it.

Contributions

Readers are invited to submit short, original programs from which others may benefit. All readers whose contributions are printed will receive 3-D holograph stickers. Additionally, this month I have two cartridge games from Sega and from Epyx for the best original programs that are received and published. If you have any nifty little programs of your own creation that others will enjoy, send them in!

Numeric Keypad Decoder

Several readers have requested an assembly listing of July’s numeric keypad program. It is listed under the “Numeric Keypad Decoder Assembly Listing” heading for those who want to modify it for use with machine language programs, or for those simply interested in seeing more clearly how it works.

Mailing List Update

I’ve gotten such a fantastic response to June’s Mailing List program from readers who are using it that we’ll begin adding more features to this program next month to make it even more practical. So far only one minor bug has surfaced. When searching for a name that does not exist, an error message will be generated. Add the following line:

935 TRAP 1000 

This will cause the program to print a “Name not found” message instead, and will allow you to continue. Some readers who have requested diskettes of this program will find that this line has already been added to the program.

Response Analysis Program

Now the program that we’ve all been waiting for. It’s called the Response Analysis Program, or RAP for short. It requires a minimum of 24K RAM.

Inspired by the program, Eliza, which was created at the Massachusetts Institute of Technology way back in 1966, RAP will sometimes startle you with apparently intelligent responses to your statements, or will make you laugh with its hilarious retorts. Eliza was a computer psychotherapist; RAP is the center of a rap session. Some have found that “talking” to such a program (as ridiculous as it sounds) has actually helped them to relieve some pressures and tensions.

Figure 1 gives you an idea of what RAP is all about. This is a sample conversation between me and the program. My entries are preceded by “>” while the program’s responses are preceded by “RAP:.” You can obviously have a lot of fun with this program.

The program has been divided into two parts. Part I (lines 10 through 1350) and Part II (lines 4960 through 5590) both with the heading, “Response Analysis Program.” RAP is a long program, so you might want to enter it in over a period of several days. It’s a good idea to use Program Perfect to enter this program to avoid making errors which will affect its operation. (See the end of this article for information on Program Perfect.)

Type in both parts of RAP. If you are using Program Perfect, first enter Part I. Then list this part to cassette or disk (LIST “C:” or LIST “D:PART1”). Now type NEW and reload Program Perfect. Type 4960 for the “Starting line” prompt and begin entering Part II. When this part is completed, merge Part I with it by entering Part I from cassette or disk (ENTER “C:” or ENTER “D:PART1”). Now the entire program will be in memory, and you can SAVE it to cassette or disk (CSAVE or SAVE “D.RAP.BAS”). You can also delete the Part I file from disk once you have saved the completed program.

NUMERIC KEYPAD DECODER ASSEMBLY LISTING 

10  *=$600 
20 ; NUMERIC KEYPAD DECODER 
30 ; (C) 1985 JEFF BRENNER 
40 PORTA=54016 
50 POT1=53761 
60 TRIG0=53264 
70 SETVBV=58460 
80 XITVBV=58466 
90 CH=764 
0100 FLAG=204 
0110  PLA 
0120  LDX #START/256    ; Load X with high byte of START. 
0130  LDY #START&255    ; Load Y with low byte of START. 
0140  LDA #7 
0150  JSR SETVBV        ; Set vectors to point to START address. 
0160  RTS               ; Return to BASIC. 
0170 START LDX TRIG0 
0180  BEQ PRESSED       ; IF TRIG0=0 then key has been pressed. 
0190  DEX 
0200  STX FLAG          ; Otherwise key is released - store zero in FLAG. 
0210  JMP END           ; Jump to end. 
0220 PRESSED LDA FLAG   ; If FLAG=0 then last key has been released. 
0230  BEQ READKEY       ; Ready to read next key. 
0240  BNE END           ; Cannot read key yet - jump to the end. 
0250 READKEY INC FLAG   ; Set flag to non-zero value since key is pressed. 
0260  LDA PORTA         ; Check which key is pressed. 
0270  AND #15 
0280  TAX 
0290  LDA POT1          ; Check if ESCAPE pressed. 
0300  CMP #1 
0310  BEQ NOESC         ; If POT1=1 then ESCAPE was not pressed. 
0320  LDX #16           ; Load X with offset for ESC key. 
0330 NOESC LDA DATA,X   ; Get data determined by X offset. 
0340  STA CH            ; Store data in keyboard code register. 
0350 END JMP XITVBV     ; Exit vertical blank routine. 
0360 DATA .BYTE 0       ; Data for keys stored after this address. 
0370  .END 
RESPONSE ANALYSIS PROGRAM - PART I 

KYJ 10 REM RESPONSE ANALYSIS PROGRAM 
KFJ 20 REM COPYRIGHT 1983 JEFF BRENNER 
CTJ 30 DIM SUM$(120):LAST=5000:PRINT "STAND BY...":DELAY=5 
HBJ 40 TRAP 30:RESTORE LAST:READ SUM$:LAST=LAST+10:GOTO 40 
MUJ 50 KEYS=INT(LAST/10)-501 
UCJ 60 DIM INP$(120),RAP$(120),REV$(100),OLD$(120),BP$(10),H$(7),FIND$(77) 
KTJ 70 DIM TMP$(120),VI$(20),V2$(20),REF$(KEYS),KEY$(20) 
IKJ 80 RESTORE 90:FOR I=1 TO 7:READ M:H$(I,I)=CHR$(H):NEXT I 
JNJ 90 DATA 32,211,212,193,210,212,32 
GRJ 100 FOR I=1 TO 77:READ M:FIND$(I,I)=CHR$(M):NEXT I 
ZAJ 110 SP$(1)=CHR$(32):SP$(10)=CHR$(32):SP$(2)=SP$ 
MUJ 120 REF$(1)=CHR$(0):REF$(KEYS)=CHR$(0):REF$(2)=REF$ 
MNJ 130 POKE 203,2:POKE 204,0:POKE 206,8 
IVJ 140 DATA 104,104,133,203,104,133,204,104,133,207,104,133,206,169,0,133 
JMJ 150 DATA 208,133,212,133,213,160,0,177,206,200,201,155,208,249,136,132 
EEJ 160 DATA 208,160,0,177,204,201,135,240,31,209,206,208,8,200,196,208 
DTJ 170 DATA 208,241,230,212,96,24,163,204,105,1,133,204,163,205,105,0 
GFJ 180 DATA 133,205,230,212,160,0,240,219,169,0,133,212,96 
NQJ 190 RESTORE 210:FOR I=1 TO 47:READ N:POKE 1535+I,N:NEXT I:A=USR(1572) 
EGJ 200 POKE 204,0:POKE 206,8 
XTJ 210 DATA 72,169,0,141,182,2,169,64,141,190,2,230,204,165,204,197 
ACJ 220 DATA 206,208,13,169,0,133,204,169,2,229,205,133,205,141,243,2 
LMJ 230 DATA 104,76,98,228,104,162,6,160,0,169,7,32,92,228,96 
IMJ 240 L=0:K=0:GRAPHICS 5:SETCOLOR 2,0,0:COLOR 1 
GDJ 250 OX=11:OY=38:RESTORE 380:PLOT OX,OY:FOR I=1 TO 37:READ X,Y:FOR J=0 TO 4 
YYJ 260 IF I=15 OR I=26 OR I=29 THEN PLOT X+J,Y:OX=X:OY=Y:GOTO 290 
YLJ 270 PLOT OX+J,OY:DRAWTO X+J,Y 
NXJ 280 IF PEEK(33279)=6 THEN SOUND 2,0,0,0:SOUND 3,0,0,0:GOTO 370 
MGJ 290 M=L+I+J:SETCOLOR 0,1,8 
DKJ 300 SOUND 0,M,10,8:SOUND 1,M*2,10,8:SOUND 2,M*3,10,8:SOUND 3,M*4,10,8 
JDJ 310 POKE 53768,1 
YMJ 320 NEXT J:OX=X:OY=Y:NEXT I:L=L+37:SOUND 2,0,0,0:SOUND 3,0,0,0 
IZJ 330 SOUND 0,235,10,8:SOUND 1,254,10,8:POKE 53768,1 
YYJ 340 PRINT SP$(8);"RESPONSE";SP$(7);"ANALYSIS";SP$(7);"PROGRAM" 
DJJ 350 POKE 752,1:POKE 656,3:POKE 657,10:PRINT "PRESS";M$;"TO BEGIN"; 
QXJ 360 FOR I=0 TO 15:SETCOLOR 0,1,8:IF PEEK(53279)<>6 THEN NEXT I:GOTO 360 
XSJ 370 SOUND 0,0,0,0:SOUND 1,0,0,0:OPEN #1,4,0,"E:":GOTO 540 
OUJ 380 DATA 11,38,9,34,5,23,4,14,5,6,10,2,20,4,20,10,19,17,9,21 
AHJ 390 DATA 7,22,13,24,20,28,24,33,31,39,31,36,30,27,28,17,28,8,33,5 
EJJ 400 DATA 33,6,40,13,45,23,46,34,47,37,43,23,40,23,32,25,57,36,57,29 
PCJ 410 DATA 53,15,47,7,48,2,55,1,67,5,67,12,58,18 
SNJ 420 POKE 559,34:IF P<2 THEN 460 
VHJ 430 PRINT #2;"RAP: ";:FOR I=1 TO LEN(RAP$) 
YFJ 440 IF RAP$(I,I)<>"/" THEN PRINT #2;RAP$(I,I);:GOTO 450 
RVJ 450 NEXT I:PRINT #2:PRINT #2 
PJJ 460 RAP$(LEN(RAP$)+1)=CHR$(32) 
OMJ 470 C=0:FOR I=1 TO LEN(RAP$) 
YMJ 480 FOR J=0 TO LEN(RAP$)-1:IF RAP$(I+J,I+J)<>CHR$(32) THEN NEXT J 
ATJ 490 C=C+J+1:IF C>38 THEN PRINT CHR$(126):C=J 
GIJ 500 FOR K=I TO I+J:SOUND 0,13,8,8:SOUND 0,0,0,0 
WMJ 510 IF RAP$(K,K)<>"/" THEN PRINT RAP$(K,K); 
JFJ 520 FOR D=1 TO DELAYS NEXT D:NEXT K 
CXJ 530 I=I+J:NEXT I:PRINT :RETURN 
RTJ 540 CLOSE #2:PRINT "WOULD YOU LIKE A PRINTOUT (Y/N)":INPUT TMP$:P=0 
OKJ 550 IF TMP$(1,1)<>"Y" THEN 580 
ISJ 560 P=1:TRAP 570:PRINT "TURN PRINTER ON.":OPEN #2,8,0,"P:":GOTO 580 
NBJ 570 PRINT "PRINTER NOT READY.":GOTO 540 
FGJ 580 RAP$="I'M RAP.":GOSUB 420:RAP$="TALK TO ME BUT ANSWER IN ONE" 
YUJ 590 RAP$(LEN(RAP$)+1)=" SENTENCE AT A TIME.":GOSUB 420 
BPJ 600 RAP$="WHEN YOU SEE THIS PROMPT: ":RAP$(LEN(RAP$)+1)=CHR$(27) 
RHJ 610 RAP$(LEN(RAP$)+1)=CHR$(127) 
AJJ 620 RAP$(LEN(RAP$)+1)=", TYPE IN YOUR WORDS AND PRESS RETURN.":GOSUB 420 
LTJ 630 PRINT :IF P=1 THEN P=2 
BFJ 640 IF LEN(KEY$)>3 THEN IF KEY$(1,3)="BYE" THEN POKE 752,0:END 
VZJ 650 TRAP 1190:POKE 752,0:PRINT CHR$(27);CHR$(127);:OLD$=INP$:INPUT #1;INP$ 
VDJ 660 IF P THEN PRINT #2;">";INP$ 
KYJ 670 POKE 559,0:IF LEN(INP$)<7 THEN 690 
JUH 680 IF INP$(1,6)="SPEED=" THEN DELAY=VAL(INP$(7,LEN(INP$))):GOTO 1170 
IUJ 690 IF INP$=OLD$ THEN 1140 
FUJ 700 TMP$=INP$(LEN(INP$)) 
E1J 710 IF TMP$<"A" OR TMP$>"Z" THEN INP$=INP$(1,LEN(INP$)-1) 
RKJ 720 TMP$=CHR$(32):TMP$(LEN(TMP$)+1)=INP$:INP$=TMP$ 
DCJ 730 INP$(LEN(INP$)+1)=CHR$(32):INP$(LEN(INP$)+1)=CHR$(155) 
XJJ 740 POKE 752,1:PRINT :INP$(LEN(INP$)+1)=SP$:LN=LEN(INP$):TOT=0 
PFJ 750 IF INP$(1,1)=CHR$(127) THEN INP$=INP$(2,LEN(INP$)):LN=LN-1 
YVJ 760 FOR D=1 TO LN-1:TOT=TOT+ASC(INP$(D,D)) 
WGJ 770 IF INP$(D,D)=CHR$(39) THEN INP$(D)=INP$(D+1,LN):LN=LN-1:D=D+1 
XHJ 780 NEXT D 
IVJ 790 IF INP$=OLD$ THEN 1140 
BPJ 800 IF INP$(5,5)<>"K" THEN 820 
TRJ 810 IF TOT=1089 AND LEN(INP$)=21 THEN 1160 
ELJ 820 AA=300:AKEY=0:RESTORE 1200:A=0:FOR KEY=1 TO KEYS-1 
KRJ 830 READ KEY$:IF KEY$>="0" AND KEY$<="9" THEN LINE=VAL(KEY$):GOTO 830 
FJJ 840 KEY$(LEN(KEY$)+1)=CHR$(155):NM=0 
TRJ 850 A=USR(ADR(FIND$),ADR(INP$),ADR(KEY$)):POKE 205,2:POKE 204,0:POKE 206,8 
DXJ 860 IF A AND KEY$(1,LEN(KEY$)-1)="BYE" THEN 930 
SLJ 870 IF NM=0 AND A>0 AND A<AA THEN AA=A+LEN(KEY$)-1:AKEY=KEY:ALINE=LINE 
HDJ 880 IF A=0 OR INT(RND(0)*3)+1<3 THEN 900 
H6J 890 AA=A+LEN(KEY$)-1:AKEY=KEY:ALINE=LINE:NM=1 
CKJ 900 READ KEY$:IF KEY$<"0" OR KEY$>"9" THEN 840 
SEJ 910 LINE=VAL(KEY$):NEXT KEY 
IVJ 920 IF AKEY>0 THEN A=AA:KEY=AKEY:LINE=ALINE 
TRJ 930 RESTORE 4960:REV$=INP$(A) 
UIJ 940 FOR I=1 TO 20:READ TMP$,V2$:V1$=CHR$(32):V1$(LEN(V1$)+1)=TMP$ 
RHJ 950 V1$(LEN(V1$)+1)=CHR$(32):V1$(LEN(V1$)+1)=CHR$(155) 
IOJ 960 V2$(LEN(V2$)+1)=CHR$(32) 
QHJ 970 B=USR(ADR(FIND$),ADR(REV$),ADR(V1$)):POKE 205,2:POKE 204,0:POKE 206,8 
YSJ 980 IF B=0 THEN NEXT I:GOTO 1020 
JWJ 990 OLD$=REV$(B+LEN(V1$)-1) 
VBJ 1000 REV$=REV$(1,B):REV$(LEN(REV$)+1)=V2$:REV$(LEN(REV$)+1)=OLD$ 
DHJ 1010 GOTO 970 
OBJ 1020 IF LEN(REV$)<2 THEN 1060 
LNJ 1030 I=ASC(REV$(LEN(REV$))) 
HSJ 1040 IF I=135 OR I=32 THEN REV$=REV$(1,LEN(REV$)-1):GOTO 1020 
STJ 1050 IF REV$(1,1)=CHR$(32) THEN REV$=RES$(2,LEN(REV$)):GOTO 1040 
RXJ 1060 L=ASC(REF$(KEY)) 
VYJ 1070 RESTORE LINE+L:READ OLD$ 
CCJ 1080 L=L+1:I=PEEK(183)+256*PEEK(184):IF I>LINE+9 THEN L=0:GOTO 1070 
KHJ 1090 REF$(KEY,KEY)=CHR$(L) 
GDJ 1100 IF ASC(OLD$(LEN(OLD$)-1))<>43 THEN RAP$=OLD$:GOSUB 420:GOTO 630 
XPJ 1110 RAP$=OLD$(1,LEN(OLD$)-2):RAP$(LEN(RAP$)+1)=CHR$(32) 
KPJ 1120 RAP$(LEN(RAP$)+1)=REV$ 
EXJ 1130 RAP$(LEN(RAP$)+1)=OLD$(LEN(OLD$)):OLD$=RAP$:GOSUB 420:GOTO 630 
WZJ 1140 RAP$="YOU ARE REPEATING YOURSELF." 
CLJ 1150 GOSUB 420:GOTO 630 
VUJ 1160 RAP$="SAME TO YOU, BUSTER!":GOSUB 420:GOTO 630 
OUJ 1170 RAP$="SPEED NOW AT ":RAP$(LEN(RAP$)+1)=STR$(DELAY) 
COJ 1180 GOSUB 420:GOTO 630 
YRJ 1190 TRAP 1190:KEY=KEYS:RESTORE 1350:READ LINE,TMP$:GOTO 1060 
YLJ 1200 DATA 5000,YOURE,YOU ARE,5010,I AM, IM,5020,CAN YOU,5030,CAN I 
AXJ 1210 DATA 5040,ARE YOU,5050,WOULD YOU,5060,WHY DONT YOU,5070,WHY SHOULD I 
QMJ 1220 DATA 5080,WHY CANT 1,5090,I DONT,5100,I CANT,5110,I WILL NOT,I WONT 
NWJ 1230 DATA 5120,I WILL,5130,I COULDNT,5140,I FELL,5150,I THINK 
QCJ 1240 DATA 5160,I WANT TO,5170,I WANT,5180,I LIKE,5190,I LOVE,5200,I WOULD 
OPJ 1250 DATA 5210,I HATE,5220,I WISH,5230,WHO,5240,WHAT,5250,WHEN 
ANJ 1260 DATA 5260,WHERE,5270,WHY,5280,HOW,5290,NEVER,5300,SOMETIMES 
HDJ 1270 DATA 5310,USUALLY,5320,ALWAYS,5330,MAYBE,5340,CAUSE 
RBJ 1280 DATA 5350,YES,5360,NO,5370,SAD,5380,HAPPY,5390,ANGRY,MAD 
NNJ 1290 DATA 5400,SICK,5410,SCARE,5420,DREAM,5430,PROBLEM,5440,LOVE 
UBJ 1300 DATA 5450,DOCTOR,BOSS,WIFE,HUSBAND,CHILD,SPOUSE,FATHER,MOTHER 
KNJ 1310 DATA 5460,FAMILY,KIDS,5470,MOVIE,5480,BOOK 
PYJ 1320 DATA 5490,POLITIC,5500,MUSIC,5510,SPORT,5520,MONEY,5530,COMPUTER 
HOJ 1330 DATA 5540,DEATH,5550,JOB,WORK,5560,SCHOOL 
OTJ 1340 DATA 5570,BYE 
IEZ 1350 DATA 5580,# 

RUN the program. The first display is the title screen, designed with the help of a slightly modified version of last month’s light pen program. You can press START at any time while this screen is being drawn to get to the next screen. Here you are asked if you want to record your conversation on a printer. It can be tremendously entertaining to look back at an entire conversation. Type Y or N for this prompt. If you don’t have a printer, of course, you cannot get a printout—sorry.

Now RAP will give you a few introductory statements and will display the triangle prompt for your input. You can say whatever you like; discuss a problem, talk about your fears, ask questions about the program itself, etc. RAP will do its best to respond to your statements. Remember, though, that RAP is just a computer program, so be forgiving with its occasional awkward grammatical use. There are a few “rules” to know when using RAP.

RESPONSE ANALYSIS PROGRAM — PART II 

IKJ 4960 DATA ARE,AM/,WERE,WAS/,YOU,I/,YOUR,MY/,IVE,YOU'VE,IM,YOU'RE,ME,YOU/ 
ILJ 4970 DATA AM,ARE/,WAS,WERE/,I,YOU/,MY,YOUR/,YOUVE,I'VE,YOURE,I'M,YOU,ME/ 
NLJ 4980 DATA OUR,YOUR/,WE,YOU/,YOURSELF,MYSELF/,MYSELF,YOURSELF/ 
KBJ 4990 DATA YOURS,MINE/,MINE,YOURS/ 
EBA 5000 DATA WHY DO YOU THINK I AM+? 
RTA 5001 DATA HAVE YOU EVER WANTED TO BE+? 
CTA 5002 DATA DO YOU REALLY BELIEVE THAT I'M+? 
EPG 5003 DATA DO YOU KNOW ANYONE ELSE WHO IS+? 
RTA 5010 DATA FOR HOW LONG HAVE YOU BEEN+? 
HHA 5011 DATA ARE YOU WORRIED BECAUSE YOU ARE+? 
MSA 5012 DATA DO YOU LIKE THAT YOU ARE+? 
TFG 5013 DATA ARE YOU HAPPY THAT YOU ARE+? 
UZA 5020 DATA DO YOU THINK I CAN+? 
RTA 5021 DATA WHAT MAKES YOU WANT TO KNOW IF I CAN+? 
OBH 5022 DATA ARE YOU ABLE TO+? 
UOA 5030 DATA WHY WOULDN'T YOU BE ABLE TO+? 
IMA 5031 DATA ARE YOU SURE YOU REALLY WANT TO+? 
OEH 5032 DATA WHY DO YOU WANT TO KNOW IF YOU CAN+? 
YEA 5040 DATA DOES IT REALLY MATTER IF I AM+? 
CMA 5041 DATA WOULD YOU BE HAPPIER IF I WERE+? 
CBH 5042 DATA DO YOU OFTEN WONDER WHETHER OTHERS ARE+? 
GNA 5050 DATA WOULD YOU BE PLEASED TO HEAR THAT I WOULD+? 
GIA 5051 DATA I MIGHT JUST+. 
BLH 5052 DATA HOW WOULD YOU FEEL IF I WOULD+? 
NIA 5060 DATA DO YOU REALLY WANT ME TO+? 
VIA 5061 DATA WHY DO YOU FEEL THAT I DON'T+? 
OSH 5062 DATA IT IS POSSIBLE THAT SOMEDAY I WILL+. 
ABA 5070 DATA CAN YOU THINK OF A GOOD REASON WHY YOU SHOULDN'T+? 
SHI 5071 DATA HOW OFTEN DO YOU+? 
OKA 5080 DATA ARE YOU SURE YOU WANT TO+? 
ENA 5081 DATA WHAT MAKES YOU THINK YOU CAN'T+? 
VBH 5082 DATA HAVE YOU TRIED TO+? 
ISA 5090 DATA ARE YOU SURE YOU DON'T+? 
FJA 5091 DATA IN YOUR OPINION, WHY DON'T YOU+? 
IMA 5092 DATA DO YOU WANT TO+? 
BDG 5093 DATA IS IT IMPORTANT THAT YOU+? 
PFA 5100 DATA ARE YOU REALLY TRYING TO+? 
THA 5101 DATA TELL YOURSELF THAT YOU CAN+! 
CYH 5102 DATA IS IT SO IMPORTANT FOR YOU TO+? 
KYA 5110 DATA WHY WON'T YOU+? 
NVI 5111 DATA TELL ME WHY YOU WILL NOT+. 
ASA 5120 DATA YOU SEEM QUITE POSITIVE THAT YOU WILL+. 
IVI 5121 DATA HOW WILL YOU+? 
SOA 5130 DATA WHY NOT? 
AYI 5131 DATA WHAT IF YOU WERE SOON ABLE TO+? 
BHA 5140 DATA HOW LONG HAVE YOU BEEN FEELING+? 
NBA 5141 DATA DO YOU WANT TO CONTINUE TO FEEL+? 
ALA 5142 DATA HOW ELSE DO YOU FEEL? 
GLG 5143 DATA DO YOU FIND THAT YOU OFTEN FEEL+? 
BOA 5150 DATA HAVE YOU ALWAYS THOUGHT THAT+? 
TUA 5151 DATA HOW DO YOU FEEL ABOUT THESE THOUGHTS? 
HFH 5152 DATA WHAT ELSE DO YOU THINK? 
EYA 5160 DATA DO YOU TRULY WANT TO+? 
BJA 5161 DATA ARE YOU SURE YOU CAN+? 
JKA 5162 DATA WHAT MAKES YOU WANT TO+? 
JSG 5163 DATA WOULD YOU BE HAPPY IF YOU GOT TO+? 
BTA 5170 DATA WHAT IF YOU CAN'T GET+? 
IVA 5171 DATA IS THAT WHAT YOU REALLY WANT? 
BYA 5172 DATA HOW WOULD YOU FEEL IF YOU SUDDENLY GOT+? 
JNG 5173 DATA DON'T OTHERS ALSO WANT+? 
KOA 5180 DATA HOW OFTEN DO YOU GET TO+? 
KEI 5181 DATA WHAT WOULD YOU GIVE TO+? 
IRA 5190 DATA WHEN DID YOU DECIDE YOU LOVE+? 
SJA 5191 DATA IS THAT LOVE REAL? 
DSH 5192 DATA HOW MUCH DO YOU LOVE+? 
SKA 5200 DATA WOULD YOU REALLY? 
MJI 5201 DATA WHY WOULD YOU+? 
VNA 5210 DATA SINCE WHEN HAVE YOU DISLIKED+? 
PBA 5211 DATA HOW STRONGLY DO YOU HATE+? 
HAH 5212 DATA YOU THINK IT IS HEALTHY TO HATE+? 
PUA 5220 DATA I'M SURE OTHERS ALSO WISH+. 
PZA 5221 DATA WOULD THAT MAKE YOU HAPPY? 
LVH 5222 DATA PERHAPS YOUR WISHES WILL SOON BE FULFILLED. 
YYA 5230 DATA WHO DO YOU SUPPOSE+? 
DVI 5231 DATA I'M NOT SURE I CAN TELL YOU WHO+. 
UNA 5240 DATA WHAT DO YOU THINK+? 
NTI 5241 DATA DO YOU THINK I KNOW WHAT+? 
OKA 5250 DATA I CAN'T KNOW EXACTLY WHEN+. 
VEI 5251 DATA WHEN DO YOU THINK+? 
FYA 5260 DATA I WOULDN'T KNOW WHERE+. 
HOI 5261 DATA DO YOU KNOW AT ALL WHERE+? 
AHA 5270 DATA I COULDN'T TELL WHY+? 
TAI 5271 DATA WHY DO YOU THINK+? 
VIA 5280 DATA DO YOU WONDER HOW+? 
YKI 5281 DATA DO YOU EXPECT ME TO KNOW HOW+? 
FCA 5290 DATA NEVER AT ALL? SNA 5291 DATA WHY NOT? 
SFH 5292 DATA GIVE IT SOME TIME. 
CQA 5300 DATA DO YOU WISH IT WERE MORE OFTEN? 
LGA 5301 DATA HOW OFTEN WOULD YOU SAY? 
LIH 5302 DATA WOULD YOU RATHER NEVER+? 
JJJ 5310 DATA HOW, OFTEN NOT? 
FAJ 5320 DATA ALL THE TIME? 
AKA 5330 DATA YOU ARE APPARENTLY UNCERTAIN. 
CJA 5331 DATA DO YOU KNOW FOR SURE? 
RFA 5332 DATA COULD YOU BE MORE DEFINITE? 
TKG 5333 DATA I WISH YOU WOULD BE CERTAIN. 
CZA 5340 DATA IS IT REALLY BECAUSE+? 
KLI 5341 DATA IS THAT THE ONLY REASON - BECAUSE+? 
OCA 5350 DATA ARE YOU CERTAIN? 
QDA 5351 DATA THAT MAKES SENSE. 
QDA 5352 DATA YOU'RE POSITIVE? 
ETA 5353 DATA TELL ME MORE. 
KSA 5354 DATA I SEE. 
RGE 5355 DATA NOW I UNDERSTAND. 
BHA 5360 DATA REALLY? 
SUA 5361 DATA WHY NOT? 
GKA 5362 DATA I UNDERSTAND. 
HOG 5363 DATA WHY DON'T YOU THINK SO? 
RSA 5370 DATA NOBODY LIKES TO BE UNHAPPY. 
DHI 5371 DATA HOW DO YOU THINK THIS SADNESS COULD BE ELIMINATED? 
KOA 5380 DATA WE'RE ALL LOOKING FOR HAPPINESS, RIGHT? 
JFI 5381 DATA WHAT HAS MADE YOU REALLY CONTENT RECENTLY? 
HHA 5390 DATA IT'S UNHEALTHY TO BE ANGRY OFTEN. 
ORA 5391 DATA WHAT DOES ANGER DO TO YOU? 
NMH 5392 DATA SOMETIMES WE LOSE CONTROL WHEN WE ARE ANGRY. 
JBA 5400 DATA PERHAPS SOMEDAY WE WILL ELIMINATE ILLNESS. 
SRA 5401 DATA HOW WOULD YOU DESCRIBE THIS ILLNESS? 
HJH 5402 DATA LET'S HOPE FOR A SPEEDY RECOVERY. 
NLA 5410 DATA TELL ME ABOUT THESE FEARS. 
NII 5411 DATA WHAT ELSE WOULD BE SCARY? 
ROA 5420 DATA LET'S DISCUSS THESE DREAMS. 
THI 5421 DATA DOES THIS DREAM MEAN ANYTHING TO YOU? 
IHA 5430 DATA EXACTLY WHAT KIND OF PROBLEM? 
TLI 5431 DATA HOW DO YOU FEEL ABOUT THESE PROBLEMS? 
SGA 5440 DATA LOVE IS A POWERFUL EMOTION. 
VNA 5441 DATA TELL ME MORE ABOUT THIS LOVE. 
FUH 5442 DATA WHAT DOES THIS LOVE MEAN TO YOU? . 
NLA 5450 DATA LET ME HEAR MORE ABOUT THIS PERSON. 
LOA 5451 DATA WHAT DO YOU REALLY THINK ABOUT THIS PERSON? 
OVA 5452 DATA WHAT COMES TO YOUR MIND WHEN YOU THINK OF THIS PERSON? 
EDG 5453 DATA WHAT WOULD YOU CHANGE ABOUT THIS PERSON? 
IHA 5460 DATA WHAT ELSE SHOULD I KNOW ABOUT YOUR FAMILY? 
VAI 5461 DATA COULD YOUR FAMILY CHANGE TO MAKE THINGS BETTER? 
BHA 5470 DATA WHAT MOVIE HAVE YOU SEEN MOST RECENTLY? 
PUI 5471 DATA I TAKE IT YOU USUALLY ENJOY MOVIES? 
DVA 5480 DATA HOW OFTEN DO YOU READ? 
HHA 5481 DATA WHAT BOOK WOULD YOU RECOMMEND FOR ME (IF I WERE HUMAN)? 
JJH 5482 DATA TELL ME ABOUT YOUR FAVORITE BOOK. 
SQA 5490 DATA DO YOU WANT TO TALK SERIOUSLY ABOUT POLITICS? 
HDI 5491 DATA LET'S HEAR YOUR POLITICAL VIEWS. 
PIA 5500 DATA HOW IMPORTANT IS THIS MUSIC TO YOU? 
TFA 5501 DATA DO YOU HAVE A FAVORITE SONG? 
YYH 5502 DATA TELL ME MORE ABOUT THIS MUSIC. 
KXA 5510 DATA DO YOU LIKE PLAYING OR WATCHING THAT SPORT? 
BHI 5511 DATA ARE YOU A FAN OF ANY PARTICULAR TEAM? 
SZA 5520 DATA IT SEEMS LIKE EVERYONE'S AFTER MONEY. 
FBA 5521 DATA IS MONEY THAT IMPORTANT TO YOU? 
BHH 5522 DATA LIFE IS INDEED MORE THAN MONEY. 
LOA 5530 DATA I HOPE YOU'RE NOT REFERRING TO ME IN ANY WAY. 
BHA 5531 DATA HAVE COMPUTERS AFFECTED YOUR LIFE SIGNIFICANTLY? 
KNH 5532 DATA MANY HAVE FEARS OF COMPUTERS. 
RUA 5540 DATA GIVE ME YOUR IDEAS ON DEATH. 
AEA 5541 DATA WOULD YOU TAKE THE OPPORTUNITY TO LIVE FOREVER? 
QGH 5542 DATA WE BECOME MORE REALISTIC ABOUT DEATH AS WE AGE. 
PIA 5550 DATA DO YOU KNOW MANY PEOPLE WHO ENJOY THEIR JOBS? 
NTI 5551 DATA TELL ME MORE ABOUT THIS WORK. 
LQA 5560 DATA WHAT WOULD YOU CHANGE ABOUT THIS SCHOOL IF YOU COULD? 
EXI 5561 DATA HOW DO YOU REALLY FEEL ABOUT THIS SCHOOL? 
UJJ 5570 DATA IT'S BEEN A PLEASURE TALKING WITH YOU. 
EVA 5580 DATA TELL ME MORE. 
SBA 5581 DATA THAT IS INTERESTING - GO ON. 
GTA 5582 DATA LET'S HEAR ALL ABOUT IT. 
PVA 5583 DATA EXPLAIN FURTHER. 
HTA 5584 DATA AND WHAT DO YOU THINK ABOUT THAT? 
VHA 5585 DATA I DON'T UNDERSTAND. 
KEA 5586 DATA WHAT ELSE SHOULD I KNOW? 
CJC 5587 DATA YOU SEEM UNCOMFORTABLE WITH THIS TOPIC. 
FSZ 5590 DATA END 

First, answer in one sentence at a time. Longer sentences are preferable since they give RAP more to work with. Unlike other BASIC artificial intelligence programs, there will not be any significant increase in the amount of time the program takes to respond with longer sentences. Since RAP uses a machine language subroutine to search your input for key words, both short and long sentences will take approximately the same amount of time to be processed; about seven seconds. But don’t go overboard; sentences longer than three lines will not be entered properly. Entering more than one sentence at a time or run-on sentences will make RAP more likely to give you a nonsensical response. Note that the screen goes blank while RAP thinks. This helps to speed up its response.

Second, RAP is more suited to understanding what you feel and what you do. It won’t necessarily understand if you talk about what your brother-in-law is doing, for example.

Third, the speed with which RAP “types” out its characters can be changed by typing “SPEED=” followed by a number from zero through 30. Zero is the fastest speed and eliminates the “typewriter” effect. Numbers above 30, such as 4000, will make you wait days for a response, so keep the number under 30. RAP will print out a confirmation of the new speed. The speed of processing your responses in not affected; only the speed at which the characters are printed is changed.

Fourth, be careful of what you say to RAP. Computer circuitry is extremely sensitive. Have fun!

Next Month

We’ll learn all about the workings of RAP and how to add additional key words and responses. We’ll also enter a few routines for June’s Mailing List program, and we’ll take a look at some more reader mail.

Reader’s questions, comments and original contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A cassette or diskette of the programs listed in this month’s column is available from the author for $7.00, postpaid. Specify DOS 2 or DOS 3; when requesting a diskette.

Program Perfect is a utility used to check for typing errors in programs entered from this column. Readers may send a SASE for a listing or $5.00 for a cassette or diskette of this program.

Address all correspondence to:

Jeff Brenner’s
“Applying The Atari 9/85”
c/o Computer Shopper
P.O. Box F Titusville, FL
32781-9990
COMPUTER SHOPPER / NOVEMBER 1985 / PAGE 63 

Applying The Atari

by Jeff Brenner

With Thanksgiving Day this month and the holiday season approaching, lots of you will appreciate this month’s feature program — a recipe manager/calculator. This month’s column also brings the Mailing List additions that I promised and ties up some loose ends on the numeric keypad program.

New Listings

Whenever a lengthy program is listed in this column, I get letters complaining about the difficulty of typing them in. One clever reader, John M. Doyle (Atlanta, GA), even sent in a miniature letter to make his point (see Letter 1).

The Weather Channel Some Unreadable Address Suite 300 Atlanta, Georgia (xxx) xxx-xxxx August 13, 1985 Dear Jeff, I suspect this is a little hard on your eyes, but I wonder if you realize how very, very small the listings in “Computer Shopper” suddenly become where it’s time to TYPE it in! — Especially the three-letter codes that preceed the line! I’m in the process of typing in “RAP”, and had to redo several lines, not because of a code error, but because it is almost IMPOSSIBLE to tell Ms, Ws and Ns apart in the three-letter prefix. Your comments and programs are very interesting. I have been an Atari fan for close to four years and know just enough about programming to be dangerous. I’m one of the on-camera guys here at the Weather Channel (based in Atlanta), and believe me, doing NATIONAL weather will certainly give you a broad outlook. I’m on afternoons and evenings, Eastern time. Tune in if you have a chance. Keep up the great programs... and ENLARGE those listings! Sincerely, John M. Boyle
Letter 1
(Actual Size)

As I have mentioned in the past, after I submit the program listings for publication, they’re at the mercy of the editorial department, which shrinks listings to fit into the available space. Program Perfect was developed to help readers enter programs accurately despite the small size, but apparently the smaller Program Perfect codes become almost unreadable when they are reduced. This month, I have implemented two changes in the program listings: The Program Perfect codes are larger than usual, and the program lines have been spaced further apart. Let’s hope this makes program entry a little easier until we can get more space for listings. If any readers’ have other suggestions for making the listings more readable, please let me know.

Newsletters

Two more Atari users’ groups newsletters came in the mail recently. The S.T.A.T.U.S. Newsletter is printed by the Southside Tidewater Atari Technical Users Society (4836 Honeygrove Road, Virginia Beach, VA 23455). The CAUG Newsletter is printed by the Charlotte Atari Users Group (5911 Brookhaven Road, Charlotte, NC 28210). Both of these users’ groups participate in a newsletter exchange program — they will send a copy of their newsletter to any group that sends in its newsletter. This is a great idea as it allows groups to exchange information and ideas and to see what is going on with other Atari users’ groups across the country.

Info From Readers
And BeyondQues

The mail for this month brings answers and updates to all the questions published in September’s column. Jim Cassout had asked about the driver routine to make his printer more compatible with AtariWriter. I suggested a “Printer Formatted Data Disk” from At-A-Glance. Thanks to Gordon C. Willis (Morehead City, NC) for informing me that the original author of the printer driver routines is making them available for $10 each, postpaid. Gary W. Furr (P.O. Box 1073, Mountain View, Ca 94042) has driver routines for over 60 printers. If you have been unable to get a printer driver for your particular printer, there’s a good chance that Mr. Furr will have one that’s compatible.

Darwin K. Garrison’s letter had asked about a genealogical program for Atari computers. Thanks to Leo H. Kordsmeier, Jr. (Little Rock, AR) and to Al Crespo (Bakersfield, CA) for writing to tell me about The Family Tree by Harry Koons. Mr. Crespo says that “you can record and access six generations and save up to 24 generations on one disk.” The program also lets you print out your pedigree charts. The Family Tree is $19.95 plus $3.00 shipping from Antic Publishing (524 Second Street, San Francisco, CA 94107). Additionally, Dan Sweda (Brookville, OH), treasurer of the A-BUG-BYTE users’ group, says his group has a genealogical program available for $5.00, postpaid. That’s from A-BUG-BYTE (10790 W. National Road, Brookville, OH 45309).

In September’s column, Terry Joslin asked how to access the full 128K RAM on the Atari 130XE. Atari itself provided the answer by sending me the DOS 2.5 disk, which contains a routine that lets you use the 130XE’s extra memory as a RAM disk. Unlike DOS 3, DOS 2.5 supports both single and enhanced density modes and is compatible with DOS 2. DOS 3 owners can obtain DOS 2.5 by sending the DOS 3 diskette to Atari (Atari Customer Relations, P.O. Box 61657, Sunnyvale, CA 94088). There is no charge for the swap. The DOS 2.5 diskette also contains a utility to convert DOS 3 files to DOS 2.5, so your DOS 3 files can be made fully compatible with DOS 2.5. A small booklet, included with DOS 2.5, summarizes the various options available on DOS 2.5. More detailed instructions are in the ATARI DOS 2.5 Manual available from the Atari address above for $10 plus $2.50 shipping.

Atari 130XE Word Processors

In addition to a utility on the new DOS 2.5 diskette that allows the use of the Atari 130XE’s full memory, two 130XE-compatible word processors should be available this month. AtariWriter Plus, from Atari, contains a 48K/64K version on one side of the diskette and a 128K version on the other side. It features a built-in spelling checker, a mailmerge data base, double column printing and a printer driver editor so you can make the program compatible with your printer. It’s under $50. PaperClip, from Batteries included (17875 Sky Park North, SuitP, Irving, CA 92714), will be available in a 130XE version. For $10, owners of the 48K PaperClip can trade it in for the 130XE version.

Numeric Keypad Problem Resolved

In the July and August columns, I published three programs for the numeric keypad. While the programs worked fine on the older Atari 400 and 800, there was a problem on the XL and some XE machines. The ESC key was being read as a zero. Strike one. In my haste to correct the problem and to end a flood of letters from readers who “tried typing in the program eight times on two different computers and with three different keypads,” I published in October’s column what I believed to be a simple solution. A little further testing however, revealed that this did not completely fix the problem — any key pressed after the ESC key would be read as the ESC key. Strike two. I get one more chance, right? This time I am presenting a completely rewritten keypad program that will read the ESC key perfectly. In addition, the new program allows the numeric keypad’s keys to respond better, so we’re not just making corrections — we’re making improvements! The new keypad program responds to a key that has been pressed before the previous one had been fully released. This could happen if you entered, say, the numbers four, five, and six in a row very quickly. As soon as the previous key is released, the character for the new key is displayed. On the older keypad programs, any key pressed before the previous one was released would be ignored.

The program listed under Keypad Program 3 takes the place of Program 1 and Program 2 in July’s column. To make Program 3 read the Y key as a comma (as Program 2 did so that you can enter data lines easily), change line 160 to:

160 DATA 32 

Programmable Keypad Revision contains the lines to be changed on August’s Programmable Keypad program for this correction. If you’re using Program Perfect, first enter lines 90 through 220. When Program Perfect erases itself from memory, LIST“C:” (for cassette) or LIST“D:TEMP” (for diskette) the program. Next, load in the old Programmable Keypad program. Type ENTER “C:” or ENTER “D:TEMP” and the new lines will automatically be merged with the old program. Now you can SAVE the revised program on cassette or disk.

KEYPAD PROGRAM 3 

FOJ 10 REM NUMERIC KEYPAD PROGRAM #3 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
JMJ 30 TOT=0:FOR I=1536 TO 1616:READ NUM 
OOJ 40 POKE I,NUM:TOT=TOT+I+NUM:NEXT I 
TOJ 50 IF TOT=134774 OR TOT=134789 THEN A=USR(1536):END 
FBJ 60 PRINT "ERROR - CHECK DATA":END 
PFJ 70 DATA 104,142,4,140,10,149,7,74 
QMJ 80 DATA 92,228,174.132,2,240,9,202 
UKJ 90 DATA 134,204,240,40,174,120,2,228 
WSJ 100 DATA 204,208,4,149,204,208,29,143 
WCJ 110 DATA 209,240,4,198,209,240,21,230 
XVJ 120 DATA 204,134,204,230,209,173,113,2 
QPJ 130 DATA 201,1,240,2,142,14,189,43 
PLJ 140 DATA 4,141,292,2,74,98,228,92 
HUJ 150 DATA 24,29,27,39,91,93,48 
XMJ 160 DATA 43 
MRJ 170 DATA 31,30,24,90,34,12,14,28 
BEZ 180 DATA 155 
PROGRAMMABLE KEYPAD REVISION 

WVT 90 IF TOT=134785 THEN A=USR(1536):GOTO 230 
KZJ 110 DATA 104,142,4,140,10,149,7 
NHJ 120 DATA 74,92,228,174,132,2,240 
ONJ 130 DATA 9,202, 134,204,240,40,174 
MYJ 140 DATA 120,2,228,204,208,4,149 
PAJ 190 DATA 204,208,29,149,209,240,4 
BOJ 140 DATA 198,209,240,21,230,204,134 
QJJ 170 DATA 204,230,209,173,113,2,201 
JLJ 180 DATA 1,240,2,142,14,189,43 
JZJ 190 DATA 4,141,292,2,74,98,228 
MLJ 200 DATA 92,24,29,27,39,91,33 
HDJ 210 DATA 48,43,31,30,24,30,34 
RVZ 220 DATA 12,14,28,199 

Mailing List Enhancements

June’s Mailing List program has generated an enormous amount of interest, and this month we have additional routines for this program to make it even more practical.

Part I contains changes that are to be made in existing lines. Load the original Mailing List and type in the lines listed in Part I. Part II contains lines to be added to the program. Type in these lines. Once Part I and Part II have been entered, LIST“C:” or LIST “D:TEMP” the program.

Now, enter lines 1380 through 1800 listed under Part III. If you have Program Perfect, you can use it to enter these lines. When all lines have been entered, ENTER “C:” or ENTER “D:TEMP” the rest of the program to merge it with Part III. Now you can SAVE the complete updated Mailing List, which we’ll call Mailing List II.

Using Mailing List II

Now, when adding names, you won’t have to constantly respond to the “MORE NAMES (Y/N)” prompt. The program will automatically assume that you are adding more names. When you are finished adding names, press the ESC key and you’ll be returned to the main menu.

PART I 

140 RESTORE 160:FOR I=1 TO 6:READ A$:PRINT CHR$(ASC(A$)+128);A$(2,LEN(A$)) 
160 DATA ADD NAMES,EDIT,LIST NAMES,PRINT,FREE DISK MEMORY,SEARCH 
210 PRINT :ON I GOTO 230,650,1040,1120,1350,1380 
370 IF K=27 AND CC<2 THEN 610 
600 IF K<>27 THEN 630 
690 PRINT E$;"CYCLE OR ID$ (C/I)?";:GET #1,Q:PRINT CHR$(Q):IF Q=67 THEN 710 
700 IF Q>73 THEN PRINT CHR$(156);:GOTO 680 
940 GOSUB 1740:INPUT #2;S,B,NAME$,ADDR$,CSZ$,CAT$ 
970 FOR I=LEN(NAME$) TO 1 STEP -1:IF NAME$(I,I)=CHR$(32) THEN NEXT I 
990 PRINT "FOUND":GOTO 1640 
1000 PRINT :PRINT "NOT FOUND":GOTO 1090 
1050 GOSUB 1740:NOTE #2,S,B:INPUT #2;I,I,NAME$,ADDR$,CSZ$,CAT$ 
1070 PRINT "PRINT "  ID #";ID$:PRINT NAME$:IF PEEK(764)=28 THEN 1100 
1240 GOSUB 1740:INPUT #2,S,B,NAME$,ADDR$,CSZ$,CAT$ 
1270 IF Q=0 THEN NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$:GOTO 1285 
1340 NAME$=NUL$:TRAP 1330:Q=0:GOTO 1285 
PART II 

45 DIM ID$(6),ID2$(6) 
295 CC=0 
345 IF PEEK(85)=34-M AND K=156 THEN PRINT CHR$(K); 
355 IF K>47 AND K<58 THEN 330 
375 IF K=27 THEN POKE 84,15:POKE 85,2:GOTO 480 
702 TRAP 680 
705 PRINT "ENTER 6-DIGIT ID: ";:INPUT #3;A$:IS=VAL(A$(1,3)):IB=VAL(A$(4,6)) 
706 POINT #2,IS,IB 
935 TRAP 1000 
945 NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$ 
975 FOR I=I TO 1 STEP -1:IF NAME$(I,I)<>CHR$(32) THEN NEXT I 
1175 PRINT :PRINT "PRINT FROM WHAT ID# (0=START)";:INPUT ID$ 
1176 ID1=0:IF LEN(ID$)=6 THEN ID1=VAL(ID$(1,3)):ID2=VAL(ID$(4,6)) 
1185 PRINT :PRINT "PRINT ID NUMBERS (Y/N)";INPUT Q$:IF Q$="Y" THEN VS=VS-1 
1235 IF ID1>0 THEN POINT #2,ID1,ID2 
1265 IF Q=0 THEN ID2$=ID$ 
1275 IF LEN(NAME2$)=0 THEN ID2$=ID$ 
1282 IF Q<>"Y" THEN 1290 
1285 PRINT #5;SP$(1,5):ID2$(SP$(12);:IF Q THEN PRINT #5;SP$(1,HS+5);ID$; 
1286 PRINT #5 

You’ll notice on the menu the addition of another option — SEARCH. When you choose this option, another menu appears which asks if you want to search by name, street, city or zip code. The name search functions the same as it did on the original program. However, whenever a name (or street, city, or zip) is found, you are asked if you want to edit that entry or if you want to continue searching for another match. With any search, you can enter only a part of what you want to find and the program will pick out all items that match that part. For example, if your address is 10 MAIN STREET, but you can’t remember whether it was 10 MAIN STREET or 10 MAIN ROAD, just enter “10 MAIN.” All address entries beginning with “10 MAIN” will be displayed one at a time. This technique can also be used when searching by zip code. Searching for the five digits of a zip code will also display any nine-digit codes that match those first five digits.

When searching for an entry, remember to use the same format, (all-capitals or capital and lower-case letters), as you used when you originally entered the entry. For example, if you search for “Computer Shopper,” the program can not find “Computer Shopper” so be sure to stay with one form or the other.

Another feature added is a six-digit identification code. This code is actually composed of the byte and sector number of the location on the disk where the particular name and address is being stored. Hence, by referring to the six-digit code, the program can instantly access any name on the disk without having to look through each name.

Whenever you choose the LIST NAMES option from the main menu, each name will be listed with its respective six-digit code. You could then jot down codes that you want to refer to later.

When you select the EDIT option, Mailing List II will ask you if you want “CYCLE or ID#.” The CYCLE option works as it did before — it lets you move back and forth among the addresses on your disk with the “▲” and “>” keys. You can freely change information on the names and addresses as you move through the entries. The ID# option enables you to enter the six-digit code to gain instant access to a particular name/address.

The PRINT option now has two additional features. You can enter an ID# from which to begin printing address labels. Hence, if you only want to print labels for, say, the last ten names you have entered, you would simply enter the six-digit code for the tenth to last name/address. Additionally, you’re given the option of printing the six-digit codes on the labels themselves. Many mailing list programs used by businesses have this feature. A client who responds to a mailout is asked to give his code numbers, or to return a form with this code number printed on it. When the business receives the response, the number can be used to instantly call up the client’s file, or to generate a new label.

PART III 

DUJ 1380 TRAP 670:OPEN #2,12,0,FILE$:NOTE #2,IS,IB 
WGJ 1390 CLOSE #5:OPEN #5,4,0,FILE2$:INPUT #5;FS,FB,FS,FB 
WSJ 1400 FOUND=0:PRINT "SEARCH BY":RESTORE 1420:PRINT :FOR I=1 TO 4:READ A$ 
CJJ 1410 PRINT CHR$(ASC(A$)+128);A$(2,LEN(A$)):PRINT :NEXT I 
CBJ 1420 DATA NAME,STREET,CITY,ZIP 
TMJ 1430 POKE 694,0:POKE 702,64:PRINT CHR$(156);"SELECT: ";:GET #1,Q 
VDJ 1440 IF Q=78 THEN 890 
TRE 1450 IF Q<>83 AND Q<>67 AND Q<>90 THEN 1430 
EAE 1455 PRINT :PRINT "FIND: ";:INPUT #3;A$:POINT #2,IS,IB 
OPJ 1460 TRAP 1710:NOTE #2,ST,BT 
QUE 1470 GOSUB 1740:INPUT #2;S,B,NAME$,ADDR$,CSZ$,CAT$ 
WNE 1475 NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$ 
ZAJ I486 IF Q<>83 THEN 1530 
NEJ 1490 A=ASC(ADDR$):IF LEN(ADDR$)<3 THEN 1505 
GWE 1500 IF A>47 AND A<58 OR A=32 THEN ADDR$=ADDR$(2,LEN(ADDR$)):GOTO 1490 
ETE 1505 IF LEN(ADDR$)<LEN(A$) THEN 1460 
OZJ 1510 IF ADDR$(1,LEN(A$))=A$ THEN GOTO 1640 
FKJ 1520 GOTO 1460 
ACJ 1530 IF Q<>67 THEN 1570 
OPJ 1540 FOR I=1 TO LEN (CSZ$):IF CSZ$(I,I)<>CHR$(32) THEN NEXT I 
LWE 1550 IF I>1 AND I<LEN(CSZ$) THEN CSZ$=CSZ$(1,I-1) 
OSA 1555 IF CSZ$(LEN(CSZ$))=CHR$(44) THEN CSZ$=CSZ$(1,LEN(CSZ$)-1) 
DHD 1556 IF LEN(CSZ$)<LEN(A$) THEN 1460 
PIE 1560 IF CSZ$(1,LEN(A$))=A$ THEN GOTO 1640 
FOE 1565 GOTO 1460 
HXJ 1570 IF CSZ$(LEN(CSZ$))<>" " THEN 1590 
AZJ 1580 FOR I=LEN(CSZ$) TO 1 STEP -1 
JTJ 1590 IF CSZ$(I,I)<"0" OR CSZ$(I,I)>"9" THEN NEXT I:GOTO 1460 
XMJ 1600 FOR I=I TO 1 STEP -1:IF CSZ$(I,I)<>" " THEN NEXT I:GOTO 1460 
OEE 1610 CSZ$=CSZ$(I+1,LEN(CSZ$)) 
DEE 1615 IF LEN(CSZ$)<LEN(A$) THEN 1460 
PKJ 1620 IF CSZ$(1,LEN(A$))=A$ THEN GOTO 1640 
FMJ 1630 GOTO 1460 
PMJ 1640 FOUND=I:PRINT "ID#";ID$ 
ANJ 1650 PRINT NAME2$:PRINT ADDR2$:PRINT CSZ2$:PRINT CAT$:PRINT 
VGE 1660 PRINT "<E>DIT, <C>ONTINUE SEARCH, <M>ENU?":GET #1,A:PRINT CHR$(A) 
LWE 1665 IF (Q=76 OR Q=70) AND A=67 THEN 940 
WHJ 1670 IF A=67 THEN 1470 
KZJ 1680 IF A=69 THEN PRINT CHR$(125):POKE 84,20:POINT #2,ID1,ID2:GOTO 730 
YUJ 1690 IF A<>77 THEN 1660 
DHJ 1700 GOTO 130 
KHJ 1710 IF FOUND=0 THEN PRINT :PRINT "NOT FOUND":GOTO 1730 
YOJ 1720 PRINT :PRINT "END OF DATA" 
LEJ 1730 A$="PRESS ESC FOR MENU":GOSUB 640:PRINT A$:GOTO 1100 
HYJ 1740 NOTE #2,ID1,ID2:ID$="" 
JEJ 1750 IF ID1<100 THEN ID$="0" 
HNJ 1760 IF ID1<10 THEN ID$(LEN(ID$)+1)="0" 
RHJ 1770 ID$(LEN(ID$)+1)=STR$(ID1) 
JMJ 1780 IF ID2<100 THEN ID$(LEN(ID$)+1)="0" 
HRJ 1790 IF ID2<10 THEN ID$(LEN(ID$)+1)="0" 
LKZ 1800 ID$(LEN(ID$)+1)=STR$(ID2):RETURN 

Recipe Program

This month’s feature program is Recipe Manager. Recipe Manager can store your favorite recipes in electronic form. As you browse through recipes on your screen, you can pick one and print it on the printer. Two additional features will be added to the program next month, as there was not enough room to include them this month. (Those who request a diskette of this program will receive the entire program in one part.) The two features that will be listed here next month are the FIND CATEGORY/RECIPE option, which lets you search for a particular category of recipe or recipe name, and the CALCULATE RECIPE option. This interesting option will automatically double, triple, halve, etc. the measurement of ingredients of any recipe so that you may instantly adjust recipes for different quantities. You can then print out the recalculated recipe and take it into the kitchen. If you select these options with this month’s listings, you’ll get a “THAT COMMAND IS NOT AVAILABLE YET” message.

Use Program Perfect to type in Recipe Manager. Since the program stores recipes on the diskette, you’ll want to save the program on a blank diskette so you’ll have as much room as possible for storing recipes.

When you RUN the program, you’ll get a specially designed Graphics 0 screen. The top two and bottom two text lines are dark, while the remaining lines are blue. The blue center is where the recipes are typed. This is a mini-screen in itself, consisting of 20 lines of 36 characters each. The top two lines display the Recipe Manager title and the particular menu function currently being used. The bottom two lines are prompt lines and tell you what keys are active (i.e. PRESS RETURN TO PRINT THE RECIPE) or special messages (i.e. NO RECIPE FILE ON DISK-ADD RECIPES). These lines also display the menu options: ADD, BROWSE/EDIT, FIND, PRINT, CALCULATE. The ADD, BROWSE/EDIT and PRINT options can be used with this month’s listing.

When you run the program for the first time, you’ll want to add recipes. When you press A (for ADD) the cursor moves to the recipe screen and you’re asked to enter a CATEGORY. Type the category that you want to place the particular recipe in, such as appetizers, soups, main dishes, holiday recipes, etc. Next you’re asked to enter the RECIPE NAME. Be sure to use capital letters only when entering the CATEGORY and NAME so that you will be able to search for a particular category or recipe.

RECIPE MANAGER 

DAJ 10 REM RECIPE MANAGER 
KFJ 20 REM COPYRIGHT 1985 JEFF BRENNER 
YGJ 30 DIM SP$(36),FILE$(15),FILE2$(15),A$(40),LF$(1),Q$(1),F$(20) 
ORJ 40 DIM LINE$(36),DE$(2),CL$(60),MV$(2),S$(1) 
JGJ 50 FILE$="D:RECIPE.DAT":FILE2$="D:RECIPE.PNT" 
WYJ 60 A$=CHR$(32):A$(2,2)=CHR$(29):A$(3,3)=CHR$(30):S$=CHR$(32) 
KAJ 70 CL$=A$:FOR I=1 TO 19:CL$(LEN(CL$)+1)=A$:NEXT I 
EQJ 80 SP$(I)=S$:SP$(36)=S$:SP$(2)=SP$:LF$=CHR$(155) 
OJJ 90 DE$=CHR$(156):DE$(2,2)=CHR$(157):MV$=CHR$(30):MV$(2,2)=CHR$(31) 
LFJ 100 OPEN #1,4,0,"K:":OPEN #3,4,0,"E:":OPEN #4,9,0,"E:":GOSUB 1620 
BMJ 110 POKE 53277,3:POKE 53248,48:POKE 53277,0:POKE 53261,255 
UIJ 120 POKE 53249,200:POKE 53262,255 
DGJ 130 GOTO 1330 
NVJ 140 GOSUB 1190:TRAP 610:OPEN #2,12,0,FILE$:SKP=IS 
FUJ 150 IF IS=0 THEN NOTE #2,IS,IB:PRINT CHR$(125);:GOTO 170 
QVJ 160 POINT #2,IS,IB 
TQJ 170 OPEN #5,4,0,FILE2$:INPUT #5;X,X,FS,FB 
VWJ 180 PRINT CHR$(125);:GOSUB 1100:GOSUB 1190 
DFJ 190 ST=IS:BT=IB:NOTE #2,IS,IB:INPUT #2;S,B 
IGJ 200 FOR I=2 TO 21:INPUT #2;LINE$:POSITION 2,I:PRINT LINE$:NEXT I 
XVJ 210 CC=0:POSITION 2,2:A=USR(1664):GOTO 300 
RIJ 220 GOSUB 1100:A=USR(1664):GOSUB 1210:POSITION 2,2:POKE 752,0 
SNJ 230 POKE 694,0:PRINT "CATEGORY: ";:GOSUB 1240:INPUT #3;LINE$ 
OYJ 240 PRINT CHR$(28);DE$;LINE$ 
YQJ 250 PRINT "RECIPE NAME: ";:GOSUB 1240:INPUT #3;LINE$ 
PAJ 260 PRINT CHR$(28);DE$;LINE$ 
LHJ 270 POKE 752,1:IF PEEK(85)>37 AND PEEK(84)=21 THEN POKE 85,37 
REJ 280 IF PEEK(85)>37 THEN POKE 85,2:POKE 84,PEEK(84)+1 
ASJ 290 IF PEEK(84)>21 THEN POKE 84,21 
JEJ 300 SOUND 0,0,0,0:TRAP 1330 
VMJ 310 POKE 694,0:CC=CC+1:POKE 752,0:PRINT MV$;:GET #1,K:POKE 752,1 
NBJ 320 IF K>31 AND K<60 THEN 580 
PEJ 330 IF K>62 AND K<125 THEN 580 
RDJ 340 IF EDIT=1 THEN IF K=60 OR K=62 OR K=27 THEN 1020 
SNJ 350 IF K=27 THEN 730 
EJJ 360 IF K<>126 OR PEEK(85)>2 THEN 390 
GWJ 370 IF PEEK(84)<3 THEN 300 
HAJ 380 POKE 84,PEEK(84)-1:POKE 85,38:PRINT CHR$(K);:GOTO 580 
PEJ 390 IF K=30 AND PEEK(85)=2 THEN POKE 85,37:GOTO 270 
OXJ 400 IF K=31 AND PEEK(85)=37 THEN POKE 85,2:GOTO 270 
CWJ 410 IF K=127 THEN PRINT CHR$(K);:IF PEEK(85)>37 THEN 410 
EEJ 420 IF PEEK(84)>21 THEN POKE 84,21:PRINT MV$; 
UKJ 430 IF K<255 THEN 460 
FXJ 440 PRINT CHR$(K);:GOSUB 1200:POSITION 38,2:POKE 752,1:PRINT CL$; 
MOJ 450 POSITION X,Y:POKE 752,0:GOTO 270 
SOJ 460 IF K=62 THEN 730 
UJJ 470 IF K=125 THEN PRINT CHR$(K);:GOTO 220 
WVJ 480 IF K<>156 THEN 510 
SEJ 490 GOSUB 1200:PRINT CHR$(K);:POSITION 2,21:PRINT CHR$(157); 
AXJ 500 POKE 84,Y:GOTO 270 
WSJ 510 IF K<>157 THEN 530 
BYJ 520 GOSUB 1200:POSITION 2,21:PRINT CHR$(156)POKE 84,Y:GOTO 580 
OYJ 530 IF K=28 AND PEEK(84)=2 THEN POKE 84,21:GOTO 270 
PAJ 540 IF K=29 AND PEEK(84)=21 THEN POKE 84,2:GOTO 270 
FTJ 550 IF K=155 AND PEEK(84)=21 THEN 270 
PTJ 560 IF K>27 AND K<32 OR K=155 OR K=126 OR K=254 OR K=61 THEN 580 
BOJ 570 GOTO 300 
JGJ 580 IF PEEK(85)=32 THEN SOUND 0,0,2,14 
NTJ 590 PRINT CHR$(K);:GOTO 270 
JBJ 600 CLOSE #2:IF PEEK(195)=170 THEN 660 
NYJ 610 IF EDIT=1 AND PEEK(195)=170 THEN 710 
GWJ 620 POSITION 2,22:PRINT DE$;"ERROR #";PEEK(195);:EDIT=0:GOSUB 1110 
WOJ 630 POKE 752,1:PRINT 
NRJ 640 IF PEEK(764)<>28 THEN 640 
DNJ 650 GOTO 1330 
INJ 660 OPEN #2,8,0,FILE$:CLOSE #2:OPEN #2,8,0,FILE2$ 
FOJ 670 PRINT #2;"0";LF$;"0";LF$:CLOSE #2 
RUJ 680 GOSUB 1190:TRAP 600:OPEN #2,9,0,FILE$ 
APJ 690 OPEN #5,4,0,FILE2$:INPUT #5;S,B:CLOSE #5 
QGJ 700 PRINT CHR$(125);:GOTO 220 
OUJ 710 POSITION 2,22:PRINT DE$;S$;"NO RECIPE FILE ON DISK-ADD RECIPES" 
UDJ 720 EDIT=0:GOSUB 1110:GOTO 630 
ARJ 730 POKE 752,0:GOSUB 1190:IF EDIT=0 THEN IF K=27 AND CC<2 THEN 820 
DJJ 740 IF EDIT=1 THEN POINT #2,IS,IB 
LRJ 750 NOTE #2,S1,B1:PRINT #2;S;LF$;B:POSITION 2,2 
XKJ 760 FOR I=2 TO 21:LINE$=SP$:POKE 84,I:INPUT #4;LINE$ 
XNJ 770 IF LEN(LINE$)<36 THEN LINE$(36)=CHR$(32) 
LCJ 780 PRINT #2;LINE$:NEXT I 
MQJ 790 IF EDIT=1 THEN RETURN 
EQJ 800 S=S1:B=B1 
XEJ 810 IF EDIT=0 AND K=62 THEN PRINT CHR$(125);:GOSUB 1100:GOTO 220 
N8J 820 CLOSE #5:OPEN #5,8,0,FILE2$:PRINT #5;S;LF$;B:NOTE #2,S,B 
UEJ 830 PRINT #5;S;LF$;B:GOTO 1330 
VNJ 840 GOSUB 1110:POSITION 2,22:A$="RETURN":GOSUB 1080:POKE 752,1 
CCJ 850 TRAP 990 
SFJ 860 PRINT DE$;SP$(35);"PRESS";CHR$(32);A$;CHR$(32);"TO PRINT THE RECIPE" 
PIJ 870 GET #1,K:IF K<>27 AND K<>155 THEN 870 
UHJ 880 POKE 752,0:IF K=27 THEN 1330 
QHJ 890 OPEN #7,8,0,"P:" 
YVJ 900 POKE 84,2:INPUT #4;LINE$:PRINT #7;LINE$:PRINT #7 
PMJ 910 POKE 84,3:INPUT #4;LINE$ 
MFJ 920 I=LEN(LINE$) 
VOJ 930 IF I>2 AND LINE$(I)=CHR$(32) THEN LINE$=LINE$(1,I-1):GOTO 920 
YSJ 940 PRINT #7;SP$(1,(36-I)/2);LINE$ 
OEJ 950 PRINT #7;SP$(1,(36-I)/2);:FOR I=1 TO LEN(LINE$):PRINT #7;"-";:NEXT I 
CSJ 960 PRINT #7 
ORJ 970 FOR I=4 TO 21:POSITION 2,I:INPUT #4;LINE$:PRINT #7;LINE$:NEXT I 
GNJ 980 PRINT #7;LF$:CLOSE #7:GOTO 1330 
ICJ 990 CLOSE #7:IF PEEK(195)<>5 THEN 620 
SKJ 1000 POSITION 2,22:PRINT DE$;S$;"NO RECIPE ON SCREEN-BROWSE OR FIND" 
VSJ 1010 EDIT=0:GOSUB 1110:GOTO 630 
LIJ 1020 IF CC>1 THEN GOSUB 730 
VYJ 1030 IF K=27 THEN 1330 
IKJ 1040 IF S>0 AND K=60 THEN GOSUB 1190:POINT #2,S,B:GOTO 180 
HDJ 1050 IF K=60 THEN A$="FIRST RECIPE IN FILE":I=1:GOSUB 1280:GOTO 210 
GFJ 1060 NOTE #2,S1,B1:IF S1<>FS OR B1<>FB THEN 180 
XZJ 1070 A$="LAST RECIPE IN FILE":I=1:GOSUB 1280:GOTO 210 
JOJ 1080 FOR I=1 TO LEN(A$):A$(I,I)=CHR$(ASC(A$(I,I))+128):NEXT I 
CWJ 1090 RETURN 
PXJ 1100 CC=0:A$="RECIPE MANAGER":GOSUB 1080:POSITION 2,0:PRINT SP$(26);A$ 
MNJ 1110 POSITION 2,23:A$="ESC":GOSUB 1080 
TKJ 1120 PRINT SP$(28);"PRESS";CHR$(32);A$;CHR$(32);"FOR MENU";:POSITION 2,22 
DGJ 1130 IF EDIT=0 THEN 1160 
SKJ 1140 A$="<":GOSUB 1080:PRINT DE$;A$;S$;"MOVES BACKWARD";S$;A$; 
FNJ 1150 POKE 89,21:A$=">":GOSUB 1080:PRINT A$;S$;"MOVES FORWARD";S$;A$ 
QQJ 1160 POSITION 2,I:PRINT SP$ 
JPJ 1170 POSITION 2,1:I=LEN(F$):IF I/2>INT(I/2) THEN F$(I+1)=S$ 
UKJ 1180 PRINT SP$(1,(36-LEN(F$))/2);F$:POKE 752,0:RETURN 
MRJ 1190 POKE 54286,64:POKE 710,148:RETURN 
FRJ 1200 X=PEEK(85):Y=PEEK(84):RETURN 
OAJ 1210 IF EDIT=1 THEN RETURN 
NHJ 1220 POSITION 2,22:PRINT DEC;SP$(33);"PRESS > TO ENTER NEXT RECIPE" 
CSJ 1230 RETURN 
LBJ 1240 POKE 764,255 
BZJ 1250 I=PEEK(764):IF I=255 THEN 1250 
VHJ 1260 IF I=28 THEN POP :GOTO 730 
CWJ 1270 RETURN 
LBJ 1280 IF I=1 THEN GOSUB 1080 
ULJ 1290 X=PEEK(85):Y=PEEK(84):POSITION 2,22 
AWJ 1300 I=LEN(A$):IF I/2>INT(I/2) THEN A$(I+1)=S$ 
IIJ 1310 PRINT DE$;SP$(1,(36-LEN(A$))/2);A$ 
NWJ 1320 POSITION X,Y:RETURN 
TWJ 1330 EDIT=0:GOSUB 1190:CLOSE #2:CLOSE #5:F$="MENU":GOSUB 1100:A=USR(1664) 
YFJ 1340 POKE 752,0:POSITION 2,22:RESTORE 1350 
SNJ 1350 DATA ADD,BROWSE/EDIT,FIND,PRINT,CALCULATE 
RCJ 1360 FOR I=1 TO 5:READ A$:A$(1,1)=CHR$(ASC(A$(1,1))+128) 
TUJ 1370 PRINT A$;CHR$(32);:NEXT I 
UQJ 1380 POSITION 2,23:PRINT DE$;"SELECT: 
IZJ 1390 POKE 694,0:POKE 702,64 
KDJ 1400 GET #1,N:IF N<65 OR N>90 THEN 1400 
HPJ 1410 Q$=CHR$(N):PRINT Q$; 
BUJ 1420 IF Q$="A" THEN F$="ADD RECIPES":GOTO 680 
VGJ 1430 IF Q$="B" THEN F$="BROWSE/EDIT":EDIT=1:GOTO 140 
ECJ 1440 IF Q$="F" THEN F$="FIND CATEGORY/RECIPE":GOTO 1730 
GTJ 1450 IF Q$="P" THEN F$="PRINT RECIPE":GOTO 840 
SBJ 1460 IF Q$="C" THEN F$="CALCULATE RECIPE":GOTO 1750 
FKJ 1470 GOTO 1330 
RBJ 1480 DATA 104,173,48,2,133,204,173 
NKJ 1490 DATA 49,2,133,205,160,3,177 
QWJ 1500 DATA 204,9,128,145,204,160,25 
TFJ 1510 DATA 177,204,9,128,145,204,173 
GRJ 1520 DATA 0,2,133,204,173,1,2 
PDJ 1530 DATA 133,205,169,0,141,198,2 
QYJ 1540 DATA 141,14,212,169,196,141,0 
HHJ 1550 DATA 2,169,6,141,1,2,162 
USJ 1560 DATA 192,173,11,212,201,128,208 
ROJ 1570 DATA 249,142,14,212,96,72,173 
QJJ 1580 DATA 11,212,105,1,106,106,106 
UMJ 1590 DATA 106,144,245,141,10,212,141 
PFJ 1600 DATA 10,212,173,198,2,73,148 
WPJ 1610 DATA 141,198,2,141,24,208,104,64 
IIJ 1620 POKE 559,0:DL=PEEK(560)+256*PEEK(561):FOR I=DL TO DL+8 
NKJ 1630 POKE I-1,PEEK(I):NEXT I:POKE DL+8,0:DL=DL-1 
QOJ 1640 H=INT(DL/256):L=DL-H*256:POKE 560,L:POKE 561,H 
USJ 1650 POKE DL+31,L:POKE DL+32,H:POKE 559,34 
PJJ 1660 RESTORE 1480:PRINT "STAND BY..."; 
GZJ 1670 POKE 752,I:FOR I=1 TO 99:READ N 
RRJ 1680 POSITION 13,0:PRINT 100-I;CHR$(32); 
PXJ 1690 POKE 1663+I,N:TOT=TOT+I+N:NEXT I 
MYJ 1700 IF TOT<>16577 THEN PRINT "ERROR - CHECK DATA LINES 2000-2130":END 
MVJ 1710 POKE 16,64:POKE 53774,64:POKE 752,0 
FSJ 1720 A=USR(1664):RETURN 
QFJ 1730 POSITION 2,22:PRINT DE$;S$;"THAT COMMAND IS NOT AVAILABLE YET" 
EJJ 1740 GOSUB 1110:GOTO 630 
GFZ 1750 GOTO 1730 

Next, you get to type in your recipe. You can type anywhere you like on the recipe screen. A gentle beep will remind you when you near the end of the line so you can press RETURN. You can put “Ingredients” and “Instructions” headings in wherever you want. All the Atari’s editing keys work so you can quickly and accurately create your recipe “card.” The screen space is ample for most recipes. For extra long ingredients’ lists, you can shorten the instructions, or you can even put the same recipe on two or more separate “cards” — i.e. SUPERBURGER PART 1 and SUPERBURGER PART 2. Part 1 could contain the ingredients, and Part 2 could contain the instructions. In this way, your recipe space is virtually unlimited.

The only restriction you have when entering recipes is that quantities should always be at the leftmost side of the screen and in parentheses, such as: (2) pounds beef. This will allow the CALCULATE function (to be implemented next month) to change these quantities when multiplying or dividing recipes. To use fractions, use the slash (i.e. for one-half, type 1/2, not .5). For a value such as one and three quarters, separate the whole number from the fraction with a space or other character, as in the following formats: (3 1/4), (3-1/4), (3+1/4), (3&1/4), etc.

Press “>” to enter the next recipe, or “ESC” when you’ve finished entering recipes.

The BROWSE/EDIT option lets you look through your computer recipe file by pressing the “▲” and “>” keys to move backward and forward, respectively. You can also change any recipe as you move through your file. All changes are recorded on the disk. If you find a recipe that you want to print, press the ESC key for the menu. Then press “P” for the PRINT option and the recipe is neatly printed with a centered title. If you again select the BROWSE option, you will be able to browse from where you left off. Happy cooking!

Next Month

We’ll get into more details on Recipe Manager, and enter the next part of the program. We’ll also have some holiday programs.

Readers’ questions, comments and original contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A diskette of all programs listed in this month’s column is available from the author for $7.00, postpaid. Please specify your disk drive model.

Program Perfect is a utility used to check for typing errors while entering programs from this column. Readers may send a SASE for a listing or $5.00 for diskette of this program.

Address all correspondence

Jeff Brenner
“Applying the Atari 11/85”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
COMPUTER SHOPPER / DECEMBER 1985 / PAGE 65 

Applying The Atari

by Jeff Brenner

This month’s column brings the second part of Recipe Manager — just in time to organize your holiday recipes. The second part adds two useful features to the section listed last month. The first is a “FIND” option, which lets you search for a particular recipe or category. The other is the “CALCULATE” option, which automatically halves, doubles, triples, etc. the measures for any recipe. This month we also have several utility programs submitted by readers, and more reader mail.

Clarifications/Corrections

I had the unusual opportunity to see last month’s column in print before completing this month’s article. I’ll take advantage of this by correcting two confusing typographical errors that appeared here last month.

In November’s column, a triangle symbol appears on page 180 and on page 184: In both these cases, this triangle should have been the less-than symbol. On both Mailing List and Recipe Manager, the greater-than symbol (same as INSERT key) moves forward among the entries, and the less-than symbol (same as the CLEAR key) moves backward. How did the triangles get there? I wish I knew.

On page 180, I seem to say that if you try to search for “Computer Shopper” the program cannot find “Computer Shopper.” The first “Computer Shopper” should have been in all capital letters: If you try to search for something that is all capitals, the program will not find the same word that contains both capitals and lower case letters.

Also in November issue, I say that a keypad program correction was published in October. However, this program was left out of October’s issue. November’s keypad program is therefore the correction to the keypad program.

Reader Mail

Q. First I’d like to say thank you for an extremely good section for Atari home computers. I’m writing to ask you a few questions: (1) Is the Atari 400 totally compatible with 800 and 800XL software? (2) Is the Atari 400 compatible with the 810 disk drive? The 1050 disk drive? (3) Where may I obtain DOS 2.5? (4) Can I piggy-back eight 2K chips on the back of each 2K memory chip in my Atari 400 to expand its memory to 32K? Can the same process be used to expand the memory to 48K or 64K? (6) Could you provide me with a listing for a memory test program? Your answers will be greatly appreciated by my users’ group.

Kuniki Lockett
Sweetwater, AL

A. (1) The 400, provided it contains sufficient memory to run the programs, is completely compatible with 800 software. A 16K Atari 400, however, cannot run a 32K program for any machine. Software released specifically for the XL/XE machines cannot be used with the 400 and 800, but almost all Atari (8-bit) software will run on the 400/800 models.

(2) Again, provided the 400 contains at least 16K of memory, it can be used with the 810 or 1050 disk drives.

(3) As mentioned in last month’s column, you can send Atari your DOS 3 diskette and you will be sent DOS 2.5 at no charge (Atari Customer Relations, P.O. Box 61657, Sunnyvale, CA 94088).

(4) Unfortunately, expanding the 400’s memory is not as simple as piggybacking RAM chips to the existing ones. You’ll probably be better off buying an inexpensive Atari XL or XE than buying hard-to-find memory boards for the Atari 400.

(5) A memory test program is listed under “SIMPLE MEMORY TESTER.” This BASIC program contains a machine language program that checks all memory above page 6 (location 1536). Each location is checked by setting all bits to zero (storing a zero in the location) and then setting all bits to one (storing a 255 in the location). At both points, the program verifies that the location contains the zero or the 255. If the memory location does not contain the value that was stored in it, the program will end and will print the faulty memory address.

SIMPLE MEMORY TESTER 
VTJ 10 REM SIMPLE MEMORY TESTER 
IIJ 20 REM COPYRIGHT 1985 JB 
ICJ 30 FOR I=1536 TO 1595:READ N:T=T+I+N 
TKJ 40 POKE I,N:NEXT I 
OQJ 50 IF T=10 THEN 70 
WHJ 60 PRINT "ERROR-CHECK DATA LINES 100-170" 
ROJ 70 PRINT CHR$(125);"CHECKING MEMORY..." 
FSJ 80 POKE 207,0:A=USR(1536) 
CKJ 90 IF PEEK(207) THEN 110 
PSJ 100 PRINT "MEMORY O.K.":END 
QXJ 110 BAD=PEEK(205)*256+PEEK(204) 
YTJ 120 POKE BAD,PEEK(206) 
OQJ 130 PRINT "BAD BYTE AT LOCATION ";BAD 
PQJ 140 END 
UXJ 150 DATA 104,169,168,141,1,210,169,7 
UFJ 160 DATA 133,205,169,0,133,204,160,0 
YQJ 170 DATA 177,204,133,206,169,0,145,204 
CFJ 180 DATA 177,204,208,29,169,255,145,204 
BWJ 190 DATA 177,204,201,255,208,19,165,206 
CXJ 200 DATA 145,204,200,208,227,230,205,165 
YCJ 210 DATA 205,141,0,210,197,106,208,216 
UGZ 220 DATA 96,230,207,96 

Q. I have played around with the Atari 130XE and DOS 2.5. I tried to use the DOS in a double density drive and cannot find if it will support DD. None of the menu options seem to support DD. Why would Atari write a “new” DOS in this day that doesn’t support DD? The documentation only says that it supports “dual density” and most users have abandoned this format long ago.

Sears V. Tanner
Leesville, LA

A. The Atari 1050 is more like a “one-and-a-half” density drive than a double density drive. Several companies sell modifications that can give you “true double density.” Normally, however, the 1050 can not operate beyond what Atari now calls “enhanced density,” Dos 2.5 can detect whether an 810 or 1050 is being used and automatically adjusts to function in single or in enhanced density. Thus, all commands on DOS 2.5 support enhanced density when used with the 1050. When you say many users have abandoned the “dual density” format, I take it that you are referring to DOS 3. When Atari released DOS 3, it used the terms “double density” and “dual density.” But, like DOS 2.5, DOS 3 does not actually work in double density — it also is an enhanced density DOS. Many Atari users stopped using DOS 3, not because of its density, but because of its incompatibility with DOS 2 and with some commercial software.


Q. Some of my friends and I have the Atari 5200 Super System and we would like to know if Jack Tramiel has plans to continue making the Super System and/or cartridges for the Super System.

Rudy Romero
Riverside, CA

A. I’m sorry to be the one to break the news, but an Atari spokesperson has told me that production of the 5200 game system and cartridges has been “put on hold indefinitely.” Atari says it is now dedicating all of its effort to marketing its new computers.

Reader’s Utilities

This month we are presenting three utilities submitted by readers. Each contributor has been sent a holograph sticker. If you have created a short program or have a public domain program that others may be interested in, send it in. The two best original programs received before the end of the year will earn their authors a program from Epyx or Sega.

Dave Garvin, of Medford, Oregon, writes: “I liked your program for the printers [ATASCII Lister, July 1985]. I am sending you a modified version that I made from your program. Program #1 is for the older Atari computers and Program #2 is for the XL/XE.”

These programs are listed under the “PRINTER UTILITY” heading. 400/800 owners should enter the first listing, and XL/XE owners should enter the second. The program allows you to LPRINT or LIST“P” a program containing inverse video or graphics characters. Compared to ATASCII Lister, the inverse video and graphics characters are printed more slowly, and quite violently - the printhead jerks back and forth for each character. However, Mr. Garvin’s utility offers an advantage in that programs can be listed directly from the computer to the printer without having to first LIST the programs to disk.

PRINTER UTILITY - 400/800 VERSION 

SCJ 19 REM 400/800 VERSION 
FEJ 20 REM BY DAVID GARVIN 
AQJ 30 PRINT CHR$(125);"DENSITY (1-2) ";:INPUT D:IF D<1 OR D>2 THEN 10 
RWJ 40 FOR X=1 TO 200:READ A:POKE 1535+X,A:NEXT X:POKE 1741,74+D:X=USR(1536) 
QYJ 50 PRINT :PRINT "THIS PRINTER IS NOW READY TO USE.":PRINT :PRINT 
BSJ 60 PRINT "IF SYSTEM RESET IS PRESSED, REACTIVATE" 
LYJ 70 PRINT "PROGRAM BY TYPING X=USR(1536).":END 
LHJ 80 DATA 194,169,12,141,27,3,169,6,141,28,3,96,158,238,219 
TAJ 90 DATA 238,157,238,26,6,128,238,157,238,76,129,238,169,9,132 
NNJ 190 DATA 203,201,155,200,3,76,192,6,201,32,144,4,201,91,144 
RTJ 110 DATA 245,201,97,144,4,201,123,144,237,19,38,203,74,201,96 
JDJ 120 DATA 176,16,201,64,176,9,201,32,176,5,105,64,76,78,6 
OEJ 130 DATA 56,233,32, 133,208,169,0,133,209,24,162,3,24,38,208 
TXJ 140 DATA 38,209,202,208,248,24,173,244,2,101,209,133,209,160,7 
QRJ 180 DATA 162,1,177,208,157,195,6,169,0,153,208,6,136,232,224 
INJ 160 DATA 9,208,240,160,0,162,8,185,208,4,62,195,6,42,153 
SLJ 170 DATA 208,6,202,208,243,165,203,240,8,185,208,6,73,255,153 
OKJ 180 DATA 208,6,185,208,6,201,155,208,5,169,151,153,208,6,200 
RRJ 190 DATA 192,8,200,212,169,0,132,203,185,204,6,132,203,32,167 
V2J 200 DATA 236,230,203,164,203,192,12,208,240,160,1,96,76,167,238 
XF2 210 DATA 0,0,0,0,0,0,0,0,128,27,75,0,0 
XL/XE VERSION 

BXJ 10 REM XL/XE VERSION 
FEJ 20 REM BY DAVID GARVIN 
AQJ 30 PRINT CHR$(125);"DENSITY (1-2) ";:INPUT D:IF D<1 OR D>2 THEN 10 
RVJ 40 FUN X=1 TO 212:READ A:POKE 1535+X,A:NEXT X:POKE 1745,74+D:X=USR(1536) 
OYJ 50 PRINT :PRINT "THIS PRINTER IS NOW READY TO USE.":PRINT :PRINT 
BSJ 60 PRINT "IF SYSTEM RESET IS PRESSED, REACTIVATE" 
LYJ 70 PRINT "PROGRAM BY TYPING X=USR(1536).":END 
MGJ 80 DATA 194,169,12,141,27,3,169,6,141,28,3,96,193,254,6 
STJ 90 DATA 255,192,254,26,6,162,254,192,254,76,153,254,160,0,132 
NRJ 100 DATA 203,201,155,208,3,76,196,6,201,32,144,4,201,91,144 
RTJ 110 DATA 243,201,97,144,4,201,123,144,237,10,38,203,74,201,96 
JDJ 120 DATA 176,16,201,64,176,9,201,32,176,5,103,64,76,78,6 
PTJ 130 DATA 86,233,32,133,208,134,204,169,0,133,209,24,162,3,24 
MAJ 140 DATA 38,200,38,209,202,208,248,24,173,244,2,101,209,133,209 
NXJ 150 DATA 160,7,162,1,177,208,157,199,6,169,0,153,212,6,136 
KRJ 160 DATA 232,224,9,208,240,169,0,162,0,185,212,6,62,199,6 
P2J 170 DATA 42,153,212,6,202,208,243,165,203,240,8,185,212,6,73 
UAJ 180 DATA 255,133,212,6,183,212,6,201,155,208,5,169,151,153,212 
PNJ 190 DATA 6,200,192,8,208,212,160,0,132,203,166,204,185,208,6 
M8J 200 DATA 132,203,32,203,234,230,203,164,203,192,12,208,238,160,1 
NAJ 210 DATA 96,76,203,254,0,0,0,0,0,0,0,0,0,27,75 
ASZ 220 DATA 0,0 

Richard Fleagle, of Fairbanks, Alaska, sends a renumbering utility (listed under the “RENUMBERING UTILITY” heading) and writes: “I am a subscriber to the Computer Shopper and I read the Atari section in each issue. I wonder what has happened to all of the old utility programs that were so plentiful so many years ago. I guess it was in January of 1981. I am enclosing a utility I have used for years. As with all of the renumbering utilities I have used, this one is no exception as it will not renumber lines referred to by variables.

“To load the utility, have the program you wish to renumber in computer memory and type EN.“D:RENUMBER.LST.” To run it, type G.32100.

“The program asks you for the file name you wish to have for the finished product. It may be a good idea to use the original program name with the extender of “.LST” since the renumbered program is saved in a LIST format. Next question is the starting line number and what line number increment you want. Maybe you want to start at line 10 and have the next line 20, etc. Just answer 10,10 at that prompt.

“The program keeps you posted as to what is happening as it goes along and plays a bit of music. If there are lines that refer to variable names or lines that are not in the program being renumbered, the line number and a message [SR-Symbolic reference or NF-not found] will appear on the screen. Write these line numbers down since you will want to go back to them and enter the correct line numbers manually. When renumbering is complete, the screen will show how many lines were renumbered. Pressing RETURN will LIST the program to disk. Then type NEW and ENTER your new renumbered program. If there were error - reference lines, check these out and make corrections. When all is done, SAVE the file.

EDITING UTILITY 

BYJ 31000 REM SPECIAL EDIT PROGRAM/A. TODD 
QOJ 31010 PRINT "TO ADVANCE, PRESS START" 
YFJ 31020 PRINT "TO BACK UP, PRESS SELECT." 
MKJ 31030 PRINT "PRESS BREAK FOR EDIT NODE." 
MIJ 31040 PRINT "TYPE 'CONT' AND PRESS RETURN WHEN YOU HAVE FINISHED EDITING." 
YUJ 31050 PRINT "WHEN THROUGH, PRESS OPTION TO ERASE" 
FZJ 31060 PRINT "THIS PROGRAM." 
HUJ 31070 PRINT "INCREMENT BY HOW MANY LINES";:INPUT LIN 
CHJ 31080 FOR LST=9 TO 31760 STEP LIN 
U64 31090 IF LST>-1 THEN LIST LST+1,LST+LIN 
IUJ 31100 IF PEEK(53279)=6 THEN GOTO 31140 
RRJ 31110 IF PEEK(53279)=5 THEN LST=LST-LIN:GOTO 31090 
IUJ 31120 IF PEEK(53279)=3 THEN GOTO 31150 
IWJ 31130 GOTO 31100 
JNJ 31140 NEXT LST:GOTO 31090 
SW4 31150 PRINT CHR$(125):POSITION 2,4 
MEJ 31160 FOR Y=31000 TO 31170 STEP 10:PRINT Y:NEXT Y:PRINT "GR.0:POKE 842,12" 
FBZ 31170 POSITION 2,3:POKE 842,13:END 
RECIPE MANAGER ADDITIONS 

WTJ 1730 PRINT CHR$(125);:GOSUB 1100 
FLJ 1740 GOTO 2150 
GBJ 1730 GOSUB 1100:TRAP 1330 
UDJ 1760 POSITION 2,23:PRINT DE$; 
MCJ 1770 POSITION 2,22:PRINT DE$;"CURRENT NUMBER OF SERVINGS"; 
SVJ 1780 INPUT CN 
UVJ 1790 POSITION 2,22:PRINT DE$;"NUMBER OF SERVINGS DESIRED"; 
GUJ 1800 INPUT SD 
CQJ 1810 F=SD/CN 
CSE 1820 FOR Y=4 TO 21:POSITION 2,Y:INPUT #4;A$ 
PAE 1825 IF LEN(A$)=0 THEN NEXT Y:GOTO 1333 
GNJ 1830 IF A$(1,1)<>"(" THEN NEXT Y:GOTO 2030 
GYJ 1840 A$=A$(2,LEN(A$)) 
QHJ 1850 FOR X=2 TO LEN(A$):IF A$(X,X)<>")" THEN NEXT X:GOTO 1880 
IKJ 1860 A$=A$(1,X-1) 
FZJ 1870 GOTO 1893 
AQJ 1880 POSITION 2,Y:PRINT "*";:POSITION 2,23:GOTO 2130 
IMJ 1890 J=LEN(A$)+1:DN=1:NM=0 
OQJ 1900 FOR I=LEN(A$) TO 1 STEP -1:IF A$(I,I)<>"/" THEN NEXT I:I=2:GOTO 1940 
JWJ 1910 DM=VAL(A$(I+1,LEN(A$))) 
JWE 1920 FOR J=I-1 TO 1 STEP -1 
DIE 1925 IF A$(J,J)>="0" AND A$(J,J)<="9" THEN NEXT J:W=VAL(A$) 
BEJ 1930 NM=VAL(A$(J+1,I-1)) 
VXJ 1940 W=0:IF J>1 THEN W=VAL(A$(1,J-1))+NM/DN 
GOJ 1950 IF J<1 THEN W=NM/DN 
YBJ 1960 W=W*F:LN=LEN(A$) 
GFJ 1970 IF INT(W)=0 THEN A$="":FR=W:W=0:GOTO 1990 
UJJ 1980 A$=STRS(INT(W)):FR=W-INT(W):W=W-FR 
UDJ 1990 R=FR:DH=1:NH=0 
YBJ 2000 FOR D=2 TO 8:IF D=5 THEN D=8 
MVJ 2010 FOR N=1 TO D 
AVJ 2020 IF ABS(FR-(N/D))<R THEN R=ABS(FR-(N/D)):DH=D:NH=N 
TBJ 2030 NEXT N:NEXT D 
SJJ 2040 IF DH=NH THEN NH=0:W=W+1 
NZJ 2050 IF W THEN A$=STR$(W):IF NH=0 THEN 2090 
OBJ 2060 IF W THEN A$(LEN(A$)+1)="+" 
RUJ 2070 A$(LEN(A$)+1)=STR$(NH):A$(LEN(A$)+1)="/" 
HIJ 2080 A$(LEN(A$)+1)=STR$(DH) 
HZJ 2090 POSITION 3,Y:J-LEN(A$)-LN:SOUND 1,25,10,8 
YIJ 2100 IF J>0 THEN FOR I=1 TO J:PRINT CHR$(255);:NEXT I 
CVJ 2110 IF J<0 THEN FOR I=J+2 TO 1:PRINT CHR$(254);:NEXT I 
HYJ 2120 PRINT A$;:SOUND 1,0,0,0 
BEJ 2130 NEXT Y 
FFJ 2140 GOTO 1330 
OYJ 2150 POKE 752,0:POSITION 2,22 
YRJ 2160 PRINT DE$;"FIND ";CHR$(195);"ATEGORY OR ";CHR$(210);"ECIPE?"; 
PQJ 2170 GET #1,A:IF A<>82 AND A<>67 THEN 1330 
SBJ 2180 PRINT CHR$(A); 
ONJ 2190 IF A=67 THEN POSITION 2,22:PRINT DE$;"FIND WHAT CATEGORY"; 
JBJ 2200 IF A=82 THEN POSITION 2,22:PRINT DE$;"FIND WHAT RECIPE NAME"; 
CUJ 2210 INPUT A$:L=LEN(A$) 
VEJ 2221 GOSUB 1190:TRAP 2360:OPEN #2,4,0,FILE$ 
NXJ 2230 CLOSE #3:OPEN #3,4,0,FILE2$:INPUT #5;X,X,FS,FB:CLOSE #3 
PRJ 2240 IF PEEK(704)=20 THEN PRINT CHR$(125)(GOTO 1330 
TAJ 2250 NOTE #2,S,B:INPUT #2,X,X:INPUT #2;LINE$:POSITION 2,2:PRINT LINE$ 
HZJ 2260 J=19:IF A=67 THEN IF A$=LINE$(1,L) THEN 2430 
HIJ 2270 J=18:INPUT #2;LINE$:PRINT LINE$ 
VLJ 2280 IF A=82 THEN IF A$=LINE$(1,L) THEN 2430 
8YJ 2290 FOR I=1 TO J:INPUT #2;LINE$:NEXT I 
FEJ 2300 GOTO 2240 
UAJ 2310 POSITION 2,23:A=USR(1664) 
EWJ 2320 PRINT DE$;CHR$(195);"ONTINUE SEARCHING OR ";CHR$(211);"TOP?"; 
FFJ 2330 GET #1,A:PRINT CHR$(A);:IF A<>67 THEN 1330 
UCJ 2340 IF S=FS AND B=FB THEN 2370 
OKJ 2350 PRINT CHR$(125);:LINE$=A$:GOSUB 1100:A$=LINE$:GOSUB 1190:GOTO 2240 
RFJ 2360 IF PEEK(195)<>136 THEN 610 
UNJ 2370 PRINT CHR$(125):GOSUB 1100 
PIJ 2380 POKE 752,1:A$="END OF RECIPES":GOBUB 1080:POSITION 13,22:PRINT A$ 
KEJ 2390 A=USR(1664) 
LAJ 2400 POKE 764,233 
RDJ 2410 IF PEEK(764)<>28 THEN 2410 
FGJ 2420 GOTO 1330 
AHJ 2430 FOR I=1 TO J:INPUT #2;LINE$:PRINT LINE$:NEXT I 
JX2 2440 IS=S:IB=B:NOTE #2,S,B:GOTO 2310 

Aaron Todd of Los Angeles, CA, submits “EDITING UTILITY.” This program should be LISTed to diskette. Then it can be ENTERed and merged with your BASIC programs. Type GOTO 31000 to run it. You’ll be asked to “INCREMENT BY HOW MANY LINES?” If your program is generally numbered by ten (i.e. 10, 20, 30, etc.) enter 10 for this prompt. Then, pressing START will list the next line(s) of your BASIC program. Pressing SELECT will list the previous line(s). To edit a line on the screen, press BREAK and use the control keys to reenter. Then type CONT and press RETURN. When you are finished using this utility, press OPTION and it will erase itself from memory, leaving you with your BASIC program.

Thanks to all readers who have submitted programs.

Genealogy Programs And More Genealogy Programs.

Last month I mentioned two genealogy programs that readers had written in about in response to Darwin K. Garrison’s request for a genealogical program for the Atari. This month Computer Shopper readers have discovered even more. Antic Publishing, which claims that its genealogy program, The Family Tree, is “the only genealogy program for the Atari” had better take note:

1) Ancestors for the 800/XL/XE. $39.95 plus a formatted DOS 2 diskette from Velma Prochter (Box 2434, Harbor, OR 97415).
2) Branches and Twigs for the 400/600/800/XL/XE, (companion programs). $55.00 from Sysco Software (3595 Cloverleaf Drive, Boulder, CO 80302).
3) Family History. $59.95 plus $2.00 shipping from Direct Lines Software (4816 Forrestal St., Fair Oaks, CA 95628).
4) Genealogical Database Manager and Family Tree Organizer for the 800/XL/XE, (soon for 520ST). $29.95 from Caledonia Enterprises (490A Abelia Street, Sumter, SC 29152-1403).
The following were listed last month:
5) The Family Tree. $19.95 plus $3.00 shipping from Antic Publishing (524 Second St., San Francisco, CA 94107)
6) Genealogical Program from A-BUG-BYTE users group. $5.00 from A-BUG-BYTE (10790 W. National Road, Brookville, OH 45309).

Now we have enough genealogy programs to last us for, well, generations! Several readers found these programs described in genealogy publications; others contacted organizations such as the National Genealogical Society. My sincerest thanks to all readers and genealogists who wrote, including Jim Cox, (APO New York), Al Crespo (Bakersfield, California), Y. Feiner (Orange, New Jersey), Louis J. Goldman (Middleburg Heights, Ohio), James M. Herzberg (Toledo, Ohio), John P. Kirkpatrick (Sumter, South Carolina), Leo H. Kordsmeier, Jr. (Little Rock, Arkansas), Dixie Sandy (Lafayette, Colorado), and Dan Sweda (Brookville, Ohio).

In October, a letter from Ken Rogers (Melrose, Massachusetts) was printed in which he asked where he could find the “Power Stick,” a joystick that was made by a company called Amiga. My thanks to Patrick Campbell (Birmingham, Alabama) for writing to say that he recently purchased the Amiga “Power Stick” at a Birmingham Toys ’R Us store. I have seen the “Power Stick” in Toys ’R Us stores in the New York area, and there is a good chance that other Toys ’R Us stores around the country are selling this joystick.

RENUMBERING UTILITY 

YPJ 32350 REM RENUMBER PROGRAM/DICK FLEAGLE 
GWJ 32360 DIM B$(12):PRINT CHR$(125);CHR$(29):T8=256:I=1:Z=32350 
EJJ 32370 WM=0:X=PEEK(138)+PEEK(139)*T8 
HRJ 32380 Y=PEEK(134)+PEEK(135)*T8+8*(PEEK(X+5)-128)+2 
PXJ 32390 PRINT "ENTER FILENAME FOR PROGRAM: ":PRINT "(NAME AND EXTENSION ONLY)" 
IQJ 32400 INPUT B$:PRINT "START #, BY (INCREMENT): ":INPUT FR,BY:PRINT CHR$(125) 
OIJ 32410 B=PEEK(136)+PEEK(137)*T8:X=B:M=FR 
ADJ 32420 LN=PEEK(X)+PEEK(X+I)*T8:SOUND 0,LN,10,8:IF LN=Z THEN 32460 
FEJ 32430 PL=PEEK(X+2):C=X+3 
SVJ 32440 LL=PEEK(C):C=C+I:GOSUB 32900:IF LL<PL THEN C=X+LL:GOTO 32440 
VLJ 32450 X=X+PL:M=M+BY:GOTO 32420 
OEJ 32460 M=FR:X=B:SOUND 1,0,0,0 
MIJ 32470 LN=PEEK(X)+PEEK(X+I)*T8:SOUND 0,32768-LN,10,8:IF LN=Z THEN 32740 
BEJ 32480 MH=INT(M/T8):ML=M-MH*T8:POKE X,ML:POKE X+I,MH 
MDJ 32490 M=M+BY:X=X+PEEK(X+2):GOTO 32470 
LRJ 32500 TK=PEEK(C) 
AOJ 32510 IF (TK>9 AND TK<14) OR TK=39 THEN C=C+I:GOSUB 32640:RETURN 
GEJ 32520 IF TK<>30 THEN 32500 
GUJ 32530 C=C+I:D=PEEK(C):IF D=23 OR D=24 THEN 32560 
CIJ 32540 IF D=14 THEN C=C+6 
JLJ 32550 GOTO 32530 
OJJ 32560 C=C+I:GOSUB 32640:D=PEEK(C):IF D<>20 AND D<>22 THEN 32560 
EZJ 32570 RETURN 
NUJ 32580 IF TK<>7 THEN RETURN 
ONJ 32590 C=C+I:D=PEEK(C):IF D=27 THEN 32620 
CFJ 32600 IF D=14 THEN C=C+6 
JOJ 32610 GOTO 32590 
QCJ 32620 C=C+I:IF C<(X+LL) THEN GOSUB 32640 
EWJ 32630 RETURN 
PHJ 32640 D=PEEK(C):IF D=20 OR D=22 THEN C=C+I:RETURN 
ONJ 32650 IF D<>14 THEN PRINT M;" SR,";:C=C+I:RETURN 
SIJ 32660 C=C+I:FOR J=0 TO 3:POKE Y+J,PEEK(C+J):NEXT J 
AQJ 32670 IF WM<LN THEN WX=B:RN=FR:GOTO 32690 
KTJ 32680 WX=X:RN=M 
NLJ 32690 WN=PEEK(WX)+PEEK(WX+I)*T8:SOUND 1,WN,10,8 
LZJ 32700 IF WN<Z AND WN<WM THEN RN=RN+BY:WX=WX+PEEK(WX+2):GOTO 32690 
KCJ 32710 IF WN<>WM THEN PRINT M;" NF,";:GOTO 32730 
VBJ 32720 WM=RN:FOR J=0 TO 3:POKE C+J,PEEK(Y+J):NEXT J 
SJJ 32730 C=C+6:RETURN 
UVJ 32740 PRINT :POKE 85,10:PRINT ">";(M-FR)/BY;" LINES" 
GJJ 32750 PRINT "LIST";CHR$(34);"D:";B$;CHR$(34);",";FR;",";M-BY 
HFZ 32760 FOR K=1 TO 3:PRINT CHR$(28);:NEXT K:POKE 766,0:END 

Recipe Manager, Part II

Use Program Perfect to type in the Part II of Recipe Manager listed under the “Recipe Manager Additions” heading. Then LIST these additions to diskette (i.e. LIST “D:TEMP”), load in the original Recipe Manager, and ENTER the additions (ENTER “D:TEMP”) to merge them with the original program. You can then SAVE the complete program under one name (i.e. SAVE “D:RECIPE.BAS”).

The additions add the routines necessary for the FIND and the CALCULATE options. A description of each of these options follows:

FIND Recipes/Categories

This option lets you find a particular recipe that you’ve stored in Recipe Manager. It also enables you to look through recipes in a specific category only, such as “main dishes.”

When F is pressed for the “SELECT:” prompt, you are asked, “FIND CATEGORY OR RECIPE?” If you have the name of a particular recipe in mind, press R, and you’ll be asked to enter the name of the recipe. When you type the name and press RETURN, the program will look through each recipe stored on the diskette unil a match is found. If you are not sure of the entire name of the recipe, you can enter only a part of the name and the program will find all receipt names that match that part. For example, if you only type “CHICKEN,” Recipe Manager would find any entires beginning with “CHICKEN,” such as “CHICKEN A LA KING” and “CHICKEN CACCIATORE.”

When a match is found, the recipe is displayed on the screen and you are asked if you want to “CONTINUE SEARCHING OR STOP.” Press C to continue finding recipe names that match the one you entered, or press S to return to the menu screen. From the menu screen, you can then print the recipe, or use the CALCULATE feature (discussed later.)

If you choose to find a category, rather than a particular recipe, type in the name of the category you want to look through. Again, you can only enter a part of the category if you are unsure of the complete name. After a match is found, it is displayed on the screen and you are asked if you want to continue searching or to stop. Press C to find the next recipe in the category you specified. When you’ve found the recipe you want, press S and the menu will appear.

When finding either a recipe name or a category name, an “END OF RECIPES” message will be displayed when all recipes on the diskette have been examined for a match.

If you want to change a recipe that you have found, press S to stop searching and press B on the menu for the BROWSE/EDIT option. The last recipe that was found will be reprinted on the screen for you to change it as you please.

CALCULATE Feature

This option enables you to automatically multiply or divide the measurements of a particular recipe. Only the recipe that is on the screen is affected by this command — the original recipe on the diskette will not be changed.

When C is pressed for the “SELECT: ” prompt, you are asked, “CURRENT NUMBER OF SERVINGS?” Type the number of servings that the original recipe makes and press RETURN. It is a good idea to label the recipe itself with the number of servings. The best way to do this is by placing the number of servings in parenthesis at the leftmost position on a line, such as: (4) SERVINGS. This will enable the “4” to be changed along with the measurements when a recipe is multiplied or divided.

Next you are asked, “NUMBER OF SERVINGS DESIRED?” Type the number of servings you would like to make and press RETURN. Recipe Manager will then examine the recipe on the screen, line by line, multiplying or dividing each measurement as appropriate. Remember, in order for a measurement to be re-calculated, it must be in parenthesis and at the left-most position on the screen. An asterisk will be printed on any line that generates an error when the CALCULATE option is used. Such an error might result if a closed-parenthesis is forgotten or if numbers are not in the correct format.

The CALCULATE feature will put mixed numbers in a form such as: 1 + 1/4. Recipe Manager uses 1/8 as the smallest fraction and will round measurements up or down to the nearest 1/8. If you would like the minimum measurement to be ¼, change line 2000 to:

2000 FOR D=2 TO 4 

It is important to note that only the measurements will be changed — baking times, for instance, must be lengthened or shortened by you, since these times cannot simply be multiplied or divided along with the measurements of the recipe.

Sample Recipe

Figure 1 shows a sample Recipe Manager screen on which a recipe (thanks to Sandra B.) has been placed. The first line of the mini-screen contains the category, “MAIN DISHES” and the second line contains the recipe name, “MEAT LOAF.” Note the format of the numbers for the measurements and the “(4) serving?” near the bottom of the recipe.

            RECIPE MANAGER 
                 MENU 
MAIN DISHES 
MEAT LOAF 

Ingredients: 
(1+1/2) cups seasoned stuffing mix 
(1/2) cup water 
(1) can tomato sauce (8 oz. can) 
(2) lbs ground beef 
(1) egg 
(1) packet onion soup mix 

Directions: 
Mix stuffing with water until moist. 
Stir in remaining ingredients. 
Form into a loaf in shallow baking 
pan. Bake 60 minutes at 
350 degrees F. 

(4) servings 
ADD BROWSE/EDIT FIND PRINT CALCULATE 
SELECT: 
Figure 1

Figure 2 shows how this recipe looks when printed with the PRINT option. The top recipe is the original one, while the bottom one was recalculated, with the CALCULATE option, for eight servings. Note how the categories are placed in the upper, left-hand corner and how the recipe names are automatically centered and underlined. This allows you to cut out the recipes and paste them on recipe cards, if desired.

MAIN DISHES MEAT LOAF Ingredients: (1+½) cups seasoned stuffing mix (½) cup water (1) can tomato sauce (8 oz. can) (2) lbs ground beef (1) egg (1) packet onion soup mix Directions: Mix stuffing with water until moist. Stir in remaining ingredients. Form into a loaf in shallow baking pan. Bake 60 minutes at 350° F. (4) servings MAIN DISHES MEAT LOAF Ingredients: (3) cups seasoned stuffing mix (1) cup water (2) cans tomato sauce (8 oz. can) (4) lbs ground beef (2) eggs (2) packet onion soup mix Directions: Mix stuffing with water until moist. Stir in remaining ingredients. Form into a loaf in shallow baking pan. Bake 60 minutes at 350° F. (8) servings.
Figure 2

Next Month

We’ll have programs for the new year, reader mail, a look back to 1985, and more.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope for a personal reply.

A diskette of all programs listed in this month’s column is available from the author for $7.00, postpaid. Please specify your disk drive model.

Program Perfect is a utility used to check for typing errors while entering programs from this column. Readers may send $5.00 for a diskette of this program and documentation.

Address all correspondence to: Jeff Brenner, “Applying The Atari 12/85” c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

COMPUTER SHOPPER / DECEMBER 1985 / PAGE 65 

Atari Help

by Jeff Brenner

Q. When using my Atari 1200XL with a monitor, the image is very unclear. There is ghosting to the left of the characters. This double image makes it quite impossible to use comfortably. I have tried several different types of monitors, amber, green, color (an interesting note: with the color monitor, it looked like the convergence was badly off). In all cases, the monitors worked well on other computers (not Atari). Can you shed some light on this?

Robert Davis
Yorba Linda, CA

A. What is unusual about your problem is that you have tried other computers with your monitor and have been able to get a good picture. I assume you are using the proper cable (and of good quality) between the 1200XL’s monitor jack and your monitor, that you have tried adjusting all controls on your monitor, and that you are not using an 80-column board.

Have you tried using an ordinary color or black and white television set? See if you still get the double image.

Is the image unclear when you are using BASIC, or only when you are using a particular program, such as your word processor? If this only happens with a particular program, it is probable that the colors used for the text and the background do not blend smoothly and are causing this ghosting.

Although a hardware problem is least likely, you can see if this is the case by trying another Atari with your monitor. It does not have to be another 1200XL; a 600XL, 800XL or even and XE should give you the same result. If you get a clear picture with another Atari computer, this would indicate that your 1200XL does indeed have some type of hardware problem.


Q. I read your column (Applying The Atari) for the first time this week and would like to compliment you on its content and style.

I couldn’t resist an ad for an Atari word-processing set, comprising 800XL, 1027, 1050 and a monitor. Later, I bought an 850 interface from a member of the local SIG.

My problem centers around using the extraordinary 1027 printer. It seems to have been made to the same philosophy as the Model A Ford. I don’t know if it will last as long.

There must be thousands of 1027s around the country. Do they all have such miserable documentation as I received with mine? The problem seems to be that all the textbooks on the Atari were printed before this printer was put on the market.

You would do me a huge service by telling me where I can find all there is to know about operating and looking after the 1027, particularly when connected to AtariWriter software.

How does it work? It spins so fast I haven’t yet fathomed it! Where precisely does one put the oil? Assuming one won’t be able to buy spare ink cartridges forever, how does one revive them? Can one print special letters from AtariWriter without using the cumbersome Control-O sequence?

One of these days I want to try to use the 800XL as a robot controller, specifically to input analog voltages relative to its coordinates via the paddle ports, and output instructions through the RS232 interface. Has anything been published on this yet?

I do hope it’s not imposing on you to ask all these questions. Even members of my SIG can’t help — they are mainly interested in games or chatting on bulletin boards!

A. While books have been written on Atari computers, BASIC and even DOS, I don’t know if there’s any supplemental documentation available for Atari’s printers. Occasionally, updates to documentation are released by Atari, so you may want to write and ask if more information is available for the 1027 (Atari Customer Relations, P.O. Box 61657, Sunnyvale, CA 94088).

How the 1027 works? Basically, an electric current spins a band of characters to the proper letter or number which is then “stamped” onto the ink ribbon, leaving an impression on the paper. Compared to a typewriter, the 1027 seems amazingly fast, but you may be surprised to hear that it is actually one of the slowest printers. Dot-matrix printers, while offering lower-quality type, can churn out characters six to eight times faster than letter quality printers. The slower, letter-quality printers have an advantage, of course, in that their print is indistinguishable from that of a typewriter.

Unless your manual specifically tells you to oil the 1027, do not oil it. Most of today’s printers are designed to run without user-oiling, and by oiling it you may do more harm than good.

Cartridges are more difficult to “revive” than are ribbons, but it is possible. One common method for extending the life of a cartridge is to take a part of the ribbon, twist it so the back of the ribbon faces the front, (180 degrees), and then completely wind the ribbon to the end. Some cartridge users open up the cartridge, apply a solvent, and then wind everything back up again when dry, but others say there may be undesirable “side-effects” to this technique.

Regardless of your printer, the Control-O sequence is necessary to send special character codes to the printer.

A good article to read on controlling external devices with the Atari computers is “Control Your Environment with the Atari 400/800” by David Alan Hayes (BYTE Magazine, July 1983, p. 428). It discusses using the joystick ports for input/output. While written for the Atari 400 and 800, most of what is discussed pertains to the XL and XE computers as well. Remember, however, that the XL and XE have only two joystick ports instead of four.


Q. Do you have any advice on a modem that would be compatible with Atari XE, Franklin, Commodore and T.I.? I would like to be one modem and use individual cables.

Stan Morris
Kula, HI

A. Your best bet is to buy any of the RS232C-compatible modems and use the appropriate cables/interfaces for each computer. You’ll need to buy an Atari 850 interface to use such as a modem with the Atari XE.


Q. Thanks for all the nice articles on ATARI along with the great utility programs. They are proving very helpful in my computing! I have a ton of questions for you: 1) I have some customized business software packages written in BASIC which I would like to use the numeric keypad for entries. Is there a particular technique to inserting your keypad program as a subroutine? 2) I would like to compile this business software into machine language. Is there a program like MAC/65 or some other which could do the job? Or should I use something like the ACTION! language to speed up the process?

John Palhof
West Palm Beach, FL

A. Adding the keypad subroutine to a BASIC program is easily done. First, renumber the keypad program (with a renumbering utility or manually) so that the line numbers do not interfere with the line numbers of your business program. Next, you must change the program into a subroutine. This is done by changing the END on line 50 to a RETURN. LIST“C:” (for cassette) or LIST“D:TEMP” (for diskette) the renumbered keypad program. LOAD in your business software and ENTER“C:” or ENTER“D:TEMP” the keypad program. By ENTERing the LISTed keypad program, it is merged with your business program in memory. Now, to activate the keypad, place a GOSUB to the keypad subroutine at the beginning of your business program. For example, if you renumbered the keypad program to begin at line 20000, line 5 of your business program could read:

5 GOSUB 20000 

After the keypad routine is initialized, control returns to your BASIC program and the numeric keypad responds to your input.

Regarding your question on compiling your BASIC business programs into machine language, you would want a BASIC compiler, such as Monarch Data System’s ABC. A compiler will take a program written in BASIC and convert it into machine language code so that it may run several times faster. MAC/65 is only an assembler/editor and would require you to completely rewrite your programs into assembly language; a far from simple task, regardless of your programming experience. A language such as Action! would speed things up, but again you would have to rewrite the entire program in the new language.


Q. On the Mailing List program (“Applying The Atari,” June 1984) how do I change the left margin on my Okidata 92? As you know, the tractor is fixed so you can’t shift the position of the paper.

Mitchell J. Macieski
Nutley, NJ

A. The lines listed under “Left-Hand Margin for Mailing List” will allow you to enter a value for the left margin. This will work on any printer since it prints spaces to move the margin over. Lines 1155 and 1266 are added, while 1285, 1290, 1300 and 1310 are changed. Line 1285 is one of the new lines recently added as an enhancement to Mailing List. If you did not enter the enhancements to Mailing List, then do not type this line.

When you choose to print labels, you’ll now be asked to enter a left margin. Enter the number of spaces that you want the print head to move over before it begins printing.

LEFT-HAND MARGIN FOR MAILING LIST 

1155 PRINT "LEFT MARGIN";:INPUT LM 
1266 A$=SP$(1,LM) 
1285 PRINT #5;SP$(1,5+LM);ID2$;SP$(12);:IF Q THEN PRINT #5;SP$(1,HS+5);ID$; 
1290 PRINT #5;A$;NAME2$;:IF Q THEN PRINT #5;SP$(1,HS);NAME$;:NAME$=NUL$ 
1300 PRINT #5;L$;A$;ADDR2$;:IF Q THEN PRINT #5;SP$(1,HS);ADDR$;:NAME2$=NUL$ 
1310 PRINT #5;L$;A$;CSZ2$;:IF Q THEN PRINT #5;SP$(1,HS);CSZ$; 

Address Atari-related questions to:

Jeff Brenner
“Atari Help”
c/o COMPUTER SHOPPER
P.O. Box F
Titusville, FL 32781-9990
COMPUTER SHOPPER / JANUARY 1986 / PAGE 57 

Applying The Atari

by Jeff Brenner

Yes, we’ve made it to 1986, and what could be a more appropriate way to start the year than with a computerized appointment calendar program? With PACE, the Personal Appointment Calendar & Editor, you’ll never have an excuse for missing an appointment again. This month we’ll also read some reader mail, look back on 1985, and get a glimpse of some Halley’s Comet software available for the Atari.

Retrospect

Surely, 1985 will be remembered for both the Atari ST and the Commodore Amiga, regardless of how well each has sold during this holiday season. As I write this column in November, everybody is talking about the amazing capabilities of the Amiga. Even A.N.A.L.O.G. has acknowledged that many Atari-users consider the Amiga to be the real next-generation Atari machine. For those less interested in the Amiga’s graphics and sound capabilities, however, most would agree that the Atari 520ST offers comparable performance at a much more affordable price. Maybe everybody should buy both machines. Or, how about neither. Many computer-users dislike the notion of upgrading to a new computer when the industry tells them to; i.e. “now’s the time to dump that 8-bit antique and get a Mac-like machine.” Many 8-bit Atari owners have put a significant investment in their machines in software and hardware, and are less than thrilled about starting over from scratch with a brand new system.

One thing is for certain, though. The prices for software and hardware for the 8-bit line have dropped considerably. Many Atari users have finally been able to expand to fully-equipped Atari systems with disk drives, modems, and more versatile printers. The lower disk drive prices have made the cassette-based Atari system almost extinct.

Well, by 1986 you’ll know the score. I’m still hoping to see a true 32-bit, multi-megabyte machine from Atari—maybe they could add some Amiga-rivaling graphics and sound effects while they’re at it. We’ll have to wait and see what 1986 brings.

Reader Mail

Q. I purchased the first issue ever of Computer Shopper in September and came across your Response Analysis Program (9/85, page 59), which I spent 3 and 1/2 hours typing in. I was intrigued with this program and looked forward to demonstrating it to friends and relatives to show that computers can be programmed to simulate artificial intelligence.

After keying it in, it did not work properly. Enclosed I give you a printout showing an example of the responses I get. The program only responds with the statements contained in the last few lines, i.e. 5580 to 5587. It does not pick up on the key words the way it is supposed to. Any suggestions?

H. G. Hittenberg
Toronto, Ont. Canada

A. The printout that H.G. Wittenberg sent me was quite humorous and a portion of it follows:

>I WANT TO TALK ABOUT WORK RAP: EXPLAIN FURTHER >WORK - YOU KNOW - WHERE ONE GOES TO EARN MONEY RAP: AND WHAT DO YOU THINK ABOUT THAT? >I THINK WORK IS NECESSARY AND ENOBLING RAP: I DON’T UNDERSTAND >WELL, YOU ARE NOT PICKING UP THE KEY WORD WORK! RAP: WHAT ELSE SHOULD I KNOW? >YOU ARE MAKING ME ANGRY RAP: YOU SEEM UNCOMFORTABLE WITH THIS TOPIC! >NO, I AM ANGRY AND MAD THAT YOU DO NOT PICK UP THE KEY WORDS RAP: TELL ME MORE. >LOOK UP DATA STATEMENT IN LINE 1280--THAT’S WHERE YOU FIND ANGRY, MAD RAP: THAT IS INTERESTING--GO ON. >YOU ARE SUPPOSED TO COME UP WITH RESPONSE IN LINES 5390-5392! RAP: LETS HEAR ALL ABOUT IT!

While it may seem that RAP is putting up a good fight with H. Wittenberg, RAP is answering only with its dummy responses, such as “AND WHAT DO YOU THINK ABOUT THAT?”; and “TELL ME MORE.”

The Response Analysis Program as listed in the September 1985 column, has been thoroughly tested on an Atari 800, 800XL, and 130XE, and will work perfectly if it has been entered correctly. The cause of H. Wittenberg’s problem is most definitely a typing error. However, a TRAP statement in the program makes it difficult to spot errors since a faulty program will still run without error messages; the program is directed to give a dummy response whenever an error occurs in the program. Therefore, readers who are not getting proper responses from RAP, should change the TRAP 1190 on line 650 to a TRAP 40000. This disables the trap command and will let the program stop executing when an error occurs.

The best way to check RAP is to type in some lines from the sample conversation provided on page 59 of September’s issue. For example, if you type:

I’M CHECKING TO SEE IF YOU WORK PROPERLY.
RAP should give a response such as:
FOR HOW LONG HAVE YOU BEEN CHECKING TO SEE IF I WORK PROPERLY.

If you enter H. Wittenberg’s statement, “I WANT TO TALK ABOUT WORK,” a properly entered RAP will respond with a response such as:

DO YOU KNOW MANY PEOPLE WHO ENJOY THEIR JOBS?

As I have stressed in the past, the best insurance against typing errors when entering programs from this column is the Program Perfect utility, which uses the three-letter codes preceding each program line to verify lines as they are entered into the computer. See April’s column (1985) for a listing of Program Perfect (the instructions are printed in May’s column), or readers can purchase a Program Perfect diskette with documentation (see the end of this article).


Q. Regarding the small print in the manual supplied by Optimized Systems Software for their Basic XE cartridge (and presumably for their other products as well). It seems I, with overworked and less than perfect eyesight, trustingly ordered Basic XE by mail. Now, I have no gripe with the product. A recently published benchmark sort took nine minutes on my 130XE. When I plugged in the Basic XE cartridge, just to see what would happen (since I can’t read the tiny print in their manual) the same exact benchmark ran in 3:30 flat. This is clearly a powerful product but, alas, I may never get full use of it, despite having paid full price. Oh, I know I could have gotten a refund. That’s not the point. I want everything this product can do for me—the full capability I paid for. So, I wrote a strong gripe on the warranty form when I sent it in. The response from OSS to date has been a big round zilch. Ironically, they have other products I’d like and can afford to buy. Will I? Will you?

I’ve spent many years in marketing and advertising and there’s a moral here. The smart marketers today know that it’s not enough merely to make the initial sale of complex hardware, software or firmware products. You must support (and keep on selling) every customer after the sale if you want to build your company. The only practical way to do that for sales that doesn’t amount to big hucks is by providing manuals that are practical, understandable and readable. In fact, good manuals are powerful marketing tools for high-tech products. We get them from Synapse, from Datasoft and others. Even the tiny “one guy and a bright idea” operators are putting out documentation that’s readable, even if they don’t spell too well.

Unfortunately, OSS saw a chance to save a few bucks on printing and paper; a decision that may be good finance but is lousy marketing. It cheats every customer who doesn’t have the eyes of an eagle. So, watch yourselves, all near-sighted hackers. Caveat emptor is alive and well in the marketplace.

Roy Hutchins
Rochester, NY

A. I’m well aware of how annoying small print can be, even for those of us with the best eyesight, as I have received numerous letters about the small size of the program listings in this column. I can imagine that this would be even more frustrating when one pays good money for a commercial software product from a respectable company such as Optimized Systems Software. But perhaps an even more serious problem lies with the manufacturers that print manuals that are legible, but make no sense to the average computer user. This is seen frequently in the computer industry with companies that let their programmers and engineers write the manuals, instead of hiring a professional writer. Even worse are the companies that do not provide enough documentation, or none at all. Such was the case for a long time with Atari’s XL computers. The machines came with a little booklet that gave instructions for setting up the machine and disk drives—a far cry from the reference manual and BASIC book that were included with my original Atari 800 several years ago. Now Atari is including a much more substantial 130-page booklet and hopefully other companies, such as OSS, will move in this direction, for their own good as well as for their customers’.

RAP Intelligence Expansion

October’s (1985) column contained instructions for adding your own keywords and responses to RAP. For those readers who still want to teach RAP some new tricks, I have put together over 30 more keywords and more than 100 additional responses. I don’t have space to print it in the column, but the “Intelligence Expansion” is available on diskette to readers for $5. (See address at end of this article.) You must have at least a 48K Atari to run RAP with the expanded vocabulary.

Halley’s Comet

1986 is, of course, the year of Halley’s Comet, and a few software packages on the Halley’s Comet theme are available for the Atari astronomers out there. They are:

Halley Patrol, which includes an almanac and observing aid. A diskette for the 800/XL/XE is $19.95. (Urania Systems, Box 4890, Richmond, VA 23220).

Urania Systems (address above) all produces Spacebase, which is an astronomy program that turns your television screen into a planetarium. Over 400 heavenly objects can be plotted on the screen. $17.95 for a diskette for the 800/XL/XE.

The Halley Project is a recreational program which teaches characteristics of planets and moons. On diskette for the 800/XL/XE. (Mindscape, 3444 Dundee Road, Northbrook, IL 60062).

Corrections/Clarifications

In November’s column, the first and last lines were mysteriously omitted from the Programmable Keypad Revision. These changes are necessary for the program to function properly with the XL/XE revisions:

70 RESTORE:TOT=0:FOR I=1536 TO 1616:READ NUM 
490 FOR I=0 TO 16:IF PR(I)>-1 THEN POKE 1599+I,PR(I) 

Additionally, change the following line in the Recipe Manager program:

1260 IF I=28 THEN POP :K=27:GOTO 730 
This enables the ESC key to return you to the menu when you are on the CATEGORY: prompt.

In last, month’s column, the program segment that is labeled the “continued” section of the Simple Memory Tester is actually the remaining lines of the Recipe Manager Additions. Hence, the first part of Recipe Manager Additions appears on page 162 of December’s column, and the continuation appears on page 66—confusion, confusion!

520 ST Newsletter

The Jackintosh Boston Users’ Group is a part of The Boston Computer Society for Atari 520ST users and has sent me its latest newsletter for ST users. Their address: The Boston Computer Society, Jackintosh User Group, One Center Plaza, Boston, MA 02108. Other groups: Let’s see your newsletters—send them in to me.

PACE

Now it’s time to enter PACE, the Personal Appointment Calendar & Editor. PACE will keep you in step with your latest plans and will remind you days in advance when important occasions, such as birthdays or exams, are approaching so you’ll have time to prepare (i.e. buy and send out cards, or study). PACE can also provide you with a printout of your daily schedule each day.

Since the program is over 300 lines long, you should be prepared to spend some time typing it in. It’s a practical, user-friendly program, and it’ll be worth the effort. PACE requires a minimum of 32K and will work with diskette system only. Since PACE takes advantage of the random-access capabilities of the disk drive, a cassette recorder cannot be used.

Enter the program listed under the “Personal Appointment Calendar & Editor” heading and save it to diskette. Remember to use Program Perfect so you don’t get stuck with inumerable typing errors.

PRESS ESC FOR TOMORROW'S 

Appointments for today, 
WEDNESDAY, JAN. 15, 1986 

9:18AM Staff meeting in 
conference room 
11AM Appt. at L.F. & Co. 
5PM Presentation-rm 310 
5:15PM Dentist, room 105 
5:45PM Dinner at Rd Lbst 
8:30PM Theatre 
*Sandra's birthday 
*Presentation/report due 
Photo 3

When you run the program, you’ll be asked to “INSERT YOUR DATA DISKETTE.” If you are using a single-density format, you’ll need a separate blank diskette to store the data. If you’re using dual-density format, you have room to store the data file and the program on the same diskette. If you place an unformatted diskette into the drive, the program will format it for you if you answer Y to the “Want to format diskette?” prompt.

Next, PACE will create an appointment file on the data diskette. Type Y for the “Create an appointment file?” prompt and enter your name and today’s date as directed. Then you will be asked to enter a password. Since this will be your personal appointment calendar, you may want to prevent others from peering at your plans. You can enter any password you want, or you can just press RETURN if you would rather not have a password. If you opt for the password, be sure it’s one you’ll remember!

You’ll be given the opportunity to correct any errors and then will be brought to the main screen (see Photo 2).

This is the screen that you’ll see each time you run the program. If you have chosen a password, you’ll have to enter the password correctly before you can access this screen.

Your name is displayed along with the date that you last used PACE. The date in the center of the screen is used to display the current date. Since you just created a data file, the previous date and the current date will be the same. When you use PACE in the future, use the START, SELECT and OPTION keys to set the new date. The day of the week is automatically calculated by the program for any day of the year. You’ll probably want to use PACE at least once a day to see your daily plans, upcoming plans, and to enter new appointments.

HELLO, JEFF BRENNER! 
The last time you used PACE was on 
TUESDAY, JAN. 14, 1986. 

Use the START, SELECT, and OPTION KEYS 
to set today's month, day and year. 
PRESS RETURN WHEN THE DATE IS SET 
         ┌───┐┌──┐┌────┐ 
         │JAN││15││1986│ 
         └───┘└──┘└────┘ 
Photo 2

Press RETURN when the current date is set and the PACE Appointment Display is shown. This mini-screen is where your daily appointments are read. Since you have not yet entered any appointments, this screen will be blank, but Photo 3 shows what a typical schedule might look like. The asterisks denote important occasions that are to be brought to our attention days in advance, such as birthdays or deadlines. If you have a printer, CONTROL-P can be used at any time to print out the schedule on paper. You could also make changes on this screen at any time and they will be recorded on the diskette.

Upcoming important entries: 

FRI 1/17: *2nd Payment due 

SAT 1/18: 
SUN 1/19: *ANNIVERSARY-GET GIFT!!! 

MON 1/20: *Lora's birthday 

TUE 1/21: *Project deadline 

WED 1/22: *ENGR Exam - STUDY! 

      Press RETURN to continue. 

Photo 4

Pressing ESC will show you the following day’s schedule. You can revise or print out this schedule too.

Another press of the ESC key brings you to the “Upcoming important entries” screen. Here the program gives you a look at important occasions (those that had been preceded by an asterisk) that are approaching within the next seven days (see Photo 4).

When you press RETURN, you are asked if you want to enter appointments. If you type Y for this prompt, you will be returned to the main screen where you will be asked to set the date for which you want to enter appointments. You will then be brought to the PACE Appointment Display where you can enter appointments for that date. You can type freely on the mini-screen as you choose, using the Atari’s control and cursor keys for positioning and editing.

You can continue entering appointments for any number of future dates by answering Y each time to the “Add or change more appointments?” prompt.

When you’re done, the program will take a few seconds to save its reference data to the data diskette and will give you the option of stopping or rerunning the program. Up to 366 days of schedules can be stored on a diskette.

Happy New Year to all readers, and may you never miss a dentist appointment, birthday, anniversary, studying for an exam, etc., again!

Next Month

We’ll have more details on PACE and hopefully a Halley’s Comet program, more reader mail and surprises too. Stay tuned.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope for a personal reply.

A diskette of the programs listed in this month’s column is available from the author for $7.00, postpaid. Please specify your disk drive model.

Program Perfect” is utility used to check for typing errors while entering programs from this column. Readers may send $5.00 for a diskette of this program and documentation.

Address all correspondence to:

Jeff Brenner
“Applying The Atari 1/86”
c/o Computer Shopper
P.O. Box F
Titusville, FL
32781-9990
PERSONAL APPOINTMENT CALENDAR & EDITOR 

PEJ 10 REM PERSONAL APPOINTMENT CALENDAR/EDITOR 
KGJ 20 REM COPYRIGHT 1986 JEFF BRENNER 
YVJ 30 MIN=1985 
FXJ 40 DIM DISK$(3),FILE$(20):DISK$="D1:" 
EPJ 50 FILE$=DISK$:FILE$(LEN(FILE$)+1)="PACE.DAT" 
YBJ 60 DIM TEXT$(200),A$(200),SP$(24),NAME$(30),DATE$(24),DAYS(30),SUM(11) 
AUJ 70 DIM PW$(20),LS$(366),HS$(366),BYTE$(366),IN$(27),MR$(4),DEL$(23),S$(5) 
LXJ 80 DIM MSG$(240):MSG$=CHR$(32):MSG$(240)=CHR$(32):MSGS(2)=MSG$ 
NUJ 90 TEXT$="START":GOSUB 1610:S$=TEXT$ 
DVJ 100 DEL$(1)=CHR$(156):DEL$(23)=CHR$(156):DEL$(2)=DELS$:DEL$(1,1)=CHR$(157) 
LLJ 110 DIM MONTH$(36):RESTORE 2740:FOR I=1 TO 12:READ A$,DAYS 
AUJ 120 MONTH$(LEN(MONTH$)+1)=A$(1,3):DAYS(I)=DAYS:NEXT I 
GDJ 130 DIM DAY$(21):FOR I=1 TO 7:READ A$:DAY$(LEN(DAY$)+1)=A$(1,3):NEXT I 
JXJ 140 SP$(1)=CHR$(32):SP$(24)=CHR$(32):SP$(2)=SP$:A$=CHR$(32):A$(2,2)=CHR$(29) 
TVJ 150 A$(3,3)=CHR$(30):IN$=A$:FOR I=1 TO 8:IN$(LEN(IN$)+1)=A$:NEXT I 
QHJ 160 RESTORE 2770:FOR I=0 TO 11:READ SUM:SUM(I)=SUM:NEXT I 
JHJ 170 DL=PEEK(560)+256*PEEK(561):MR$=CHR$(28):MR$(2,2)=CHR$(156) 
IOJ 180 MR$(3,4)=MR$ 
MEJ 190 OPEN #1,4,0,"K:":PRINT CHR$(125);"STAND BY...":GOSUB 2560:GOSUB 2920 
EEJ 200 GOSUB 1450:POKE 85,8 
UDJ 210 PRINT "INSERT YOUR DATA DISKETTE" 
UOJ 220 TEXT$="RETURN":GOSUB 1610 
BOJ 230 POKE 752,1:POKE 85,10:PRINT "PRESS ";TEXT$;" TO BEGIN":POKE 764,255:D=25 
RJJ 240 POKE 1771,10:GOSUB 1500:IF PEEK(764)<255 THEN 260 
PQJ 250 POKE 1771,4:GOSUB 1500:IF PEEK(764)=255 THEN 240 
XHJ 260 GET #1,N:POSITION 2,3:PRINT CHR$(156);CHR$(156);:POKE 1771,10 
GVJ 270 A$=DISK$:A$(LEN(A$)+1)="PACE.PNT" 
JIJ 280 TRAP 1940:OPEN #2,4,0,A$:INPUT #2;NAME$,DATE$,M,D,Y,PW$:TRAP 40000 
XMJ 290 FOR I=1 TO 3:INPUT #2,A$:LS$(LEN(LS$)+1)=A$:NEXT I 
WWJ 300 FOR I=1 TO 3:INPUT #2,A$:HS$(LEN(HS$)+1)=A$:NEXT I 
FUJ 310 FOR I=1 TO 3:INPUT #2,A$:BYTE$(LEN(BYTE$)+1)=A$:NEXT I:CLOSE #2 
HXJ 320 IF LEN(PW$)=0 THEN 390 
SLJ 330 FOR I=1 TO 3:POSITION 2,2 
LRJ 340 POKE 1770,4:POKE 694,0:POKE 702,64:PRINT "PASSWORD:":INPUT #16;A$ 
XIJ 350 IF AS=PW$ THEN 380 
CGJ 360 PRINT CHR$(28);CHR$(156);CHR$(29);CHR$(156);"(";3-I;") TRY AGAIN." 
NUJ 370 PRINT CHR$(253);:NEXT I 
SUJ 380 IF I=4 THEN GRAPHICS 0:PRINT "Access denied.":NEW 
YCJ 390 POKE 1770,10:POKE 84,2:PRINT "HELLO, ";NAME$;"!":TEXT$="PACE":GOSUB 1610 
OQJ 400 PRINT "The last time you used ";TEXT$;" was on":PRINT DATE$;"." 
ANJ 410 GOSUB 420:GOTO 450 
VFJ 420 PRINT SP$:PRINT "Use the ";S$;", "; 
XMJ 430 TEXT$="SELECT":GOSUB 1610:PRINT TEXT$;" and "; 
RAJ 440 TEXT$="OPTION":GOSUB 1610:PRINT TEXT$;" KEYS":RETURN 
XYJ 450 PRINT " to set today's month, day and year." 
SUJ 460 TEXT$="RETURN":GOSUB 1610:POKE 85,4 
MNJ 470 PRINT "PRESS ";TEXT$;" WHEN THE DATE IS SET":GOSUB 480:GOTO 720 
OFJ 480 POKE 764,255:PRINT :T=PEEK(84):FOR I=1776 TO 1778:POKE I,14:NEXT I 
UNJ 490 FOR I=1779 TO 1781:POKE I,0:NEXT I:FOR I=1782 TO 1790:POKE I,4:NEXT I 
PLJ 500 POKE 84,9:RESTORE 2420:FOR I=1 TO 3:POKE 85,13 
WMJ 510 FOR J=1 TO 15:READ N:PRINT CHR$(N);:NEXT J:PRINT :NEXT I 
DSJ 520 FOR I=DL+17 TO DL+19:POKE I,146:NEXT I:POKE 54276,10 
MBJ 530 FOR I=1 TO 3:READ X:POKE 85,X:FOR J=1 TO 5:READ N:PRINT CHR$(N); 
LDJ 540 NEXT J:PRINT :NEXT I 
LBJ 550 POKE 84,10:SOUND 0,0,0,0 
TFJ 560 POKE 85,14:PRINT MONTH$(M*3-2,M*3);:POKE 85,19:IF D<10 THEN PRINT "0"; 
OCJ 570 PRINT D;:POKE 85,23:PRINT Y;:SR=0 
RVJ 580 NUM=SUM(M-1)+D+INT((Y-1752-(M<3))/4)+365*(Y-1753)-2 
FIJ 590 YH=Y-(M<3):NUM=NUM-INT(YH/100)+INT(YH/400)-13 
DPJ 600 WD=NUM-7*INT(NUM/7):IF SR THEN RETURN 
CEJ 610 POSITION 28,13:PRINT DAY$(WD*3+1,WD*3+3) 
RJJ 620 A=PEEK(53279):IF A=7 AND PEEK(764)=255 THEN W=0:GOTO 620 
IMJ 630 IF A<>7 THEN SOUND 0,INT(A/2),6,4 
WVJ 640 LP=0:IF M=2 AND Y/4=INT(Y/4) THEN LP=1 
JHJ 650 IF Y/100=INT(Y/100) THEN IF Y/4000 INT (Y/400) THEN LP=0 
LQJ 660 IF A=6 THEN M=M+1:IF M>12 THEN M=1 
GXJ 670 IF A=5 THEN D=D+1:IF D>DAYS(M)+LP THEN D=1 
FWJ 680 IF A=3 THEN Y=Y+1:IF Y>MIN+15 THEN Y=MIN 
UOJ 690 IF W<20 AND PEEK(53279)<>7 THEN W=W+1:SOUND 0,0,0,0:GOTO 690 
OHJ 700 GOSUB 2530:IF PEEK(764)<>12 THEN 550 
AVJ 710 RETURN 
NKJ 720 SOUND 0,0,0,0:GOSUB 1520:GOSUB 1580 
PRJ 730 TEXT$="PRESS":TEXT$(LEN(TEXT$)+1)=CHR$(2):POSITION 8,1 
JUJ 740 TEXT$(LEN(TEXT$)+1)="ESC":TEXT$(LEN(TEXT$)+1)=CHR$(22) 
HAJ 750 TEXT$(LEN(TEXT$)+1)="FOR TOMORROW'S":GOSUB 1610:PRINT TEXT$ 
SGJ 760 CLOSE #2:OPEN #2,12,0,FILE$ 
RZJ 770 POSITION 8,2:PRINT "Appointments for today,":GOSUB 780:GOTO 810 
HAJ 780 RESTORE 2760:FOR I=0 TO WD:READ A$:NEXT I:POKE 85,8 
WOJ 790 PRINT A$;CHR$(44);CHR$(32);MONTH$(M*3-2,M*3);CHR$(46);CHR$(32)) 
DGJ 800 PRINT D;CHR$(44);CHR$(32);Y;:PRINT SP$(1,33-PEEK(85));:RETURN 
TPJ 810 GOSUB 2530:IF SEC+BYTE THEN POINT #2,SEC,BYTE 
BBJ 820 GOSUB 830:GOTO 850 
CBJ 830 FOR I=1 TO 9:A$=SP$:IF SEC+BYTE>0 THEN INPUT #2;A$ 
FEJ 840 POSITION 8,I+3:PRINT A$:NEXT I:RETURN 
VOJ 850 POKE 764,255:POSITION 8,4:GOSUB 1920:IF CT THEN GOSUB 1350 
CBJ 860 POSITION 8,2:PRINT "Tomorrow's Appointments." 
APJ 870 TEXT$="TO CONTINUE":TEXT$(LEN(TEXT$)+1)=SP$(1,3):GOSUB 1610 
RXJ 880 POSITION 18,1:PRINT TEXT$;:POSITION 8,1:PRINT CHR$(255);CHR$(160) 
BIJ 890 POSITION 32,1:PRINT CHR$(32) 
XEJ 900 REC2=REC:D2=D:M2=M:Y2=Y:WD2=WD:WD=WD+1:IF WD=7 THEN WD=0 
WMJ 910 D=D+1:IF D>DAYS(M)+LP THEN D=1:M=M+1:IF M>12 THEN M=1:Y=Y+1 
NEJ 920 POSITION 8,3:GOSUB 780 
TSJ 930 GOSUB 2530:IF SEC+BYTE THEN POINT #2,SEC,BYTE 
EQJ 940 GOSUB 830 
VRJ 950 POKE 764,255:POSITION 8,4:GOSUB 1920:IF CT THEN GOSUB 1350 
HAJ 960 GOSUB 1450:PRINT "Upcoming important entries:" 
MTJ 970 POKE 752,1:PRINT :WD=WD+1:IF WD=7 THEN WD=0 
RSJ 980 LN=LN+1:D=D+1:IF D>DAYS(M)+LP THEN D=1:M=M+1:IF M>12 THEN M=1:Y=Y+1 
IZJ 990 RESTORE 2760:FOR I=0 TO WD:READ A$:NEXT I 
JRJ 1000 PRINT A$(1,3);CHR$(32);M;"/";D;": "; 
CZJ 1010 GOSUB 2530:IF SEC+BYTE=0 THEN GOTO 1060 
CLJ 1020 POINT #2,SEC,BYTE 
YIJ 1030 FOR J=1 TO 9:INPUT #2;A$:IF A$(1,1)<>"*" THEN NEXT J:GOTO 1100 
YIJ 1040 PRINT A$:LN=LN+1:IF LN<16 THEN NEXT J:GOTO 1060 
COJ 1050 GOSUB 1080:GOSUB 1450:NEXT J 
RCJ 1060 IF LN>15 THEN GOSUB 1080:GOSUB 1450 
FBJ 1070 GOTO 1100 
OMJ 1080 PRINT :POKE 85,8:TEXT$="RETURN":GOSUB 1610 
HBJ 1090 PRINT "Press ";TEXT$;" for more.":GET #1,A:LN=0:RETURN 
KWJ 1100 IF REC<REC2+7 THEN 970 
DHJ 1110 D=D2:M-M2:Y=Y2:WD-WD2:TEXT$="RETURN":GOSUB 1610 
DNJ 1120 PRINT :POKE 85,8:PRINT "Press ";TEXT$;" to continue.":GET #1,A 
EQJ 1130 GOSUB 1450:PRINT :PRINT "Want to enter appointments? ";:GOSUB 2460 
WMJ 1140 IF N=78 THEN 2800 
XWJ 1150 PRINT "Want to define the control keys? ";:GOSUB 2460 
WJJ 1160 IF N=78 THEN 1220 
IPJ 1170 PRINT "Type up to 24 characters for each":PRINT "control key." 
OSJ 1180 TEXT$="RETURN":GOSUB 1610:PRINT "Press ";TEXT$;" by itself when you've" 
UFJ 1190 PRINT "finished defining control keys." 
HVJ 1200 PRINT :PRINT :FOR I=65 TO 74:PRINT MR$;"CONTROL-";CHR$(I);":" 
JMJ 1210 INPUT #16;A$:IF LEN(A$) THEN MSG$((I-65)*24+1,(I-65)*24+24)=A$:NEXT I 
6FJ 1220 GOSUB 1450:GOSUB 420:PRINT "to select date to add appointments." 
OFJ 1230 PRINT :POKE 85,4:TEXT$="RETURN":GOSUB 1610 
SPJ 1240 PRINT "PRESS ";TEXT$;" WHEN THE DATE IS SET" 
NYJ 1250 POKE 752,1:GOSUB 480:POKE 762,0:SOUND 0,0,0,0:GOSUB 1520:GOSUB 1580 
UVJ 1260 TEXT$="PRESS":TEXT$(LEN(TEXT$)+1)=CHR$(2):TEXT$(LEN(TEXT$)+1)-"ESC" 
JCJ 1270 TEXT$(LEN(TEXT$)+1)=CHR$ (22):TEXT$(LEN(TEXT$)+1)="TO CONTINUE" 
MJJ 1280 GOSUB 1610:POSITION 8,1:PRINT CHR$(160);TEXT$;CHR$(160);CHR$(160) 
CYJ 1290 POSITION 8,2:PRINT "Appointments for: ":GOSUB 780 
YMJ 1300 IF SEC+BYTE>0 THEN POINT #2,SEC,BYTE 
SJJ 1310 GOSUB 830:POSITION 8,4:GOSUB 1920:IF CT THEN GOSUB 1350 
BAJ 1320 GOSUB 1450:PRINT "Add or change more appointments? ";:GOSUB 2460 
WNJ 1330 IF N=78 THEN 2800 
FEJ 1340 GOTO 1220 
XIJ 1350 NF=1:GOSUB 2530:IF SEC+BYTE>0 THEN NF=0:POINT #2,SEC,BYTE:GOTO 1390 
SJJ 1360 CLOSE #2:OPEN #2,9,0,FILE$ 
NJJ 1370 NOTE #2,SEC,BYTE:H=INT(SEC/256):L=SEC-H*256 
UIJ 1380 HS$(REC,REC)=CHR$(H):LS$(REC,REC)=CHR$(L):BYTE$(REC,REC)=CHR$(BYTE) 
HOJ 1390 POKE 842,13:FOR I=1 TO 9:POSITION 8,3+I:INPUT #16;A$ 
WRJ 1400 IF LEN(A$)>24 THEN A$=A$(1,24) 
SQJ 1410 IF LEN(A$)<24 THEN A$(LEN(A$)+1,24)=SP$ 
FLJ 1420 PRINT #2;A$:NEXT I:POKE 842,12 
VLJ 1430 IF NF THEN CLOSE #2:OPEN #2,12,0,FILE$ 
PBJ 1440 CT=0:RETURN 
TCJ 1450 GRAPHICS 0:POKE 16,64:POKE 53774,64:A=USR(1664) 
HXJ 1460 POKE 559,0:POKE 1767,0:POKE 1768,0:TEXT$=CHR$(32):SETCOLOR 4,9,0 
OTJ 1470 POKE 53248,0:POKE 53249,0 
NFJ 1480 PRINT CHR$(125);:POSITION 0,0:PRINT M1$:POSITION 0,1:PRINT M2$ 
FBJ 1490 POKE 559,34:RETURN 
GBJ 1500 FOR I=1 TO D:IF PEEK(764)=255 THEN NEXT I 
CTJ 1510 RETURN 
NSJ 1520 GOSUB 1450:POKE 559,0:PRINT CHR$(125);:POKE 623,0:POKE 764,255:CT=0 
OHJ 1530 FOR I=1771 TO 1790:POKE I,10:NEXT I 
UWJ 1540 POKE 1767,1:POKE 1768,8:POKE 1769,14:POKE 1770,14:POKE 1788,1 
MLJ 1550 RESTORE 2780:FOR I=0 TO 31:READ N:POKE DL+I,N:NEXT I 
DIJ 1560 POSITION 8,0:PRINT M3$;:POSITION 8,13:PRINT M4$ 
FAJ 1570 POKE 559,34iRETURN 
LIJ 1580 SETCOLOR 4,9,0:POKE 704,144:POKE 705,144:POKE 53277,3:POKE 53248,48 
JPJ 1590 POKE 53277,0:POKE 53261,255:POKE 53249,176:POKE 53262,255 
KKJ 1600 POKE 53256,3:POKE 53257,3:RETURN 
KUJ 1610 FOR I=1 TO LEN(TEXT$) 
GOJ 1620 TEXT$(I,I)=CHR$(ASC(TEXT$(I,I))+120):NEXT I:RETURN 
TMJ 1630 POKE 85,(40-LEN(TEXT$))/2:PRINT TEXT$:RETURN 
TGJ 1640 TRAP 40000;CT=0 
RVJ 1650 GET #1,K:IF PEEK(694)>0 THEN K=K-128:POKE 694,0 
XIJ 1660 IF K>27 AND K<123 OR K=127 OR K=154 OR K=155 OR K=126 THEN 1840 
LVJ 1670 IF K=16 THEN GOSUB 2650:GOTO 1920 
YNJ 1680 IF K=254 THEN 1840 
BWJ 1690 IF K<>157 THEN 1720 
UNJ 1700 POKE 752,1;PRINT CHR$(K);:V=PEEK(84):POSITION 8,13:PRINT CHR$(156); 
WQJ 1710 CT=CT+1:POKE 84,V;POKE 85,8:GOTO 1920 
BSJ 1720 IF K<>156 THEN 1750 
RCJ 1730 POKE 752,1:POKE 1787,4:PRINT CHR$(K);:V=PEEK(84):CT=CT+1 
JOJ 1740 POSITION 8,12:PRINT CHR$(157);:POKE 1787,10:GOTO 1710 
ICJ 1750 IF K=27 THEN RETURN 
YQJ 1760 IF K<255 THEN 1790 
GPJ 1770 PRINT CHR$(K);:H=PEEK(85):V=PEEK(84):POSITION 32,4:POKE 752,1 
REJ 1780 PRINT IN$:POSITION H,V:GOTO 1850 
WIJ 1790 IF K>10 THEN 1820 
MHJ 1800 POKE 752,1:PRINT MSG$(K*24-23,K*24-PEEK(85)+8) 
QEJ 1810 POKE 85,8;CT=5:GOTO 1850 
WMJ 1820 SOUND 1,60,6,8;FOR I=1 TO 40:NEXT I:SOUND 1,0,0,0 
FPJ 1830 GOTO 1650 
NVJ 1840 CT=CT+1:POKE 752,1:PRINT CHR$(K);:IF K=156 OR K=157 THEN POKE 85,8 
TEJ 1850 IF PEEK(85)>31 THEN POKE 85,8;POKE 84,PEEK(84)+1 
AXJ 1860 IF PEEK(84)>12 THEN POKE 84,4 
LJJ 1870 IF PEEK(85)>7 THEN 1910 
RPJ 1880 IF K=126 THEN POKE 85,32:POKE 84,PEEK(84)-1:PRINT CHR$(K)):GOTO 1910 
KZJ 1890 IF K=155 THEN POKE 85,8:GOTO 1910 
ADJ 1900 POKE 85,31:POKE 84,PEEK(84)-1 
ARJ 1910 IF PEEK(84)<4 THEN POKE 84,12 
NXJ 1920 POKE 752,0;PRINT CHR$(31);CHR$(30); 
FQJ 1930 GOTO 1650 
GEJ 1940 CLOSE #2:E=PEEK(195) 
BJJ 1950 IF E<>144 THEN 2060 
XNJ 1960 POSITION 2,2:PRINT DEL$;"Diskette must be formatted." 
OYJ 1970 POKE 752,0:PRINT "Went to format this diskette? ";:GOSUB 2400 
UUJ 1980 IF N=78 THEN 200 
HHJ 1990 POKE 752,1 
GKJ 2000 PRINT MR$;"Press ";S$;" to format disk in drive ";DISK$(2,2) 
IPJ 2010 TEXT$="OPTION":GOSUB 1610;PRINT "or press ";TEXT$;" to cancel." 
XGJ 2020 A=PEEK(53279):IF A<>3 AND A<>6 THEN 2020 
OPJ 2030 IF PEEK(53279)=3 THEN 200 
YAJ 2040 PRINT "Formatting...":XIO 253,#7,33,87,DISK$ 
BYJ 2050 POSITION 2,2:PRINT DEL$;"Formatting completed.":GOTO 2080 
BGJ 2060 IF E<>170 THEN 2380 
RRJ 2070 POSITION 2,2:PRINT DEL$;"No appointment file on this disk." 
GYJ 2080 POKE 752,0;PRINT "Create an appointment file? ";:GOSUB 2460 
UNJ 2090 IF N=78 THEN 200 
TXJ 2100 POSITION 2,2;PRINT DEL$;"Enter your name.";INPUT #16;NAME$ 
TJJ 2110 PRINT MR$;"Enter the date (Example: 1/12/86).":INPUT #16;A$ 
LMJ 2120 TRAP 2110:FOR I=2 TO LEN(A$):IF A$(1,1)<>"/" THEN NEXT I 
EQJ 2130 M=VAL(A$(1,I-1)):FOR J=I+2 TO LEN(A$):IF A$(J,J)<>"/" THEN NEXT J 
VUJ 2140 D=VAL(A$(I+1,J-1)):Y=VAL(A$(J+1)):IF Y>99 THEN 2150 
FOJ 2150 TRAP 40000:C=INT(MIN/100)*100:IF Y>=MIN-C THEN Y=Y+C:GOTO 2170 
FAJ 2160 Y=Y+C+100 
NNJ 2170 PRINT HR$;"Enter a password (RETURN for none).":INPUT #16;PW$ 
THJ 2180 SR=1:GOSUB 580 
GLJ 2190 RESTORE 2760:FOR I=0 TO WD:READ A$:NEXT I:DATE$=A$ 
LFJ 2200 DATE$(LEN(DATE$)+1)=CHR$(44):DATE$(LEN(DATE$)+1)=CHR$(32) 
HJJ 2210 DATE$(LEN(DATE$)+1)=MONTH$(M*3-2,M*3):DATE$(LEN(DATE$)+1)=CHR$(46) 
KZJ 2220 DATE$(LEN(DATE$)+1)=CHR$(32):DATE$(LEN(DATE$)+1)=STR$(D) 
LIJ 2230 DATE$(LEN(DATE$)+1)=CHR$(44):DATE$(LEN(DATE$)+1)=CHR$(32) 
WHJ 2240 DATE$(LEN(DATE$)+1)=STR$(Y) 
SBJ 2250 PRINT MR$;"NAME: ";NAME$:PRINT "DATE: ";DATE$ 
GNJ 2260 IF LEN(PW$) THEN PRINT "PASSWORD: ";PW$ 
GGJ 2270 IF LEN(PW$)=0 THEN PRINT "NO PASSWORD." 
FTJ 2280 PRINT "Is all of the above correct? ";:GOSUB 2460 
KTJ 2290 IF N=78 THEN GOTO 2100 
RMJ 2300 PRINT "Saving this data..." 
IOJ 2310 A$=DISK$:A$(LEN(A$)+1)="PACE.PNT" 
JRJ 2320 OPEN #2,8,0,A$:PRINT #2;NAME$;CHR$(155);DATE$;CHR$(155); 
SRJ 2330 PRINT #2;M;CHR$(155);D;CHR$(155);Y;CHR$(155);PW$ 
EZJ 2340 A$=CHR$(0):A$(122)=CHR$(0):A$(2)=A$ 
FHJ 2350 FOR I=1 TO 9:PRINT #2;A$:NEXT I:CLOSE #2 
KDJ 2360 A$=DISK$:A$(LEN(A$)+1)="PACE.DAT";OPEN #2,8,0,A$:CLOSE #2:POKE 752,1 
JYJ 2370 GOSUB 1450;POKE 85,4:PRINT "Appointment file has been made.":GOTO 220 
FLJ 2380 TEXT$="ERROR #":TEXT$(LEN(TEXT$)+1)=STR$(E):GOSUB 1610:GOSUB 1630 
NUJ 2390 TEXT$="START":GOSUB 1610:PRINT "Press ";TEXT$;" to start again." 
TCJ 2400 IF PEEK(53279)<>6 THEN 2400 
DEJ 2410 GOTO 200 
YOJ 2420 DATA 17,18,18,18,5,17,18,18,5,17,18,18,18,18,5 
OYJ 2430 DATA 124,32,32,32,124,124,32,32,124,124,32,32,32,32,124 
YKJ 2440 DATA 26,18,18,18,3,26,18,18,3,26,18,18,18,18,3 
VXJ 2450 DATA 19,17,18,18,18,5,27,124,32,32,32,124,35,26,18,18,18,3 
IEJ 2460 H=PEEK(85) 
ELJ 2470 POKE 694,0;POKE 702,64:GET #1,N:IF N>128 THEN N=N-128 
KWJ 2480 IF N=78 THEN PRINT "NO":RETURN 
OFJ 2490 IF N=89 THEN PRINT "YES":RETURN 
YOJ 2500 PRINT 
HPJ 2510 PRINT CHR$(156);CHR$(253);"Y OR N";CHR$(28); 
LFJ 2520 POKE 85,H:PRINT CHR$(30);CHR$(31);:GOTO 2470 
VNJ 2530 REC=SUM(M-1)+D:IF M>2 THEN REC=REC+1 
KHJ 2540 SEC=ASC(HS$(REC,REC))*256+ASC(LS$(REC,REC)) 
POJ 2550 BYTE=ASC(BYTE$(REC,REC)):RETURN 
JHJ 2560 I=40:DIM M1$(I),M2$(I),M3$(I),M4$(I) 
RRJ 2570 TEXT$=CHR$(32) 
XHJ 2580 TEXT$(LEN(TEXT$)+1)="Personal Appointment Calendar & Editor" 
APJ 2590 TEXT$(LEN(TEXT$)+1)=CHR$(32):GOSUB 1610:M1$=TEXT$ 
LCJ 2600 TEXT$=SP$(1,7):TEXT$(LEN(TEXT$)+1)="Copyright 1986 Jeff Brenner" 
YXJ 2610 TEXT$(LEN(TEXT$)+1)=SP$(1,6):GOSUB 1610:M2$=TEXT$ 
UIJ 2620 TEXT$="PACE APPOINTMENT DISPLAY":GOSUB 1610:M3$=TEXT$ 
UHJ 2630 TEXT$="PRESS CONTROL-P TO PRINT":GOSUB 1610:M4$=TEXT$ 
CYJ 2640 RETURN 
NHJ 2650 TRAP 2680:OPEN #3,8,0,"P:":PRINT #3 
CJJ 2660 FOR I=2 TO 12:POKE 842,13:POSITION 8,1:INPUT #16;AV:PRINT #3;A$:NEXT I 
IPJ 2670 POSITION 8,4:PRINT #3:RETURN 
QVJ 2680 CLOSE #3;TEXT$="PRINTER DOES NOT RESPOND":GOSUB 1610 
CTJ 2690 H=PEEK(85):V=PEEK(84):POSITION 8,13:PRINT TEXT$ 
BJJ 2700 POKE 1788,14:SOUND 1,50,6,8:FOR I=1 TO 40:NEXT I:SOUND 1,0,0,0 
YNJ 2710 POSITION H,V:PRINT CHR$(31);CHR$(30); 
RAJ 2720 IF PEEK(764)=255 THEN 2720 
AUJ 2730 POSITION 8,13:PRINT M4$:POKE 1788,1:POSITION H,V:RETURN 
BHJ 2740 DATA JANUARY,31,FEBRUARY,28,MARCH,31,APRIL,50,MAY,31,JUNE,30,JULY,31 
PRJ 2750 DATA AUGUST,31,SEPTEMBER,30,OCTOBER,31,NOVEMBER,30,DECEMBER,31 
EMJ 2760 DATA SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY 
BAJ 2770 DATA 0,31,59,90,120,151,181,212,243,273,304,334 
MXJ 2780 DATA 240,112,112,194,64,156,130,112,130,130,112,130,128,130,128,130 
LUJ 2790 DATA 128,130,128,130,128,130,.128,130,128,130,128,130,130,65,32,156 
SZJ 2800 GOSUB 1450:PRINT "Saving appointment data...":CLOSE #2 
NDJ 2810 M=M2:D=D2:Y=Y2:WD=WD2 
HIJ 2820 GOSUB 780:POKE 842,13:POSITION 8,4:INPUT #16;DATE$:POKE 842,12 
PHJ 2830 A$=DISK$:A$(LEN(A$)+1)="PACE.PNT":OPEN #2,8,0,A$ 
EZJ 2840 PRINT #2;NAME$;CHR$(155);DATE$ 
SYJ 2850 PRINT #2;M;CHR$(155);D;CHR$(155);Y;CHR$(155);PW$ 
XTJ 2860 FOR I=0 TO 2:PRINT #2;LS$(I*122+1,I*122+122):NEXT I 
XQJ 2870 FOR I=0 TO 2:PRINT #2;HS$(I*122+1,I*122+122):NEXT I 
EQJ 2880 FOR I=0 TO 2;PRINT #2;BYTE$(I*122+1,I*122+122):NEXT I 
NKJ 2890 CLOSE #2:PRINT "Run this program again? ";:GOSUB 2460 
CNJ 2900 IF N=89 THEN GRAPHICS 0;RUN 
UWJ 2910 GRAPHICS 0:END 
SNJ 2920 REM MULTI-LUMINANCE SUBROUTINE 
OJJ 2930 REM COPYRIGHT 1985 JEFF BRENNER 
AQJ 2940 IF PEEK(1664)>0 THEN RETURN 
XRJ 2950 RESTORE 3000:I=0 
CLJ 2960 READ NUM:IF NUM=-1 THEN 2980 
VHJ 2970 TOT=TOT+NUM+I:POKE 1664+I,NUM:I=I+1:GOTO 2960 
VQJ 2980 IF TOT<>13108 THEN PRINT "ERROR-CHECK DATA LINES":STOP 
GCJ 2990 A=USR(1664);RETURN 
RQJ 3000 DATA 104,173,48,2,133,204,173,49,2,133,205,160,26,169,10 
VMJ 3010 DATA 153,230,6,136,208,250,160,0,177,204,9,128,14S,204,160 
8HJ 3020 DATA 3,177,204,9,128,145,204,160,6,177,204,9,128,145,204 
MHJ 3030 DATA 200,192,28,208,245,169,197,141,0,2,169,6,141,1,2 
RVJ 3040 DATA 173,14,212,9,128,141,14,212,96,72,152,72,173,11,212 
RHJ 3050 DATA 201,7,240,18,201,8,240,14,230,204,164,204,105,231,6 
OHZ 3060 DATA 141,23,208,104,100,104,64,169,0,133,204,240,238,-1 
[END OF LISTING] 
COMPUTER SHOPPER / JANUARY 1986 / PAGE 57 

Atari Help

by Jeff Brenner

Q. The August 1984 issue of Computer Shopper included a program for alphabetizing words and then storing and retrieving these words. This program has turned out to be very handy. Is there a way to delete words from the alphabetized list?

John M. Hirsch
Normal, IL

A. There are two easy ways to delete an entry from an alphabetized list. Consider the following string, which represents five words A, B, C, D and E; WORDS$ = “ABCDE”. Each “word” has its own position in the string; “A” is in position 1, “B” is in position 2, and so forth. Deleting an entry is then a simple matter if you are familiar with the way Atari BASIC handles strings. If you wanted to delete the “B” entry above, for example, the following command would do the trick: LET WORDS$(2)=WORDS$(3,5). This tells the computer to place in position 2 (where the “B” resides) the entries in positions 3 through 5. Thus, WORDS$ now contains: “ACDE”. The “B” has been deleted.

A similar procedure can be used to delete an entry in August’s alphabetizing program. For example, to delete entry number X, use the following:

LET WORDS$(X*20-19)=WORDS$(X*20+1,LEN(WORDS$)). 

A more creative technique for deleting an entry in an alphabetized list is to assign the entry to be deleted a string such as “ZZZZZZZZZZZ.” When the words are realphabetized, the entry with the Z’s will be sorted to the bottom of the list where it can be conveniently ignored or discarded.


Q. I am interested in finding any information concerning the ability of expanding the memory on my 800XL Atari. It would be greatly appreciated if you could tell me if this is possible and, if so, who I may purchase these components from to further the use of my system.

Andrew Leo Eddings
Alabaster, AL

A. Over a year ago I recall that Axlon and one other company had been manufacturing a 128K memory expansion for the 800 (although this would not necessarily be compatible with the XL). The extra memory was accessed through bank switching of a 4K address area. I haven’t heard anything about it since then, although I can tell you that it would not be compatible with the DOS 2.5 RAMDISK for the 130XE. If any readers produce or know of a 128K memory expansion currently available for the 800XL. Please write and tell us.


Q. I recently purchased a Percom disk for my Atari 800XL because of an article in the June 1983 issue of Creative Computing (pp. 114-116). However, the two Percom manuals refer only to the TI 99/4A. Will this drive work with my Atari 800XL?

Paul T. Johnson
Ellenville, NY

A. Unless you know of an electronics engineer who owes you a lot of favors, you’re going to have a rough time trying to get a TI 99/4A Percom to work with the Atari. If you can somehow return the drive to where you purchased it, do so. I don’t think you can still get an Atari Percom drive, but you may want to consider an Atari 1050 disk drive. Prices on this disk drive have dropped greatly in recent months.


Q. Do you know what’s involved hooking up my Atari 130XE to my shortwave communications-receiver to decode morse on-line?

Robert Harren
Pueblo, CO

A. I suggest you contact Cantronics (1202 E. 23rd Street, Lawrence, KS 66044). I am told that this company sells various Atari-compatible interfaces and software for shortwave communications. Good luck.


Q. Thanks for the keyboard programs (latest version in November 1985 Computer Shopper, page 180). How can I change the program to make it operate with joystick port #2 instead of #1?

Donald Parsons
Delmar, NY

A. The following lines can be changed to read from joystick port 2 instead of port 1:

80 DATA 92,228,174,133,2,240,5,202 
90 DATA 134,204,240,40,174,121,2,228 
120 DATA 204,134,206,230,205,173,115,2 

Address Atari-related questions to: Jeff Brenner, “Atari Help” c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

COMPUTER SHOPPER / FEBRUARY 1986 / PAGE 69 

Applying The Atari

by Jeff Brenner

Machine Language Alphabetize,
Halley’s Comet Program

I hope you’re putting last month’s Personal Appointment Calendar/Editor to good use. This month we’ll learn more about PACE, calculate data on Halley’s Comet, and enter an alphabetizing program that features machine language sorting and storage capability. Let’s first take a look at some letters…

Reader Mail

Q. I am a first time reader of your column — I am very impressed. I would like to make another comment. It’s in the form of a question: Why is the Program Perfect code a three-digit or three-letter code when they all end in “J”? Why not truncate the third letter and you’ll have more room than your readers are asking for? I was just wondering about that.

Michael Bonkowski
Madison Heights, MI

A. You ask a very good question, since it does appear that the last character of the Program Perfect codes is always the same. This third character is used by Program Perfect to determine the next program line number for the automatic line numbering feature. Not only does this make it unnecessary to type line numbers when using Program Perfect, but it ensures that all lines of the program are entered.

Since line numbers of the programs in this column usually step by 10 (10, 20, 30, etc.), this third character is most often a “J” (the tenth character of the alphabet). But there are times when the line numbers do not continuously step by 10; September’s Response Analysis Program is one example. In this program, the line numbers of the data statements (above 5000) step by varying amounts, and you can see that the third character in this listing changes appropriately. Additionally, the Program Perfect code of the last line of a program ends in a “Z”. The “Z” signals Program Perfect to erase itself from memory.


Comment: I noticed in the 10/85 issue the problem you have had with the Basic B bug in the 800XL. Instead of getting the $15 cartridge from Atari, I got a program from First Byte called Enhancements to BASIC. It not only eliminates the bug, but also upgrades Atari BASIC by adding some excellent functions such as TRACE and DIR (disk listing straight from BASIC). And best of all, it was only $14.95. Their address is First Byte, P.O. Box 32, Rices Landing, PA 15357.
John A. Dunaway
Goodlettsville, TN

A. Thanks for the info!

Newsletters

Another two newsletters were in the mail for this month. SPACE Probes is printed by the South-Central Pennsylvania Atari Computer Enthusiasts (P.O. Box 11446, Harrisburg, PA 17108-1446). A-BUG-BYTE Newsletter is printed by the Atari - Brookville Users Group (10781 West National Road, Brookville, OH 45309).

Halley’s Comet Program

There are still a few months left to catch a glimpse of Halley’s comet. Halley’s Comet is a public domain program and is listed this month for those interested in calculating information about the comet. When it is run, the program will ask you to enter the year, the month and the day. It will take about 20 seconds to calculate and will then display the comet’s geocentric right ascension (RA) and declination (DEC), distance from the sun and earth in astronomical units, predicted magnitude of brightness, and days to perihelion (the closest point to the sun). Angles are referred to the ecliptic and equinox of 1950.

After the calculations are displayed, you are given the option of making another calculation or getting a printout. Figure 1 shows a sample calculation printout for the date February 6, 1986.

DATA FOR COMET HALLEY 
DATE: M/D/Y-2/6/1986 
DAYS TO PERIHELION.....-4 

COORDINATES: epoch 1950 
RA:....................21HRS  8MIN 
DEC:...................-9DEG  41MIN 

DISTANCES: 
COMET TO SUN...........0.591   AU 
COMET TO EARTH.........1.62    AU 

PREDICTED MAG..........3.5 
Figure 1

You astronomers out there may want to personalize the program to calculate data for your particular latitude and longitude, or add additional features and calculations, such as data for a specific time of day. Have fun and good luck comet-gazing!

HALLEY’S COMET PROGRAM 

YUJ 10 REM HALLEY'S COMET PROGRAM 
CIJ 20 REM ORIGINAL PROGRAM BY ROGER BROWNE 
NJJ 30 OPEN #2,4,0,"K:" 
BIJ 40 DIM CO$(15),SP$(20),DT$(20),DA$(40) 
XIJ 50 SP$(1)=CHR$(32):SP$(20)=CHR$(32):SP$(2)=SP$ 
WBJ 60 DT$(1)=CHR$(46):DT$(20)=CHR$(46):DT$(2)=DT$ 
TEJ 70 DA$(1)=CHR$(45):DA$(40)=CHR$(45):DA$(2)=DA$ 
IQJ 80 PI=3.14159265 
ANJ 90 CO$="COMET HALLEY" 
EGJ 100 PH=1986.11 
DVJ 110 PL=170.011 
DZJ 120 AN=58.1453 
EWJ 130 PY=76.0081 
EVJ 140 SM=17.9435 
GOJ 150 EO=0.967267 
EJJ 160 IO=162.239 
IJJ 170 GRAPHICS 0 
SLJ 180 PRINT CHR$(125);:POKE 85,14:PRINT CO$:POSITION 20,0:PRINT CHR$(255) 
XZJ 190 FOR I=1 TO 18:PRINT CHR$(45);CHR$(32);:NEXT I:PRINT CHR$(45) 
CPJ 200 POKE 85,11:PRINT "EPHEMERIS FOR DATES" 
XYJ 210 POKE 85,10:PRINT "BETWEEN 1946 AND 2026" 
XFJ 220 POKE 85,13:PRINT "by Roger Browne":PRINT 
GBJ 230 PRN=0:PRINT "INPUT YEAR: ";:INPUT #16;Y 
UCJ 240 IF Y<1946 OR Y>2026 THEN 230 
SHJ 250 PRINT "INPUT MONTH: INPUT #16;M 
JCJ 260 IF M<1 OR M>12 THEN 250 
LOJ 270 PRINT "INPUT DAY: ";:INPUT #16;D 
OWJ 280 PRINT CHR$(125);:POSITION 15,10:PRINT "CALCULATING..." 
TEJ 290 X=PH 
IQJ 300 IF Y>=1986 THEN Z=1984 
GKJ 310 IF Y<1986 THEN Z=1988 
CBJ 320 IF Y>=1986 THEN S=0 
YSJ 330 IF Y<1986 THEN S=1 
GFJ 340 GOSUB 1720 
SQJ 350 DS=N 
BBJ 360 B=(360/PY)*(N/365.25) 
PIJ 370 K=B 
GNJ 380 GOSUB 1850 
ISJ 390 B=(K*PI)/180 
OWJ 400 E=B 
USJ 410 Y1=EO 
VIJ 420 Q=E-(Y1*SIN(E))-B 
RKJ 430 IF ABS(Q)<=1.7E-05 THEN 470 
YJJ 440 U=Q/(1-(Y1*COS(E))) 
UEJ 450 E=E-U 
BPJ 460 GOTO 420 
XCJ 470 V=(SQR((1+Y1)/(1-Y1))*(SIN(E/2)/COS(E/2))) 
GZJ 480 V=2*ATN(V) 
LVJ 490 V1=(V*180)/PI 
AMJ 500 L=V1+PL 
XJJ 510 R=SM*(1-(Y1*Y1))/(1+Y1*COS(V)) 
WQJ 520 F=L-AN 
UHJ 530 F2=IO 
KLJ 540 F1=(F*PI)/180 
MLJ 550 F2=(F2*PI)/180 
AXJ 560 I=(SIN(F1)*SIN(F2)) 
EIJ 570 I=ATN(I/SQR(-1*1+1)) 
GFJ 580 P=ATN((SIN(F1)/COS(F1))*COS(F2)) 
SOJ 590 P1=(P*180)/PI+AN 
IIJ 600 IF F>=90 AND F<=270 THEN P1=P1+180 
HFJ 610 IF P1<0 THEN P1=P1+360 
LEJ 620 P=(P1*PI)/180 
JLJ 630 R2=R*COS(I) 
VNJ 640 X=1975 
DXJ 650 IF Y>=X THEN Z=1972 
BRJ 660 IF Y<X THEN Z=1976 
WLJ 670 IF Y>=X THEN S=0 
UCJ 680 IF Y<X THEN S=1 
GNJ 690 GOSUB 1720 
IFJ 700 T=(360/365.25)*(N/1.00004) 
PYJ 710 K=T 
GLJ 720 GOSUB 1850 
QAJ 730 T=K 
LPJ 740 T1=(T*PI)/180 
BAJ 750 C=0.01672 
YTJ 760 J=T+(360/PI)*C*SIN(T1-0.051943) 
GNJ 770 J=J+99.5343 
FJJ 780 IF J>360 THEN J=J-360 
BFJ 790 IF J<0 THEN J=J+360 
FUJ 800 H=((J-102.51044)*PI)/180 
FTJ 810 R1=(1-C*C)/(1+C*COS(H)) 
VAJ 820 U1=((P1-J)*PI)/180 
VCJ 830 U2=((J-P1)*PI)/180 
KBJ 840 IF R2<R1 THEN GOTO 900 
RBJ 850 Q1=(R1*SIN(U1)) 
IQJ 860 Q1=Q1/(R2-(R1*COS(U1))) 
GYJ 870 Q1=ATN(Q1) 
UCJ 880 Q2=(Q1*180)/PI+P1 
CDJ 890 GOTO 940 
RBJ 900 Q3=(R2*SIN(U2)) 
IRJ 910 Q3=03/(R1-(R2*COS(U2))) 
GYJ 920 Q3=ATN(Q3) 
ALJ 930 Q2=(Q3*180)/PI+J+180 
LWJ 940 IF Q2>360 THEN Q2=Q2-360 
HSJ 950 IF Q2<0 THEN Q2=Q2+360 
NOJ 960 Q4=(Q2*PI)/180 
IIJ 970 Q5=(R2*(SIN(I)/COS(I))*SIN(Q4-P)) 
YIJ 980 Q5=Q5/(R1*SIN(U1)) 
HJJ 990 Q5=ATN(Q5) 
KQJ 1000 E1=0.40893064 
ESJ 1010 L1=(SIN(OS)*COS(E1)) 
FBJ 1020 L1=L1+(COS(Q5)*SIN(E1)*SIN(Q4)) 
NXJ 1030 H1=ATN(L1/SQR(-L1*L1+1)) 
PBJ 1040 Y2=(M1*180)/PI 
BKJ 1050 B1=((SIN(Q4)/COS(Q4))*COS(E1)) 
EVJ 1060 B1=B1-(((SIN(Q5)/COS(Q5))*SIN(E1))/COS(Q4)) 
FRJ 1070 G=ATN(B1) 
MKJ 1080 H1=(G*180)/PI 
OMJ 1090 I1=INT(Q2/90) 
NVJ 1100 J1=INT(H1/90) 
NSJ 1110 IF I1=J1-4 OR I1=J1-1 THEN H1=H1+360 
NTJ 1120 IF I1=J1-2 OR I1=J1-3 THEN H1=H1+180 
QMJ 1130 IF I1=J1-4 THEN H1=H1+360 
QNJ 1140 IF I1=J1-2 THEN H1=H1-180 
BXJ 1150 N1=H1/15 
QUJ 1160 N=INT((N1-INT(N1))*60+0.5) 
FMJ 1170 IF W=60 THEN N1=N1+1 
WKJ 1180 IF W=60 THEN W=0 
IGJ 1190 K1=ABS(Y2) 
SGJ 1200 W1=INT((K1-INT(K1))*60+0.5) 
GQJ 1210 IF N1=60 THEN G1=G1+1 
AZJ 1220 IF N1=60 THEN N1=0 
IDJ 1230 G1=INT(K1) 
XOJ 1240 IF Y2<0 AND G1<1 THEN N1=N1 
QHJ 1250 D1=R1*R1+R2*R2 
JNJ 1260 D1=D1-C2*R1*R2*COS(U1)) 
IJJ 1270 D2=SQR(D1) 
MZJ 1280 R3=D2/COS(I) 
UBJ 1290 K9=R 
ICJ 1300 GOSUB 1940 
TUJ 1310 R=K9 
CIJ 1320 K9=R3/10 
IFJ 1330 GOSUB 1940 
CFJ 1340 R3=K9*10 
KJJ 1350 M0=4.1:N=3.1 
OTJ 1360 IF DS<0 THEN M0=5:N=4.44 
HLJ 1370 MA=M0+5*0.4343*LOG(R3) 
OMJ 1380 MA=MA+N*2.5*0.4343*LOG(R) 
XYJ 1390 MA=(INT(10*MA))/10 
CWJ 1400 IF Y2<0 THEN G1=-G1 
ENJ 1410 PRINT CHR$(125);:PRINT DA$(1,38):IF PRN THEN PRINT #1;DA$(1,38) 
CCJ 1420 POKE 83,10:PRINT "DATA FOR ";CO$:PRINT 
LFJ 1430 IF PRN THEN PRINT #1;SP$(1,8);"DATA FOR ";CO$:PRINT #1 
MCJ 1440 PRINT "DATE: M/D/Y=";M;"/";D;"/";Y 
WSJ 1450 IF PRN THEN PRINT #1;"DATE: M/D/Y=";H;"/";D;"/";Y 
GZJ 1460 PRINT "DAYS TO PERIHELION.";INT(DS) 
OOJ 1470 IF PRN THEN PRINT #1$"DAYS TO PERIHELION.INT(DS)*PRINT #1 
YUJ 1480 PRINT 
SKJ 1490 PRINT "COORDINATES: epoch 1950" 
DRJ 1500 IF PRN THEN PRINT #1;"COORDINATES: epoch 1950" 
DXJ 1510 PRINT "RA :";DT$(1,19);INT(N1);"HRS";SP$(1,2);W;"MIN" 
ONJ 1520 IF PRN THEN PRINT #1;"RA :";DT$(1,19);INT(N1);"HRS";SP$(1,2);W;"MIN" 
SHJ 1530 PRINT "DEC:";DT$(1,19);G1;"DEG";SP$(1,2);W1;"MIN" 
DXJ 1540 IF PRN THEN PRINT #1;"DEC:";DT$(1,19);G1;"DEG";SP$(1,2);W1;"MIN" 
CZJ 1550 PRINT :IF PRN THEN PRINT #1 
QNJ 1560 PRINT "DISTANCES:":IF PRN THEN PRINT #1;"DISTANCES:" 
PXJ 1570 PRINT "COMET TO SUN";DT$(1,11);R;SP$(1,3);"AU" 
BNJ 1580 IF PRN THEN PRINT #1;"COMET TO SUN";DT$(1,11);R;SP$(1,3);"AU" 
VGJ 1590 PRINT "COMET TO EARTH";DT$(1,9);R3;SP$(1,4);"AU" 
GNJ 1600 IF PRN THEN PRINT #1;"COMET TO EARTH";DT$(1,9);R3;SP$(1,4);"AU" 
CWJ 1610 PRINT :IF PRN THEN PRINT #1 
PYJ 1620 PRINT "PREDICTED MAG";DT$(1,10);MA 
BOJ 1630 IF PRN THEN PRINT #1;"PREDICTED MAG";DT$(1,10);MA 
OUJ 1640 PRINT DA$(1,37):IF PRN THEN PRINT #1;DA$(1,37) 
OBJ 1650 POKE 85,9:PRINT "PRESS 0 FOR ANOTHER DATE" 
IUJ 1660 POKE 85,9:PRINT "PRESS P FOR PRINT OUT" 
KJJ 1670 GET #2,DATE 
UMJ 1680 IF DATE=ASC("0") THEN PRINT CHR$(125);:GOTO 1710 
EAJ 1690 IF DATE=ASC("P") THEN PRN-1:CLOSE #1:OPEN #1,8,0,"P:":GOTO 1410 
SEJ 1700 PRINT CHR$(253):GOTO 1670 
DJJ 1710 GOTO 230 
EUJ 1720 A=(Y-Z)/4 
KRJ 1730 A1=INT(A+S) 
UBJ 1740 N=365*(Y-X+S)+A1 
XLJ 1750 IF INT(A)<>A THEN GOTO 1770 
NEJ 1760 IF (M=2 AND D<29) OR M=1 THEN N=N-1 
ITJ 1770 IF M>2 THEN GOTO 1810 
XLJ 1780 M2=M-1 
CGJ 1790 M2=31*M2 
FMJ 1800 GOTO 1830 
XDJ 1810 N2=M+1 
XTJ 1820 M2=INT(30.6*M2)-63 
QGJ 1830 N=N+M2+D-365*S 
CZJ 1840 RETURN 
ISJ 1850 IF K<0 THEN GOTO 1870 
MQJ 1860 IF K>360 THEN GOTO 1900 
AHJ 1870 K=K+360 
LDJ 1880 IF K>=0 THEN GOTO 1930 
FZJ 1890 GOTO 1870 
ADJ 1900 K=K-360 
OWJ 1910 IF K<=360 THEN GOTO 1930 
FNJ 1920 GOTO 1900 
CZJ 1930 RETURN 
GCZ 1940 K9=INT(K9*1000+0.5)/1000:RETURN 

More About PACE

Now we’ll learn about the remaining features of last month’s feature program, the Personal Appointment Calendar/Editor.

Password

As mentioned last month, when you create an appointment file when you use PACE for the first time, you’re asked to enter a password. You can enter a password to protect your appointment calendar from peering eyes, or you can just press RETURN if you do not want a password. If you do choose a password, you’ll be given three chances to enter it correctly whenever you run the program. After the third try, the program will erase itself (the data — namely your appointments — is saved on the disk and will not be erased). This is why it is a good idea to choose a password you can remember, or otherwise choose no password at all. Each member of the family can have his or her own “plan diskette,” and password, if wanted.

Defining Control Keys

One feature that was not discussed last month is the control-key redefinition. After you enter “Y” to the “Want to enter appointments?” prompt, you’re asked if you want to define the control keys. You can define up to ten control keys, from CONTROL-A to CONTROL-J, and each key can be programmed to “hold” up to 24 characters. This feature is ideal for plans that repeat often during the month or year. For example, if you play tennis every Thursday, you could define CONTROL-A to be “8:30 PM Tennis club.” Then, when entering appointments for any Thursday, you could press CONTROL-A and “8:30PM Tennis club” will be added to the screen. You could also define other keys for “Pay bills,” “10:00AM Chemistry Class,” etc.

Important Entries

As mentioned briefly last month, you can place an asterisk (*) at the beginning of any appointment line on the PACE Appointment Display, and you will be reminded of that appointment when it is within seven days away. Such plans will be displayed on the “Upcoming Important Entries” screen that follows the “Tomorrow’s Appointments” display. This feature is perfect to use with birthdays, deadlines, or any other dates for which you would need a reminder several days in advance.

Setting the Year

When setting the present date or choosing a date to enter appointments, the display shows the year 1985 and can be moved up to 2000 with the OPTION key. To make the program start by displaying 1986, change line 30 to:

30 MIN=1986 
This will save you from having to press the OPTION key to change the year each time you enter the date. The original program started with 1985 since most Computer Shopper subscribers received the January 1986 in 1985. Next year you could change this line to MIN=1987, and so forth.

Since the program uses 366 records, a particular day of any year is stored in a record for that day. Hence, February 15, 1986 and February 15, 1987 are the same record. It is still possible however, to make appointments for more than one year in advance. In this case, you either label a line of February 15, 1986 screen “1987:.” Then when PACE cycled back around the February in the year 1987, you could delete the 1986 data and make note of the 1987. Or, you can use a completely different data diskette that you could label, “1987.”

Instant Alphabetizer

This month’s feature program is a data alphabetizer that uses a machine language sort for super fast operation. The program also allows you to save and load alphabetized lists to and from diskette or cassette, delete items from an alphabetized list, add items to the list, or print the alphabetized list on the printer.

INSTANT ALPHABETIZER 

VVJ 10 REM INSTANT ALPHABETIZER 
QGJ 20 REM WITH MACHINE LANGUAGE SORTER 
KHJ 30 REM COPYRIGHT 1986 JEFF BRENNER 
RWJ 40 LN=38 
HLJ 50 DIM ABC$(109),IN$(257),SP$(255),D$(25),IO$(7):IN$(257)=CHR$(0) 
AKJ 60 MAX=INT((FRE(0)-500)/LN):DIM DAT$(MAX*LN):DAT$(MAX*LN)=CHR$(0) 
YIJ 70 TRAP 1010:GOSUB 1040:SP$(1)=CHR$(32):SP$(255)=CHR$(32):SP$(2)=SP$ 
NNJ 80 OPEN #1,4,0,"K:" 
WMJ 90 TRAP 1010:CLOSE #3 
PKJ 100 PRINT CHR$(125);:POKE 85,10:IN$="INSTANT ALPHABETIZER" 
IRJ 110 FOR I=1 TO LEN(IN$):PRINT CHR$(ASC(IN$(I,I))+128);:NEXT I:PRINT 
AWJ 120 POKE 85,10:PRINT CHR$(40);CHR$(99);CHR$(41);"1986 JEFF BRENNER" 
TCJ 130 POSITION 2,4:PRINT "<E>NTER NEW LIST TO BE ALPHABETIZED":PRINT 
YLJ 140 PRINT "<L>OAD A PREVIOUSLY SAVED LIST":PRINT 
SIJ 150 PRINT "<D>ISPLAY ALPHABETIZED LIST ON SCREEN":PRINT 
SSJ 160 PRINT "<P>RINT ALPHABETIZED LIST ON PRINTER.":PRINT 
VVJ 170 PRINT "<A>DD ITEMS AND RE-ALPHABETIZE":PRINT 
JDJ 180 PRINT "<R>EMOVE ITEMS FROM LIST":PRINT 
IWJ 190 PRINT "<S>AVE ALPHABETIZED LIST":PRINT 
EJJ 200 GOSUB 960 
KPJ 210 IF C=0 AND N<>69 AND N<>76 THEN 310 
TYJ 220 PRINT CHR$(125); 
PWJ 230 IF N=69 THEN C=0:GOTO 330 
UAJ 240 IF N=65 THEN C=C+1:GOTO 330 
SWJ 250 IF N=68 THEN 480 
SMJ 260 IF N=80 THEN 520 
SZJ 270 IF N=76 THEN 590 
SRJ 280 IF N=82 THEN 710 
SWJ 290 IF N=83 THEN 830 
AGJ 300 GOSUB 1000:GOTO 90 
GRJ 310 PRINT CHR$(125);"NO ITEMS IN MEMORY YET" 
MCJ 320 PRINT "MUST ENTER OR LOAD ITEMS":GOTO 500 
JPJ 330 PRINT "YOU CAN ENTER UP TO ";MAX;" LINES" 
OQJ 340 PRINT "OF ";LN;" CHARACTERS EACH." 
DJJ 350 IF C>MAX THEN PRINT "YOU HAVE REACHED MAXIMUM # OF ENTRIES":GOTO 500 
KYJ 360 PRINT "TYPE EACH ITEM AND PRESS RETURN." 
RVJ 370 PRINT "PRESS RETURN ON AN EMPTY LINE WHEN" 
QOJ 380 PRINT "FINISHED ENTERING ITEMS." 
RBJ 390 IF C=0 THEN C=1 
KAJ 400 FOR C=C TO MAX:PRINT 
KWJ 410 PRINT :PRINT "ENTRY #";C:INPUT #16;IN$:IF LEN(IN$)=0 THEN 450 
XCJ 420 IF LEN(IN$)<LN THEN IN$(LEN(IN$)+1)=BP$ 
QRJ 430 DAT$(C*LN-LN+4,C*LN+3)=IN$ 
AFJ 440 NEXT C:PRINT "MAXIMUM ITEMS REACHED.":GOTO 470 
YVJ 450 C=C-1:IF C>1 THEN A=USR(ADR(ABC$),ADR(DAT$)+3,C,LN) 
YWJ 460 GOTO 90 
SLJ 470 C=C-1:A=USR(ADR(ABC$),ADR(DAT$)+3,C,LN):GOTO 500 
OQJ 480 POKE 85,4:PRINT "PRESS CONTROL-1 TO PAUSE/CONTINUE" 
XQJ 490 PRINT :FOR I=1 TO C:PRINT I;":";CHR$(32);DAT$(I*LN-LN+4,I*LN+3):NEXT I 
MOJ 500 PRINT :POKE 85,9:PRINT "PRESS <RETURN> FOR MENU";:POKE 764,255 
TSJ 510 GET #1,N:GOTO 90 
RCJ 520 PRINT "PRINT WITH NUMBERED LINES (Y/N)?";:GET #1,N:PRINT CHR$(N) 
SYJ 530 SKIP=0:IF N=78 THEN SKIP=1:GOTO 550 
VFJ 540 IF N<>89 THEN 520 
XDJ 550 PRINT "TURN PRINTER ON AND PRESS <RETURN>":POKE 764,255 
NQJ 560 GET #1,N:OPEN #3,8,0,"P:":PRINT #3:FOR I=1 TO C 
XBJ 570 IF SKIP=0 THEN PRINT #3;I;":";CHR$(32); 
PAJ 580 PRINT #3;DAT$(I*LN-LN+4,I*LN+3):NEXT I:PRINT #3:GOTO 90 
JFJ 590 PRINT "LOAD FROM CASSETTE OR DISK (C/D)"; 
QCJ 600 GET #1,N:PRINT CHR$(N):IF N=67 THEN D$="C:":I=128:GOTO 650 
TGJ 610 IF N<>68 THEN 90 
EIJ 620 I=0:D$="D:":PRINT "ENTER FILENAME: ";:INPUT #16;IN$ 
SEJ 630 IF IN$(2,2)=":" OR IN$(3,3)=":" THEN D$=IN$:GOTO 650 
SLJ 640 D$(LEN(D$)+1)=IN$ 
QYJ 650 POKE 881,0:OPEN #3,4,I,D$:POKE 889,255 
VPJ 660 H=INT(ADR(DAT$)/256):L=ADR(DAT$)-H*256:POKE 885,H:POKE 884,L 
YWJ 670 POKE 882,7:A=USR(ADR(IO$),48) 
JHJ 680 LN=ASC(DAT$(1)):H=ASC(DAT$(2)):L=ASC(DAT$(3)) 
CRJ 690 C=L+256*H 
TDJ 700 PRINT "DATA HAS BEEN LOADED":CLOSE #3:GOTO 500 
OLJ 710 IF C<=1 THEN PRINT "ONLY ONE ITEM IN MEMORY":GOTO 500 
KSJ 720 PRINT :PRINT "ENTER NUMBER OF ITEM TO REMOVE OR 0" 
EKJ 730 PRINT "FOR MENU: "; 
DIJ 740 TRAP 90:INPUT #16;NUM:IF NUM<=0 THEN 90 
AKJ 750 IF NUM>C THEN PRINT "NO SUCH NUMBER - USE DISPLAY OPTION":GOTO 500 
SCJ 760 PRINT "ITEM #";NUM;" IS: " 
MFJ 770 PRINT DAT$(NUM*LN-LN+4,NUM*LN+3) 
VRJ 780 PRINT "SURE YOU WANT TO DELETE THIS (Y/N)";:GET #1,N:PRINT CHR$(N) 
VNJ 790 IF N<>89 THEN 710 
EZJ 800 IN$(1)=CHR$(255):IN$(257)=CHR$(255):IN$(2)=IN$ 
IOJ 810 DAT$(NUM*LN-LN+4,NUM*LN+3)=IN$:A=USR(ADR(ABC$),ADR(DAT$)+3,C,LN) 
JVJ 820 C=C-1:PRINT "THAT ENTRY HAS BEEN REMOVED.":GOTO 500 
ECJ 830 PRINT "SAVE TO CASSETTE OR DISK (C/D)"; 
QOJ 840 GET #1,N:PRINT CHR$(N):IF N-67 THEN D$="C:":I=128:GOTO 890 
TMJ 850 IF N<>68 THEN 90 
VYJ 860 I=0:D$="D:":PRINT "FILENAME TO SAVE UNDER: ";:INPUT #16;IN$ 
SQJ 870 IF IN$(2,2)=":" OR IN$(3,3)=":" THEN D$=IN$:GOTO 890 
SRJ 880 D$(LEN(D$)+1)=IN$ 
MHJ 890 H=INT(C/256):L=C-H*256:DAT$(1,1)=CHR$(LN):DAT$(2,2)=CHR$(H) 
TGJ 900 DAT$(3,3)=CHR$(L) 
SZJ 910 POKE 881,0:OPEN #3,8,I,D$:PRINT #3;DAT$(1,C*LN+10) 
GOJ 920 REM H=INT(ADR(DAT$)/256):L=ADR(DAT$)-H*256:POKE 885,H:POKE 884,L 
HCJ 930 REM H$(C*LN+10)/256:L=(C*LN+10)-H:POKE 889,H:POKE 888,L 
LNJ 940 REM POKE 882,11:A=USR(ADR(IO$),48) 
RIJ 950 CLOSE #3:PRINT "DATA HAS BEEN SAVED":GOTO 500 
GKJ 960 H=PEEK(84) 
HGJ 970 POKE 702,64:POKE 694,0 
YGJ 980 POSITION 2,H:PRINT "SELECT: ";CHR$(32);CHR$(126); 
IIJ 990 GET #1,N:PRINT CHR$(N);:RETURN . 
ROJ 1000 SOUND 0,50,6,4:FOR I=1 TO 50:NEXT I:SOUND 0,0,0,0:RETURN 
WAJ 1010 PRINT "ERROR #";PEEK(195);" AT LINE ";PEEK(186)+256*PEEK(187) 
SXJ 1020 PRINT "TYPE ";CHR$(34);"CONT";CHR$(34);" TO RECOVER.":CLOSE #3:STOP 
BMJ 1030 GOTO 90 
NTJ 1040 DATA 104,104,133,204,104,133,203,104,133,212,104,133,211,104,104,133 
LGJ 1050 DATA 209,165,203,133,207,165,204,133,208,162,0,134,210,134,213,232 
JLJ 1060 DATA 165,207,133,205,24,101,209,133,207,165,208,133,206,105,0,133 
CVJ 1070 DATA 208,160,0,177,207,209,205,240,4,144,9,176,27,200,196,209 
OLJ 1080 DATA 176,22,144,239,164,209,132,210,136,177,207,133,214,177,205,145 
JTJ 1090 DATA 207,165,214,145,205,136,16,241,232,208,2,230,213,228,211,208 
JIJ 1100 DATA 191,165,212,197,213,208,185,165,210,208,166,96 
BKJ 1110 PRINT CHR$(125);"STAND BY..." 
UCJ 1120 FOR I=1 TO 108:READ N:TOT=TOT+N:ABC$(I,I)=CHR$(N):NEXT I 
WLJ 1130 IF TOT<>17407 THEN PRINT "CHECK DATA LINES 1040-1100":STOP 
SYJ 1140 DATA 104,104,104,170,76,86,228 
LLJ 1150 FOR I=1 TO 7:READ N:IO$(I,I)=CHR$(N):NEXT I 
DKZ 1160 RETURN 

A similar type of program was the subject of the very first “Applying The Atari” column (August 1984), but this program took a very long time to alphabetize, save or load data. It also did not provide for deleting entries from the alphabetized list. A question from reader John M. Hirsch (Normal, IL) who asked how to delete entries from the August 1984 program inspired me to create a vastly superior version. With Instant Alphabetizer, alphabetization takes a few seconds at most, data is saved to or loaded from the disk drive or cassette much faster, and a delete function has been implemented. Now you can get those names, book titles, record albums, computer programs, etc. in alphabetical order more efficiently than ever.

Use Program Perfect to enter the program under the “Instant Alphabetizer” heading. When you run the program, a menu will appear with the following options: Enter new listing to be alphabetized, Load a previously saved list, Display the alphabetized list on screen, Print the alphabetized list on the printer, Add items and realphabetize, Remove items from list, Save alphabetized list.

When you use the program for the first time, you’ll want to use the “Enter new list” function, so press E. Depending upon the memory of your machine, you will be able to enter a certain number of lines of 38 characters each to be alphabetized. A 48K or 64K Atari can handle over 600 entries of 38 characters each, which is probably more than you’ll ever need. If you do need more entries, you can make the size of each entry smaller by changing the value of LN on line 40 from 38 to a lower value. For example, if you want to enter twice as many items, change line 40 to:

LN=19 
You will now have a maximum of 19 characters per item. Similarly, you can increase LN if you need more characters per item but fewer items.

Enter each item and press RETURN on a blank line when done. Your list will be alphabetized and you’ll be brought back to the menu screen. You can now save the data to cassette or diskette by pressing S.

Once an alphabetized list is in memory, you can press D to display the list on the screen, or you can press P to print it on your printer. When displaying on the screen, each item will be numbered so that you may refer to it if you want to delete it from the list. When you print the list to the printer, you’ll be asked if you want to number each entry. Type Y if you want the entries to be numbered.

To delete an item, first display the list and get the number of the item you want to remove. Then press R for the remove operation and enter the number of that item. The item will be deleted from the list.

If you want to load a previously saved file, press L. You might then want to add items to this list by pressing A for the Add Items option. Add each item and press RETURN on an empty line when done. The added entries will be alphabetized together with the old entries and you can display, print, or save the new list.

Next Month

Well enter an entertaining graphics program that will make you go to pieces. A digitized picture and more reader mail are in store too.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A diskette of the programs listed in this month’s column is available from the author for $7.00, postpaid. Please make checks payable to “Jeff Brenner” and specify your disk drive model.

Program Perfect” is a utility used to check for typing errors while entering programs from this column. Readers may send a SASE for a listing or $5.00 for a diskette of this program.

Address all correspondence to Jeff Brenner, “Applying The Atari 2/86”, c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

COMPUTER SHOPPER / FEBRUARY 1986 / Page 70 

Atari Help

by Jeff Brenner

Q. I have an Atari 400 computer which is used by my preschool children. They easily use the cartridge programs available but cannot load our cassette programs. They also have trouble waiting for me to load them. Since we have several good programs on cassette, I am looking for a way to convert these cartridges. Is there such a procedure? If so, where may I have it done and what would be the approximate cost?

Glenda York
Prattville, AL

A. Unfortunately, it is impractical to store your cassette programs in cartridge form. First of all, the progams would have to be in machine language (programs that load by pressing START when you turn on the computer). BASIC programs (those that load with CLOAD) could not be placed in cartridge form. Second, even if the programs were in machine language, they would have to be relocated to run in the memory area that the cartridge uses. Relocating a program is a tedious, complicated task and you would need to know a good deal about machine language to do it. Third, the cartridge making procedure itself (you would need an EPROM burner and blank EPROMs) is not simple.

A disk drive is a much more feasible solution, although I do not know if you had this kind of investment in mind — the Atari 1050 is currently being sold for around $150. With a disk drive, programs could be loaded by turning the disk drive on, inserting the diskette and turning the computer on. Diskette programs can be made to run automatically once they are loaded. I know of several families in which the preschool children have learned to use the disk drive. The disk drive is also much faster than the cassette recorder, has a greater variety of software available for it, and lends itself to more serious applications.


Q. We bought an Atari computer set-up comprised of the following: Atari 800XL, (2) 1050 disk drives, 1027 printer, 1010 recorder and modem. My question to you is about this modem. Will it work with this system? The box containing my modem says “THE COMMUNICATOR II Atari 400/800 Computer System.” It contains a TELELINK II program cartridge, an Atari 835 direct-connect modem plus literature.

Also, I would like to brag about Atari: I complained about the “B BASIC” in my 800XL and they promptly sent me a cartridge of “C” BASIC — YEAH ATARI! Computer Shopper is great, very helpful and informative.

Kenneth W. Faries
Nacogdoches, TX

A. The Atari 835 modem was released when the Atari 400 and 800 models were still in production, and was designed to match the color and style of the Atari 400/800. The newer Atari 1030 direct-connect modem was designed to match the XL series. The 835 is otherwise compatible with the 1030 and should work fine with your 800XL and the Telelink II cartridge. Of course, the best way to see if the modem works is to hook it up and try it out! You can start by calling some Atari bulletin boards listed in Computer Shopper’s bulletin board section. Good luck!

I’m glad to hear that Atari sent you the revision C BASIC cartridge at no charge. Unfortunately, many Atari owners, including myself, had to part with fifteen bucks to get it. I have always felt that Atari should have provided revision C BASIC at no charge to those Atari owners who got stuck with revision B.


Q. I am a fairly new reader of Computer Shopper and I think your Atari column is great. Can you tell me if it is possible with an Atari 800 and a modem to access any BBS or data bank or can you only reach other Atari systems?

Jerry Burt
Greenville, PA

A. One of the most important aspects of the modem is that it converts the output from a computer to a standarized signal that can be sent along the phone lines and interpreted by any other modem (using the same baud rate, of course). This allows virtually any two computers to communicate with each other. Hence, your Atari 800 can send and receive text to and from an Apple II+, a Commodore 64, or an IBM PC. You can even communicate with an Amiga, an Atari ST, or a Macintosh. Sometimes a specialized terminal program is used by both the receiving and sending computers to provide features such as special text formatting or graphics images. For the majority of BBS’s however, any communications software, such as Telelink, will be adequate.

If you want to download software you would have to be sure the programs are Atari compatible, since you would be running the actual program on your computer. There are plenty of BBS’s that cater specifically to Atari owners and offer Atari-compatible public domain programs that can be downloaded. See Computer Shopper’s “Bulletin Board” section this issue.


Q. I won an Atari 1027 printer and, as you know, this will not use more than one sheet in the rollers. Consequently, adhesive address labels are out. Instead I use Avery labels (nr. 5357) making a master sheet of the addresses and then photocopying them. The problem: If there is a list of more than 30 addresses (or one sheet) the printer must be stopped to allow for inserting a fresh sheet of paper, but how am I going to resume printing where I left off? Is there a way to do so?

Niek Vanerlee
Kingston, ON, Canada

A. Here is a simple one-line solution that will allow you to interrupt printing and continue at any time:

1241 IF PEEK(764)=33 THEN 1241 

To pause printing, press the space bar. Printing will stop as soon as the program finishes printing the current address. Printing can be resumed by pressing any other key.

This will allow you to change label sheets when you are printing more than a page of addresses. Just press the space bar while the last address on the sheet is being printed. When this address has been printed, the program will pause and you will be able to insert and position a new sheet. Pressing any other key will then continue the printing.


Q. I have typed in Super Clock (Computer Shopper, October 1985) and have attempted to change the clock to a 24-hour format. I have not been successful so-far. (HELP!)

Hendell Helfrick
Springfield, OH

A. Following is a listing of modifications and additions that can be made to Super Clock for a 24-hour format. To change the clock display, modify lines 50, 60, 300, 380 and 400 and add line 425.

CHANGES FOR 24-HOUR CLOCK: 

50 FOR T=0 TO 360 STEP 15:POSITION 19+SIN(T)*16,11-COS(T)*9.75 
60 PRINT T/15;:NEXT T 
300 IF H>24 THEN H=H-24 
380 POKE 706,PEEK(705):POKE 705,S*4:IF PEEK(764)=33 THEN FL=0:GOTO 410 
400 HA=15*(H+M/120):MA=6*M 
425 IF PEEK(764)=33 THEN 200 

Listing 1 

Q. How can I change Mailing List (Computer Shopper, June 1985) to a four-line program. I would like to have, say, a principal’s name on one line and a school’s on another.

Eugene Curtis
Toledo, OH

A. The entire architecture of Mailing List’s data structure is based on the three line format (plus additional characters for the category). Therefore it is not a simple task to modify the program for four lines. However, there is a way around this, and it involves splitting the first line up into two or more lines. Here’s how it works: First add or modify the following lines on your Mailing List program (Lines 1270 and 1320 are changed, while lines 1245 and 1246 are added). Now, when entering the name on the first line, you can use the slash (/) to specify the beginning of a new line. When printing labels, the program will now change these slashes into line-feeds so the data following it will be printed on the next line. The program will automatically adjust for the extra line when printing so that the labels following are not “pushed” down by the additional line.

While this is a clever method of obtaining the four lines, there are two limitations: First, the total number of characters on the first and “extra” lines cannot exceed the number of characters (32) normally allocated for the first line. Second, whenever labels utilizing this extra line technique are to be printed, only single-column printing can be used; the extra line will interfere with double-column label printing.

CHANGES FOR 4-LINE MAILING LIST: 

1245 SKP1=0:FOR J=1 TO LEN(NAME$):IF NAME$(J,J)<>"/" THEN NEXT J:GOTO 125 
1246 NAME$(J,J)=CHR$(155):SKP1=SKP1+1:NEXT J 
1270 IF Q=0 THEN NAME2$=NAME$:ADDR2$=ADDR$:CSZ2$=CSZ$:GOTO 1282 
1320 FOR I=1 TO VS-SKP1:PRINT #5:NEXT I:GOTO 1240 

Listing 2 

Address Atari-related questions to: Jeff Brenner, “Atari Help”, c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

COMPUTER SHOPPER / MARCH 1986 / PAGE 63 

Applying The Atari

by Jeff Brenner

Puzzle Generator,
Digitized Picture

This month’s feature program is PixMix, a high-resolution puzzle generator. Not only is this an excellent way to show off your Atari’s graphics capabilities, but it’s real entertaining and challenging as well. And to test it out, we’ll type in data for a digitized picture.

The 520ST

Apparently Jack Tramiel has the right touch. Atari says that by the end of 1985 it had shipped about 100,000 ST units, though many of these were to Europe. And Atari has had continued success with the 800XL and the newer 130XE. Many distributors have been selling the 130XE in a package with the 1050 disk drive, 1027 letter-quality printer and AtariWriter Plus for an incredible $400. Indeed, 1986 looks like a very promising year for the new Atari.

Incidentally, out editor, Stan Veit, has told me that Computer Shopper plans to cover the 520ST in a separate column. Therefore, my “Applying The Atari” column will remain devoted to the Atari 400/800/XL/XE.

It’s Never Too Late
For Corrections

Those of you using the February 1985 Computer Assisted Study program may still have problems saving and loading question and answer data, depending on what was residing in memory before Computer Assisted Study was run. To fix this for good, we can simply force the string memory to clear with the following line:

105 A$(1)=CHR$(0):A$(FM)=CHR$(0):A$(2)=A$ 

PixMix

Recently, I attended an Atari users group meeting in New York where several members displayed digitized images that they had captured with their Atari computers. A digitized image, for those of you unfamiliar with the term, is created when a signal from a video camera or videotape recorder is converted into numeric data that the computer can store. The computer can then regenerate the video image to the limits of its graphics resolution. A slow-scan device, such as Ditital Visions’ “ComputerEyes,” is used to convert the video signal into the data that the computer can understand.

The idea of storing realistic images in my Atari was particularly exciting to me, and I set out to design a few routines for processing and modifying captured digital images. One of these routines enabled a block of the screen to be moved to another section of the screen. On one digitized image, I had plenty of on-screen fun rearranging a young woman’s eyes and nose. In a few minutes the entire image was hopelessly scrambled and the idea for the PixMix Puzzle Machine instantly evolved.

PixMix turns any Graphics 8 format screen (Graphics 9 through 11, or Graphics 15 or “7.5”, i.e. MicroPainter screens) into a 30-piece puzzle that you can mix up as much or as little as you like. Use the joystick to move the “pieces” around the screen to reconstruct the original image. Press the space bar when you get stuck and you’ll see the completed puzzle for as long as you like. When you think that you’ve solved the puzzle, hit the START key and hope that you’ll get the short, congratulatory tune instead of the low buzz that tells you to look more carefully.

The faster you complete the puzzle, the better your time and the higher your score. PixMix is a great solitary game, but since a score is given, as many people as you like can compete against each other.

PixMix is listed under the “PixMix Puzzle Machine” heading and will run on any 8-bit Atari with a minimum of 40K RAM.

Sample Digitized Picture

Before you test out PixMix, you might want to type in and run the “Digitized Picture Data” program. This program creates a cassette or diskette file of a digitized picture of a watch. Since a full-resolution digitized Graphics 8 image is about 8K in data alone, we had to halve its vertical resolution so that it could be typed into the computer in a feasible amount of time. The image still looks realistic, though, and takes up the full length of the screen.

Using PixMix

When you RUN PixMix, the animated title screen will fall into place and the Atari will take a few seconds to set up the data and to load the machine language routines.

You’ll be asked if you’re using a cassette or diskette (press C or D). If you’re using a diskette you’ll be asked to enter the file name for the picture you want to load. To load the digitized watch file created with the “Digitized Picture Data” program, type “CLOCK.PIC” and press RETURN. If you want to load a picture from a diskette with several files on it, you can press RETURN to the “LOAD WHAT PICTURE FILE?” You’ll then be shown each file on the diskette. To see the next file, press RETURN. To load the file that is displayed, press y.

The screen will remain blank until the picture is fully loaded. The picture will then appear on the screen along with a flashing cursor. Photo 1 shows how the full-resolution watch picture looks like when it is loaded into PixMix. The light box in the upper left-hand corner of the screen is the cursor. Plug in a joystick and you can move the cursor to any part of the screen. The cursor was designed to be visible yet semi-transparent to the screen underneath, regardless of whether you are using a color or a black and white screen.

By pressing the trigger, you can “pick up” any piece of the picture and move it to wherever you like. Try it: Push the joystick trigger. You’ll hear a beep. Now when you move the cursor, the piece of screen that was under the cursor will move with it! You can now place this piece of screen down wherever you like by pressing the trigger again. What happens to the section of the image that you just covered with the moved piece, you ask? It is automatically placed in the blank space that the original piece was taken from. Hence, when you move one piece to another, the two exchange places.

Scrambling The Screen

Now for the fun stuff. When you press and hold down the OPTION key, the image on the screen will be mixed up. The longer you hold down the OPTION key, the more the pieces of the picture will be mixed up. Photo 2 shows the picture of the watch after a few seconds of scrambling. When you release the OPTION key, the timer starts. Now use the joystick to put the picture back together.

The Space Bar

At any time while solving the puzzle, you can press and hold down the space bar to see the completed puzzle. When you release the space bar, your unsolved puzzle will return to the screen. The space bar is particularly useful when you first start solving the puzzle, since it allows you to check that you’re putting the pieces in their correct positions.

Solving The Puzzle

As soon as you think you’ve solved the puzzle, press the START key. If your Atari responds with a menacing buzz, you’ll know that you’ve left some pieces out of place. A short, pleasant melody tells you when you’ve correctly solved the puzzle, and your time and score will be displayed. Photo 3 shows a puzzle that has just been solved. The time was 7 minutes and 43.71 seconds.

After a puzzle has been solved, you are given the option of trying the same puzzle again, or a new one. If you’re playing with a group of people, you’ll want each person to try to get the best score on the same puzzle, since each puzzle varies in complexity and difficulty.

Hints and Strategies

Naturally, it’s a good idea to look for recognizable pieces when you begin solving a puzzle. For example, if the puzzle is the face of a person, you’ll want to look for the eyes and get those into place before continuing with the rest of the puzzle. In the watch picture, the Roman numerals are of great help in putting the picture together, which is why this puzzle is particularly well suited for beginners.

You’ll find that some pictures make easy puzzles, while others make incredibly difficult puzzles. Generally, the more defined and clear the original image is, the easier the puzzle will be to solve. In any case, the more you solve a particular puzzle, the faster you’ll be able to do it. You may find that you can do a thoroughly mixed watch puzzle in close to a minute after enough practice.

Take advantage of the fact that the cursor returns to the opposite side of the screen when it is moved past an edge. For example, if the cursor is on the right side of the screen and you want to move it to the left side, pushing the joystick to the right is the fastest way, since the cursor will return to the left side of the screen once it passes the right edge.

Certainly make use of the space bar, not only when you start solving a puzzle, but near the end too when you may easily miss those few pieces that are out of place. By pressing and releasing the space bar, you can flip back and forth between the original image and your puzzle screen so that any differences become visible to you.

Picture Diskette

I have assembled a disk full of specially centered, high-resolution digitized pictures that you can use with PixMix. Also included on the diskette is an add-on utility that allows PixMix to load compressed MicroIllustrator files (for Atari Touch Tablet and Koalapad) in Graphics 15 (“Graphics 7.5”) four-color format. The “Picture Diskette” is available to readers for $5.00, postpaid. (See address at end of article.)

Next Month

Readers questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A diskette of the programs listed in this months column is available from the author for $7.00, postpaid. Please make checks payable to “Jeff Brenner” and specify your disk drive model.

Program Perfect” is a utility used to check for typing errors while entering programs from this column. Readers may send $5 for a diskette or a SASE for a listing of this program.

Address all correspondence to Jeff Brenner, “Applying The Atari 3/86” c/o Computer Shopper, PO Box F, Titusville, FL 32781-9990.

DIGITIZED PICTURE DATA 

SCE 10 REM DIGITIZED PICTURE DATA LOADER 
ESE 15 S=1:C=0:PRINT CHR$(125);"COUNTDOWN: ":POKE 752,1:OPEN #1,4,0,"K:" 
ONE 20 DIM A$(3840),C0$(40),C255$(40):C0$=CHR$(0):C0$(40)=CHR$(0):C0$(2)=C0$ 
GTE 25 C255$=CHR$(255):C255$(40)=CHR$(255):C255$(2)=C255$ 
DHE 30 POSITION 14,0:PRINT 3840-S;"   " 
KDE 35 READ N:IF N>0 AND N<255 THEN A$(S)=CHR$(N):S=S+1:GOTO 30 
CLE 40 IF N=-1 THEN GOTO 55 
MJE 45 READ A:IF N=0 THEN A$(S)=C0$(1,A):S=S+A:GOTO 30 
VLE 50 A$(S)=C255$(1,A):S=S+A:GOTO 30 
RXE 55 POKE 752,0:PRINT :PRINT "SAVE TO CASSETTE OR DISK (C/D)?";:GET #1,N 
MWE 60 PRINT CHR$(N) 
ISE 65 IF N<67 OR N>68 THEN 55 
BSE 70 PRINT "PRESS START TO SAVE" 
LZE 75 IF PEEK(53279)<>6 THEN 75 
QEE 80 IF N=68 THEN PRINT "SAVING AS CLOCK.PIC":OPEN #2,8,0,"D:CLOCK.PIC" 
WXE 85 IF N=67 THEN OPEN #2,8,128,"C:" 
PKE 90 FOR I=1 TO LEN(A$) STEP 40 
MDE 95 PRINT #2;A$(I,I+39);A$(I,I+39);:NEXT I:CLOSE #2 
NWE 100 PRINT "COMPLETED.":POKE 752,0:END 
DDE 105 DATA 0,6,16,0,3,48,0,1,1,240,3,255,1,191,255,1,251 
MPE 110 DATA 255,4,184,0,23,128,0,2,192,0,1,22,0,1,255,1,216,47 
CDE 115 DATA 255,6,193,128,0,21,129,0,2,7,128,0,1,192,15,148,127,255,8 
ROE 120 DATA 27,32,0,23,52,0,2,1,224,15,255,10,248,0,23,112,24,0,1 
JQE 125 DATA 8,6,255,3,7,255,8,32,0,18,16,0,3,128,224,0,2,127 
BEE 130 DATA 255,1,252,61,143,255,3,223,255,3,254,253,0,21,1,7,136,0,1 
VWE 135 DATA 7,255,2,254,29,199,255,3,227,255,4,223,192,0,16,16,0,3 
BIE 140 DATA 12,62,32,0,1,31,255,3,131,227,255,3,227,220,127,255,3,252 
VJE 145 DATA 0,6,16,0,13,48,248,6,11,255,4,227,225,255,3,224,120,67 
GTE 150 DATA 255,4,128,0,19,67,224,48,15,255,4,240,241,255,3,241,248,199 
TAE 155 DATA 255,4,240,0,2,1,64,0,14,1,15,128,128,127,255,4,240,56 
IZE 160 DATA 255,3,225,240,135,255,4,254,0,5,1,0,6,2,0,4,16,4 
VQE 165 DATA 63,131,3,255,6,8,127,255,2,177,225,143,255,5,192,0,1,2 
AHE 170 DATA 128,0,3,64,0,11,255,1,136,15,232,255,4,239,255,3,254,248 
WWE 175 DATA 225,15,255,5,240,0,2,128,0,14,3,250,64,31,223,127,255,5 
DWE 180 DATA 143,191,255,1,254,195,31,255,6,0,12,32,0,4,7,253,192,255,1 
XVE 185 DATA 3,255,4,247,239,255,3,127,248,63,255,6,160,0,1,248,0,13 
XAE 190 DATA 1,31,219,3,255,1,240,31,255,2,251,255,1,247,2,7,127,254 
PGE 195 DATA 63,255,7,237,0,1,16,0,12,8,0,1,127,254,15,255,2,131 
VGE 200 DATA 255,1,254,255,1,248,255,4,188,254,255,7,241,0,1,4,0,14 
JWE 205 DATA 254,220,31,255,2,224,23,255,1,254,127,255,5,125,255,7,252,128 
ANE 210 DATA 16,0,13,3,253,176,63,255,3,31,63,159,255,6,251,248,255,3 
CAE 215 DATA 241,255,3,0,1,12,0,13,39,248,65,255,5,253,255,8,231,255,3 
YWE 220 DATA 193,255,3,128,11,0,10,32,0,2,79,244,195,255,4,231,255,12 
DUE 225 DATA 254,15,255,3,224,1,0,13,31,241,135,255,4,252,127,255,9,223 
BTE 230 DATA 255,1,240,63,255,3,242,0,14,63,207,15,255,3,252,255,2,207 
GPL 235 DATA 255,9,191,193,255.4,248,0.14,127,254,31,255,4,207.255,1,225 
VLE 240 DATA 255,10,231.255,4,252,32,128,0,9,4,0,2,255,1,204,63,255,3 
JVE 245 DATA 223,191,255,1,240,127,255,1,253,255,6,252,127,255,5,2,96,0,11 
FCE 250 DATA 1,255,1,252,127,255,3,254,255,2,252,31,255,1,251,239,255,5 
XUE 255 DATA 249,255,6,128,32,0,11,1,255,1,248,127,255,6,254,7,255,2 
NRE 260 DATA 221,155,255,11,196,96,0,11,11,255,1,240,248,255,2,253,247,255,3 
EQE 265 DATA 129,255,2,249,196,255,5,207,255,5,224,48,0,11,15,255,1,113 
rpE 270 DATA 255,8,224,255,3,237,246,207,255,9,249,0,12,23,254,227,247,231 
AME 275 DATA 255,6,248,31,255,3,238,31,255,4,223,255,4,248,24,0,11,31 
HWE 280 DATA 255,1,227,224,0,1,1,239,255,4,254,15,255,3,253,147,111,255,8 
YWE 285 DATA 253,64,0,7,32,0,3,31,253,231,207,255,1,127,223,255,5,131 
XJE 290 DATA 255,4,248,111,255,4,252,7,255,2,254,4,0,11,63,255,1,227 
TNE 295 DATA 192,127,255,1,191,255,5,0,1,255,9,240,0,1,15,255,3,16 
VWE 300 DATA 0,11,63,255,1,199,252,0,1,247,129,255,4,252,0,1,63,255,7 
XDE 305 DATA 254,0,2,255,4,144,0,11,63,253,207,255,1,248,7,125,255,4 
OPE 310 DATA 252,0,1,15,255,7,0,2,15,255,4,128,0,11,127,255,1,207 
TSE 315 DATA 255,2,239,255,6,128,3,255,6,0,2,96,31,255,1,240,255,2 
BXE 320 DATA 136,0,11,127,255,1,239,255,3,99,255,5,240,1,255,5,128,0,1 
PEE 325 DATA 127,255,1,254,0,2,127,255,1,196,0,9,1,0,1,127,255,1 
BUE 330 DATA 223,255,9,254,0,1,127,255,3,192,0,1,255,4,15,252,63,255,1 
HCE 335 DATA 226,0,11,127,255,1,239,255,10,224,31,255,2,240,0,1,127,255,3 
VJE 340 DATA 7,0,2,31,255,1,224,0,11,63,255,1,127,255,2,254,103,255,6 
ULE 345 DATA 252,0,1,31,224,0,1,63,255,5,131,255,3,224,0,11,127,254 
WWE 350 DATA 127,255,11,0,3,31,255,5,253,255,4,241,0,11,63,255,4,254 
VRE 355 DATA 247,255,7,0,2,7,255,6,129,255,4,243,0,11,127,255,1,127 
YRE 360 DATA 255,2,254,87,255,7,0,2,127,255,11,241,0,11,63,255,13,0,2 
HLE 365 DATA 127,255,11,240,0,11,31,255,1,127,255,2,239,251,255,7,128,0,1 
TIE 370 DATA 15,255,6,192,255,4,240,0,11,31,255,1,63,255,1,192,7,3 
VFE 375 DATA 255,7,224,0,1,195,255,11,248,0,11,31,255,2,192,0,1,247 
GNE 380 DATA 255,8,254,7,248,63,255,10,248,128,0,10,31,255,1,223,199,240 
DKE 385 DATA 3,255,11,135,255,5,230,255,4,248,0,11,15,255,1,223,224,0,1 
HRE 390 DATA 123,192,255,10,240,255,5,224,255,4,249,128,0,10,15,255,1,231 
EUE 395 DATA 224,254,1,223,255,10,254,31,255,4,239,199,255,3,249,0,7,32 
SHE 400 DATA 0,3,15,255,1,231,240,0,1,2,255,12,195,255,4,207,255,1 
AHE 405 DATA 15,255,2,240,0,11,7,255,1,247,248,47,255,1,246,63,255,10 
BVE 410 DATA 248,127,255,3,223,255,1,252,31,255,1,241,0,11,7,255,1,249 
DZE 415 DATA 248,255,2,251,255,12,15,255,3,155,255,2,248,255,1,240,0,11 
LNE 420 DATA 3,255,1,253,253,2,128,125,255,12,241,255,3,191,255,2,253,255,1 
LUE 425 DATA 240,128,0,10,3,255,1,252,127,248,7,254,247,255,11,254,63,255,2 
BFE 430 DATA 60,231,255,1,249,255,1,224,0,11,3,255,1,254,127,0,1,255,2 
ALE 435 DATA 127,255,5,253,255,6,199,255,2,127,242,3,255,2,224,0,11,1 
IIE 440 DATA 255,2,143,143,255,8,248,255,1,127,255,4,248,255,1,254,124,12 
HRE 445 DATA 127,251,255,1,230,0,11,1,255,2,207,255,3,254,255,6,126,255,6 
JKE 450 DATA 31,252,249,255,1,231,247,255,1,206,128,0,10,1,255,2,231,255,8 
EFE 455 DATA 63,255,1,240,255,6,227,248,63,205,247,247,255,1,140,0,11,1 
EKE 460 DATA 255,2,241,255,9,162,127,255,6,252,127,153,255,1,7,255,2,20 
CSE 465 DATA 0,12,255,2,252,255,4,159,255,3,247,255,1,206,63,255,6,135 
EME 470 DATA 191,231,255,1,239,255,1,12,0,12,255,2,254,95,255,9,254,253 
NPE 475 DATA 255,6,128,255,2,143,223,254,142,15,128,0,10,127,255,2,143,255,2 
LNE 480 DATA 193,254,31,255,5,231,255,6,120,31,255,2,159,252,240,0,12,255,3 
FPE 485 DATA 203,255,2,6,120,255,12,253,255,1,231,255,3,253,252,0,12,127 
IEE 490 DATA 255,2,243,255,1,248,24,31,252,255,11,247,255,1,252,255,3,243 
NXE 495 DATA 248,0,12,127,255,2,253,255,1,224,224,255,13,223,255,2,159,255,2 
LFE 500 DATA 231,248,0,12,127,255,3,62,7,135,255,2,243,255,10,207,248,255,4 
KHE 505 DATA 207,224,0,12,127,255,1,247,255,1,239,156,31,241,254,239,255,9 
ICE 510 DATA 251,247,224,63,255,3,63,192,0,12,127,255,1,207,255,1,247,192 
BXE 515 DATA 126,7,255,2,231,255,10,135,15,255,2,254,63,0,13,127,255,1 
MHE 520 DATA 129,255,1,252,121,239,15,255,2,191,255,9,124,112,195,255,2,249 
WXE 525 DATA 255,1,1,224,0,11,63,255,1,128,127,255,1,62,126,31,255,3 
JSE 530 DATA 191,255,6,191,255,1,242,28,48,255,1,254,224,200,0,13,63,255,1 
ELE 535 DATA 128,31,255,1,3,252,63,255,2,254,127,63,255,4,207,255,1,127 
UBE 540 DATA 225,135,12,31,255,1,130,120,0,13,127,255,1,0,1,7,255,1 
SBE 545 DATA 225,224,127,255,3,252,127,254,127,159,227,255,1,231,255,1,248,11 
VBE 550 DATA 193,31,254,5,224,0,13,127,255,1,0,2,255,1,252,29,255,3 
KBE 555 DATA 252,127,230,255,3,243,243,255,2,254,12,48,63,184,118,224,0,13 
CEE 560 DATA 127,255,1,0,2,31,255,1,195,255,3,254,31,255,1,248,125,253 
DWE 565 DATA 131,255,4,195,132,254,224,125,128,0,13,127,254,0,2,3,255,1 
EQE 570 DATA 249,255,3,252,63,63,255,8,240,231,255,1,3,178,0,14,127,254 
ANE 575 DATA 0,3,255,2,63,255,2,252,126,63,255,3,254,255,4,252/31,252 
EDE 580 DATA 2,188,0,14,127,252,0,3,15,255,1,247,255,2,248,124,63,255,3 
JYE 585 DATA 254,127,255,5,224,31,248,0,14,127,252,0,4,255,1,254,127,255,1 
ETE 590 DATA 248,248,63,255,3,254,31,255,5,128,238,160,0,14,127,248,0,4 
ENE 595 DATA 31,255,1,231,255,1,240,254,63,255,3,254,15,255,4,248,1,219 
WRE 600.DATA 128,0,14,255,1,240,0,4,3,255,1,254,127,225,222,63,255,4 
RHE 605 DATA 199,255,4,128,0,1,43,0,15,255,1,240,0,5,63,255,1,243 
VDE 610 DATA 252,62,63,255,4,225,255,3,248,0,1,1,248,0,15,255,1,224 
STE 615 DATA 0,5,3,255,2,143,254,63,255,4,248,255,3,0,2,1,112,0,15 
XLE 620 DATA 255,1,192,0,6,63,255,1,252,51,255,5,248,63,255,1,224,32 
LGE 625 DATA 0,1,1,64,0,15,255,1,192,0,6,3,255,2,252,255,7,240 
UIE 630 DATA 31,224,0,1,51,0,16,255,1,128,0,7,31,255,2,252,31,255,4 
RBE 635 DATA 240,15,255,1,224,0,1,62,0,16,255,1,128,0,8,127,255,3 
HIE 640 DATA 192,0,2,7,255,3,128,0,1,120,0,16,62,0,9,1,255,9 
MQE 645 DATA 254,0,2,32,0.16,14,0,10,7,255,8,192,0,1,1,128,0,16 
FAE 650 DATA 12,0,12,255,6,0,3,6,0,36,1,128,0,1,62,0,37,128 
XVE 655 DATA 0,1,16,0,36,1,0,2,160,0,36,1,0,1,3,192,0,36 
WYZ 660 DATA 2,0,1,2,0,37,2,0,1,14,0,12,-1 
PIXMIX PUZZLE MACHINE 

VJJ 10 REM PIXMIX PUZZLE MACHINE 
KGJ 20 REM COPYRIGHT 1986 JEFF BRENNER 
ENJ 30 DIM PM$(176),C1$(48),C2$(48),TEMP$(25),FILE$(25),A$(10),B$(10) 
MKJ 40 OPEN #1,4,0,"K:":GOSUB 160 
TCJ 50 C1$=PM$=C1$(17)=CHR$(255):C1$(32)=CHR$(255) 
MAJ 60 C1$(18,31)=C1$(17,32):C1$(LEN(C1$)+1)=PM$ 
YWJ 70 DIM GT$(57),PT$(53),SCR$(7680),MOVE$(56),CMP$(65),SWAP$(62),CIO$(7) 
IUJ 80 GOSUB 930:DIM P$(320),HOLD$(320):P$(320)=CHR$(0) 
KKJ 90 POKE 106,PEEK(106)-16:GRAPHICS 24:GOSUB 720:J=PEEK(88)+256*PEEK(89) 
NXJ 100 RESTORE 110:FOR I=1664 TO 1684:READ N:POKE I,N:NEXT I:A=USR(1664) 
PIJ 110 DATA 104,162,6,160,138,169,7,76,92,228,165 
YVJ 120 DATA 20,41,247,141,192,2,76,98,228 
BRJ 130 PM=PEEK(106):POKE 54279,PM:POKE 53277,3:POKE 53248,0 
FSJ 140 V=PEEK(134)+256*PEEK(135):A=PEEK(140)+256*PEEK(141):OS=PM*256+512-A 
NDJ 150 H=INT(OS/256):L=OS-H*256:POKE V+2,L:POKE V+3,H:GOSUB 160:GOTO 170 
SGJ 160 PM$(1)=CHR$(0):PM$(176)=CHR$(0):PM$(2)=PM$:RETURN 
YMJ 170 X=48:Y=48:PM$(Y-47,Y+48)=C1$:POKE 53256,3 
UAJ 180 DIM JX(10),JY(10) 
FAJ 190 RESTORE 200:FOR I=0 TO 9:READ X1,Y1:JX(I)=X1:JY(I)=Y1:NEXT I 
FUJ 200 DATA 32,16,32,-16,32,0,0,0,-32,16,-32,-16,-32,0,0,0,0,16,0,-16,0,0 
NDJ 210 GRAPHICS 8+32:GOSUB 720 
PNJ 220 TEMP$="":CLOSE #3:PRINT "CASSETTE OR DISKETTE (C/D)? "; 
OWJ 230 GET #1,D:PRINT CHR$(D):IF D<67 OR D>68 THEN 220 
PNJ 240 IF D=68 THEN PRINT "LOAD WHAT PICTURE FILE? D:";:INPUT #16;TEMP$ 
EHJ 230 IF LEN(TEMP$) OR D<>68 THEN 340 
PUJ 260 TRAP 330:PRINT "DIRECTORY (PRESS RETURN OR Y)":OPEN #2,6,0,"D:*.*" 
NRJ 270 INPUT #2;FILE$:IF FILE$(2,2)<>CHR$(32) THEN 330 
VVJ 280 A$=FILE$(1,10):PRINT A$;".";FILE$(11,13);"?";CHR$(32); 
BCJ 290 GET #1,N:PRINT CHR$(N):IF N<>89 THEN 270 
CCJ 300 IF A$(LEN(A$))=CHR$(32) THEN A$=A$(1,LEN(A$)-1):GOTO 300 
ETJ 310 TEMP$=A$(3):TEMP$(LEN(TEMP$)+1)=".":TEMP$(LEN(TEMP$)+1)=FILE$(11) 
WOJ 320 CLOSE #2:GOTO 340 
QCJ 330 TRAP 40000:PRINT :CLOSE #2:GOTO 240 
EOJ 340 FILE$=CHR$(D):FILE$(2,2)=":":FILE$(LEN(FILE$)+1)=TEMP$ 
QDJ 350 POKE 881,0:TRAP 220:OPEN #3,4,0,FILE$ 
WQJ 360 H=INT(ADR(SCR$)/256):L=ADR(SCR$)-H*256:POKE 884,L:POKE 885,H 
ASJ 370 POKE 888,0:POKE 889,30:POKE 882,7:A=USR(ADR(CIO$),48):CLOSE #3 
XCJ 380 TRAP 40000:A=USR(ADR(MOVE$),ADR(SCR$)) 
ADJ 390 GRAPHICS 8+16+32:GOSUB 720:POKE 53248,48 
KHJ 400 POKE 18,0:POKE 19,0:POKE 20,0:TF=0 
HQJ 410 I=0:D=STICK(0)-5:IF D=10 THEN 540 
PRJ 420 SOUND 3,0,1,6:SOUND 3,0,1,0:POKE 77,0 
YZJ 430 X=X+JX(D):Y=Y+JY(D):IF X<48 THEN X=176 
ABJ 440 IF X>176 THEN X=48 
YAJ 450 IF Y<48 THEN Y=128:GOSUB 160 
YDJ 460 IF Y>128 THEN Y=48:GOSUB 160 
YXJ 470 IF HOLD$="" THEN FOR DL=1 TO 14:NEXT DL 
KRJ 480 POKE 53248,X 
VPJ 490 PM$(Y-47,Y+48)=C1$ 
MSJ 500 IF LEN(HOLD$)=0 THEN 540 
QMJ 510 A=USR(ADR(PT$),ADR(P$),S) 
OIJ 520 S=J+(X-48)/4+(Y-48)*80:A=USR(ADR(GT$),ADR(P$),S) 
YVJ 530 A=USR(ADR(PT$),ADR(HOLD$),S) 
IEJ 540 SOUND 0,0,0,0:IF PEEK(764)=33 THEN GOSUB 730 
QJJ 550 FL=0:IF PEEK(53279)=3 THEN GOSUB 660 
ENJ 560 IF PEEK(53279)=6 THEN GOSUB 760 
EHJ 570 IF STRIG(0) THEN 410 
LYJ 580 SOUND 0,0,6,6 
AGJ 590 S=J+(X-48)/4+(Y-48)*80:IF HOLD$="" THEN 620 
KJJ 600 HOLD$="":IF S<>OS THEN S=OS:A=USR(ADR(PT$),ADR(P$),S) 
BQJ 610 GOTO 640 
FFJ 620 OS=S:A=USR(ADR(GT$).ADR(P$),S) 
CFJ 630 HOLD$=P$:P$=CHR$(0):P$(320)=CHR$(0):P$(2)=P$ 
IPJ 640 IF STRIG(0)=0 THEN 640 
BWJ 650 GOTO 480 
DAJ 660 XX=INT(RND(0)*5):YY=INT(RND(0)*6):S=J+XX*8+YY*1280 
PGJ 670 IF FL=0 THEN FL=1:A=USR(ADR(GT$),ADR(P$),S):S1=S:HOLD$=P$:GOTO 660 
RMJ 680 A=USR(ADR(GT$),ADR(P$),S):A=USR(ADR(PT$),ADR(P$),S1):S1=S 
NNJ 690 IF PEEK(53279)=3 THEN 660 
DFJ 700 IF TF=0 THEN TF=1:POKE 18,0:POKE 19,0:POKE 20,0:SOUND 0,11,12,10 
RIJ 710 A=USR(ADR(PT$),ADR(HOLD$),S1):HOLD$="":RETURN 
MPJ 720 POKE 559,46:POKE 710,0:POKE 16,64:POKE 53774,64:POKE 764,255:RETURN 
XKJ 730 A=USR(ADR(SWAP$),ADR(SCR$)) 
RGJ 740 IF PEEK(53775)=251 THEN 740 
XEJ 750 POKE 764,255:A=USR(ADR(SWAP$),ADR(SCR$)):RETURN 
XSJ 760 A=USR(ADR(CMP$),ADR(SCR$)):IF PEEK(208)=0 THEN 780 
SFJ 770 SOUND 0,45,6,8:FOR I=1 TO 100:NEXT I:SOUND 0,0,0,0:RETURN 
NKJ 780 TM=(PEEK(20)+256*PEEK(19)+256*PEEK(18))/60-0.21:RESTORE 820 
JDJ 790 FOR I=0 TO 3:READ N:FOR V=12 TO 0 STEP -1:SOUND I,N,10,V:NEXT V 
LYJ 800 NEXT I:FOR I=53761 TO 53767 STEP 2 
ASJ 810 POKE I,166:NEXT I:FOR I=1 TO 90:POKE 712,I:NEXT I 
XFJ 820 DATA 243,193,162,121 
EWJ 830 SOUND 1,29,10,8:SOUND 3,11,10,8:POKE 710,12:FOR I=1 TO 100:NEXT I 
KBJ 840 POKE 710,0:POKE 712,0:FOR I=0 TO 3:SOUND 1,0,0,0:NEXT I 
ANJ 850 GRAPHICS 8+32:GOSUB 720:PRINT CHR$(125);"TIME":POKE 559,46 
LHJ 860 M=INT(TM/60):S=TM-M*60 
HRJ 870 PRINT M;" MINUTES AND ";INT(S*100+0.5)/100;" SECONDS." 
TFJ 880 PRINT "SCORE: ";INT((1000-TM)*1000+0.5) 
XZJ 890 PRINT "SAME OR NEW PUZZLE (S/N)? ";:GET #1,N:PRINT CHR$(N) 
SXJ 900 IF N<>83 AND N<>78 THEN 890 
SSJ 910 IF N=78 THEN 220 
TUJ 920 A=USR(ADR(MOVE$),ADR(SCR$)):GOTO 390 
RLJ 930 POKE 559,0:RESTORE 940:FOR I=1 TO 57:READ N:GT$(I,I)=CHR$(N):NEXT I 
KXJ 940 DATA 104,104,133,205,104,133,204,104,133,207,104,133,206,162,32,160 
DCJ 950 DATA 7,177,206,145,204,169,0,145,206,136,16,245,24,165,206,105 
EEJ 960 DATA 40,133,206,165,207,105,0,133,207,165,204,105,8,133,204,165 
FEJ 970 DATA 205,105,0,133,205,202,208,215,96 
NCJ 980 GOSUB 1210:FOR I=1 TO 53:READ N:PT$(I,I)=CHR$(N):NEXT I 
LCJ 990 DATA 104,104,133,205,104,133,204,104,133,207,104,133,206,162,32,160 
GIJ 1000 DATA 7,177,204,145,206,136,16,249,24,165,206,105,40,133,206,165 
DGJ 1010 DATA 207,105,0,133,207,165,204,105,8,133,204,165,205,105,0,133 
FRJ 1020 DATA 205,202,208,219,96 
TLJ 1030 FOR I=1 TO 56:READ N:MOVE$(I,I)=CHR$(N):NEXT I 
LVJ 1040 DATA 104,104,133,205,104,133,204,165,88,133,206,165,89,133,207,162 
ILJ 1050 DATA 192,160,39,177,204,145,206,136,16,249,24,165,204,105,40,133 
HMJ 1060 DATA 204,165,205,105,0,133,205,24,165,206,105,40,133,206,165,207 
YKJ 1070 DATA 105,0,133,207,202,208,218,96 
QHJ 1080 FOR I=1 TO 65:READ N:CMP$(I,I)=CHR$(N):NEXT. I 
JVJ 1090 DATA 104,104,133,205,104,133,204,169,0,133,208,165,88,133,206,165 
IXJ 1100 DATA 89,133,207,162,192,160,39,177,204,209,206,208,33,136,16,247 
FMJ 1110 DATA 24,165,204,105,40,133,204,165,205,105,0,133,205,24,165,206 
NMJ 1120 DATA 105,40,133,206,165,207,105,0,133,207,202,208,216,96,230,208,96 
TNJ 1130 FOR I=1 TO 62:READ N:SWAP$(I,I)=CHR$(N):NEXT I 
LZJ 1140 DATA 104,104,133,205,104,133,204,165,88,133,206,165,89,133,207,162 
KOJ 1150 DATA 192,160,39,177,204,72,177,206,145,204,104,145,206,136,16,243 
FMJ 1160 DATA 24,165,204,105,40,133,204,165,205,105,0,133,205,24,165,206 
RNJ 1170 DATA 105,40,133,206,165,207,105,0,133,207,202,208,212,96 
ODJ 1180 FOR I=1 TO 7:READ N:CIO$(I,I)=CHR$(N):NEXT I 
TDJ 1190 DATA 104,104,104,170,76,86,228 
CPJ 1200 RETURN 
NFJ 1210 A$="PIXMIX":DIM X(6),Y(6),C(2):GRAPHICS 2:POKE 710,0:N=0 
QQJ 1220 POKE 708,66:POKE 709,216:POKE 711,148 
FAJ 1230 C(0)=0:C(1)=32:C(2)=160 
GFJ 1240 FOR I=1 TO 6:X(I)=5+INT(RND(0)*10):Y(I)=INT(RND(0)*10) 
RRJ 1250 POSITION X(I),Y(I):PRINT #6;CHR$(ASC(A$(I,I))+C(N)):N=N+1 
TSJ 1260 IF N=3 THEN N=0 
ASJ 1270 NEXT I 
VKJ 1280 B=1:FOR I=1 TO 6 
QWJ 1290 X=X(I):Y=Y(I) 
USJ 1300 SOUND 1,X(I)*4,10,8:SOUND 2,Y(I)*4,10,8 
CLJ 1310 IF Y(I)>5 THEN Y(I)=Y(I)-1:B=0 
CIJ 1320 IF Y(I)<5 THEN Y(I)=Y(I)+1:B=0 
GXJ 1330 IF X(I)>I+6 THEN X(I)=X(I)-1:B=0 
GUJ 1340 IF X(I)<I+6 THEN X(I)=X(I)+1:B=0 
AWJ 1350 POSITION X,Y:PRINT #6;CHR$(32);:POSITION X(I),Y(I):PRINT #6;A$(I,I) 
NFJ 1360 POSITION X(I),Y(I):A=ASC(A$(I,I)):PRINT# 6;CHR$(A+C(N)) 
IXJ 1370 N=N+1:IF N>2 THEN N=0 
NKJ 1380 NEXT I:IF B=0 THEN 1280 
TQJ 1390 POKE 752,1:POKE 657,13:PRINT "PUZZLE MACHINE" 
XHJ 1400 POKE 657,7:PRINT "Copyright 1986 Jeff Brenner":POKE 53768,1 
OEJ 1410 FOR I=1 TO 36 
WNJ 1420 N=PEEK(711):POKE 711,PEEK(709):POKE 709,PEEK(708):POKE 708,N 
VZJ 1430 NEXT I:PRINT :POKE 657,15:PRINT "STAND BY..."; 
TIJ 1440 SOUND 1,0,0,0:SOUND 2,0,0,0 
DFZ 1450 POKE 752,0:RETURN 
COMPUTER SHOPPER / MARCH 1986 / PAGE 63 

Atari Help

by Jeff Brenner

In January’s “Atari Help” column, Andrew Leo Eddings of Alabaster, AL had asked about memory expansion for the Atari 800XL. Since I was not familiar with the latest memory expansions available for the 800XL, I asked those readers who produced or were familiar with 800XL memory expansion to write. This month we will all learn about the latest memory expansion available, thanks to the many readers who responded to my call for help.

The treasurer of the Memphis Atari Systems Hobbyists was kind enough to give us a brief history of the recent activity in the 800XL memory expansion area. He writes:

Claus Buchholz published an article in the September 1985 issue of BYTE which described the use of 41256 256K-bit dynamic RAMs to expand the 800XL to a full 256K RAM! I built that modification (for under $30.00) as have many others. Unfortunately, it bank selected 32K pages ($0000-$7FFF) unlike both the 130XE and Axlon and Mosaic expansion mods for the older 800, which bank selects 16K. Buchholz’s handler was modified by a CompuServe user named John Radigan. Then Tom Harker of ICD got together with Buchholz and developed a SpartaDOS-compatible ramdisk handler for the “256K XL.” Now single, enhanced and double densities were supported but no existing software existed for this bank select scheme.

Enter ICD and CDY consulting. Harker (ICD) has introduced the “RAMBO XL” mod which, unlike the original Buchholz mod, allows both the 800XL and 1200XL to be expanded to 256K RAM plus providing the same 16K ($4000-$7FFF) selection as the 130XE. These mods produced a pseudo 130XE with 256K instead of 128K of banked memory. The ICD unit retails for $49.95 without DRAMs and the CDY upgrade sells for $99.95 with DRAMs (although it too is available without DRAMs for much less).

With the minimal cost of 41256-150ns dynamic RAMs, Atari ought to give serious consideration to producing a “260XE” as both the manufacturing changes would be minimal and now there is little reason for XL owners to buy XEs! The modified XLs are the most powerful 8-bit Ataris in existence! Add two 50k-baud drives (ICD US Doubler or Happy-Modified 1050’s) and the Supra Xebic 1410 based controller with a suitable 10MB hard drive and voila! Now what we need is a printer spooler program like that just released for the 520ST!

Bob Allman
Millington, TN

Thomas Harker, president of ICD (1220 Rock Street, Suite 310, Rockford, IL 61101-1437), writes that ICD’s RAMBO XL upgrade “is indeed 130XE compatible in the CPU mode. A computer fitted with this upgrade can run the DOS 2.5 RAMdisk, BASIC XE, PaperClip word processor, and Synfile+, as if it was the 130XE.” CDY’s upgrade is similarly compatible (CDY, 421 Hanbee, Richardson, TX 75080). Garrett Computing (117 Drury Lane, Slidell, LA 70460) offers yet another “Quarter Megabyte Atari 800XL” upgrade for $59.95, which includes RAMs. Dan Garrett says his upgrade runs “some 130XE software” although he doesn’t mention whether his upgrade performs 16K or 32K bank switching.

I suspect that all of these 256K upgrades were based on Claus Buchholz’s original article in BYTE, “The Quarter-Meg Atari,” but modified to perform 16K bank switching to make it compatible with the 130XE. I should stress that these upgrades are not completely 130XE compatible. The 130XE has the ability to control whether the 6502 or Antic (or both) sees the extra RAM banked through locations $4000 through $7FFF. This permits, for example, a graphics screen to reside in the Atari’s normal memory between $4000 and $7FFF while a RAMDISK is in operation. The above mentioned 256K upgrades forgo this feature for the ability to bank in the additional 128K of memory. In most cases, the screen memory is above location $7FFF and there is no problem. But programs that place graphics data between locations $4000 and $7FFF will not work properly. Similarly, some 800 or 800XL programs that utilize this memory area for graphics will not work properly unless the additional RAM is disabled (i.e. not using a RAMDISK).

For those of you have read Claus Bucholz’s article in BYTE and are comfortable with soldering or have a friend who will help you out (an Atari users group member, for example) Claus has prepared a special treat for us: A modification to his original article that uses 16K bank switching like the 130XE. It is 130XE compatible except as mentioned earlier. Claus writes:

“The procedure for this upgrade is basically the same as in the article except for the following points: If your Antic (U7) part number is CO21697, use the circuit of the figure [Figure 1], excluding the area inside the dotted lines. If it is CO12296, include the circuit inside the dotted lines. The circuit requires five connects to the PIA (U23). So, pins 12 through 16 must be bent up and connected to the circuit. The rest of the procedure is the same. Notice that this circuit has one more chip than the article’s circuit. This is the price of compatibility.

“With the 256K dynamic RAMs in your XL, be sure to wait at least ten seconds after turning the computer off. Otherwise it may not coldstart properly when you turn it back on. My original RAMdisk software doesn’t work with this new mod. You may download [the new version] from the Capital Hill Atari Owners’ Society BBS at 517-371-1106 or from the Castle Communications board at 517-371-4234. The source file is called QMEGXLD.SRC for Quarter-MEG XL Double. Also available is a RAMdisk program that sets up one single-density RAMdisk and leaves the XE-equivalent banks free for XE software. This is quite useful with BASIC XE, DOS 2.5, or the new Synapse software. Its name is QMEGXLS.SRC.

“I ask one thing in return for this information: Please pass it around to all your interested friends. Put it in your club’s library or on your favorite BBS. Encouraging software support of 256K will result in many interesting uses for it. Thank you and enjoy — Claus Buchholz.”

We owe a thousand thanks to Claus Buchholz and the C.H.A.O.S. users group of Lansing, Michigan. Figure 1 shows the parts list, the memory control register, and the schematic diagram.

Other upgrades: Inspired by Claus Buchholz’s article, David G. Byrd (1513 Commanche Drive, Las Vegas, NV 89109) has written a public domain article, “The Atari 800-Plus 256K,” which gives 288K total memory for the Atari 800.

Tiny Tek (Rt. 1, Box 795, Quinlan, TX 75474) still offers its 48/52K upgrade for the Atari 400. “Sandy” Sandberg of Azure Electronics (1020 Price St. “E,” Pismo Beach, CA 93449) writes of the Tiny Tek board “I have been installing these boards for customers for several years. Please inform your readers of this memory replacement board which makes the 400 actually have a larger memory than the 800 (unexpanded) due to the hidden 4K at $C000 to $CFFF.

In response to Robert Harren’s question on interfacing his Atari to a shortwave communications receiver (in the January 1986 “Atari Help”) Bob Allman and Patrick Campbell wrote to recommend an article published in the November 1985 issue of ANTIC, “Morse Code Receiver by Steve Stuntz.” Bob also suggests a look at the December 1985 issue of 73 for Radio Amateurs, which published another one-chip tone detector circuit for facsimile transmissions.

My thanks to all readers who wrote in to Help including R.J. Allman of M.A.S.H. (Millington, TN), Patrick Campbell (Birmingham, AL), Dan Garrett of Garrett Computing (Slidell, LA) Thomas Harker of ICD (Rockford, IL), John Kirkpatrick of Caledonia Enterprises (Sumter, SC), Dick Litchfield of STATUS (Virginia Beach, VA), S.D. Martin (Washington D.C.), Newell Industries (Wylie, TX), “Sandy” Sandberg (Pismo Beach, CA), and Jeffrey R. Wilson of SSI Software (Orem, UT).

PARTS LIST 

8  41256  256K-bit dynamic RAM (200ns or less) 
1 74LS1S3 Dual 4-to-1 multiplexer 
1 74LS139 Dual 2-to-4 decoder 
1    -    33 ohm, 1/4 watt resistor 

ADDITIONAL PARTS FOR ANTIC CO12296 

1 74LS158 Quad inverting 2-to-1 Multiplexer 
1 74LS393 Dual 4-bit counter 

DEFINITION OF MEMORY CONTROL REGISTER AT $D301 (54017 DECIMAL)

XL MOD 

bit: 7 6 5 4 3 2 1 0 
     D a b E c d B R 

D=0 enables diagnostic ROM 
B=0 enables BASIC ROM 
R=1 enables OS ROM 
E=0 enables extended RAM 
abcd is 4-bit extended RAM bank # 
    - ranges from 4 to 15 
    - banks 12 to 15 are equivalent 
    to XE's banks 0 to 3 

130XE 

bit: 7 6 3 4 3 2 1 0 
     D   V C x y B R 

D=0 enables diagnostic ROM 
B=0 enables BASIC ROM 
R=1 enables OS ROM 
V=0 enables extended RAM for video 
C=0 enables extended RAM for CPU 
xy is 2-bit extended RAM bank # 
    - ranges from 0 to 3 

Q. Thanks for a great column in Computer Shopper. I have several questions about the 800XL:

1) I cannot get the MicroProse Solo Flight to load. The program will go as far as the title screen and freeze up. I’ve tried every combination of switch (down, up, same time) I can think of. That Atari Translator doesn’t do anything either.

2) I have a MicroPeripheral Corp. modem. The problem is I cannot locate any software that will access this modem. The only software that works is the one that came with it that I typed in. I have tried Amodem, HomeTerm, etc. and they all give me a modem error.

3) Last question: Is the keypad program for 11/85 for the external keypad that connects to the joystick ports?

H. Wayne Shiver
Powder Springs, GA

A. We didn’t have any trouble loading Solo Flight on our 800XL. You should only need to hold down the OPTION key while you turn on your computer (with the diskette in the disk drive). The translator disk is not needed. If you continue to have problems, it could be your diskette. Contact MicroProse for a replacement (10616 Beaver Dam Road, Hunt Valley, MD 21030, 301-667-1151).

Regarding your question about software for the MPP modem series, several programs that support this modem are in the public domain. These include MSCOPE MPP, which lets you download from CompuServe, VT100 Terminal Emulator, which features an 80-column, DEC-compatible display, and HomePak Customizer Disk which includes a special handler for the MPP modem. Your local users group may have these programs available, or a friend can download them for you from an Atari BBS. ANTIC (524 Second St., San Francisco, CA 94107) also offers these on diskette for $10.00 per program.

November’s Keypad program is indeed for the Atari CX85 keypad that plugs into the joystick ports. I have more information on this keypad planned for future months.


Q. The joystick ports on the XL are able to supply a +5vdc switched output to an external device. I remember reading this at some time, but do not remember the details; and whatever the publication, it is now long gone. Would you know how to control this output?

A. David Alan Hayes’ article, “Control Your Environment with the Atari 400/800,” (BYTE, July 1983) is exactly what you are looking for, and I have recommended this well-written article in the past. You can probably find it in your local library. David discusses using the four joystick ports on the Atari 400 or 800, but what is said also applies to the two joystick ports on the XL/XE units. (Incidentally, the XL and XE machines use the other two ports internally to control the switching in and out of RAM and ROM, and to specify the memory banks on the 130XE.)

Address Atari-related questions to:

Jeff Brenner “Atari Help”
c/o Computer Shopper
P.O. Box F
Titusville, FL 32781-9990
COMPUTER SHOPPER / APRIL 1986 / PAGE 45 

Applying The Atari

by Jeff Brenner

Still puzzled over how March’s PixMix program works? This month we’ll take a look at the machine language routines essential to this programs operation. Well also enter a program that gives us a disk-based BASIC language (and fixes up Atari’s Revision B BASIC to boot!). And, for all you CX-85 numeric keypad fans, this month’s column presents a special keypad driver that lets you use the keypad with some commercial software.

Did You Say 1040ST?

The Atari 1040ST should be in stores by the time you read this. Reaping the benefits of falling RAM chip prices, the 1040ST is an Atari 520ST-compatible computer with 1 megabyte (a megabyte is a million bytes) of memory, standard. The big news is, of course, the price: $999 suggested retail, which includes a monochrome monitor and an internal disk drive.

The 1040ST is essentially a 520ST with an additional 512K RAM. 520ST owners can get equivalent power by getting any of the 512K upgrades that are available (see article in this months Computer Shopper.) A few design changes have been made in the 1040ST: The case is deeper, since the disk drive and power supplies are internal. The internal disk drive is double-sided, and an RF modulator is built-in (for using the ST with a standard color television). Additionally, the operating system (TOS) has been completed and (hopefully) fully debugged and is now in ROM. This eliminates much of the boot-up waiting time, since TOS no longer needs to be loaded from disk. The newer 520ST models now contain TOS in ROM also. (Incidentally, the TOS ROM chips are currently being installed at Atari service centers for 520ST owners who presently boot TOS from disks.)

The 1040ST may prove to be the most serious threat to the Apple Macintosh yet. The standard 1M RAM (say goodbye to Ks) combined with a hard disk (to be released soon at under $700) gives this machine enormous potential for serious business applications. Atari may have still even greater plans for reaching the upscale markets; sources say Atari is investigating the user of National Semiconductor’s 32-bit “superchip,” the 32332, in a personal computer.

Reader Mail

Dear Jeff,

In the January 1985 column you had a short disk directory program that I’ve relied on ever since it was published. I put it on all my disks along with an AUTORUN.SYS command that boots the directory program. Eventually I was having trouble on a couple of my disks, because they contained as many as 20 or more short utility files. When the directory program booted and ran on power up, it displayed all the files, but the first few scrolled off the screen (I had to be quick to read them).

To solve this problem, I made a few small changes in your original directory program. Now when the program is booted on power up, or run from BASIC, it displays the disk files in two columns, instead of just on the left hand side of the screen. After it has listed the file names and free sectors, the program asks “RUN AGAIN (Y/N)?” If you press the “Y” key and hit RETURN, the program will prompt you to insert the disk (use only drive one) and press RETURN. When you do this, the screen clears and the program reruns, displaying you files in a double column.

If you answer the “RUN AGAIN” prompt with the “N” key and RETURN, the program erases itself from memory and leaves the file directory on the screen. I find this especially handy as a boot-up program, because it leaves me a list of disk files in plain view to reference when I type in my LOAD, ENTER or RUN command.

Keep up the great work and I hope this program will be of help to your other readers.

Nicholas J. Worth
Heber, AZ

A. I’m sure many readers will appreciate your modification. A holographic sticker is on its way to you for your contribution.

Those readers who want the directory program to RUN when a disk is booted, use the SETUP.COM utility on DOS 2.5 to automatically run a BASIC program utility. See Program 1. Next month I’ll print a short listing that creates this AUTORUN.SYS file.


Dear Jeff,

One thing I do about Computer Shopper’s microprint listings is to enlarge them to legible size on an enlarging photocopier (lots of them around.) This also works well for visually impaired folks, by successively copying the enlargement to a size they can read.

Paul Sentner
Pittsburgh, PA

A. Great idea! thanks for sharing it.


Dear Jeff,

We’ve developed a design for business software that differs from traditional designs in two ways. First, it meets a list of objections we compiled from a survey of operators of small businesses who had investigated computers but were not presently using one. Secondly, because we eliminated many features which were of no value to this group, all design specs are increased dramatically — application speed, functions, flexibility, friendliness, and especially capabity, We developed the design to sell to software developers and manufacturers. Because of its low cost, availability, and to prove the design would work on any system, we chose the 64K Atari w/1050 drive for our demo system. A byproduct of all this is that we have a program for Atari computers which accomplishes the design goals mentioned. I enclose a booklet documenting the comparative advantages of the MICROMOD program for a user seeking utility from a file manager/word processor. There are not enough of these customers using Ataris to make mass marketing feasible, but we’d like to make it available to those who are.

Steve Boduc
MicroMiser Software
Orlando, FL

A. I’m mentioning your product because of the relative scarcity of true business-dedicated programs available for the Atari. Readers should be aware that MicroMiser calls MICROMOD an Integrated Modular Business System that is not suitable for the hobbyist (as is HomePak and SynFile), but rather for business persons “seeking utility only.” While the specs that MicroMiser sent me look good, I have not seen the actual program in use and thus cannot give an evaluation of its performance. The price is $39.95. Those wanting more information should write to MicroMiser Software, 1635-A Holden Ave., Orlando, FL 32809.

Newsletters

A well designed newsletter was in the mail this month from H.A.C.E., the Houston Atari Computer Enthusiasts (P.O. Box 562, Katy, TX 77492, BBS: 713-644-6400). If your users group publishes a newsletter, send it in and let me know if you participate in a newsletter exchange program. In this way, your group will be able to swap newsletters with other groups reading this column. It’s truly interesting to see the Atari newsletters of groups from other parts of the country, Canada and beyond, and I highly recommend that users’ groups participate in a newsletter exchange.

Prizes

Cartridge games from Epyx and Sega are being sent to Ricky Freeman, for his Joystick Tester published in the March 1985 issue, and to David Garvin, for his printer utilities published in the December 1985 issue. More prizes will be given away for the best contributions of 1986, and hopefully I’ll have even more room this year to print readers’ contributions.

For April I have a copy of WSI’s 360-page Atari XL User’s Handbook ($15.95, Weber Systems Incorporated, 8437 Mayfield Road, Cleveland, OH 44026) just waiting to be given away to a lucky reader in our first random (as in RND(0)) drawing. Anyone who writes with a question, comments, contribution, order, etc. before 4/31/86 will automatically be entered in the drawing, or you can simply send me a postcard with your name and address.

New Products

Still looking for a modem? Atari’s new XM301, might be just the answer. The XM301 is an auto-dial, auto-answer, 300-baud modem that connects directly to the serial port (or daisy chains with the disk drive) and requires no interface. Included is XE-Term, an excellently designed communications program that supports the 130XE’s additional memory. At $49.95 suggested retail, XM301/XE-Term package is a great buy. Contact: Atari Corp., 1196 Borregas Ave., Sunnyvale, CA 94086.

Your Atari 400/800/XL/XE can be just like its big brother ST with a mouse from Zobian Controls. Actually, it’s called the “RAT” and includes a mouse-controlled drawing program and a routine that lets your “RAT” move your cursor. A booklet shows you how to use the mouse in your own BASIC programs, but be advised that it won’t work with commercial software not designed specifically for it. The “RAT” is about $100. Contact: Zobian Controls, P.O. Box 6406, Wyomissing, PA 19610.

Atari Writer Plus Is Here

Has PaperClip met its match? Months after Atari’s press announcement of AtariWriter Plus, I’ve finally had a chance to try out the new word processor, and my initial impressions are highly positive. AtariWriter Plus has all the features that made the original AtariWriter popular, plus a lot more: word alphabetization and counting, double column printing (on any printer), “insert” and “typeover” modes, the ability to write a customized printer driver fot virtually any printer, an 80-column editor (expandable up to 249 columns), a mail merge, and a 36,000-word spelling checker on a separate diskette. A 130XE version of AtariWriter Plus is included on the reverse side of the main diskette. The two-diskette package is supported by a 66-page manual. Look for a formal review in an upcoming Computer Shopper issue. Contact: Atari Corp., 1196 Boregas Ave., Sunnyvale, CA 94086.

PixMix — How It Works

Last month’s feature program, the PixMix Puzzle Machine, was built around five machine language routines that enable the program to function quickly and effectively. The assembly listings of these routines are being listed this month for those of you who wish to study them, or to incorporate them into your own programs.

When PixMix loads the digitized watch picture (or any screen) from disk or cassette, it stores the data in a string (SCR$), rather than directly in screen memory. This allows the program to have continuous access to the original picture data, regardless of what is done to the picture on the screen (i.e. scrambling). Once the data is loaded into the string, the “STRING TO SCREEN” routine is used to transfer the data to the screen. leaving the contents of the string intact. See Program 2.

The “GET SCREEN PIECE” and “PUT SCREEN PIECE” routines allow high-speed manipulation of the graphics screen. The “GET” routine picks up a 64 by 32 pixel area and stores it in P$. Conversely, the “PUT” routine transfers this area from P$ to a specified section of the screen. The two routines together allow PixMix to “mix up the pieces” of the screen, and enable you to pick up screen pieces and move them around with your joystick. See Programs 3 and 4.

Pressing the space bar while solving a puzzle lets you see how the completed puzzle should look. This feature involves the “STRING/SCREEN SWAP” routine. Essentially, this routine simply exchanges the data saved in SCR$ (the original screen image) with the scrambled image on the screen. When the space bar is released, the swap routine is called again, bringing the scrambled image back to screen, and the completed puzzle image back to SCR$. See Program 5.

When you solve the puzzle and press the START key, how does PixMix know you’ve solved the puzzle correctly? Once again the program refers to the original image data stored in SCR$, but this time through the “STRING/SCREEN COMPARE” routine. If the screen contents and the string data do not match, the puzzle has not been solved and location 208 ($D0) is set to one to flag this to the BASIC program. PixMix then generates its ominous, disapproving hum. On the other hand, if the screen does match the string, the flag is left at zero and the congratulatory tune is played by the BASIC program. See Program 6.

These five routines are the vital organs of PixMix. BASIC serves as glue to hold it all together. PixMix serves as a good example of the power and flexibility of the BASIC/machine language combination.

Operating System Keypad Driver

Ever since the CX-85 keypad drivers for BASIC programming were published in the July and August 1985 issues, I’ve been inundated with requests for drivers to work with just about every commercial software product imaginable. Unfortunately, finding a place in memory for the keypad driver is not easy; each commercial program would have to be looked at as an individual case. But XL and 130XE owners will be happy to know that the extra RAM in your machines (“underneath” the OS ROM”) is the ideal place for such a keypad driver. This is precisely where we install this month’s keypad driver.

Type in the “CX-85 Driver Creator” using Program Perfect and SAVE the program to diskette. If you’re not using Program Perfect, recheck your typing several times, since one small mistake in the data statements can blow the whole program. See Program 7.

Now place a formatted diskette (containing DOS files) into the drive and RUN the program. You’ll be instructed to press the START key to write an AUTORUN.SYS file — when you’re ready, press it.

When the “COMPLETED” message is printed, you’re finished. You now have keypad driver that takes up none of your Atari’s normal memory and will work with some commercial software.

Using The New Driver

The best way to test out the new driver is by booting up a BASIC disk. Turn off your computer and insert the keypad driver diskette into the disk drive. Now turn on the computer. If everything is O.K. you’ll soon get an “INSERT PROGRAM DISKETTE AND PRESS SELECT” prompt. Replace the keypad driver with a regular BASIC diskette and press SELECT. The computer will reboot, and when finished, your Atari will work normally with one exception: It will now respond to a CX-85 keypad plugged into joystick port 2. Joystick port 2 was chosen instead of port 1 since many readers wrote that they like to keep a joystick, plugged into port 1.

Using Commercial Software

To use the keypad with a commercial product, boot up the keypad driver diskette as described before and remove the diskette. Now place the program you want to load into the drive. If BASIC must be disabled, then hold the OPTION key down while you press SELECT. Otherwise, just press SELECT. The Atari will simulate being turned off and then on and the program should load.

In most instances, you should be able to use the keypad with a commercial software product, but there are exceptions — namely, some heavily protected software and programs that read the Atari’s keyboard register directly, bypassing location 764. In these cases, the program will either not run, or will not respond to the keypad.

I’m asking readers who try this keypad driver with commercial programs to please write and let me know which of your programs are compatible with the driver and which aren’t (you could even jot the names down on the postcard if you’re entering our drawing!) I’ll report the findings in a future column.

How It Works

When the keypad driver is loaded into an XL or XE, it transfers the Atari’s ROM operating system (OS) into the RAM that lies underneath it. Next, the actual keypad decoding routine is loaded into the Atari’s international character set memory at $CC00 to $CCD3. The Atari’s actual vertical blank interrupt routine is then rerouted to execute the keypad routine. This is the beauty of having a RAM OS — we can add extensions to the actual Atari OS without having to worry about vectors that might be utilized or changed by the next program loaded in. None of the application RAM is used, and thus the keypad driver is transparent to most programs.

The next step is to display the introductory message on the screen and wait for the SELECT key to be pressed. When it’s pressed, a jump is made to the Atari’s cold start vector (COLDSV, $E477) so that the next diskette can be booted. Necessary portions of the OS are changed before jumping to COLDSV to prevent the ROM OS from being reenabled and to prevent the COLDSV routine from clearing the RAM OS when the rest of the memory is zeroed.

Next Month

We’ll take a look at the assembly listing for the keypad routine, plus we’ll enter a personal budget program, designed in response to readers’ requests.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

A diskette of the programs listed in this months column is available from the author for $7.00, postpaid. Please make checks payable to “Jeff Brenner” and specify your disk drive model.

Program Perfect” is a utility used to check for typing errors while entering programs from this column. Readers may send $5.00 for a diskette or a SASE for a listing of this program. Address all correspondence to:

Jeff Brenner
“Applying The Atari 4/86”
c/o Computer Shopper
PO Box F Titusville, FL 32781-9990
Improved Directory Program 

1 REM DIRECTORY PROGRAM MOD. BY N. WORTH 
2 DIM FILE$(17),R$(1) 
3 OPEN #1,6,0,"D:*.*" 
4 INPUT #1,FILE$ 
5 PRINT FILE$;CHR$(32);CHR$(32); 
6 IF FILE$(5,8)="FREE" THEN 8 
7 GOTO 4 
8 CLOSE #1 
9 ? :? :? "RUN AGAIN (Y/N):INPUT R$ 
10 IF R$="Y" THEN ? :? "INSERT DISK AND PRESS RETURN";:INPUT 
11 IF R$="N" THEN ? CHR$(125):NEW 
12 GOTO 3 

PROGRAM 1 
STRING TO SCREEN ROUTINE 

10  *=$600 ; RELOCATABLE 
20 ; STRING TO GR.8 SCREEN 
30 ; (C)1986 JEFF BRENNER 
40 ; FORM: A=USR(ADR(STS$),ADR(A$)) 
50  PLA 
60  PLA 
70  STA $CD  ; SAVE STRING ADR 
80  PLA 
90  STA $CC 
0100  LDA 88 
O110  STA $CE ; SAVE SCREEN ADR 
0120  LDA 89 
0130  STA $CF 
0140  LDX #192  ; 192 LINES 
0150 LOOP2 LDY #39 ; 40 BYTES/LINE 
0160 LOOP LDA ($CC),Y 
0170  STA (4CE),Y 
0180  DEY 
0190  BPL LOOP 
0200  CLC 
0210  LDA $CC 
0220  ADC #40 
0230  STA $CC 
0240  LDA $CD 
0250  ADC #0 
0260  STA $CD 
0270  CLC 
0280  LDA $CE 
0290  ADC #40 
0300  STA $CE 
0310  LDA $CF 
0320  ADC #0 
0330  STA $CF 
0340  DEX 
0350  BNE LOOP2 
0360  RTS 
0370  .END 

PROGRAM 2 
GET SCREEN PIECE ROUTINE 

10  *=$600 ; RELOCATABLE 
20 ; GET BLOCK ROUTINE 
30 ; (c)1986 JEFF BRENNER 
40 ; TRANSFER SECTION OF GR.8 SCREEN TO STRING 
50 ; (FOR 8 BYTE BY 32 LINE SECTION) 
60 ; FORM A=USR(GET,ADR(P$),SCREEN) 
70 ; DIM P$(320), P$ STORES DATA 
80 ; SCREEN=SCREEN LOC. TO START GET 
90  PLA 
0100  PLA 
0110  STA $CD  ; SAVE STRING ADR 
0120  PLA 
0130  STA $CC 
0140  PLA 
0150  STA $CF  ; SAVE SCREEN ADR 
0160  PLA 
0170  STA $CE 
0180  LDX #32 
0190  LDX #32  ; VERTICAL BYTES (LINES) FOR PIECE 
0190 AGAIN LDY #7  ; * HORIZ BYTES FOR PIECE-1 
0200 LOOP1 LDA ($CE),Y ; GET BYTE FROM SCREEN 
0210  STA ($CC),Y ; STORE IN STRING 
0220  LDA #0 
0230  STA ($CE),Y ; ERASE BYTE OF SCREEN 
0240  DEY 
0250  BPL LOOP1 
0260  CLC 
0270  LDA $CE 
0280  ADC #40     ; NEXT SCREEN LINE 
0290  STA $CE 
0300  LDA $CF 
0310  ADC #0 
0320  STA $CF 
0330  LDA $CC 
0340  ADC #8      ; * HORIZ BYTES PER PIECE 
0350  STA $CC 
0360  LDA $CD 
0370  ADC #0 
0380  STA $CD 
0390  DEX 
0400  BNE AGAIN 
0410  RTS 
0420  .END 

PROGRAM 3 
PUT SCREEN PIECE ROUTINE 

10  *= $600 ; RELOCATABLE 
20 ; PUT BLOCK ROUTINE 
30 ; (c) 1986 JEFF BROWNER 
40 ; TRANSFER STRING TO SECTION OF GR.8 SCREEN 
50 ; (8 BYTE BY 32 LINE SECTION) 
60 ; FORM A=USR(PUT,ADR(P$),SCREEN) 
70 ; DIM P$(320), P$ STORES DATA 
80 ; SCREEN=SCREEN LOC. TO START PUT 
90  PLA 
0100  PLA 
0110  STA $CD  ; SAVE STRING ADR 
0120  PLA 
0130  STA $CC 
0140  PLA 
0150  STA $CF  ; SAVE SCREEN ADR 
0160  PLA 
0170  STA $CE 
0180  LDX #32  ; VERTICAL BYTES (LINES) FOR PIECE 
0190 AGAIN LDY #7  ; * HORIZONTAL BYTES FOR PIECE-1 
0200 LOOP1 LDA ($CC),Y 
0210  STA ($CE),Y 
0220  DEY 
0230  BPL LOOP1 
0240  CLC 
0250  LDA $CE 
0260  ADC #40   ; NEXT SCREEN LINE 
0270  STA $CE 
0280  LDA $CF 
0290  ADC #0 
0300  STA $CF 
0310  LDA $CC 
0320  ADC #8    ; * HORIZONTAL BYTES FOR PIECE 
0330  STA $CC 
0340  LDA $CD 
0350  ADC #0 
0360  STA $CD 
0370  DEX 
0380  BNE AGAIN 
0390  RTS 
0400 .END 

PROGRAM 4 
STRING/SCREEN SWAP ROUTINE 

10  *=$600 ; RELOCATABLE 
20 ; STRING/SCREEN SWAP 
30 ; SWAPS 7680 BYTES OF STRING W/GR.8 SCREEN 
40 ; FORM: A=USR(ADR(SWAP$),ADR(A$)) 
50 ; WHERE SWAP$ IS THIS ROUTINE 
55 ; AND A$ IS STRING TO SWAP 
60  PLA 
70  PLA 
80  STA $CD  ; SAVE STRING ADR 
90  PLA 
0100  STA $CC 
0110  LDA 88 
0120  STA $CE ; SAVE SCREEN ADR 
0130  LDA 89 
0140  STA #CF 
0130  LDX #192 ; 192 LINES 
0160 LOOP2 LDY 439 ; 40 BYTES/LINE 
0170 LOOP LDA ($CC),Y ; GET BYTE OF STRING 
0180  PHA          ; SAVE IT 
0190  LDA ($CE),Y  ; GET BYTE OF SCREEN DATA 
0200  STA ($CC),Y  ; STORE IN STRING 
0210  PLA          ; RETRIEVE STRING BYTE 
0220  STA ($CE),Y  ; STORE IN SCREEN MEM 
0230  DEY 
0240  BPL LOOP 
0230  CLC 
0260  LDA $CC 
0270  ADC #40  ; NEXT STRING "LINE" 
0280  STA $CC 
0290  LDA $CD 
0300  ADC #0 
0310  STA $CD 
0320  CLC 
0330  LDA $CE  
0340  ADC #40  ; NEXT SCREEN LINE 
0330  STA $CE 
0360  LDA $CF 
0370  ADC 40 
0380  STA $CF 
0390  DEX 
0400  BNE LOOP2 
0410  RTS 
0420  .END 

PROGRAM 5 
STRING/SCREEN COMPARE ROUTINE 

10  *=$600 ; RELOCATABLE 
20 ; COMPARE STRING W/GR.8 SCREEN 
30 ; (C)1986 JEFF BRENNER 
40 ; FORM: A=USR(ADR(SSC$)),ADR(A$)) 
50 ; WHERE SSC$ IS THIS ROUTINE 
60 ; AND A$ IS STRING TO COMPARE 
70 ; RESULTS IF PEEK(208)>0, NO MATCH 
80  PLA 
90  PLA 
0100  STA $C0 
0110  PLA 
0120  STA $CC 
0130  LDA 40 
0140  STA 400 ; CLEAR 400 
0150  LDA 88 
0160  STA $CE ; SAVE SCREEN ADR 
0170  LDA 89 
0180  STA $CF 
0190  LDX #192 ; 192 LINES 
0200 LOOP2 LDY #39  ; 40 BYTES/LINE 
0210 LOOP LDA($CC),Y;GET STRING VALUE 
0220  CMP ($CE),Y;COMP. W/SCREEN VALUE 
0230  BNE END ; IF NOT EQUAL, END 
0240  DEY 
0250  BPL LOOP 
0260  CLC 
0270  LDA 4CC 
0280  ADC #40 ; NEXT STRING "LINE" 
0290  STA $CC 
0300  LDA $CD 
0310  ADC #0 
0320  STA $CD 
0330  CLC 
0340  LDA $CE 
0350  ADC #40 ; NEXT SCREEN LINE 
0360  STA $CE 
0370  LDA $CF 
0380  ADC #0 
0390  STA $CF 
0400  DEX 
0410  BNE LOOP2 
0420  RTS 
0430 END INC $D0 ; SET $D0 TO 1 
0440  RTS 
0450  .END 

PROGRAM 6 
CX-85 DRIVER CREATOR 

HTJ 10 REM CX-85 NUMERIC KEYPAD DRIVER CREATOR 
KGJ 20 REM COPYRIGHT 1986 JEFF BRENNER 
TPJ 30 PRINT CHR$(129);"INSERT FORMATTED DISKETTE INTO DRIVE" 
PNJ 40 PRINT (PRINT "PRESS <START> TO NRITE AUTORUN FILE." 
LQJ 50 IF PEEK(53279)<>6 THEN 90 
FAJ 60 PRINT "CREATING AUTORUN.SYS...":OPEN #3,8,0,"D:AUTORUN.SYS" 
TFJ 70 FOR I=1 TO 402:READ N:PUT #3,N:NEXT I 
YOJ 80 CLOSE #3 
MUJ 90 PRINT "COMPLETED.":END 
QAJ 100 DATA 299,299,0,6,167,6,120,169,0,141,14,212 
RKJ 110 DATA 174,1,211,160,0,189,0,192,206,1,211,193 
TOJ 120 DATA 0,192,142,1,211,200,208,241,238,13,6,238 
UHJ 130 DATA 19,6,173,13,6,240,14,201,208,208,226,169 
RUJ 140 DATA 216,141,13,6,141,19,6,208,216,206,1,211 
SFJ 150 DATA 88,96,169,0,141,14,212,162,9,141,10,212 
DRJ 160 DATA 202,208,253,169,76,141,138,194,169,0,141,139 
JTJ 170 DATA 194,169,204,141,140,194,169,146,141,133,196,169 
YTJ 180 DATA 6,141,134,196,160,9,189,89,204,153,220,194 
EDJ 190 DATA 136,16,247,160,26,189,94,204,193,169,196,136 
BHJ 200 DATA 16,247,169,64,141,14,212,160,79,189,132,204 
UUJ 210 DATA 56,233,32,9,128,149,88,136,16,243,173,31 
WGJ 220 DATA 208,41,2,208,249,76,119,228,173,1,211,141 
DJJ 230 DATA 235,207,32,218,196,169,254,141,1,211,173,255 
ICJ 240 DATA 207,141,1,211,96,0,226,2,227,2,0,6 
DJJ 230 DATA 224,2,229,2,36,6,0,204,211,204,174,17 
ICJ 260 DATA 208,240,6,202,142,82,204,240,47,174,121,2 
WVJ 270 DATA 236,84,204,208,9,173,82,204,208,34,173,83 
XYJ 280 DATA 204,240,5,206,83,204,240,24,238,82,204,142 
RYJ 290 DATA 84,204,238,83,204,173,3,210,201,1,240,2 
AXJ 300 DATA 162,16,189,64,204,141,232,2,104,168,104,170 
MTJ 310 DATA 104,64,32,24,29,27,35,51,53,48,43,31 
IDJ 320 DATA 30,26,90,34,12,14,28,135,0,0,0,169 
QHJ 330 DATA 4,133,1,169,0,76,121,204,169,160,133,6 
TQJ 340 DATA 173,0,160,73,233,141,0,160,205,0,160,208 
SZJ 350 DATA 9,73,255,141,0,160,169,192,133,6,96,160 
MZJ 360 DATA 0,153,0,6,200,208,250,76,3,195,67,88 
MNJ 370 DATA 45,56,53,32,75,69,89,80,65,68,32,68 
LYJ 380 DATA 82,73,86,69,82,32,45,32,40,67,41,49 
MQJ 390 DATA 37,56,54,32,74,46,32,66,82,69,78,78 
MPJ 400 DATA 69,82,73,7B,83,69,82,84,32,80,82,79 
MNJ 410 DATA 71,62,65,77,32,68,73,83,75,69,84,84 
MFJ 420 DATA 69,32,63,78,68,32,80,82,69,83,83,32 
DUZ 430 DATA 83,69,76,69,67,84 

PROGRAM 7 
COMPUTER SHOPPER / APRIL 1986 / PAGE 46 

Atari Help

by Jeff Brenner

In last month’s “Atari Help” column, I listed several manufacturers of memory expansion products for the 800XL. I inadvertently omitted Newell Industries (600 E. Hwy. 78, #602, Wylie, TX 75098). Newell also produces a 256K upgrade for the 800XL ($99.95 complete, or $49.95 without RAM chips). In addition to those readers credited in last month’s column for contributing information on the memory expansion topic, let me also thank Danny L. Becker (APO NY) and Karel C. Sysala (Los Angeles, CA), whose letters arrived too late to be included in that issue.

XL “Video Smears”

Q. I write in response to the letter in “Atari Help” from Robert Davis of Yorba Linda, California, printed in the December 1985 Computer Shopper.

I am having the same trouble using a monitor with my Atari 800XL: namely, a “video smear” such that characters appear blurred. I switched monitors; same effect. Monitor works beautifully on a friend’s Apple. Switched cables; no improvement.

Is this an inherent defect in the 800XL series, then? I was able to try a new 130XE and found that characters are much sharper, I was planning to add Omniview to my XL, but am no longer interested: things are bad enough with 40 columns.

I’d appreciate other readers’ experiences.

Alan McPherron
Pittsburgh, PA

A. Several readers have commented about an apparent blurred Atari 800XL image and in the past I have suggested checking cables, switching monitors, etc. But I am beginning to suspect that the 800XL itself may be at fault. (Apparently, some 800XLs, 1200XLs and 600XLs suffer from the blurred image, but not the 130XE). One theory is that a pixel shift, introduced by the earlier GTIA chip, is responsible for the blurred image. Or had Atari used inferior components in its financially troubled days? An Atari spokesperson said she did not know of any problem. Hopefully we’ll hear from other readers on this topic.

Data Files

Q. In experimenting with the DOS files, I tried making a complete record with several strings. What I mean is linking strings together to make one long string: Ex. LET REC$(1,20)=NAME$, LET ADDR$=REC$(21,40), etc. This seemed to have worked but I got garbage in the blanks. I tried filling the string with blanks before filling it and it still didn’t work. How do I accomplish one record from several prompts, and is there a way to view the records in a data file? I’ve worked with FMS on Data General and we could view the records in the file to verify them.

David Bucci
N. Kingsville, OH

A. You should not get garbage (unwanted data) in the blanks if you properly cleared the main string before assigning the smaller strings to it. I assume that NAME$ and ADDR$ are obtained through normal screen input (i.e. INPUT ADDR$) and are not the source of the garbage. Here’s a simple and fast technique that takes advantage of the way Atari BASIC handles its string memory to clear the main string:

REC$=CHR$(32):REC$(MAX)=CHR$(32):REC$(2)=REC$ 
where MAX is the total number of characters that REC$ is dimensioned for. The entire string will be filled with character 32, the space character, and subsequent additions to the string will be surrounded by the blank spaces.

To view the records in a data file, you could have your main program read them from disk in the same way they were written (i.e. INPUT #2;TEMP$:PRINT TEMP$;). The maximum number of characters you should read in at one time from a diskette file should not exceed 128 characters. (While up to 256 bytes can be read at a time without an error, anything over 128 bytes will be stored in page 6 of memory, which might upset any machine language routines that you may have stored there.) The best way to do this is to write the main string to disk in chunks of 128 bytes at a time into a temporary string which you can transfer to the main string:

REC$(I,I+127)=TEMP$. 

Another way you can examine a data file is with DOS. Specify the COPY FILE option. When you’re asked “FROM, TO?” type the name of your data file, followed by a comma and an “E:” (i.e. DATAFILE,E:). This will transfer the diskette file to the screen editor.

For a good example of creating and using data file, take a look at the Mailing List listing in the June 1985 “Applying The Atari.”

Q. A friend has damaged his BASIC cartridge for an Atari 1200XL. Is there any way I can copy the BASIC from my 800XL to disk for him to use. My machine runs the “C” BASIC.

William R. Pew
Everett, WA

A. The program listed under the “DISK-BASED BASIC” heading will allow you to create a diskette which loads the actual BASIC language when booted. It can be used on any 8-bit Atari with a minimum of 48K RAM. (DISK-BASED BASIC will be included on this month’s “Applying The Atari” diskette). See Program 1.

Type in the program and save it to disk. Place a formatted diskette (containing DOS files) into the drive and run the program. When you press START, the program will write a special AUTORUN.SYS loader to your diskette, and will then save the code for the BASIC ROM in your machine. If you own revision B of Atari BASIC, the program will automatically convert the data into revision C, to eliminate the dreaded revision B bugs.

When it’s completed, turn off your computer. Now unplug your BASIC cartridge (or hold down the OPTION key on the 800XL/130XE) and turn the computer on again. The diskette will automatically load the BASIC language into your Atari’s RAM, and when the READY prompt appears, you have a RAM-based BASIC.

Once your BASIC is in RAM, you can have some fun with it. Experienced users can examine the memory in locations 40960 through 49151, find where the BASIC commands reside and change them to whatever is desired (the last character of each command must be an inverse video character — bit 7 set — and any replaced commands should be the same number of characters in length as the original command). Just be careful where you poke, since you can easily crash the BASIC or make it function improperly. When you run the “CHANGE THE READY PROMPT” program with your RAM-based BASIC, you can change the familiar “READY” prompt to your nickname, or whatever you want. See Program 2.

The “Disk-Based BASIC” loader has been specially designed to permit the SYSTEM RESET key to operate normally. Additionally, DOS 2 and DOS 2.5 users can specify the B. RUN CARTRIDGE option when in DOS and BASIC will be executed, despite the fact that no cartridge is in place!

For those interested in how the RAM BASIC is implemented, two difficulties had to be overcome to make it function properly. First, whenever the RESET key is pressed, a GRAPHICS 0 screen is set up at the top of free RAM. Normally, when the BASIC ROM is in place, the screen is set up directly below the BASIC ROM, at the top of RAM (in systems with 40K or more RAM). But when BASIC is in RAM, this screen is set upon top of part of our BASIC language itself! Unless the disturbed BASIC code is replaced, our BASIC routine is likely to crash.

To solve this problem, a special SYSTEM RESET handler was put into place which automatically replaces 1K of the damaged BASIC code. The result is 1K less of free BASIC RAM (MEMLO is reset upon initialization to provide the 1K of memory for our use) but we are able to use the RESET key normally.

The second difficulty involves DOS. When you call up DOS and choose the “RUN BASIC” option, DOS checks if a cartridge is installed and would normally respond “NO CARTRIDGE” is our RAM-based BASIC is there instead. To get around this, you could press the RESET key to return to BASIC, but if you’re using DOS 2 or DOS 2.5, you’ll be able to use the “RUN CARTRIDGE” option. An interrupt routine is set up that automatically modifies DOS 2 or DOS 2.5 when it is called up to trick it into believing a cartridge is in place.

The assembly listing of the BASIC loader will be listed here next month.

Requests

If you have been looking for a particular product that others may also be looking for, send me a letter.

Address Atari-related questions to: Jeff Brenner, “Atari Help”, c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

DISK-BASED BASIC 

YCJ 10 REM DISK-BASED BASIC INITIALIZATION 
KGJ 20 REM COPYRIGHT-1986 JEFF BRENNER 
RDJ 30 DIM BASIC$(8192),S$(33),CIO$(7):BASIC$(8192)=CHR$(0) 
KFJ 40 FOR I=1 TO 7:READ N:CIO$(I,I)=CHR$(N):NEXT I 
GXJ 30 FOR I=1 TO 33:READ N:S$(I,I)=CHR$(N):NEXT I 
QVJ 60 PRINT CHR$(123);"THIS PROGRAM CREATES AN AUTORUN.SYS" 
NXJ 70 PRINT "FILE ON THE DISK, ALONG WITH A FILE," 
XFJ 80 PRINT CHR$(34);"BASIC";CHR$(34);", WHICH CONTAINS THE BASIC" 
OEJ 90 PRINT "LANGUAGE.":PRINT :PRINT "INSERT BLANK FORMATTED DISK INTO DRIVE" 
XTJ 100 POKE 85,7:PRINT "PRESS <START> TO CREATE FILE" 
PCJ 110 IF PEEK(33279)<>6 THEN 110 
HJJ 120 PRINT :PRINT "CREATING AUTORUN.SYS..." 
THJ 130 CLOSE #1:OPEN #3,8,0,"D:AUTORUN.SYS" 
WRJ 140 RESTORE 240:FOR I=1 TO 309:READ N:PUT #3,N:NEXT I:CLOSE #3 
JGJ 150 A=USR(ADR(S$),ADR(BASIC$)):IF ASC(BASIC$(2272))=202 THEN GOSUB 300 
MUJ 160 POKE 881,0:OPEN #3,8,0,"D:BASIC":PRINT "SAVING BASIC..." 
RSJ 170 H=INT((ADR(BASIC$)-6)/256:L=ADR(BASIC$)-6-H*256:POKE 884,L:POKE 883,H 
GOJ 180 POKE 888,0:POKE 889,32:POKE 882,11:I=USR(ADR(CIO$),48) 
HQJ 190 CLOSE #3:PRINT "FINISHED.":END 
QYJ 200 DATA 104,104,104,170,76,86,228 
EEJ 210 DATA 104,104,133,203,104,133,204,169,0,133,206,169 
EMJ 220 DATA 160,133,207,160,0,177,206,143,204,200,208,249 
YOJ 230 DATA 230,203,230,207,166,207,224,192,208,239,96 
UPJ 240 DATA 233,233,213,5,233,6,163,12,141,108,6,163 
UGJ 230 DATA 13,141,109,6,169,107,133,12,169,6,133,13 
UHJ 260 DATA 162,0,142,68,2,232,134,9,169,160,133,106 
OLJ 270 DATA 32,173,6,78,197,2,160,3,140,114,3,200 
VZJ 280 DATA 140,122,3,169,220,141,116,3,169,6,141,117 
RIJ 290 DATA 3,162,48,32,86,228,169,7,141,114,3,169 
VTJ 300 DATA 230,141,116,3,169,159,141,117,3,206,121,3 
UUJ 310 DATA 32,86,228,14,197,2,169,119,141,232,2,173 
NVJ 320 DATA 231,2,133,2,141,229,6,173,232,2,133,3 
TPJ 330 DATA 141,230,6,24,103,4,141,232,2,169,214,141 
WIJ 340 DATA 230;191,169,6,141,231,191,162,4,160,0,183 
OSJ 330 DATA 0,188,143,2,200,208,248,230,3,238,86,6 
URJ 360 DATA 202,208,240,169,1B8,141,86,6,208,44,32,0 
OEJ 370 DATA 0,169,160,133,106,32,173,6,32,200,6,24 
OAJ 380 DATA 103,4,141,232,2,162,4,160,0,177,2,133 
WGJ 390 DATA 0,188,200,208,248,230,3,238,134,6,202,208 
UMJ 400 DATA 240,169,188,141,134,6,173,34,2,141,234,6 
QOJ 410 DATA 173,33,2,141,293,6,162,6,160,231,169,6 
PHJ 420 DATA 32,92,228,76,0,160,169,3,141,98,3,169 
TTJ 430 DATA 228,141,100,3,169,6,141,101,3,169,12,141 
QYJ 440 DATA 106,3,162,32,76,86,228,173,229,6,133,2 
OBJ 430 DATA 141,231,2,173,230,6,133,3,96,32,200,6 
MRJ 460 DATA 76,80,6,68,38,66,63,83,73,67,133,83 
SUJ 470 DATA 0,0,173,249,38,201,233,208,3,206,249,38 
VGJ 480 DATA 208,10,173,89,39,201,233,208,3,206,89,39 
OQJ 490 DATA 76,0,0,224,2,223,2,213,3 
MZJ 300 PRINT "CONVERTING REV.B TO REV.C BASIC..." 
BRJ 310 BASIC$(2272)=CHR$(234):BASIC$(2273)=CHR$(240):BASIC$(2274)=CHR$(17) 
AQJ 320 BASIC$(2273)=CHR$(234):BASIC$(6934)=CHR$(0) 
DCZ 330 FOR J=8180 TO 8186:BASIC$(J)=CHR$(0):NEXT J:RETURN 

PROGRAM 1 
CHANGE THE READY PROMPT 

ELJ 10 REM CHANGE THE "READY" PROMPT 
RVJ 20 M=48304:IF PEEK(48498)=169 THEN M=48493 
YDJ 30 DIM A$(6) 
GAJ 40 PRINT "WHAT'S THE NEW PROMPT";:INPUT A$ 
NMJ 30 IF LEN(A$)>5 THEN PRINT "5 CHARACTERS MAXIMUM":GOTO 40 
UUJ 60 IF LEN(A$)<3 THEN FOR I=LEN(A$)+1 TO 5:A$(I,I)=CHR$(32):NEXT I 
CBJ 70 FOR I=1 TO 5:POKE M-I,ASC(A$(I,I)):NEXT I 
MAZ 80 PRINT "PROMPT HAS BEEN CHANGED!" 

PROGRAM 2 
COMPUTER SHOPPER / JUNE 1986 / PAGE 75 

Applying The Atari

by Jeff Brenner

This month’s feature program is BudgetMate, our longest “Applying The Atari” program ever. The program was designed specifically in response to requests (in some cases pleadings and threats) from readers for a home budget program. Well also take a look at some new products and reader mail.

New Products

In the March 1986 column we learned about all of the latest memory expansion products available for the Atari 800XL. For Atari 800 owners, Magna Systems announces the RAMCHARGER, a plug-in memory expansion board. While it’s not 130XE-compatible, it does offer full Axlon compatibility and gives the user up to 288K of memory for Synfile + and Syncalc. The popular MYDOS ramdisk software is included with the board. 256K, 512K and 1 megabyte versions are available for under $150, $200 and $300, respectively. Contact: Magna Systems, 147-05 Sandford Ave. Suite 4E, Flushing, NY 11355.

Datamost, Inc. is marketing a line of educational software called MindWare. Each package consists of two cassettes containing voice-tracks that sound through the television speaker and complement the visual display. Reading, Math, English, Science, Personal Skills and Business development are the topics available. They’re $24.95 per package. Contact DataMost, 21040 Nordhoff Street, Chatsworth, CA 91311.

Reader Mail

Dear Jeff,

Q. I plan to send at least 200 letters per week (for a mail order business). I want to keep all letters on file and correspondence (who did or did not correspond). I currently have: an Atari 800XL, 1050 Disk Drive, 1027 printer.

My questions: (1) Do you think I need another printer for more speed; if so, what would you recommend? (2) Is there a buffer for this printer or other printers which you recommend? (3) Can I still exchange DOS 3 for DOS 2.5?

Stuart G. Fowler
Anderson, South Carolina

A. The 1027 is an economical printer, but remember, it can only print 20 characters per second, so you can calculate how long it will take to print 200 letters per week. There are faster letter-quality printers available, but they are more costly, and you’ll need a printer interface. Near Letter Quality (NLQ) is somewhat faster and various printer models offer both NLQ and draft modes. The Gemini SG10, for example, is very cost-effective, and features near-letter quality in addition to its draft mode. The Epson LQ series is even faster and has nicer looking output, but again, this model is more costly. Thus it all depends on how much you’re willing to spend. Whatever you decide, you should visit a computer store before you buy and take a careful look at the print quality of each printer you are interested in to insure that you’re satisfied with the print quality.

A printer buffer will help free up computer time while printing, and this would be particularly practical if you needed to change or add to each letter between printings. If you’re buying an interface, you should certainly consider one with a built-in buffer. 16K, 32K, and 64K buffers are the most common sizes, and they vary in price according to memory size. The direct-connect 1027 cannot use the interface-buffer combination products since it does not require an interface.

To get DOS 2.5, send your DOS 3 disk to Atari Customer Relations, P.O. Box 61657, Sunnyvale, CA 94088.


Dear Jeff,

Q. Recently I learned through one of the local BBS’s a particular game could be modified by changing a couple of locations and the program would be enhanced to perform better. This is great...but how do you get into the locations? When the program is listed, all you get are the typical Atari arrow, hearts, squares, etc. How do you convert it to something that can be made sense of?

Gary Robinson
Cedar, Minnesota

A. Since you are not specific about what “locations” you were directed to change, it is difficult for me to determine what you need to do. What you can do is write me again describing specifically what you were told to change and I’ll help you personally. For other readers, I’ll briefly discuss a couple of techniques that are involved in changing various types of programs.

For a BASIC program (and I assume your program is in BASIC since you say you can list it), you should be told a particular line to change, or shown a group of characters to change on a specific line. A “location” can’t really tell you anything in a BASIC program; you need a line number. What a location can mean, though, is a memory location that you should POKE with a particular value. For example, you might be instructed to store a five in location 82, in which case you’d type POKE 82,5 before running a program. This particular poke would change the left-hand screen margin.

A machine language program presents an entirely different situation. In such a case you would generally need a disk utility to be able to change specified portions or bytes on a disk. For example, you might be told to alter a specific sector/byte location, or to change a series of values at a particular section/byte location. In both cases, a disk sector utility is necessary.


Dear Jeff,

Q. Your answer to H. Wayne Shiver in the Computer Shopper for March 1986 is not quite correct. Microperipheral modems were made by the Microperipheral Corporation in Redmond, Washington. In other words, “It ain’t MPP!”

A friend here has one of these and is having the same problems finding programs to work with it. There seems to be little available information on these modems, indicating that they were not very popular or that many are confused with the name similarity.

Aaron G. Todd
Los Angeles, California

A. Oops! You’re absolutely right, Aaron. Microperipheral Corp. is not Microbits Perpipheral Products. That’s the problem with a lot of computer company names; they sound too much alike. Nevertheless, I apologize to Wayne Shiver and to anyone I might have caused only more confusion. You and the following reader were the only ones who caught my goof:


Dear Jeff,

Q. I was just reading your March “Atari Help” column and I believe you misread the letter from H. Wayne Shiver of Powder Springs, GA.

He stated he owned a Microperipheral Corp. modem. This company has often been confused with the formerly named “MPP Corp.” but it is a different company from Washington, not Oregon. They used to manufacture modems under the name “Microconnection” for various computers, two models for the Atari. One was an 850 connected model and the other was for use without the 850, either a joystick port or I/O daisy chain connection. I’m not sure which.

I owned an 850 connect model for years and was completely satisfied with its operation. It used its own autodial routine, not compatible with Hayes, but several public domain Amodem programs supported it, namely the earlier versions of Amodem Plus v. 1.85 and variants, up to Amodem 6.3 which was the best. Later versions like Amodem 7.1 worked fine but did support the autodial.

I suspect that Mr. Shiver may be using the non-850 version of the modem which explains why Amodem and HomeTerm give a modem error. You are correct that he needs the correct handler for his modem, but it may not be the MPP handler, although if his modem uses the joystick port, one of the MPP handlers might get his modem recognized.

Without more specific information on the model of his modem, I cannot think of any more ideas to help him. The Microperipheral Corp. produced a number of early terminal programs which they did not ship with the modem called T Smart and S Smart, and required that the proper AUTORUN.SYS handler be booted for the modem. I recommend neither program. In fact, I recommend none of the commercial terminal software for Atari. Public domain terminal software is far superior to anything you can buy on the market.

Frank Halters
Panama City, Florida
A. Thanks for your help.

Atari 800XL Display Fix

In April’s column, in response to a letter about blurred characters on the 800XL from Alan McPherron (Pittsburgh, Pennsylvania), I asked other readers experiencing the same problem to write in. Many wrote in with similar complaints, but Ricky J. Burgett (Humboldt, Nebraska) wrote in with a solution. Ricky writes: “I am writing in reply to the question on the 800XL’s poor monitor performance. Both the 800 and the 130XE have separate chrominance and luminance outputs, but the 800XLs do not have an output to the chroma pin. There is a solution for this. (See Figure 1). The chroma output is at the emitter of Q5. You need to purchase a 200 ohm resistor and solder on one side at the junction of R67 and R68. The other side goes to pin 5 on the monitor connector. You will have to extend the 200 ohm resistor by means of an insulated wire. The Chicago Atari Users Group and Antic get credit for this solution. Several in my local users group have tried this modification and have seen a marked improvement in their monitor performance. Hope this helps.”

Many thanks to Ricky for writing in with, this solution. Readers who want to make this modification but are uncomfortable with soldering or electronics can probably find assistance at a users’ group.

Reader Requests

Readers have been so responsive and helpful in the past in discovering software items such as genealogical programs, and hardware products, such as memory expansion boards, that beginning next month I will be including a “Reader Request” section to help readers locate hard-to-find Atari items, or even to see if such items exist. Have a particular request? Let me know.

PixMix Picture Diskette, Volume II

March’s PixMix Puzzle Machine program had proved to be a very popular one, and I have been receiving numerous requests for “Volume II” of the PixMix picture diskette, despite the fact that I never offered a Volume II! Well, this month I’m happy to announce that Volume II is available, and best of all, it’s still $5.00 (see address at end of article). Volume II consists of several specially-centered digitized pictures and other high-resolution images that can be used with the March 1985 PixMix program.

BudgetMate

Now for this month’s feature program, BudgetMate. BudgetMate allows you to define up to nineteen different expense categories (and one income category) and has features that make it simple to plan your monthly budget. For example, the actual amount spent in each expense category in the previous month is displayed as you plan the next month’s budget. Additionally, the planned budget of the previous month can be copied into this month’s budget. A single diskette can hold a full year’s worth of data. Printer output and the numeric keypad are both supported. 32K minimum memory required.

Special Monthly Diskette

In the past I have offered diskettes containing the programs listed in this column for those who did not have the time or the desire to type in programs. This month’s diskette will be a little different in that it will contain a modified version of the listed BudgetMate. Since I have much more freedom when I design a program that will be saved directly to diskette rather than be printed in the column, I decided to create a more powerful version of BudgetMate for my personal use, which I will include for my readers on this month’s diskette (see end of article). In addition to the original BudgetMate features, the enhanced version needs no initial set-up time, allows up to 20 transaction details for each category (including income), records dollars and cents on the transaction detail screen, and features an end-of-year summary of transaction details and expenditures. Six months worth of data can be stored on a single diskette. Two diskettes, or two sides of a diskette, can hold a full year’s data. The main use of these extra features is, of course, for tax purposes, since a record of all purchases, medical expenses, contributions, business expenses, etc. can be retrieved and conveniently printed by category at any time. Therefore, those who intend to use BudgetMate to keep detailed income/expense records should consider this version. Supplementary instructions will be included with this monthly diskette.

Using BudgetMate

If you’re typing in the program, be sure to use Program Perfect, since this is a long one. The listing appears under the “BUDGETMATE” heading.

When you RUN the program, the title screen soon appears (See Photo 1). If you have the Atari CX-85 numeric keypad, plug it into joystick port 1.

Next, you’re asked to “INSERT THIS YEAR’S DATA DISKETTE OR A BLANK, FORMATTED DISK FOR A NEW YEAR.” Since you do not yet have a data diskette for this year, insert a blank, formatted disk and press START. Use this diskette to store your budget data for the remainder of the year. At the beginning of a new year, you should use a new data diskette, unless you want to erase over the previous year’s data.

Next, you’re asked to enter the date. Type the month, day and year (i.e. 6/4/86) and press RETURN. If the month is January and you are starting a new data diskette, you are asked to insert the previous year’s diskette so that BudgetMate can load in the data from December of that year. You won’t have to do this until next year.

Once the date has been entered, the appropriate files are opened or created on the data diskette and the budget screen is displayed. On the left-hand side of the screen is a menu of the commands (see Photo 2). Press ESC and the full budget screen will be displayed, with the names of any categories you have entered (see Photo 3). You can toggle between the command menu and the full screen at any time by pressing the ESC key.

The elongated cursor can be moved around the screen by using the cursor-control arrow keys. You do not need to hold down the control key to move the cursor. On the numeric keypad, the four keys on the left-side of the keypad will move the cursor up, down, left and right, respectively (from top to bottom). Changing or adding items to the screen is easy. Simply position the cursor over the data that you want to change, or over the position to which you want to add data. Then use the keyboard or the numeric keypad to enter the information. BudgetMate will automatically switch to its input mode and will display your entry on the screen when you press RETURN. To enter a negative number, press RETURN first and then the negative sign, otherwise pressing the negative sign would move the cursor up (since it is the same key as the up arrow).

The first thing you’ll want to do is enter the categories. The same category data is used for each month’s budget data, so you should avoid changing categories in which you have already entered data in the months before. You can and should, however, add categories as you discover that you need more. Move the cursor over to the category column and position it on top of the next empty “block,” type the name of the category you want to place there and press RETURN. You can add more categories or change any category in the same manner. You should not change the ***INCOME*** category to an expense category, since it is treated differently by the program (the INCOME category is assigned a positive value internally while the expense categories are assigned negative values).

The other two columns you can change or add to are this month’s BUDGET and ACTUAL columns. Numeric values for each category can range from -9,999 to 99,999. The total monthly balance can range from -99,999 to 999,999. Your first task is to design a balanced budget that will give you a zero or positive balance (the balance is displayed at the bottom of the column). Then, as the month progresses, use the ACTUAL column to record the actual expenditures that you make over the course of the month. By comparing the ACTUAL column to the BUDGET column, you can see exactly where you need to cut back, and where you can spend more freely. On the diskette version of BudgetMate, changes or additions to the ACTUAL column will bring you to a detail screen (see Photo 4) where you can record the actual transaction.

Last month’s ACTUAL column will be empty when you first start using the program, but after the first month this column will show you what you actually spent in each category (and how much you earned in the income category) in the previous month. This will help you to plan a much more easily adhered-to budget for the current month, since last month’s actual figures should give you a good estimation of the current month’s requirements for most of the categories.

Five control commands are used for your budget planning and actual record keeping. Press CONTROL-A to add a value to an existing one. On the numeric keypad, the minus sign (-) has been redefined to be the CONTROL-A key, since this feature is used often. For example, if you just went out and bought $100 worth of clothing, you would move the cursor down to the CLOTHING category line and then over to the ACTUAL column. Then you would press CONTROL-A (or - on the keypad), type 100 and press RETURN. 100 dollars will be automatically added to the existing amount in that category. The subtract command, CONTROL-S, does just the opposite. The add and subtract commands can be used on both the BUDGET and the ACTUAL columns.

The CONTROL-T command allows you to switch in last month’s budget. Thus, if you were able to adhere to last month’s budget well, you can copy it for this month’s budget and modify whatever amounts are necessary. Pressing CONTROL-T again will return the original current budget, should you change your mind once you see last month’s budget.

The CONTROL-P command gives you a printout of the budget screen. You can obtain a hardcopy of any month’s data by loading in that month’s data (enter a date in that month when asked to type in the current date). Then use the CONTROL-P command to print out the budget screen.

The CONTROL-Q command is the quit command. It is extremely important that you remember to press CONTROL-Q once you have finished adding/changing data, since this command tells BudgetMate to save all changes and additions to diskette. If you forget to press the CONTROL-Q command and turn off your computer, you will lose whatever additions you made for that day, so always remember to use this command when you are finished. You can use BudgetMate on a daily, weekly, or monthly basis, depending on how often you need to add to the expense categories and how much you want to monitor your budget.

Next Month

We’ll learn how BudgetMate works, plus we’ll enter some reader-modified utility programs.

Readers’ questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply.

The BudgetMate diskette is available from the author for $7.00, postpaid. Please make checks payable to Jeff Brenner; and specify your disk drive model.

Program Perfect” is a utility used to check for typing errors while entering programs from this column. Readers may send $5.00 for a diskette or a SASE for a listing of this program.

Address all correspondence to: Jeff Brenner, “Applying The Atari 6/86”, c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990.

BUDGETMATE 

STJ 10 REM BUDGETMATE 
KGJ 20 REM COPYRIGHT 1986 JEFF BRENNER 
YSJ 30 CYR=1900 
UBJ 40 DIM INVERSE$(59),WINDOW$(130),SCR$(960),MENU$(960) 
FDJ 50 DIM HEADING$(240),LAST(20),BUDGET(20),ACTUAL(20),LB(20) 
VWJ 60 DIM DATE$(15),IN$(100),TEMP$(100),FILE$(20),Z$(1),Z1$(1) 
JMJ 70 DIM XP(2):XP(0)=2:XP(1)=23:XP(2)=31 
PYJ 80 INVERSE=ADR(INVERSE$);WINDOW=ADR(WINDOW$) 
XMJ 90 DIM SP$(100):SP$=CHR$(32):SP$(100)=CHR$(32):SP$(2)=SP$ 
LCJ 100 DIM D$(2):D$=CHR$(156):D$(2)=CHR$(157) 
ACJ 110 GOSUB 3400:GOSUB 700:OPEN #1,4,0,"K:":OPEN #2,9,0,"E:":POKE 559,0 
HCJ 120 SETCOLOR 4,9,0:SX=85 
IJJ 130 FOR I=704 TO 707:POKE I,0:NEXT I 
RXJ 140 RESTORE 160:FOR I=1 TO 59:READ N:TOT=TOT+I+N 
BWJ 150 INVERSE$(1,1)=CHR$(N):NEXT I 
PEJ 160 DATA 104,104,104,170,165,88,133,200,165,89 
OSJ 170 DATA 133,209,104,104,168,240,16,24,165,208 
MNJ 180 DATA 105,40,133,208,165,209,105,0,133,209 
QRJ 190 DATA 136,208,240,24,138,101,208,133,208,165 
ONJ 200 DATA 209,105,0,133,209,104,104,168,136,177 
FXJ 210 DATA 208,73,128,145,200,136,16,247,96 
THJ 220 RESTORE 240:FOR I=1 TO 130:READ N:TOT=TOT+I+N 
YFJ 230 WINDOW$(1,1)=CHR$(N):NEXT I 
RGJ 240 DATA 104,104,133,212,104,133,211,104,104,170 
PJJ 250 DATA 165,88,133,208,165,89,133,209,104,104 
MZJ 260 DATA 168,240,29,24,165,208,105,40,133,208 
MOJ 270 DATA 165,209,105,0,133,209,24,165,211,105 
MAJ 280 DATA 40,133,211,165,212,105,0,133,212,136 
QYJ 290 DATA 208,227,24,138,101,208,133,208,165,209 
NUJ 300 DATA 105,0,133,209,138,101,211,133,211,165 
NUJ 310 DATA 212,105,0,133,212,104,104,168,136,132 
SDJ 320 DATA 213,104,104,170,164,213,177,208,133,214 
QRJ 330 DATA 177,211,145,208,165,214,145,211,136,16 
OSJ 340 DATA 241,24,165,208,105,40,133,208,165,209 
LZJ 350 DATA 105,0,133,209,165,211,105,40,133,211 
MHJ 360 DATA 165,212,105,0,133,212,202,208,211,96 
GGJ 370 GOSUB 1670:POKE 752,1 
UPJ 380 POSITION 4,5:PRINT "INSERT THIS YEAR'S DATA DISKETTE" 
HSJ 390 POKE SX,4:PRINT "OR A BLANK, FORMATTED DISK FOR A" 
ATJ 400 POKE SX,16:PRINT "NEW YEAR" 
KAJ 410 POSITION 3,4:L=34:H=4:GOSUB 2020 
BQJ 420 IF TOT<>187386 THEN GOSUB 620 
URJ 430 POSITION 9,9:PRINT "PRESS START WHEN READY" 
VXJ 440 A=USR(ADR(INVERSE$),9,9,22) 
UGJ 450 FOR I=1 TO 20:IF PEEK(53279)=6 THEN 470 
UFJ 460 NEXT I:GOTO 440 
NTJ 470 TRAP 1700:CLOSE #3:OPEN #3,4,0,"D:HEADING.DAT" 
DHJ 480 INPUT #3;YEAR:GOSUB 1670:IF MONTH+DAY<>0 THEN 510 
XGJ 490 POSITION 10,4:PRINT CYR+YEAR;" DATA DISKETTE" 
LDJ 500 POSITION 9,3:L=21:H=1:GOSUB 2020:GOSUB 1770 
BFJ 510 GOSUB 1100:GOSUB 520:GOTO 610 
CUJ 520 HEADING$="":FOR I=1 TO 19:INPUT #3;TEMP$ 
WCJ 530 HEADING$(LEN(HEADING$)+1)=TEMP$:NEXT I:CLOSE #3 
KSJ 540 GOSUB 820:POSITION 2,2:PRINT "***INCOME***" 
VKJ 550 A=USR(ADR(INVERSE$),2,2,12) 
WBJ 560 FOR I=1 TO 19:PRINT HEADING$(I*12-11,I*12):NEXT I 
XJJ 570 FOR I=0 TO 19:NUM=LAST(I):POSITION 21-LEN(STR$(NUM)),I+2:PRINT NUM 
VTJ 580 NUM=BUDGET(I):POSITION 29-LEN(STR$(NUM)),I+2:PRINT NUM 
PGJ 590 NUM=ACTUAL(I):POSITION 37-LEN(STR$(NUM)),I+2:PRINT NUM:NEXT I 
XEJ 600 COL=1:GOSUB 2750:COL=2:GOSUB 2750:COL=0:RETURN 
UAJ 610 YP=2:GOSUB 1440:GOSUB 2220 
TCJ 620 RESTORE 650:FOR I=1536 TO 1616:READ N:TOT=TOT+I+N:POKE I,N:NEXT I 
XUJ 630 IF TOT=187386 THEN A=USR(1536):RETURN 
ONJ 640 GRAPHICS 0:PRINT "PROGRAM ENTRY ERROR - CHECK DATA LINES":END 
SBJ 650 DATA 104,162,6,160,10,169,7,76,92,228,174,132,2,240,5,202 
CNJ 660 DATA 134,206,240,40,174,120,2,228,203,208,4,165,206,208,29,165 
DWJ 670 DATA 207,240,4,198,207,240,21,230,206,134,203,230,207,173,113,2 
ORJ 680 DATA 201,1,240,2,162,16,189,63,6,141,252,2,76,98,228,52 
QFJ 690 DATA 24,29,27,15,51,53,48,7,31,30,26,50,34,12,191,14,155 
KXJ 700 RESTORE 750:1=0:TOT=0 
XBJ 710 READ NUM:IF NUM=-1 THEN 730 
QXJ 720 TOT=TOT+NUM+1:POKE 1664+1,NUM:I=I+1:GOTO 710 
XXJ 730 IF TOT<>13247 THEN PRINT "ERROR - CHECK LINES 3000-3060":END 
POJ 740 FOR I=1767 TO 1790:POKE I,148:NEXT I:A=USR(1664):RETURN 
SLJ 750 DATA 104,173,48,2,133,204,173,49,2,133,205,160,26,169,148 
TZJ 760 DATA 153,230,6,136,208,250,160,0,17?,204,9,128,145,204,160 
QUJ 770 DATA 3,177,204,9,128,145,204,160,6,177,204,9,128,145,204 
KUJ 780 DATA 200,192,28,208,245,169,197,141,0,2,169,6,141,1,2 
OIJ 790 DATA 173,14,212,9,128,141,14,212,96,72,152,72,173,11,212 
PLJ 800 DATA 201,7,240,18,201,8,240,14,230,204,164,204,185,231,6 
NWJ 810 DATA 141,24,208,104,168,104,64,169,0,133,204,240,238,-1 
MFJ 820 GOSUB 1670:DM=PEEK(559):POKE 559,0 
TXJ 830 Z$="":IF YEAR<10 THEN Z$="0" 
WUJ 840 Z1$="":IF YEAR-(MONTH=1)<10 THEN Z1$="0" 
EUJ 850 POSITION 16,0:RESTORE 6500+MONTH-1:READ TEMPS,IN$ 
YNJ 860 PRINT CHR$(8);TEMP$(1,3);CHR$(32);Z1$;YEAR-(MONTH=1);CHR$(8); 
KOJ 870 FOR I=1 TO 2 
OVJ 880 PRINT CHR$(136);IN$(1,3);CHR$(32);Z$;YEAR;CHR$(8);:NEXT I 
XTJ 890 A=USR(ADR(INVERSE$),1T, 0,23) 
IEJ 900 POSITION 4,1:PRINT "CATEGORY" 
VKJ 910 A=USR(ADR(INVERSE$),2,1,13) 
ETJ 920 POSITION 1,22:PRINT CHR$(2);"ESC FOR MENU";CHR$(22) 
XKJ 930 A=USR(ADR(INVERSE$),2,22,12) 
MGJ 940 POSITION 15,1:PRINT CHR$(8);"ACTUAL";CHR$(8);CHR$(136); 
VUJ 950 PRINT "BUDGET";CHR$(8);CHR$(136);"ACTUAL";CHR$(8) 
XRJ 960 A=USR(ADR(INVERSE$),16,1,23) 
WWJ 970 IN$=CHR$(2):IN$(2,13)=SP$:IN$(14)=CHR$(22) 
WHJ 980 TEMP$=CHR$(130):TEMP$(2,8)=SP$:TEMP$(7,7)=CHR$(150) 
SCJ 990 POSITION 1,1:PRINT CHR$(2):POSITION 14,1:PRINT CHR$(22) 
CUJ 1000 FOR I=1 TO 20:POKE 85,1:PRINT IN$;TEMP$;TEMP$;TEMP$:NEXT I 
TYJ 1010 FOR X=15 TO 35 STEP 8:POSITION X,22 
MQJ 1020 FOR I=1 TO 7:PRINT CHR$(13);:NEXT I:NEXT X 
IJJ 1030 A=USR(1664):POKE 1767,144:POKE 1768,144:POKE 1789,144:POKE 1790,144 
QCJ 1040 POKE 1769,144:FOR I=1770 TO 1788 STEP 2:POKE I,146:NEXT I 
WHJ 1050 POKE 53260,213:POKE 53265,255 
01J 1060 FOR I=704 TO 706:POKE I,144:NEXT I 
MMJ 1070 POKE 53252,104:POKE 53253,136:POKE 53254,168:POKE 53255,200 
UWJ 1080 POKE 53248,48:POKE 53261,255 
GNJ 1090 POKE 559,DM:RETURN 
XHJ 1100 FILE$="D:MONTH":FILE$(LEN(FILE$)+1)=STR$(MONTH) 
YIJ 1110 TRAP 1390:CLOSE #4:0PEN #4,4,0,FILE$:INPUT #4;ACTUAL:INPUT #4;BUDGET 
DDJ 1120 FOR I=0 TO 19:INPUT #4;TMP:ACTUAL(I)=TMP:NEXT I 
DFJ 1130 FOR I=0 TO 19:INPUT #4;TMP:BUDGET(I)=TMP:NEXT I 
DBJ 1140 CLOSE #4:IF MONTH®1 THEN 1210 
QAJ 1150 IN$="D:MONTH":IN$(8)=STR$(MONTH-1) 
FYJ 1160 TRAP 1200:OPEN #4,4,0,IN$:INPUT #4;LAST:INPUT #4;LB 
XEJ 1170 FOR I=0 TO 19:INPUT #4;TMP:LAST(I)=TMP:NEXT I 
QVJ 1180 FOR I=0 TO 19:INPUT #4;TMP:LB(I)=TMP:NEXT I 
CXJ 1190 RETURN 
EBJ 1200 FOR I=0 TO 19:LAST(I)=0:LB(I)=0:NEXT I:LB=0:LAST=LB:RETURN 
LSJ 1210 TY=PEEK(84) 
NRJ 1220 POSITION 2,TY:PRINT DS;"DO YOU HAVE DISK FOR ";CYR+YEAR-1;; 
OAJ 1230 GET #1,N:PRINT CHR$(N); 
WGJ 1240 IF N<>78 AND N<>89 THEN 1210 
IGJ 1250 IF N=78 THEN RETURN 
MBJ 1260 POKE 752,1:PRINT :PRINT :POKE 85,6:PRINT "INSERT LAST YEAR'S DISKETTE" 
JAJ 1270 POKE 85,5:PRINT "PRESS START WHEN READY TO LOAD"; 
OZJ 1280 A=USR(ADR(INVERSE$),11,PEEK(84),5) 
TOJ 1290 IF PEEK (53279) 06 THEN f290 
FEJ 1300 TRAP 1380:CLOSE #4:OPEN #4,4,0,"D:MONTH12" 
XFJ 1310 INPUT #4;LAST:INPUT #4;LB 
XBJ 1320 FOR I=0 TO 19:INPUT #4;TMP:LAST(I)=TMP:NEXT I 
MXJ 1330 FOR I=0 TO 19:INPUT #4;TMP:LB(I)=TMP:NEXT I:CLOSE #4 
MCJ 1340 PRINT :PRINT :PRINT :POKE 85,9:PRINT "REPLACE NEW DISKETTE" 
OHJ 1350 POKE 85,8:PRINT "PRESS START WHEN READY"? 
ASJ 1360 A=USR(ADR(INVERSE$),14,PEEK(84),5):POKE 85,8:L=22:GOSUB 1940 
TMJ 1370 IF PEEK (53279 ) 06 THEN 1370 
CYJ 1380 RETURN 
SPJ 1390 CLOSE #4:OPEN #4,8,0,FILE$ 
PDJ 1400 FOR I=0 TO 41:PRINT #4;0 
UMJ 1410 IF I<20 THEN BUDGET(I)=0:ACTUAL(I)=0 
VUJ 1420 NEXT I: CLOSE #4 
FFJ 1430 GOTO 1140 
RXJ 1440 MENU$=CHR$(0):MENU$(960)=CHR$(0):MENU$(2)=MENU$ 
VXJ 1450 POSITION 0,0:POKE 752,1:PRINT CHR$(30);CHR$(31); 
CNJ 1460 A=USR(ADR(WINDOW$),ADR(MENU$),2,1,12,22) 
KOJ 1470 POSITION 2,1:PRINT "COMMAND MENU":A=USR(ADR(INVERSE$),2,1,12) 
LXJ 1480 POSITION 2,2:PRINT "HOLD CONTROL":POKE 85,4:PRINT "KEY DOWN" 
GRJ 1490 POKE 85,6:PRINT "WHEN":POKE 85,4:PRINT "PRESSING" 
JIJ 1500 POKE 85,2:PRINT "COMMAND KEYS" 
ADJ 1510 POSITION 3,8:PRINT CHR$(193);"DD AMOUNT":PRINT 
GOJ 1520 PRINT CHR$(32);CHR$(211);"UBTRACT":PRINT 
YEJ 1530 PRINT CHR$(32);CHR$(212);"OGGLE LAST":PRINT "MONTH'S BDGT" 
ICJ 1540 PRINT CHR$(32);CHR$(208);"RINTOUT":PRINT 
MPJ 1550 PRINT CHR$(32);CHR$(209);"UIT AND" 
VMJ 1560 PRINT CHR$(32);"SAVE DATA" 
QLJ 1570 PRINT :PRINT CHR$(32);"PRESS ESC" 
XZJ 1580 A=USR(ADR(INVERSE$),9,19,3) 
YTJ 1590 PRINT "TO CONTINUE":POSITION 0,0:PRINT CHR$(30);CHR$(31); 
ABJ 1600 A=USR(ADR(INVERSE$),2,22,12) 
RFJ 1610 POKE 764,255:POKE 1769,148 
QWJ 1620 IF PEEK(764)=255 THEN 1620 
CMJ 1630 A=USR(ADR(WINDOW$),ADR(MENU$),2,1,12,22) 
JBJ 1640 IF PEEK(764)=28 THEN POKE 764,255 
PFJ 1650 A=USR(ADR(INVERSE$),XP(COL),YP,7+5*(COL=0)):POKE 1769,144:RETURN 
AUJ 1660 A=USR(ADR(WINDOW$),ADR(MENU$),2,1,12,22):GOTO 1610 
WYJ 1670 GRAPHICS 0:POKE 711,144:POKE 623,17:POKE 710,144:POKE 712,144 
NIJ 1680 POKE 16,64:POKE 53774,64 
DCJ 1690 RETURN 
QQJ 1700 IF PEEK(195)=170 THEN 1720 
RRJ 1710 PRINT "ERROR #";PEEK(195);:GOTO 370 
YWJ 1720 POKE 84,12;PRINT "OPEN NEW FILE ON THIS DISKETTE (Y/N)?"; 
IUJ 1730 T=PEEK(SX):L=37:POSITION 2,12:GOSUB 1940 
RRJ 1740 GET #1,N:IF N<>89 AND N<>78 THEN 1720 
UXJ 1750 IF N=78 THEN 37$ 
HAJ 1760 GOSUB 1770: GOTO 1870 
TUJ 1770 POSITION 2,14:PRINT D$;"ENTER THE DATE (ex: 5/8/86): ";:T=PEEK(SX) 
FHJ 1780 POSITION 2,14:L=2B:GOSUB 1940 
TQJ 1790 TRAP 1770:INPUT #16;DATE$ 
AHJ 1800 MONTH=VAL(DATE$):GOSUB 1810:GOTO 1830 
KYJ 1810 IF DATE$(2,2)="/" THEN DATE$=DATE$(3):RETURN 
MJJ 1820 DATE$=DATE$(4):RETURN 
TPJ 1830 DAY=VAL(DATE$) 
IHJ 1840 GOSUB 1810 
VYJ 1850 YEAR=VAL(DATE$):IF YEAR<0 OR YEAR>99 THEN 1770 
DBJ 1860 RETURN 
WAJ 1870 GOSUB 1670:POSITION 9,5:PRINT "OPENING FILE - STAND BY" 
HFJ 1880 POKE 752,1 
MLJ 1890 POSITION 8,4:L=25:H=1:GOSUB 2020 
RPJ 1900 CLOSE #3:OPEN #3,8,0,"D:HEADING-DAT" 
LLJ 1910 PRINT #3;YEAR:FOR I=1 TO 19:PRINT #3;SP$(1,12):NEXT I 
DKJ 1920 CLOSE #3 
DTJ 1930 GOTO 470 
FEJ 1940 IF KBH THEN POKE 764,KBH:KBH=0:GOTO 2010 
VJJ 1950 H=PEEK(SX):POKE 764,255:POKE 752,1:PRINT CHR$(30);CHR$(31); 
NTJ 1960 POKE SX,H:FOR I=1 TO 6 
FXJ 1970 A=USR(ADR(INVERSE$),PEEK(85),PEEK(84),L) 
NCJ 1980 FOR W=1 TO 3 
HNJ 1990 IF I/2=INT(I/2) AND PEEK(764)<>255 THEN 2010 
TMJ 2000 NEXT W:NEXT I 
KWJ 2010 POKE 752,0:POKE SX,T:PRINT CHR$(30);CHR$(31);:RETURN 
DQJ 2020 XI=PEEK(85):YI=PEEK(84):PRINT CHR$(17); 
HAJ 2030 FOR I=1 TO L-2:PRINT CHR$(18);:NEXT I:PRINT CHR$(5) 
EYJ 2040 FOR J=1 TO H:POKE 85,XI:PRINT CHR$(124); 
AYJ 2050 POKE SX,XI+L-1:PRINT CHR$(124):NEXT J 
YRJ 2060 POKE SX,XI:PRINT CHR$(26); 
HCJ 2070 FOR I=1 TO L-2:PRINT CHR$(18);:NEXT I:PRINT CHR$(3) 
CWJ 2080 RETURN 
SIJ 2090 DATA DECEMBER 
QXJ 2100 DATA JANUARY 
TOJ 2110 DATA FEBRUARY 
KGJ 2120 DATA MARCH 
KUJ 2130 DATA APRIL 
FGJ 2140 DATA MAY 
IEJ 2150 DATA JUNE 
IXJ 2160 DATA JULY 
ORJ 2170 DATA AUGUST 
WQJ 2180 DATA SEPTEMBER 
QUJ 2190 DATA OCTOBER 
WFJ 2200 DATA NOVEMEBER 
SCJ 2210 DATA DECEMBER 
AZJ 2220 COL=0:POKE 764,255 
NJJ 2230 A=USR(ADR(INVERSE$),XP(COL),YP,7+5*(COL=0)) 
NDJ 2240 SOUND 0,0,0,0 
HHJ 2250 KB=PEEK(764):IF KB=255 THEN 2250 
CCJ 2260 POKE 764,255:IF ER=0 THEN 2280 
SWJ 2270 POSITION 0,23:ER=0:PRINT SP$(1,35); 
VYJ 2280 SOUND 0,8,12,4:POKE 53768,64 
YTJ 2290 IF KB=12 THEN 2450 
NHJ 2300 A=USR(ADR(INVERSE$),XP(COL),YP,7+5*(COL=0)) 
IXJ 2310 IF KB=7 OR KB=135 THEN COL=COL+1:IF COL>2 THEN COL=0 
EGJ 2320 IF KB=6 OR KB=134 OR KB=52 THEN COL=COL-1:IF COL<0 THEN COL=2 
EMJ 2330 IF KB=14 OR KB=142 THEN YP=YP-1:IF YP<2 THEN YP=21 
EGK 2340 IF KB=15 OR KB=135 THEN YP=YP+1:IF YP>21 THEN YP=2 
OFJ 2350 IF KB=28 THEN GOSUB 1660:GOTO 2250 
UWJ 2360 IF KB=191 AND COL THEN 3240 
UYJ 2370 IF KB=190 AND COL THEN 3350 
SFJ 2380 IF KB=175 THEN GOSUB 2870 
RRJ 2390 IF KB=138 THEN GOSUB 3000 
RQJ 2400 IF KB=173 THEN GOSUB 3170 
YPJ 2410 IF KB>127 OR KB=6 OR KB=7 OR KB=t4 OR KB=15 OR KB=52 THEN 2230 
GPJ 2420 KBH=KB:A=USR( ADR(INVERSE$),XP(COL),YP,7+5*(COL=0)) 
FLJ 2430 GOTO 2450 
FIJ 2440 GOTO 2230 
LDJ 2450 SCR$(1)=CHR$(0):SCR$(960)=CHR$(0):SCR$(2)=SCR$ 
YXJ 2460 A=USR(ADR(WINDOW$),ADR(SCR$),1,22,39,1) 
AYJ 2470 IF COL=0 THEN 2640 - 
CBJ 2480 POSITION 2,22:PRINT D$;"NEW VALUE: ";:T=PEEK(85) 
EWJ 2490 POSITION 2,22:L=10:GOSUB 1940 
YTJ 2500 TRAP 2730:INPUT #16;VALUE:VALUE=INT(VALUE+0.5) 
VVJ 2510 POKE 752,1:POSITION 0,0:PRINT CHR$(30);CHR$(31); 
CGJ 2520 IF VALUE<-9999 OR VALUE>99999 THEN 2480 
RIJ 2530 A=USR(ADR(INVERSE$),XP(COL),YP*7) 
OSJ 2540 FL=1:IF YP=2 THEN FL=-1 
DJJ 2550 IF COL<>1 THEN 2570 
IHJ 2560 BUDGET=BUDGET+FL*BUDGET(YP-2)-FL*VALUE:BUDGET(YP-2)=VALUE 
DOJ 2570 IF COL<>2 THEN 2590 
IFJ 2580 ACTUAL=ACTUAL+FL*ACTUAL(YP-2)-FL*VALUE:ACTUAL(YP-2)=VALUE 
OXJ 2590 POSITION XP(COL)+1,YP 
EXJ 2600 I=LEN(STR$(VALUE)) 
SZJ 2610 IF I<5 THEN PRINT SP$(1,5-1);VALUE; 
UWJ 2620 IF I=5 THEN PRINT VALUE; 
FPJ 2630 GOTO 2740 
NAJ 2640 POSITION 2,22:PRINT D$;"NEW CATEGORY: ";:T=PEEK(SX) 
EXJ 2650 POSITION 2,22:L=13:GOSUB 1940 
FRJ 2660 INPUT #16;IN$:POKE 752,1:POSITION 0,0:PRINT CHR$(30);CHR$(31); 
LJJ 2670 IF LEN(IN$)=0 THEN 2730 
HUJ 2680 IF LEN(IN$)>12 THEN IN$=IN$(1,12) 
DTJ 2690 IF LEN(IN$)<12 THEN IN$(LEN(IN$)+1,12)=SPS 
MBJ 2700 HEADING$((YP-2)*12-11,(YP-2)*12)=IN$ 
EHJ 2710 POSITION XP(COL),YP:PRINT IN$;:POSITION 0,0:PRINT CHR$(30);CHR$(31); 
FPJ 2720 GOTO 2740 
NOJ 2730 A=USR(ADR(INVERSE$),XP(COL),YP,7+5*(COL=0)) 
YGJ 2740 A=USR(ADR(WINDOW$),ADR(SCR$),1,22,39,1):GOSUB 2750:GOTO 2230 
IFJ 2750 POSITION XP(COL)-1,22:IF COL<>1 THEN 2800 
LDJ 2760 I=LEN(STR$(BUDGET))+2 
UKJ 2770 IF I<9 THEN PRINT SP$(1,9-1);BUDGET;:GOTO 2850 
WDJ 2780 IF I=9 THEN PRINT BUDGET;:GOTO 2850 
FXJ 2790 GOTO 2840 
NWJ 2800 IF COL<>2 THEN RETURN 
KYJ 2810 I=LEN(STR$(ACTUAL))+2 
UFJ 2820 IF I<9 THEN PRINT SP$(1,9-1);ACTUAL;:GOTO 2850 
VYJ 2830 IF I=9 THEN PRINT ACTUAL;:GOTO 2850 
SOJ 2840 PRINT CHR$(32);"OVRFLW"; 
EMJ 2850 POSITION 15,22: PRINT "TOTALS:":A=USR(ADR(INVERSE$),15,22,7) 
RVJ 2860 POKE 752,1:POSITION 0,0:PRINT CHR$(30);CHR$(31);:RETURN 
POJ 2870 TRAP 2970:POKE 54286,64:POKE 710,144 
EBJ 2880 CLOSE #4:OPEN #4,8,0,"D:HEADING.DAT":PRINT #4;YEAR 
EVJ 2890 FOR I=1 TO 19:PRINT #4;HEADING$(I*12-11,I*12):NEXT I 
SNJ 2900 CLOSE #4:OPEN #4,8,0,FILE$ 
OZJ 2910 PRINT #4;ACTUAL:PRINT #4;BUDGET 
FGJ 2920 FOR I=0 TO 19:PRINT #4;ACTUAL(I):NEXT I 
FIJ 2930 FOR I=0 TO 19:PRINT #4;BUDGET(I):NEXT I 
DOJ 2940 CLOSE #4 
WGJ 2950 FOR I=53252 TO 53255:POKE I,0:NEXT I:POKE 53248,0 
ISJ 2960 POP :GRAPHICS 0:END 
TEJ 2970 POKE 710,148:POKE 54286,192 
MVJ 2980 POSITION 2,23:PRINT "SAVING ERROR #";PEEK(195);:ER=1 
KSJ 2990 POSITION 2,23:L=17:T=0:GOSUB 1940:RETURN 
LCJ 3000 POKE 54286,64:TRAP 3140 
VRJ 3010 POKE 752,1:POSITION 0,0:PRINT CHR$(30);CHR$(31); 
AHJ 3020 A=USR(ADR(INVERSE$),15,22,7) 
NUJ 3030 CLOSE #4:0PEN #4,8,0,"P:" 
KQJ 3040 FOR Y=0 TO 22:IF Y<2 THEN A=USR(ADR(INVERSE$),0,Y,40) 
PXJ 3050 POSITION 2,Y:INPUT #2;IN$:A=USR(ADR(INVERSE$),0,Y,40) 
PQJ 3060 IF Y>1 AND Y<22 THEN 3110 
PGJ 3070 FOR I=1 TO LEN(IN$):A=ASC(IN$(I,I)) 
VOJ 3080 IF A>31 AND A<97 THEN PRINT #4;CHR$(A);:GOTO 3100 
ATJ 3090 PRINT #4;CHR$(32); 
URJ 3100 NEXT I:PRINT #4: GOTO 3120 
JLJ 3110 IN$(13,14)=SP$:IN$(20,22)=SP$:IN$(28,30)=SP$:PRINT #4;IN$ 
DCJ 3120 IF Y>1 THEN A=USR(ADR(INVERSE$),0,Y,40) 
XFJ 3130 NEXT Y:POKE 54286,192:A=USR(ADR(INVERSE$),15,22,7):RETURN 
IKJ 3140 POKE 54286,192: A=USR (ADR(INVERSE$),15,22,7) 
SSJ 3150 POSITION 2,23:PRINT "PRINTING ERROR #";PEEK(195);:ER=1 
KKJ 3160 POSITION 2,23:T=0:L=19:GOSUB 1940:RETURN 
PIJ 3170 FOR I=0 TO 19:TMP=LB(I):LB(I)=BUDGET(I):BUDGET(I)=TMP 
DAJ 3180 A=USR(ADR(INVERSE$),24,I+2,5) 
NRJ 3190 POSITION 24,I+2:IF TMP=0 THEN J=1:GOTO 3210 
YLJ 3200 J=LEN(STR$(TMP)) 
JMJ 3210 IF J<5 THEN PRINT SP$(1,5-J);TMP:GOTO 3230 
NDJ 3220 IF J=5 THEN PRINT TMP 
QIJ 3230 NEXT I:TMP=LB:LB=BUDGET:BUDGET=TMP:COL=1:GOTO 2750 
LBJ 3240 SCR$(1)=CHR$(0):SCR$(960)=CHR$(0):SCR$(2)=SCR$ 
YVJ 3250 A=USR(ADR(WINDOW$),ADR(SCR$),1,22,39,1) 
PFJ 3260 POSITION 2,22:PRINT D$;"ADD WHAT VALUE: ";:FL=1:T=PEEK(SX) 
EYJ 3270 POSITION 2,22:L=15:GOSUB 1940 
VDJ 3280 VALUE=0:TRAP 3290:INPUT #16;VALUE:VALUE=INT(VALUE+0.5) 
WBJ 3290 POKE 752,1:POSITION 0,0:PRINT CHR$(30);CHR$(31); 
NSJ 3300 IF COL=1 THEN VALUE=BUDGET(YP-2)+VALUE*FL 
NTJ 3310 IF COL=2 THEN VALUE=ACTUAL(YP-2)+VALUE*FL 
OQJ 3320 POSITION 2,23:PRINT SP$(1,14);:POSITION 2,23 
XNJ 3330 IF VALUE<-9999 OR VALUE>99999 THEN PRINT "VALUE TOO BIG";:GOTO 3260 
FMJ 3340 GOTO 2540 
LDJ 3350 SCR$(1)=CHR$(0):SCR$(960)=CHR$(0):SCR$(2)=SCR$ 
YXJ 3360 A=USR(ADR(WINDOW$),ADR(SCR$),1,22,39,1) 
UZJ 3370 POSITION 2,22:PRINT D$;"SUBTRACT WHAT VALUE: ";:FL=-1:T=PEEK(SX) 
EWJ 3380 POSITION 2,22:L=20:GOSUB 1940 
FTJ 3390 GOTO 3280 
EJJ 3400 DATA 124,102,120,62,126,126,99,24,126,126,102,102,108,96,96,24 
DPJ 3410 DATA 119,60,24,96,124,102,102,96,124,24,127,102,24,124,102,102 
CHJ 3420 DATA 102,110,96,24,107,102,24,96,102,102,108,102,96,24,99,126 
YHJ 3430 DATA 24,96,124,126,120,62,126,24,99,102,24,126 
WFJ 3440 GRAPHICS 4:SETCOLOR 2,9,0:SETCOLOR 4,9,0:SETCOLOR 0,9,10 
COJ 3450 S=PEEK(88)+256*PEEK(89)+80:DL=PEEK(560)+256*PEEK(561) 
HFJ 3460 POKE 559,0 
MGJ 3470 RESTORE 3400:FOR I=0 TO 59:READ N:POKE S+I,N:NEXT I:POKE 559,34 
PHJ 3480 POKE DL+23,6:POKE DL+24,6:POKE 87,1 
XGJ 3490 IN$="COPYRIGHT 1986":POSITION 3,9:PRINT #6;IN$ 
ULJ 3500 IN$="JEFF BRENNER":POSITION 4,10:PRINT #6;IN$ 
HCJ 3510 POKE 752,1:PRINT SP$(1,9);"Please stand by..." 
DMZ 3520 RETURN 
COMPUTER SHOPPER / MAY 1987 / PAGE 127 

Applying The Atari

by Jeff Brenner

This month we have reader mail and newsletters, and, in response to reader requests, a special 800XL memory project from March 1986.

Reader Mail

Dear Jeff,

In your January 1987 “Applying The Atari” column, reader Darwin K. Garrison asked you about a printer utility which would allow him to print a script font on his Epson LX-80. I have just completed a program, Daisy-Dot, that prints user-created fonts in Near Letter Quality mode on Epson and Star printers. Here’s a list of features: Compatible with most word processors; allows up to four different graphic densities; prints proportional fonts at up to eight times the density of draft mode; offers flexible character spacing manipulation; includes five fonts: Roman, Sans-Serif, Script, Block, and Ohio. You can revise and generate fonts using the Daisy-Dot Font Editor with: joystick control, printer module, proportional font design, characters up to 19 columns wide and 16 rows high, range of 91 ASCII characters, and 14 commands. The program is for XL/XE systems only and is $12.95 + $1.50 shipping from Roy Goldman, 2440 South Jasmine, Denver, CO 80222.

Roy Goldman
Denver, Colorado

I am printing your letter to supplement my answer to Darwin K. Garrison’s question in the January column, and for other readers interested in using other fonts with their printer. The five fonts included with Daisy-Dot are shown in Figure 1. Readers should be aware that I have not yet received a review copy of Roy’s program and therefore cannot make an evaluation of the program’s performance at this time.


Dear Jeff,

I read your article in Computer Shopper, 2/87, which mentioned an article that allowed the Atari 800XL memory to be upgraded to 256K. Where can I get a reprint to allow me to make this modification to my 800XL?

Charles Wesockes Hollywood, Florida

February’s mention of Claus Buchholz’s 256K upgrade brought a deluge of requests for reprints of the original article published in my March 1986 “Atari Help” column. Unfortunately, supplying reprints is a tedious, time-consuming, and expensive process, and I have not been able to offer this service to my readers (Computer Shopper does not have back-issues to sell). This month, however, because of the demand for this particular project, and in recognition of an Atari audience that has more than doubled since the original article appeared, I am reprinting Claus Buchcholz’s memory expansion project for those interested in expanding their Atari 800XL to 256K. For 600XL owners, an enterprising Canadian reader has successfully modified the circuit to expand a 600XL to 256K. Contact Gordon Filion, #26-249 Kitchener Cr., Kamloops, B.C. Canada. The 800XL project follows:

256K Atari 800XL

WARNING: Neither Computer Shopper nor the author is responsible for any damages resulting from the construction of this memory expansion project.

This upgrade is based on Claus Buchholz’s original article in BYTE, “The Quarter-Meg Atari,” which he has modified to perform 16K bank switching to make it compatible with the 130XE. It should be stressed that the upgrade is not 100% 130XE compatible: The 130XE has the ability to control whether the 6502 or Antic (or both) sees the extra RAM banked through locations $4000 through $7FFF. This permits, for example, a graphics screen to reside in the Atari’s normal memory between $4000 and $7FFF while a RAMdisk is in operation. In most cases, the screen memory is above location $7FFF and there is no problem. But programs that place graphics data between location $4000 and $7FFF will not work properly. Similarly, some 800 or 800XL programs that utilize this memory area for graphics will not work properly unless the additional RAM is disabled (i.e. not using a RAMdisk). The majority of 130XE programs currently available will work with the upgrade with no incidence.

For those of you who have read Claus Buchholz’s article in BYTE (September 1985—check your library) and are comfortable with soldering or have a friend who will help you out (an Atari user group member, for example), Claus writes:

“The procedure for this upgrade is basically the same as in the article except for the following points: If your Antic (U7) part number is CO21697, use the circuit of the figure [Figure 2] excluding the area inside the dotted lines. If it is CO12296, include the circuit inside the dotted lines. The circuit requires five connects to the PIA (U23). So, pins 12 through 16 must be bent up and connected to the circuit. The rest of the procedure is the same. Notice that this circuit has one more chip than the article’s circuit. This is the price of compatibility.

“With the 256K dynamic RAMs in your XL, be sure to wait at least ten seconds after turning the computer off. Otherwise it may not coldstart properly when you turn it back on. My original RAMdisk software doesn’t work with this new mod. You may download [the new version] from the Capitol Hill Atari Owners’ Society BBS at 517-371-1106 or from the Castle Communications board at 517-371-4234. The source file is called QMEGXLD.SRC for Quarter-Meg XL Double. Also available is a RAMdisk program that sets up on single-density RAMdisk and leaves the XE-equivalent banks free for XE software. This is quite useful with BASIC XE, DOS 2.5 or the newer Synapse software. Its name is QMEGXLS.SRC.”

“I ask one thing in return for this information: Please pass it around to all your interested friends. Put it in your club’s library or on your favorite BBS. Encouraging software support of 256K will result in many interesting uses for it. Thank you and enjoy—

Claus Buchholz

We owe a thousand thanks to Claus Buchholz and the C.H.A.O.S. users group of Lansing, Michigan. Figure 2 shows the parts list, the memory control register and the schematic diagram.

Newsletters

In the mail this month comes the Michigan Atari Magazine, the newsletter of the Capitol Hill Atari Owners’ Society, and a number of other independent groups including the Washtenaw Atari Users Group, the Tri-City Atari Group, the Greater Kalamazoo Atari Users Group, the Cascades Atari Computer Enthusiasts, the Genesee Atari Group, and the Battle Creek Atari Users Group. Through their combined resources, the group has produced one of the most attractive and professionally prepared newsletters I have ever seen. The 30-page February 1987 issue contains “Rumors,” “Atari News,” and articles for the 8-bit and ST written by the independent groups supporting the newsletter. ($12/yr. subscription, C.H.A.O.S., Michigan Atari Magazine, P.O. Box 16132, Lansing, MI 48901.)

F.L.A.G. is the newsletter of the First Lawton Atari Group. The February issue contains “8-bit News” and some ST articles. (F.L.A.G. Newsletter, First Lawton Atari Group, 2506 N.W. 7th St., Lawton, OK 73507.)

Network: Atari and the Progressive Atari Computing (PAC) Users Group have announced two interesting newsletters. The Hard Disk Users Group (HDUG) Newsletter is a special interest newsletter for 8-bit and 16-bit Atari owners using hard drives. The group is taking free advertisements for its first two issues. NANN, the National Atari Newsletter Newsletter, is the group’s other venture. Chuck Leazott, president of PAC, describes NANN as a compendium of the best articles, reviews and notefiles from all the newsletters sent in to PAC. (Network: Atari and PAC Users Group, P.O. Box 196, Rantoul, IL 61866-0196.)

Next Month

We’ll begin entering the bank account recordkeeping and checkwriting program mentioned last month. Meanwhile, if you’re interested in the program, you might want to start looking at continuous checks for computer printers. Well-known national suppliers are NEBS (1-800-637-0118) and MOORE (1-800-828- 7946). Request their “Computer Forms” catalog when you call.

Reader’s questions, comments and contributions are welcome. Please enclose a self-addressed, stamped envelope (SASE) for a personal reply. Due to volume of letters received, only a selected number of personal responses can be given each month.

Program Perfect” is a utility used to check for typing errors while entering programs from this column. Readers can send $5 for a diskette or a SASE for a listing of this program.

Address all correspondence to: Jeff Brenner, “Applying The Atari 5/87”, c/o Computer Shopper, P.O. Box F, Titusville, FL 32781-9990. •


Roman:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
Ohio:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567898
Sans-Serif:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
Block:
ABCDEFGHIJKLMNOPQRSTUVWXVZ
abcdefghijklmnapqrstuvwxyz
1234567890
Script:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1254567890
Figure 1. Daisy Dot type styles.

PARTS LIST 

8  41256  256K-bit dynamic RAM (200ns or less) 
1 74LS153 Dual 4-to-l multiplexor 
1 74LSI39 Dual 2-to-4 decoder 
1         33 ohm, 1/4 watt resistor 

ADDITIONAL PARTS FOR ANTIC #C012296 

1 74LS158 Quad inverting 2-to-1 Multiplexer 
1 74LS393 Dual 4-bit counter 

DEFINITION OF MEMORY CONTROL REGISTER AT $D301 (54017 DECIMAL). 

XL MOD. 

bit: 7 6 5 4 3 2 1 0 
     D a b E c d B R 

D=0 enables diagnostic ROM 
B=0 enables BASIC ROM 
R=1 enables OS ROM 
E=0 enables extended RAM 
abcd is 4-bit extended RAM bank # 
    - ranges from 4 to 15 
    - banks 12 to 15 are equivalent 
    to XE’s banks 0 to 3 

130XE 

bit: 7 6 5 4 3 2 1 0 
     D   V C x y B R 

D=0 enables diagnostic ROM 
B=0 enables BASIC ROM 
R=1 enables OS ROM 
V=0 enables extended RAM for video 
C=0 enables extended RAM for CPU 
xy is 2-bit extended RAM bank # 
    - ranges from 0 to 3 
Figure 2
COMPUTER SHOPPER / DECEMBER 1988 / PAGE 298 

Applying The Atari

by Jeff Brenner

Welcome to our annual holiday column, where we’ll take a look at many of the fine new products that have become available for the 8-bit Atari computers and the XE game machine during 1988. But first, a quick look at some reader mail.

Reader Mail

Dear Jeff:

Your August 1988 column was of great interest to me. I use an Atari 800XL with a 1050 disk drive and a Panasonic KX-10801 printer.

This letter is written using the revised PaperClip (without key), which is a gem. I also purchased the Synapse trio—SynCalc, SynFile+ and SynTrend. SynCalc and SynTrend meet my current needs. SynFile+ gives me a lot of grief.

Your column mentioned TurboBase, which could be a solution to my problem. Where can I find some information about it and where can I purchase it?

Aaron J. Blumberg
Boyne Falls, MI

TurboBase is a full-featured database from MicroMiser Software. It offers an integrated file manager, report generator and word processor and handles open invoicing, statements, accounts, receivable/payable, inventory, payroll and more. The program can utilize the ICD Multi-I/O Board’s RAMdisk capability to provide up to 1MB of quickly accessible data storage. For an 8-bit program, it is remarkably versatile and powerful, but at the same time will require a substantial investment of learning time to make the most of its features. The switch from SynFile+ to TurboBase will be far from a natural one, since the two use very different approaches in setting up applications. The benefits of TurboBase, however, may be well worth the switch, depending upon your needs in a database. The complete program with extensive documentation sells for $179. A review of TurboBase appeared in the August 1987 Computer Shopper. For additional information on TurboBase, contact: MicroMiser Software, Inc., 1635-A Holden Ave., Orlando, FL 32809.


Dear Jeff:

I want to add an Epson parallel printer to my system and wanted to use the MPP1150 interface only to find out that it will not work with the 1200XL. I was told by a dealer that the computer has to be modified by adding a wire to the board. I can make this modification myself if it could tell me where to add this wire. Any help or advice you or your readers could give will be greatly appreciated.

Lorenzo Gasperini
Towaco, NJ

I assume the dealer would not be more specific in describing the necessary 1200XL modifications. There were a number of quirks found in the 1200XL that made the machine incompatible in some respect with the other 8-bit models, and the discoveries of the bugs were often followed by suggested remedies or hardware fixes. I don’t recall nor have documentation on the fix that you mention so I’ll have to leave this one to my readers. If anyone can provide information on any such modifications, please write in and let us know. Otherwise I would recommend one of two things: Pick up an interface that will function properly with the 1200XL; or, buy yourself an inexpensive 65XE (or even a 130XE) to eliminate the 1200XL headaches while still maintaining compatibility with your software base.

1988 Holiday Shopping List For The 8-Bit Atari

Here is a compilation of many of the new 8-bit software products that have appeared during the year. All of the following products are to be in stores by December 1988 (except public domain programs, or course), although some products have not yet been released as of this writing. Readers are reminded that while some of my comments on the programs that follow are based on my own observations of the program, many are also based on manufacturers’ product descriptions, particularly in cases where the product has not yet been released. The products are listed in alphabetical order:

Alfcrunch is a remarkably efficient file compacter that saves both time and disk space. It is public domain software and can generally be found on bulletin boards.

BASIC TurboCharger by J. Bader is actually a combination book and diskette package. The 128-page book and its accompanying diskette contain dozens of short machine language routines that you can incorporate into your own BASIC programs to allow your BASIC programs to perform various operations at machine language speed. The routines include memory movers, screen data manipulators, data searches, sorts, Display List Interrupt and Vertical Blank Interrupt routines, disk operations, player/missile graphics routines, number systems conversions, bit operations and many others. The package is $24.95. Contact: Alpha Systems, 1012 Skyland Drive, Macedonia, OH 44056, 216-467-5665.

The Celebrity Cookbook, Vol. I from Merrill Ward and Associates, is a home catering program that contains approximately 50 celebrity recipes collected by such notables as Sophia Loren, Frank Sinatra, Bob Hope, Ronald Reagan, and others. A wine and bar guide, party tips, diet secrets of the celebrities and a personal recipe filer are included. The program is $34.99 from Shelly Ward and Associates, 255 North El Cielo Road, Suite 222, Palm Springs, CA 92262. 619-320-5828.

The Converter is a utility program for Atari users of The Print Shop, Newsroom, Awardware and Printpower. The Converter will allow icons for these programs to be converted from their original format to other formats needed by these programs. The Converter also allows materials to be added to your Print Shop icons to add details beyond the Print Shop format so that the icons will improve their look for these “larger format” picture programs. This is accomplished by using the Converter’s graphics editor, which will also allow the creation of your own graphics from scratch to be used with the higher resolution printing programs. The Converter is $19.95. Contact: No Frills Software, 800 East 23rd Street, Kearney, NE 68847, 308-234-6250.

Cross-Town Crazy Eights from XLENT Software lets you play against one of three computer opponents. Or, if you have a friend with an Atari, modem and Cross-Town Crazy Eights, you can play against each other and up to two computer opponents. The program lets you make an “answer only” copy of the program to give to your friends so that you can play against them even if they don’t own a copy of the program. The “answer only” copies function only when playing by modem against the owner of an original disk. Contact: XLENT Software, PO Box 5228, Springfield, VA 22150, 703-644-8881.

Daisy-Dot II is an excellent near-letter quality printer driver for the 8-bit Atari which works with Epson, Star Genini, or graphics compatible printers. This is the newest version of Daisy Dot by the original author, Roy Goldman. The program consists of the Print Processor, which handles the actual printer of text; the Font Editor, which allows you to create and edit Daisy-Dot fonts; and the Font Utilities program, which converts standard Atari fonts into the Daisy-Dot format. Fourteen fonts are included on the Daisy-Dot II diskette. The most surprising aspect of Daisy-Dot II is that it is public domain software! The author relies on contributions to encourage him to continue programming other 8-bit goodies. Contact: Roy Goldman, 2440 South Jasmine, Denver, CO 80222.

Determ is a new terminal program in the public domain with versions for the XM301/1030, 850, MPP and SX212 modems. The program features drop down menus and a breakout game that can be played while downloading. It is generally available on bulletin boards for downloading.

Diamond is a graphic operating system for the 8-bit Atari. The program offers cursor control with the keyboard, joystick, touch tablet or mouse and also features drop-down menus, desk accessories, dialog boxes, windows, and more. Diamond includes the DeskTop software which allows the use of all DOS functions without the need for typed commands. Diamond is $29.95 and will apparently be distributed by Merrill Ward and Associates (address previously listed) after the company dropped plans for its own Graphics Operating Environment.

Enhancements to BASIC II by Ronald C. Hathaway, adds many useful commands to revisions A, B and C of Atari BASIC including program traces, variable name changes, string searches, multiple line deleting, line renumbering, automatic line numbering, DOS commands and more. The 48K diskette includes a 27-page instruction booklet and reference card and sells for $24.95. Contact: Hathaway Electronics, PO Box 168, Rices Landing, PA 15357, 412-592-5981.

The Lotto Program analyzes past winning lotto numbers and gives probability charts on the frequency with which specific numbers are chosen. Graphs let you see trends and patterns, odd/even numbers, sum totals, number frequency, digit groups and more. The 48K diskette is $24.95. Contact: SoftByte, PO Box 556, Forest Park, Dayton, OH 45405, 513-233-2200.

The Newsroom was finally released thanks to a letter writing campaign by thousands of 8-bit Atari owners and users groups. The popular newsletter designing program features over 600 clip art pieces that can be incorporated into newsletters, a built-in word processor that uses up to five fonts, and automatic layout such as wrapping text around pictures. Newsroom is $49.95. Also available from Springboard are three volumes of additional Clip Art collections. Clip Art Collection, Vol. I contains over 600 pieces of general occasion art; Vol. II contains over 800 pieces of business related clip art; and Vol. III contains over 600 pieces of sports/recreation art. Each clip art collection retails for $29.95. Contact: Springboard Software, PO Box 141079, Minneapolis, MN 55414-6079.

No Frills Software released a number of new graphics diskettes for PrintShop users. The Fonts & Borders Disk #3 includes the first upper/lowercase font commercially available for PrintShop. Fonts & Borders Disk #4 includes nine new upper/lowercase versions of fonts from previous disks. Many other disks are available and all of the graphics images are reproduced in a catalog available from the company. Contact: No Frills Software, (address previously listed).

The RAMdisk Protector is a hardware and software package for XL/XE computers that simulates a power-up for immediate exit from programs or lock-ups. The software then enables DOS to recognize and provide immediate access to the RAMdisk, thereby recovering the RAMdisk’s contents. Both the hardware and software are entirely transparent. Included with the product are DOS enhancements for support of Atari DOS 2.5 and SpartaDOS. The RAMdisk Protector is $22.95. Contact: Logic One, Hardware/Software Development, PO Box 18123, Cleveland, OH 44118-0123.

Video Title Shop was at last released early this year, after a delay of ten months. Created by DataSoft/Intellicreations and distributed by Electronic Arts, Video Title Shop allows you to create colorful, animated title screens to add to your business, school or home videos. The program supports numerous font styles and sizes and lets you incorporate picture backdrops from other pain programs. The MicroPainter plus program and the Graphics Companion I diskette are included with the program. It’s $29.95. Contact: Electronic Arts, 1820 Gateway Drive, San Mateo, CA 94404, 415-571-7171.

Win At Lotto is a computerized implementation of one of the most popular wheeling systems currently available, according to Vern Smith of Phantasy Software. The program incorporates five separate wheels, plus win detection routines. It is 100% machine language and has on-screen documentation. It’s $24.95 from Phantasy Software and Electronics, Inc., P.O. Box 13474, Portland, OR 97213.

New Hardware Products

New software isn’t the only thing that has appeared for the 8-bit Atari over the past year. Here are some interesting new 8-bit hardware products:

Easy-Scan is a digitizer that transforms an image from your printer to the computer screen. Using fiber-optics to link the computer and the printer, Easy-Scan interfaces via the cartridge port and digitally scans an image up to 75% of the area of an 8½×11″ sheet. Digitized pictures are saved in standard 62 sector file format. The included software allows for the control of display color, size, clarity and graphics mode. Also supplied are conversion utilities to convert the images to other popular formats, such as Print Shop. Easy-Scan is $79.95 from Innovative Concepts, 31172 Shawn Drive, Warren, MI 48093; (313) 293-0730.

ICX-85 Keypad is the answer to software incompatibility with a keypad handler. The ICX-85 keypad is wired directly to the 8-bit keyboard—a press on the keypad has the same effect as pressing the corresponding key on the keyboard and thus works with any software. Installation requires soldering a 12 wire connector into the computer and plugging the keypad into the connector, so get help with this one if you tend to be dangerous with a soldering iron in your hand. The keypad is $44.95 from Innovative Concepts (address previously listed).

MIDIMax is a MIDI interface for the 8-bit Atari that is compatible with all existing 8-bit MIDI software and also includes MIDI Music System software (MMS), an AMS (Advanced Music System) to MMS converter, sample song files, and two six-foot MIDI cables. MIDIMax has a built-in I/O port for daisy chaining with other Atari peripherals. It’s $225. Contact: Wizztronics, P.O. Box 122, Port Jefferson Station, NY 11776.

P.O.S. Net, or Point-Of-Sale Network program, from Xenia Research, is a barcode reader for the 130XE (or any 8-bit Atari expanded to 128K) that includes software for point-of-sale applications, invoice generation, barcode reading and printing and reports. Another program, entitled XR-100, is included, which allows you to incorporate the barcode reading into your own software. Other 8-bit Atari computers can be used as terminals for a main system. The complete package, which consists of P.O.S. Net, the barcode handler and reader, and XR-100 software with documentation is $189. Alternative packages are available. Contact: Xenia Research, P.O. Box 4675, Federal Way, WA 98003; (206) 927-7108.

RAMdrive + XE-GM1 is a memory upgrade for the Atari XE Game System that expands the memory of the machine to 128K, thereby enabling the XT Game System to run 130XE compatible software. Soldering and desoldering is required for installation. The upgrade is $34.95 from Innovative Concepts (address previously listed).

The Six System Box from Irata Verlag is for XL/XE computer owners who use multiple operating systems or who intend to acquire additional operating systems. The box lets you select from among six different XL/XE operating systems (you must obtain the OS chips) with the flip of a switch. Six LED lamps on the front of the box indicate which operating system is currently in use. Some of the OS chips offered by Irata Verlag include the High Chip XL ($70), for owners of Happy drives, which lets the computer run slightly faster and provides a special menu for shutting off, slowing down, or slow-loading with the Happy on; The High Chip XE ($120) is another OS chip available. This one sets up a RAM disk in the computer as soon as the computer is turned on. Contact: Irata Verlag, 1272B Potter Drive, Colorado Springs, CO 80909.

The SX212, the 300/1200 baud modem from Atari was finally released this year. The SX212 features full Hayes compatibility, an SIO port for connection to Atari 8-bit computers, an RS-232 port, built-in speaker, and the Hayes standard array of eight LEDs. It’s $99.95. Contact: Atari Corp., 1196 Borregas Ave., Sunnyvale, CA 94086; (408) 745-2000.

The Super Turbo Interface is a printer interface for the 8-bit with an 8-bit buffer that allows the addition of two drives (such as IBM or ST 3.5 or IBM 5.25) and a booster system that allows speeds of 150,000 baud. Contact: Irata Verlag (address previously listed).

The XF551 is another long awaited product from Atari that finally reached store shelves this year. The XF551 is a double-sided true double-density disk drive (5¼″). The drive runs almost three times the speed of the 1050 and includes ADOS, a specially designed DOS from Optimized Systems Software that takes advantage of the double-sided, double-density capacity. The drive retails for $199.95. Contact: Atari Corp. (address previously listed).

Next Month

We’ll explore what’s in store for your 8-bit Atari in 1989 and beyond. And we’ll look at more reader mail and user groups’ newsletters.

Readers’ questions, comments and contributions are welcome. Address all correspondence to:

Jeff Brenner
Applying The Atari, 12/88
P.O. Box F
Titusville, FL 32781 •
COMPUTER SHOPPER / MARCH 1989 / PAGE 262 

Applying the Atari

by Jeff Brenner

This month, we’ll take a look at some new products for the 8-bit Atari, solve a 1200XL incompatibility problem, and learn about repair services for the 8-bit Atari.

AutoPrep

AutoPrep is a new product for all 8-bit machines that automatically formats blank disks without the need for calling DOS. Helpways, the manufacturer, describes the product as follows:

A unique utility program for all Atari 8-bit machines, AutoPrep completely eliminates the need to call DOS and suffer its endless repetition of prompts and slow copying procedures when initializing disks.

AutoPrep automatically formats blank disk in single or dual (enhanced) density and writes your choice of DOS and autorun files to them. You can choose to initialize with DOS.SYS alone, the usual DOS.SYS and DUP.SYS (either DOS 2.5 or 2.0), or no DOS files. Autorun file choices include almost any AUTORUN.SYS, RAMDISK.COM, both, or none. You can even initialize with a BASIC program by temporarily renaming it AUTORUN.SYS.

After the title screens, AutoPrep asks a series of questions to learn how you want disks initialized, then follows your instructions until told to change. After initializing one side of a disk, the program beeps and asks if you wish to do the other side the same way, do another disk, or change your instructions. Answer no to all three and the program ends.

AutoPrep brings you major benefits in convenience and speed, since you can do something else while disks are initialized. It also spares you a lot of typing and annoyance by automating the whole procedure. In fact, the more disks you initialized, the more you’ll appreciate your new freedom from the tyranny of DOS.

At $14.95 plus shipping, the cost is somewhat steep for a program that essentially formats disks for you, but may be worth the price in speed and convenience if you usually have many disks to format. A significant limitation is that it is currently compatible only with DOS 2.0 or DOS 2.5. A more detailed review will appear in a future issue. For more information, contact: Helpways, PO Box H, Rochester, NY 14623.

SpartaDOS X

For XF-551 disk drive owners who have been patiently waiting for XE-DOS and all other disk drive owners who yearn for a better DOS, SpartaDOS X from ICD Corporation might be the perfect solution. As a ROM cartridge, SpartaDOS X is instantly active and does not eat up any valuable user memory. Plus, the DOS supports the Atari 800 (unlike SpartaDOS 3.2) in addition to the XL and XE machines, and can handle virtually any Atari-compatible drives, including the XF-551, with its unique features.

Reader Mail

A number of readers wrote in with information on the 1200XL in response to Lorenzo Gasperini’s question in the December 1987 column regarding using the MPP1150 interface with the 1200XL.


Dear Jeff:

I read in the December issue of Computer Shopper that Lorenzo Gasperini is having some difficulty making the MPP1150 work with his 1200XL. I believe that the modification required is the very simple one described. I have excerpted it from the P:R: Connection owners manual. My thanks to ICD for this information.

Carefully disassemble the computer case and locate resistor R63 on the printed circuit board and replace it with a jumper wire. Resistor R63 is near the top of the board and near the center; it is to the right of the transistor Q3. R3 is a current limiting resistor and will prevent any device from drawing power from the serial port. Devices which do this are the P:R: Connection, the XM301 modem and the MPP1150.

Keep up the fine column.

Eric Andersen
Dover, Delaware

Dear Jeff:

This is in response to the letter concerning a modification requirement for the 1200XL computer for the MPP1150 interface to work. This letter was printed through a P:R: Connection using a 1200XL system. I am assuming that the modification for the MPP1150 is the same one that is required for the P:R: Connection. The 1200XL uses a current limit resistor to limit current going out the I/O port in the rear of the computer. This resistor prevents the 1200XL from using any peripheral which draws power from the computer. To alleviate this problem you must remove the resistor (R63) and replace it with a jumper wire. A small piece of 24-30 gauge wire should do the trick. Most peripherals that require power from the computer will now work. With the comment about buying a 65XE or 130XE to eliminate the “problems” of the 1200XL, I have yet to have any problems with my system. I’m really happy with my 1200XL. So happy that I’ve decided to NOT purchase an MSDOS clone. The Atari (with the software that I have) will do everything those clones will do, and with the memory upgrade that I have installed, I can run the 130XE software, like the 130XE version of PaperClip that I’m using to write this letter. So all I have to say is that the 1200XL is a great computer. Now if we could only get Atari Corp. to acknowledge that the 8-bit is not dead, we’ll be in great shape. P.S. This letter was printed using Daisy Dot II.

Robert A. Baczek
Egling AFB, Florida

Thanks for writing. My comment about replacing one’s 1200XL with a 65XE or 130XE was perhaps a bit premature, and should apply only to those experiencing substantial software and/or hardware incompatibilities, although this modification and other fixes may correct any problems. Let me also thank readers Walter Korzyk, of Albany, New York, Paul Siu of Darby, Pennsylvania, Edward Liao of Brooklyn, New York, and an anonymous reader from Brighton, Colorado for providing additional detailed information, as well as readers who wrote in to help. Mr. Siu sent along information from the booklet, “Mods, Fixes and Upgrades.” 1200XL owners will be interested in the booklet’s “Souping Up the 1200XL” article by Paul Smith. The article describes the modification discussed above for printer interfaces and also discusses fixing the Serial I/O Connector, adding chroma output and adding an XE-compatible 256K upgrade. The “Mods, Fixes and Upgrades” booklet also contains articles on expanding the memory of the 800, 800XL and 130XE, fixing the XE console keys, hardwiring the CX-85 keypad, adding a 1050 write-enable switch, using four joysticks with the XL/XE and more. The booklet was compiled by the Midwest Atari Group—Iowa Chapter (MAGIC), PO Box 1982, Ames, IA 50010-1982.


Dear Jeff:

I’ve been trying to locate where I can get my 800XL repaired, with no luck. Do you know of any repair centers where I can get service?

Stephen Mattick
Tacoma, Washington

Atari Corp. will repair or replace your 8-bit computer (at its option) for a flat rate of $50 (or $65 for an Atari 130XE). The flat rate for repair/replacement of an 810, 1050 or XF551 disk drive is $75. A unit sent for repair should be securely packaged and insured for its value. For additional information, contact: Atari Corp., Customer Service, 390 Caribbean Dr., Sunnyvale, CA 94089.

A number of independent companies also provide 8-bit repair service, such as American Techna-Vision (15338 Inverness St., San Leandro, CA 94579) and Innovative Concepts (31772 Shawn Dr., Warren, MI 48093.) Other companies providing repair service or parts for the 8-bit Atari’s can write in to be listed.

Recently, I’ve printed several letters from satisfied ATR-8000 users. In fairness, here’s one with another point of view:


Dear Jeff:

I see the ATR-8000 is surfacing in your column. I had one, so I can’t resist a comment about it.

InfoWorld gave this unit a nice writeup when it first came out, but I found it frustrating. Most of its capabilities are outmoded. Yes, it’s a modem interface, and offers a printer port: so does the 850, or the P:R: Connection. Yes, you can connect 8″ drives (ever tried to find desk space for an 8″?) and standard drives, but who needs them with the Indus and now the double-sided Atari unit available? Ah, yes...you can run CP/M. Now, before you buy this— stroll into your favorite computer store and ask to see their CP/M selection. Commercial CP/M software is deader than commercial 8-bit Atari software! The public domain stuff was written by hackers with “a user-friendly interface substantially ignored.” And the best part—CP/M was written for an 80 column screen. The ATR-8000 jockey gets to enjoy horizontally scrolling his 40 column window, unless he has an 80-column card.

The ATR-8000, to me, was less useful than a RAM expansion card for my old 800. At least I can—with the right DOS—use that for a RAM disk.

My advice would be to pass up ALL expansion—enjoy your 800 in its pristine 48K glory. You’ll have some nice programs (PaperClip, SynCalc, SynFile, Print Shop, 1030 Express) which work and are a joy to use. If you outgrow that, you don’t need an upgrade—you are buying frustration and wasting your money. Go to MSDOS. You’ll get 640K and all the fine software modern talent can provide. It’ll be well integrated, and “transparent.” Like your old 800, a joy!

The ATR-8000 and its twin Shugarts were discarded long ago. My old 800 with its single Indus GT sits proudly underneath its Zenith monitor, right by my IBM. It’s still used, though not as often as before. For me, MSDOS has picked up where it left off.

Bill E. Barry
Tampa, Florida

And now, a letter on the 8-bit “dead or alive?” controversy.


Dear Jeff:

We’re tired of hearing all the talk by magazines and software developers that the 8-bit Atari’s are dead and would like to share our story of how we get along with our “outdated” 8-bit Atari. We use our AtariWriter Plus, in combination with a letter quality printer that we got as a “steal” from an advertiser in Computer Shopper. The program is easy enough to use by all members of our family and its gets our writing tasks done in record time. But most importantly, you couldn’t tell the finished document from one that came from out of a Commodore, an Apple, or even an IBM for that matter. What amazes us is how stand-alone consumer word processors these days sell for around $500, yet our 8-bit Atari system with disk drive and printer cost less, yet can do so much more besides word processing. We keep mailing lists for our personal and business needs, and use an old but quite adequate database program to keep records for our home business. The kids get games at closeout prices that are just as entertaining as they were when they were originally released. And they’ve also been introduced to programming by learning how to use the BASIC language built into the machine.

We believe that Atari Corp. wants to see the 8-bit Atari’s die because they think that we’ll all run out and buy brand new ST computers. Not us— never. Our 130XE system offers us everything we need from a computer system. Anyone who suggests that we would be better off dumping our useful software collection and data disks and buying a brand new ST (or an Amiga, or an IBM) where we would have to start all over again, with more expensive software, is crazy. The 8-bit Atari is very much alive in our house, and will continue to be so until its operating life has truly ended, completely beyond repair. And even then, we’ll have to find another 8-bit machine to take its place.

The Albert Family
Lakewood, California

What a comforting, reassuring letter for the 8-bit community! Let’s hope the software manufacturers begin to get the message.

Are You Applying Your Atari?

In the months ahead, I’ll be publishing other letters from 8-bit Atari owners who are making the most of their machines for home, business, and/or educational applications. If you would like to share your experiences using your 8-bit Atari system with other readers, please write it down and send it in. Please describe your system in full and specify the software packages you are using. Photos are welcome, and will be used when space permits.

Readers’ questions, comments and contributions are welcome. Send all correspondence to:

Jeff Brenner “Applying The Atari, 3/89” c/o Computer Shopper PO Box F Titusville, FL 32781-9990 •