1422 lines
66 KiB
Plaintext
1422 lines
66 KiB
Plaintext
_________________________________________________________________________
|
|
|///////////////////|ZMagazine June 27, 1988 Issue #112|
|
|
|///////////////////|___________________________________________________|
|
|
|///////////////////|___________________________________________________|
|
|
|///////////////////| American Publishing Enterprises, Inc |
|
|
|////////////////// | Post Office Box 74 |
|
|
| //////// | Middlesex, New Jersey 08846-0074 |
|
|
| //////// |___________________________________________________|
|
|
| //////// | Publisher/Editor: Ron Kovacs |
|
|
| //////// | Sales Manager : Gary Gorski |
|
|
| //////// | Assistant Publisher: Stan Lowell |
|
|
| //////// |___________________________________________________|
|
|
| //////// |**Syndicate BBS down for vacation. |
|
|
| //////// |___________________________________________________|
|
|
| //////// | Where to communicate with ZMag/ST-Report/AMy-Rpt |
|
|
|///////////////////| CompuServe: 71777,2140 |
|
|
|///////////////////| GEnie : R.KOVACS or ST-REPORT |
|
|
|///////////////////| Delphi : RONKOVACS or REXREADE |
|
|
|///////////////////| The Source: BDG793 |
|
|
|___________________|___________________________________________________|
|
|
|June 27, 1988 #112|Table of Contents|
|
|
|___________________|_________________|
|
|
|
|
<*> Editors Desk.......Ron Kovacs <*> ZMAG Confidential.....Ron Kovacs
|
|
<*> Reader Commentary....Jack Lee <*> Basic Programming..Jackson Beebe
|
|
<*> Action Prgm'g.....D Arlington <*> Up/Coming..............Bill Pike
|
|
<*> Celebrity Cookbook..Bill Pike <*> ST Modification.......Jeff Rigby
|
|
_______________________________________
|
|
EDITORS DESK by Ron Kovacs
|
|
_______________________________________
|
|
|
|
This week I am writing commentary about BBS Software and Hard Disk
|
|
systems. You can call it a bitch session if you choose. I really do not
|
|
comment in these pages that frequently. I am on my soapbox this week
|
|
because I have been battling more BBS problems.
|
|
|
|
As some of you know, I have been running different BBS software over the
|
|
last few years. Many comment that I am changing software too many times
|
|
and should at least stay with something for at least a year. I totally
|
|
agree and have made some mistakes, however, what I have gained in
|
|
knowledge about them all is well worth telling.
|
|
|
|
I really haven't seen many articles written about problems with BBS
|
|
software. They are all either running well, or I am making some big
|
|
mistakes. We all make errors, but I refuse to believe that I am the
|
|
only person in the world with BBS problems. If you are a BBS sysop and
|
|
have expirenced problems, please take a few minutes out and drop me a
|
|
note. I am very interested in knowing what the heck the real story is.
|
|
|
|
I wrote the following over the last few days, It might even be taken as
|
|
a direct blow to some, but it is honest and written with facts I have
|
|
expirienced over the last three years. Feedback about this editorial is
|
|
welcome and appreciated. Now, Let me hop on my soapbox and begin.
|
|
|
|
Having been a BBS SysOp for close to 3 years and telecommunicating for
|
|
more than 5 years, I have seen BBS systems come and go. New BBS software
|
|
is released about every 6 months and rise and fall just as fast as it is
|
|
released. BBS users are just as fast in disappearing.
|
|
|
|
Running a BBS requires many hours of preparation and dedication. You
|
|
have to select a program that you feel will best service your needs and
|
|
the needs of your users. When selecting software, you know right away
|
|
if it something you want. I guess the best choices are made by calling
|
|
other systems and finding the software pleasing. The choice is then made
|
|
to purchase it and off you go. This article will discuss a short history
|
|
of my problems with a few BBS programs and take you to the present
|
|
problems encountered with another recently released program.
|
|
|
|
Back in 1985, I thought about putting up a BBS of my own, ZMagazine
|
|
wasn't even a thought at the time and my particular area didnt really
|
|
have an Atari BBS locally. We had the JACG and Scott Brause, but nothing
|
|
else really worthwhile, locally. After a few months of pondering on what
|
|
I wanted, I researched and decided to try out FoReM MPP. I had only an
|
|
MPP modem at the time. The 1030 couldn't answer a phone and cost for a
|
|
better modem wasnt attractive at the time. The rest of my configuration
|
|
was an 800XL, Indus GT and a 1050 Disk Drive. I decided to go with FoReM
|
|
26M and on July 21, 1985, the Hudson BBS was born, later in September the
|
|
name was changed to the Syndicate BBS.
|
|
|
|
We ran this software at 300 baud until May 1986. The best thing we were
|
|
able to do is modify and add code, spruce up commands etc... We
|
|
encountered few and far between problems. This was the ONLY time in
|
|
Syndicate BBS history we ran 9+ months without serious problems. Then it
|
|
all began in May 1986.
|
|
|
|
We discussed the idea of moving to 1200 baud. Having just purchased an
|
|
Avatex 1200 modem, we wanted software that could handle the task. I had
|
|
also recently ordered the New Supra Atari Hard Disk System. The 10 Meg
|
|
Hard disk with it's own interface. Being one of the first owners of the
|
|
system, I was pretty excited about upgrading, However, Forem would run
|
|
with MyDos, and SpartaDos wouldn't run with it either at the time.
|
|
Upgrading hardware and modem to 1200 baud and no BBS software to run.
|
|
Wait!!! Antic is selling the same software the JACG BBS uses! Lets look
|
|
into it!
|
|
|
|
BBCS! A very well written software package. It did have it's problems as
|
|
most everyone knows, however, I am sure with the proper marketing and
|
|
better beta testing, alot of the problems of that time would have been
|
|
rectified. Not only did it take 2 weeks to set-up, but I don't think it
|
|
lasted more than 2-3 months. I am sure you all know the story behind
|
|
BBCS! There are still a few systems around running it and they are happy
|
|
with it. (I hope) We are considering at this time to take another look at
|
|
BBCS for some testing to see where the bugs still exist if any.
|
|
|
|
After a Hard Disk crashed, software problems, fixes to the software,
|
|
calls to Supra and other minor problems, we killed this sucker off and
|
|
went to another problem software, Carina I, this ran well for about 3
|
|
days also, but was soon discovered to be locking up at the drop of a pin
|
|
and again was pulled from usage. Then in December 1986, Express BBS.
|
|
Christmas and the modem, after a day or so set-up, we were off and
|
|
running for a clear 6+ months of trouble free service until another Hard
|
|
disk crash and the debut of Oasis.
|
|
|
|
Oasis I and II were a good addition to the BBS software area. Well
|
|
written, decent price and excellant support. A commendable job to Leo
|
|
Newman and Ralph Walden. Leo is missed from the 8 bit community. He is
|
|
still working hard I hope. Until Glenda Stocks bought the software, or
|
|
took over thr rights to it. I am really not sure on the details, but many
|
|
of you know who I am talking about. The lady who comments in numerous
|
|
BBS discussions around the country and lands punches on the other
|
|
software writers. We should get Bill Brown and Glenda Stocks in a ring
|
|
somewhere so they can battle it out!.. I wonder who will win.. Well,
|
|
Glenda made some improvements to the program and continues today with
|
|
Oasis IV and Oasis Jr. the public domain version of Oasis.
|
|
|
|
Well, sorry to say this software lasted 6 months. Great at the start
|
|
with Leo helping me with minor misunderstandings (which were my fault for
|
|
not reading the documentation properly.) But the problem with Oasis
|
|
would not surface until later. Instead of a preset message base size,
|
|
Oasis appends messages( read on later about Hard Disk problems). Oasis
|
|
was doomed sooner or later, well, sooner came quicker than expected, 6
|
|
months after running Oasis II and III, it again was another notch on my
|
|
BBS belt as a failure.
|
|
|
|
At this time I had decided to retire from BBS sysoping. I really wasnt
|
|
pleased about going through it all again. Carina II, Express Pro, Oasis
|
|
IV, Nightlite, BBCS 2.4 etc.... I stayed away from the SysOp role for two
|
|
months and came back with FoReM XEP.
|
|
|
|
FoReM XE Professional, this public domain release contains features from
|
|
3-4 different BBS programs. Running with Basic XE and Spartados, it is
|
|
definately one of the better systems available. The support was great and
|
|
the system ran very well. Again, another success here. All this brings
|
|
us to the final days of trouble. After FoReM XEP, we went with Carina
|
|
II. I did so because of the impression left by the demo and the
|
|
extensive time I spent working on the special Carina ZMag issue a few
|
|
months ago. The entire revamping of Carina I is not without its problems
|
|
and holes. I have tried standing by the software for the last two months,
|
|
and honestly have to say that it was a mistake. Here is a list of some
|
|
problems encountered with this software in just the last 4-6 weeks:
|
|
|
|
<*> Lock-ups
|
|
|
|
This software locked up when a caller hung up, when a caller changed
|
|
sigs, or did any type of moving around the system.
|
|
|
|
After a caller would logoff the system, the waitcall section would then
|
|
be loaded to reset the system for the next caller. Of the 60 days I ran
|
|
this software, a total of 87 lock-ups. This would be a frustrating
|
|
feature if I were to continue usage of the software.
|
|
|
|
<*> Disconnects
|
|
|
|
A user was hung up on just traveling around the system.
|
|
|
|
<*> Uploads and Downloads
|
|
|
|
Uploads to the BBS are placed in a holding area for sysop validation at a
|
|
later time. When the files are validated, the SysOp has the option of:
|
|
|
|
A). Validating the file.
|
|
B). Erasing the file.
|
|
C). Editing the description.
|
|
|
|
A few notes here about this. If the user uploaded the file with a
|
|
mistake in the filename or without an extender, there is no way to
|
|
correct it, unless you use a sector editor. Re-editing a users file
|
|
description is a great feature. If you do so, the user uploading the
|
|
file is lost and your name is placed as the uploader. When a user uploads
|
|
a file and the file is aborted, 9 times out of ten, you will see
|
|
everything there except a no byte count and a sometimes (File Not Found)
|
|
message next to the filename.
|
|
|
|
When a file is validated, you then transfer the file to the main download
|
|
directory in that particular SIG. In other words, you are deleting the
|
|
original file and re-writing it to another place on your hard disk(more
|
|
on hard disk problems later).
|
|
|
|
When a user uploads a file, there are no flags to tell the system
|
|
operator that a file has been uploaded. If you are running a multi SIG
|
|
(section) system and have file transfer ability in each, you have to
|
|
manually check each base for new uploads.
|
|
|
|
<*> Passwords
|
|
|
|
Name and passwords checking does not exist within this software. I had a
|
|
user with the same name and password and two different user numbers. This
|
|
user was then able to circumvent BBS rules by calling and downloading
|
|
twice as much as other users. There really should be password checking
|
|
here. More than one user can have the same password.
|
|
|
|
If a user calls and has line noise at login, and that noise is part of
|
|
his name, you cannot edit it out in the password file. You have to wait
|
|
for that user to call, if he can logon, and have him call again and
|
|
re-apply for access. No name editing at all!
|
|
|
|
<*> Speed
|
|
|
|
After a hard days work, Carina crawls like a turtle. I never before in
|
|
my life did I ever see a BBS reset in 5 minutes. Sheesh!! Give me a
|
|
break here.... Sometimes the system would take the phone off the hook
|
|
during this reset, or just let the phone ring while it was sleeping
|
|
trying to get it's act together!
|
|
|
|
Below is my rating of BBS Software. FoReM 26M is now public domain and
|
|
really not popular anymore. It is the only software on the list that is
|
|
restricted to 300 Baud only. Maybe 450 as a max. Here is a rating of the
|
|
BBS software we have ran.
|
|
|
|
Ratings:
|
|
--------
|
|
|
|
1- Poor
|
|
2- Fair
|
|
3- Good
|
|
4- Excellent
|
|
5- Outstanding
|
|
|
|
|
|
Software |P/W| File Xfer | Msg Base | Locks-up | Hard Disk | Rating |SPD|
|
|
---------|---|-----------|----------|----------|-----------|--------|---|
|
|
Carina I | 2 | Fair | Poor | Yes | Fair |1- Poor | 1 |
|
|
BBS Exprs| 3 | Fair | Fair | Not bad | Fair |3- good | 4 |
|
|
FoReM 26M| 4 | Excellent | Excellent| None | None |5- Oustd| 2 |
|
|
BBCS | 3 | Fair | Fair | Yes | Poor |1- Poor | 3 |
|
|
Oasis II | 4 | Excellent | Excellent| Not bad | Excellent |4- Excln| 3 |
|
|
Oasis III| 5 | Fair | Excellent| Yes | Fair |3- Good | 3 |
|
|
FoReM XEP| 5 | Excellent |Outstand'g| None | Excellent |5- Oustd| 3 |
|
|
Carina II| 1 | Good | Fair | Yes | Poor |2- Fair | 3 |
|
|
Exprs Pro| - | Not tested| - | - | - |- | - |
|
|
|
|
The clear winner so far is FoReM XEP, Although BBS Express was a fairly
|
|
crash free system, modification was almost non-existant. Basic BBS
|
|
programs are about the only choice one has for modifying to one's
|
|
personal preference. The machine language programs have the speed.
|
|
|
|
In three years of running BBS systems, I have found that they all are
|
|
lacking Spartados support. Which brings us to the subject of Hard Disks
|
|
on the 8 bit.
|
|
|
|
I will let you all know now that I am not a machine language or basic
|
|
programmer. But I think I have enough expirience with Spartados and hard
|
|
disks to write the following. As all 8 bit hard disk owners know, we do
|
|
not have the honors of using an optimizer with our systems. Optimizers
|
|
assist the Hard Disk by filling blanks sectors that have become available
|
|
after file has been deleted. There is probably a better explanation than
|
|
that. More on optimizers in a future issue.
|
|
|
|
When we run BBS software on a hard disk, there are many disk access
|
|
routines which sooner or later are going to cause grief. Let me try to
|
|
explain further.
|
|
|
|
When running a large BBS, you are more than likely allowing file
|
|
transfers and storing many files in your library. Not including database
|
|
areas and BBS text files. When you allow users to access your hard disk
|
|
it also has the potential of playing havoc with your sector maps, files,
|
|
or directories.
|
|
|
|
When a file is uploaded, you are filling empty sectors with data.
|
|
Pretty simple to understand right? Now take a look at the example below:
|
|
|
|
FILE.1 **********************
|
|
FILE.2 **************************
|
|
FILE.3 ********
|
|
FILE.4 *********************************
|
|
FILE.5 *************
|
|
|
|
As noted above, we have five files in order on a typical hard disk. Let
|
|
the (*)'s show as a sector. Now let's erase file one and write file 6 to
|
|
the hard disk.
|
|
|
|
FILE.6 **********************
|
|
FILE.2 **************************
|
|
FILE.3 *********
|
|
FILE.4 *********************************
|
|
FILE.5 **************
|
|
FILE.6 ***************
|
|
|
|
You will notice that FILE.6 took the place of FILE.1, and continued after
|
|
FILE.5 This was because FILE.6 had filled the area of FILE.1, FILE.6 was larger and had to be
|
|
written at another place on the disk.
|
|
|
|
Now with this in mind imagine a BBS system with a larger number of file
|
|
deletions and message base input etc... You will end up with a file
|
|
being scattered over many places. This in my judgement is the cause of
|
|
many if not all 8 bit hard disk crashes.
|
|
|
|
For awhile in my BBS problems, I either blamed the BBS software or my
|
|
Supra Hard Disk system. With the setting up of Carina II, I used an MIO
|
|
and a 16 MEG hard drive. Having increased storage by 6 MEG, I really
|
|
thought I had the problem solved. But it has happened again.
|
|
|
|
The worst offender of this type of disk storage is the Carina II BBS
|
|
software. I recommend that if you are planning on changing software,
|
|
stay away from Carina until these problems have been resolved. The
|
|
multi-subdirectories and massive amount of disk accessing has the
|
|
potential to cause problems down the road.
|
|
|
|
THE FINAL WORD
|
|
|
|
Many readers may feel that this is a personal attack upon Jerry Horanoff
|
|
and feel compelled to write back in anger. Please save your opposing
|
|
points of view and think about it all. Any BBS software can have it's
|
|
own problems. I just happens that I did try almost everything there is
|
|
and the results were included here. I did NOT contact any software
|
|
author for assistance during the past weeks crash, Repairing an apparent
|
|
problem would be of no use to me right now.
|
|
|
|
If you are a Carina II SysOp running without any problems, then you are
|
|
a very lucky person. I would greatly appreciate hearing the details of
|
|
your system set-up and how long you have ran without a problem.
|
|
|
|
Mr. Horanoff and a few other programmers should get spend more time
|
|
beta testing and searching for potential problems. Even if it takes
|
|
purchasing other Atari hardware. Leaving beta testing to the untrained
|
|
public is a dangerous alternative. Perhaps a survey of the BBS sysops is
|
|
in order here. I am sure each BBS configuration is different and and
|
|
will perform different from the programmers did. Better luck with
|
|
future releases.
|
|
|
|
NEWSLETTER COMMENTARY
|
|
|
|
Michigan Atari Magazine gets a BOO from ZMagazine for the content of the
|
|
most recent issue.
|
|
|
|
Your Reader's Viewpoint piece was in very poor taste. The original
|
|
reader who sent in the article was stating his opinion, jokingly or not
|
|
your response was totally off base.
|
|
_______________________________________
|
|
ZMAG CONFIDENTIAL by Ron Kovacs
|
|
_______________________________________
|
|
|
|
News around the 8bit community... Jerry Horanoff is said to be working or
|
|
going to be working for ICD. Carina II will not become part of the ICD
|
|
inventory. Should be interesting what plans they have for Jerry there...
|
|
|
|
As reported last week, Micron Tele and Atari have settled the law suit
|
|
out of court. We are still on the pursuit of the details that either
|
|
will not release to the public.
|
|
|
|
What ever happened to Keith Ledbetter?? Sources tell us that he was
|
|
fired from ICD! True or false? We have been told that Keith says it
|
|
was a difference of opinion and others say he was canned.
|
|
|
|
Check out the most recent issue of Atari Explorer Magazine and you will
|
|
find Atari selling it's hardware and software via mail order. Not too
|
|
bad, but when you consider the price of a 130XE for $149.00, the
|
|
acceptance just doesn't seem to be there. You can call other mail-order
|
|
houses and find a better deal!
|
|
_______________________________________
|
|
READER COMMENTARY by Jack Lee
|
|
_______________________________________
|
|
|
|
The number of software companies that support the Atari 8-bit line are
|
|
practically nil, if indeed there are any.
|
|
|
|
What is the reason? Piracy, among other things. Most companies when
|
|
asked why they dropped the support of the 8-bit line will reply that the
|
|
market was very unlucrative, or that sales were very poor, and so forth.
|
|
|
|
It's a bit amazing to see how the attitudes of these companies changes
|
|
throughout the years. In my five years of using Atari computers, I've
|
|
heard these responses from the companies: -There are very little Atari
|
|
computers out there, so we don't see that we should market software for
|
|
it yet.-; -The Atari computer is a game machine, and that wouldn't help
|
|
our sales-; -Not too many Atari owners have disk drives, and since all
|
|
our software is disk based, that wouldn't do us much good...- The list
|
|
goes on and on.
|
|
|
|
If the Atari computer was a game machine, then why was it rebuffed? The
|
|
Commodore 64 was taken more seriously, and yet what did software
|
|
companies make for it? A lot of games. And now I hear the 64 referred
|
|
to as the -classic game machine-. HAH!
|
|
|
|
In any case, the 8-bits are a dying breed, with diehards scattered about,
|
|
including this one. Atari Corp. seems to be heavily promoting the
|
|
virtues of the ST line, and ignoring the 8-bits altogether.
|
|
|
|
Even with the release of the XE Game System, they are doing little,
|
|
except advertising it now and again on TV commercials. The XE-GS is the
|
|
last hope- no, make that the NEW HOPE to get software publishers to
|
|
produce Atari software once again. And it's about time, too. In one of
|
|
the XE-GS commercials, it had a presidents from a few software companies
|
|
to say how great the machine was. But you never can tell what the
|
|
outcome will be in this everchanging market. As was the case in the
|
|
past, by the time companies finally released software for the Atari
|
|
computer, the product was already obsolete, having been available for
|
|
other computers for years.
|
|
|
|
So perhaps one of the major reasons why sales were poor for the Atari
|
|
8-bit is that the owners grew up and evolved into using the ST. Hmmmmm,
|
|
could this mean something? Well, yes and no. Sales for 8-bits are poor
|
|
due to less 8-bit owners, and piracy. Combine the two and what do you
|
|
have? Zilch profits for the software companies!
|
|
|
|
You always hear Atarians complain that there are no software for their
|
|
machines. Some realize why, some play dumb, and others, like Antic
|
|
Magazine, take this attitude: -Hey! Such and such won't release software
|
|
for Atari! Duh, I wonder why? Let's all write to the company and demand
|
|
that we want that product for our computer! Let's show them that there
|
|
is a big user base in Atari!!!- And of course, the companies fall for
|
|
it, thinking: -Gee, maybe we were wrong in abandoning the Atari market.
|
|
We sure have been receiving a ton of mail! There's probably a big number
|
|
of people wanting to buy our products afterall!- And of course, what
|
|
happens? No sooner does the product reach the market do pirated copies
|
|
come out. That implies something- some people don't give a damn! They
|
|
write to a company saying that they want software, then gleefully grab an
|
|
illegal copy once it's out!
|
|
|
|
The survival of the Atari 8-bit line is now in the hands of Atarians.
|
|
Action must be taken, and not just talk! If the 8-bit line was to
|
|
finally go kaput, then it will be a Catch-22 situation, since that seems
|
|
to be the case now. The software companies will continue their merry
|
|
way, and the 8-bit diehards will have to salvage the remains and make the
|
|
most of it. And that's the bottom line.
|
|
|
|
_______________________________________
|
|
BASIC PROGRAMMING by Jackson Beebe
|
|
_______________________________________
|
|
(Continued from last week Issue #111)
|
|
|
|
PUT # Statement:
|
|
================
|
|
|
|
In the same way that the GET # statement gets or reads a byte from a
|
|
device, the PUT # statement puts or writes a byte to an open device. For
|
|
example, let's open one IOCB to the keyboard, and another IOCB to the
|
|
printer, and send data from the keyboard to the printer.
|
|
|
|
The PUT # statement puts just one byte (character), each time it is
|
|
called (used), to a valid device as specified in an OPEN # statement. Got
|
|
that? It's commonly used with a FOR-NEXT loop around it, to write
|
|
strings, sentences, entire files, etc one byte at a time from beginning
|
|
to end. BASIC knows enough to start you at the beginning of a file when
|
|
the file is opened, and we can GET and PUT, one byte at a time. BASIC
|
|
gives an EOF (End Of File) message, sending error 136 -End of File. We
|
|
can set a TRAP statement for a line that tests for error 136 in an
|
|
IF-THEN. If its TRUE, we're at the end of the file.
|
|
|
|
10 REM ** PUT Demo **
|
|
20 OPEN #1,4,0,-K:-:REM Open kybd
|
|
30 OPEN #2,8,0,-P:-:REM Open prtr
|
|
40 ? :? :? -Begin typing-
|
|
50 REM
|
|
60 GET #1,A:REM Get keypress
|
|
70 PUT #2,A:? CHR$(A);:REM Put to printer and screen
|
|
80 GOTO 60:REM Loop
|
|
|
|
|
|
This prints a prompt -Begin typing- on the screen, then gets a character
|
|
from the keyboard, prints it to the screen (not done automatically for
|
|
you) and sends it to the printer.
|
|
|
|
The PUT # statement writes data to disks, to create disk files; sends
|
|
data to a printer; to the screen; cassette; etc.
|
|
|
|
|
|
INPUT # Statement
|
|
=================
|
|
|
|
In the way that the GET # statement brings in bytes, the INPUT #
|
|
statement brings in strings from a device. Each time the command is
|
|
issued, it brings in a string of the length specified in the DIM
|
|
statement associated with the variable. The syntax is;
|
|
|
|
|
|
10 DIM STRING$(15)
|
|
20 CLOSE #1:OPEN #1,4,0,-K:-
|
|
30 ? -Type some - then <RETURN> -
|
|
40 INPUT #1,STRING$
|
|
50 ? STRING$
|
|
60 GOTO 30
|
|
|
|
Note it doesn't write to the screen as we type, as BASIC or DOS.
|
|
|
|
It's handy to bring strings in from data files on disk. We will use it to
|
|
bring in entries in a disk directory, in RWP.BAS.
|
|
|
|
|
|
CLOSE # Statement:
|
|
==================
|
|
|
|
The CLOSE # statement, closes and releases the IOCB referenced. Closing
|
|
an IOCB, 'turns it loose' meaning it is free to be called for a different
|
|
purpose, or device. It's syntax is simply:
|
|
|
|
|
|
95 CLOSE #1
|
|
100 CLOSE #2:CLOSE #3
|
|
etc.
|
|
|
|
|
|
Once an IOCB has been opened, it cannot be reopened again. It needs to be
|
|
closed before reopening. Type in this code and RUN it:
|
|
|
|
|
|
10 OPEN #1,4,0,-K:-
|
|
20 OPEN #1,8,0,-P:-
|
|
|
|
It generates:
|
|
|
|
ERROR- 129 AT LINE 20
|
|
|
|
This means the IOCB is already open. We can sometimes solve this problem
|
|
by using different IOCB's for different purposes. Still, there will be
|
|
times when program logic dictates looping back into an OPEN statement in
|
|
a wild hack. No problem. We simply issue a CLOSE # statement, THEN issue
|
|
the new OPEN # statement. Actually, it is common practice to use an OPEN
|
|
# statement preceded by a CLOSE # statement. This is routinely done.
|
|
Check the listings in published BASIC programs. It insures you don't
|
|
issue an OPEN # statement to an open device.
|
|
|
|
You should always close IOCB's at the end of a program. This avoids
|
|
potential problems. I usually precede my END statement with a CLOSE. A
|
|
strange and terrible phenomenon of some BASIC's, involves Opening a data
|
|
file (financial, mailing list, etc.) for appending, or updating for
|
|
instance, and crashing out of the program without closing it. The file
|
|
can hang out there, inaccessible, not able to be opened again, as it's
|
|
already open. Bad News. It's sensible to be conscious of this, and add
|
|
all needed CLOSE statements to our programs, covering all the different
|
|
ways we can exit without closing.
|
|
|
|
Okay, let's try a revision of the previous code:
|
|
|
|
10 CLOSE #1:OPEN #1,4,0,-K:-
|
|
20 CLOSE #1:OPEN #1,8,0,-P:-
|
|
|
|
|
|
Type in and RUN this code. Note it runs correctly, without error 129, as
|
|
it was closed before opening.
|
|
|
|
|
|
|
|
Writing RWP.BAS:
|
|
================
|
|
|
|
Well, that's the building blocks for data transfer. Now let's add a few
|
|
touches, and a little flash, and write a program that moves data between
|
|
devices, in Atari BASIC. Let's say it should...oh....Read a file - Write
|
|
a file - Print a file - and give a disk Directory. This will give us
|
|
understandable examples of how to do input/output in BASIC that we can
|
|
refer back to when programming.
|
|
|
|
Here's the way I would go about writing such a program. I think it's
|
|
important for beginners to see that programs are written from the middle
|
|
out, or started at just any old place, and written until everything is
|
|
finally finished. We don't have to start at the beginning.
|
|
|
|
Okay, I think, hmmm...let's use a menu for Read /Write /Print /Directory
|
|
choice, and one section for each part, that's four parts plus menu is
|
|
five. Maybe subroutines? Yes, definitely subroutines. We'll leave the
|
|
initial lines from 10 and up for initialization, description and
|
|
housekeeping. Maybe put the menu at 1000, (R)ead at 2000, (W)rite at
|
|
3000, (P)rint at 4000, and (D)irectory at 5000. This way,we're sure to
|
|
have room to number new lines by 10's as we go along, and we will always
|
|
intuitively know where we are in the program by what number lines begin
|
|
with. We will number the first line in the subroutines 1000, 2000, 3000,
|
|
4000 etc for clarity, and ease of remembering where the first line is,
|
|
when looping back to it, or going-sub to it. We'll hack this program out,
|
|
then maybe renumber the sections for neatness in increments of 10 when
|
|
we're finished. How do we renumber separate sections of a program without
|
|
affecting the whole numbering system? Stick around and I'll show you
|
|
(with LIST and ENTER).
|
|
|
|
Okay, let's think over some of the things we have to do. Let's put a
|
|
menu up at the -top- of the program, that reads input and sends control
|
|
down to one of four subroutines below it. Think of the program's
|
|
operation in terms of -falling down through- the program from the top,
|
|
until diverted, then falling once again. Kind of like -gravity.-
|
|
|
|
Let's have control revert to this main menu prompt, on return from any
|
|
subroutine. The menu will choose which subroutine to send control to by
|
|
letting the program fall through a stack if IF-THEN statements. Down at
|
|
the bottom, we will use a GOTO to send control back up to the top of the
|
|
menu if the user DOESN'T choose one of our options. We will print our
|
|
prompt, then bring in a character from the keyboard. We could use an
|
|
INPUT statement, but...the user would have to push <RETURN>, and that
|
|
seems inelegant in a one letter menu. If we OPEN an IOCB, and GET a
|
|
character from the keyboard, we won't have to push <RETURN>.
|
|
|
|
We forgot to add a way to end the program, so let's exit the program with
|
|
a (Q)uit option at the menu. We'll CLOSE IOCB's before quitting.
|
|
|
|
Now the Read subroutine. Hmmm...Open an IOCB to the disk, by filename. We
|
|
need to allow for different disk drives other than the default D: and we
|
|
might want to get a little fancy, and write a hack to recognize a
|
|
legitimate filename in any of the three formats:
|
|
|
|
FILENAME
|
|
D:FILENAME
|
|
D1:FILENAME
|
|
|
|
Okay, after we OPEN an IOCB, we will GET a byte and PUT that byte to the
|
|
screen. Let's include error trapping to catch errors that would crash
|
|
the program (also very inelegant), by using a TRAP statement, and letting
|
|
control return to a subroutine's beginning prompt in case of trouble.
|
|
Generally, if programs don't bomb on mistakes, but keep prompting us
|
|
until we get the input correct, most of us will learn a program fairly
|
|
quickly. It will be -user friendly-. The TRAP function keeps a program
|
|
running, when an error occurs, and gives us many recovery options by
|
|
sensing the type of error that has occurred.
|
|
|
|
Okay, now for the WRITE subroutine...we will need to open one IOCB to the
|
|
keyboard, and another to the disk drive, to write the file to. We'll need
|
|
a way to quit writing, and cause the file to be written to the disk.
|
|
(CLOSE the IOCB) I think we'll have control stay at the WRITE prompt when
|
|
finished, to allow us to write multiple files if we wish. If we DON'T
|
|
want to write another file, or if we got into the WRITE subroutine by
|
|
accident, we'll use an empty <RETURN> at the WRITE (or any other) prompt,
|
|
to go back to the main MENU. Again, that's real -user friendly-, not
|
|
asking us to hunt for any one key, but to push <RETURN> just to go back
|
|
to the MENU.
|
|
|
|
I think we'll use CONTROL+Z to finish writing a file. My reasoning is
|
|
that we won't need that key combination for anything else in a file, and
|
|
IBM-PC's (MS-DOS) use that sequence to end files. We'll print a prompt
|
|
each time so a user won't have to memorize this! And while we're at it,
|
|
we may add our -smart filename- option to the Write function too.
|
|
|
|
For the PRINT subroutine...we can use the READ subroutine nearly -as is-,
|
|
sending output to the printer in addition to the screen. No sweat, that
|
|
one requires almost no new code. We will write the READ subroutine, and
|
|
when ready, put our cursor on top of the first 2 in line 2000 of the READ
|
|
subroutine, type a 4, and hit <RETURN>. This will -clone- line 2000
|
|
exactly, with the new number, 4000. We can edit the new line and the old
|
|
line will remain unaffected. We can clone lines from the READ subroutine
|
|
into the PRINT subroutine and edit them, saving some typing.
|
|
|
|
One touch that's always nice in a program that accesses a printer, is
|
|
checking to see if the printer is off, then printing a message and
|
|
prompting for a <RETURN> without crashing the program or locking up if
|
|
the printer is off. We will do this with a TRAP statement that PEEKS
|
|
location 195 that holds the number of the error encountered (because the
|
|
printer is off.) Isn't that handy? Our handy dandy error guide says the
|
|
code for -Device did not respond- is # 138. We will use an IF-THEN to
|
|
look for that in case of error, then tell the user that the printer's
|
|
off, POKE a zero in 195, and wait for a <RETURN>. (You should look up
|
|
location 195 that holds the number of the last error encountered, in your
|
|
Memory Map, and follow this. You DO HAVE your Memory Map, don't you ?
|
|
|
|
For a DIRECTORY, we will open an IOCB, and bring in a string, using an
|
|
INPUT # statement dimensioned to be 17 bytes long. Let's use a FOR-NEXT
|
|
loop around it. We will allow for 128 files. That should do it. When it
|
|
has read the last file, it -errors- and returns to the prompt.
|
|
|
|
Let's not use any -clear-the-screen- commands in this program, so we can
|
|
always see the previous commands and files on the screen. It can help to
|
|
see what we typed previously, especially when it doesn't work the way we
|
|
thought it would.
|
|
|
|
|
|
|
|
ENTER-IN FEATURE:
|
|
=================
|
|
|
|
As a new service to readers, I am importing actual BASIC program code
|
|
listings into these lessons, that may be ENTERed into your computer from
|
|
this file, without typing, if you downloaded this from a BBS. These
|
|
longer programs are identified as ENTER-IN programs, and are intended for
|
|
BBS users with modems. The lines may break oddly in a word processor with
|
|
narrow margins, but...edit them if you like.
|
|
|
|
To use:
|
|
=======
|
|
|
|
** NOTE ** If you D/L'ed this file from CompuServe, it will be modified
|
|
to contain CR/LF at the end of each line, rather than the Atari EOL
|
|
character. (Copy the file to the screen using DOS, and see if it breaks
|
|
correctly by line, or if it has inverse rectangles and triangles at the
|
|
end of each line.) Before using a word processor as described below,
|
|
convert the CR/LF back to Atari EOL characters using FILEFIX.COM by Glenn
|
|
K. Smith, or a similar program.)
|
|
|
|
Load this lesson in your word processor (AtariWriter Plus in a 130XE, or
|
|
upgraded 800XL, etc.) t Place the cursor directly over the first
|
|
character in the BASIC listing, and press OPTION+B to mark the beginning
|
|
of text to be saved in the buffer. Move the cursor over the last
|
|
character in the BASIC listing, and press OPTION+DELETE. This saves the
|
|
text (source code) in the buffer.
|
|
|
|
Now erase the lesson in main memory, retaining the BASIC listing in the
|
|
buffer. With AtariWriter Plus, once you've blocked the BASIC listing in
|
|
the buffer, you can use ESCAPE to move to main menu, and select Option
|
|
(C)reate. Answer Y to -ERASE FILE IN MEMORY ?-. The main memory is now
|
|
empty. Now copy the contents of the buffer into RAM, in AtariWriter Plus
|
|
by pressing OPTION+X to write buffer. This should be a perfect copy of
|
|
the BASIC source code listing by itself, in memory as a document.
|
|
|
|
Examine it in the word processor for accuracy. Edit as required.
|
|
|
|
Now do an ASCII SAVE, (in AtariWriter Plus use CONTROL+S from the main
|
|
menu) under the filename RWP.BAS. This will save only the source code,
|
|
without word processor commands. This is exactly the same kind of file
|
|
the ENTER command produces using:
|
|
|
|
LIST -Dn:RWP.BAS-
|
|
|
|
To summarize, you load the entire lesson in the word processor, and
|
|
either 'clip out' and save the BASIC listing, or delete out everything
|
|
but the BASIC listing, depending on your word processor, and do an ASCII
|
|
save of the listing.
|
|
|
|
Now boot up BASIC, and load the file back into BASIC using the command:
|
|
|
|
ENTER -Dn:RWP.BAS-
|
|
|
|
LIST your code to see if it contains any errors. You should have the
|
|
complete BASIC listing. Many errors may be fixed with the editing
|
|
feature. Lines that begin with ERROR - are usually fixed by deleting the
|
|
ERROR - message, and fixing the problem. Hitting <RETURN> while in the
|
|
line will save it.
|
|
|
|
Now SAVE your program in BASIC, using: SAVE -D:RWP.BAS-. then RUN your
|
|
program. It should work fine. I've tried it, and it's worked well for me.
|
|
For BBS users, it seems like a time-saving idea. (I have also uploaded
|
|
RWP.BAS to CompuServe ATARI8 Forum for CompuServe users.)
|
|
|
|
|
|
RWP.BAS ** AN ENTER-IN PROGRAM **
|
|
===================================
|
|
|
|
|
|
10 REM +++++++ RWP.BAS +++++++
|
|
20 REM + +
|
|
30 REM + A Demo for LESSON 9 of +
|
|
40 REM + LEARNING TO PROGRAM +
|
|
50 REM + IN ATARI BASIC +
|
|
60 REM + by Jackson Beebe +
|
|
70 REM + Ver. 1.07 4/88 +
|
|
80 REM +------------------------+
|
|
90 REM
|
|
100 REM ***** Initialize *****
|
|
110 REM
|
|
120 DIM DN$(15),FILENAME$(15),DIRSTR$(17)
|
|
130 OFF=40000:REM Turn off TRAP
|
|
140 REM
|
|
150 REM ***** MENU *****
|
|
160 REM
|
|
170 REM ** Print menu, get choice **
|
|
1000 ? :? :? -R/W/P/D/Q a file >-;
|
|
1010 CLOSE #1:OPEN #1,4,0,-K:-
|
|
1020 GET #1,CHOICE:CLOSE #1
|
|
1030 REM
|
|
1040 IF CHOICE=82 OR CHOICE=114 THEN GOSUB 2000:REM Read
|
|
1050 IF CHOICE=87 OR CHOICE=119 THEN GOSUB 3000:REM Write
|
|
1060 IF CHOICE=80 OR CHOICE=112 THEN GOSUB 4000:REM Print
|
|
1070 IF CHOICE=68 OR CHOICE=100 THEN GOSUB 5000:REM Directory
|
|
1080 IF CHOICE=81 OR CHOICE=113 THEN ? :? :CLOSE #1:CLOSE #2:CLOSE
|
|
#3:TRAP OFF:END :REM Quit
|
|
1090 REM
|
|
1100 REM ** Must be input error **
|
|
1110 ? :? :? -(R)ead-(W)rite-(P)rint-(D)ir-(Q)uit-
|
|
1120 GOTO 1000:REM Loop Back to MENU
|
|
1130 REM
|
|
1140 REM ***** READ Subroutine *****
|
|
1150 REM
|
|
2000 ? :? :? -READ FILENAME.EXT >-;
|
|
2010 TRAP 2000:REM Crash proofing
|
|
2020 GOSUB 6000:REM Input and check
|
|
2030 ? :?
|
|
2040 CLOSE #2:OPEN #2,4,0,FILENAME$
|
|
2050 GET #2,BYTE
|
|
2060 PRINT CHR$(BYTE);
|
|
2070 GOTO 2050:REM Loop until error
|
|
2080 REM
|
|
2090 REM ***** WRITE Subroutine *****
|
|
2100 REM
|
|
3000 ? :? :? -WRITE FILENAME.EXT >-;
|
|
3010 TRAP 3000:REM Crash proofing
|
|
3020 GOSUB 6000:REM Input and check
|
|
3030 ? - (CONTROL+Z to end write)-:?
|
|
3040 CLOSE #2:OPEN #2,4,0,-K:-
|
|
3050 CLOSE #3:OPEN #3,8,0,FILENAME$
|
|
3060 GET #2,BYTE
|
|
3070 IF BYTE=26 THEN CLOSE #2:CLOSE #3:GOTO 3000
|
|
3080 PUT #3,BYTE:PRINT CHR$(BYTE);
|
|
3090 GOTO 3060:REM Loop until error
|
|
3100 REM
|
|
3110 REM ***** PRINT Subroutine *****
|
|
3120 REM
|
|
4000 ? :? :? -PRINT FILENAME.EXT >-;
|
|
4010 TRAP 4060:REM Crash proofing
|
|
4020 GOSUB 6000:REM Input and check
|
|
4030 ? :?
|
|
4040 CLOSE #2:OPEN #2,4,0,FILENAME$
|
|
4050 CLOSE #3:OPEN #3,8,0,-P:-
|
|
4060 IF PEEK(195)=138 THEN ? :? -* Turn on Printer - push <RETURN>
|
|
-;:INPUT DN$:POKE 195,0:GOTO 4000
|
|
4070 TRAP 4000
|
|
4080 GET #2,BYTE
|
|
4090 PUT #3,BYTE:? CHR$(BYTE);
|
|
4100 GOTO 4080:REM Loop until error
|
|
4110 REM
|
|
4120 REM ***** DIR Subroutine *****
|
|
4130 REM
|
|
5000 ? :? :? -Directory of Drive # >-;:CLOSE #1:OPEN #1,4,0,-K:-
|
|
5010 TRAP 5000:REM Crash proofing
|
|
5020 GET #1,DRIVE
|
|
5030 IF DRIVE=155 THEN CLOSE #1:TRAP OFF:RETURN
|
|
5040 IF DRIVE<49 OR DRIVE>57 THEN GOTO 5000:REM Wrong Dn
|
|
5050 DN$=CHR$(DRIVE)
|
|
5060 FILENAME$=-D-
|
|
5070 FILENAME$(LEN(FILENAME$)+1)=DN$
|
|
5080 FILENAME$(LEN(FILENAME$)+1)=-:*.*-
|
|
5090 ? FILENAME$:?
|
|
5100 CLOSE #1:OPEN #1,6,0,FILENAME$
|
|
5110 FOR FILE=1 TO 128
|
|
5120 INPUT #1,DIRSTR$:? DIRSTR$
|
|
5130 NEXT FILE:REM Loop until error
|
|
5140 REM
|
|
5150 REM *** NORMALIZE Subroutine ***
|
|
5160 REM
|
|
6000 INPUT FILENAME$
|
|
6010 IF FILENAME$=-- THEN CLOSE #1:CLOSE #2:CLOSE #3:TRAP OFF:POP :RETURN
|
|
6020 IF LEN(FILENAME$)>2 THEN IF FILENAME$(2,2)=-:- OR FILENAME$(3,3)=-:-
|
|
THEN RETURN
|
|
6030 DN$=-D:-
|
|
6040 DN$(LEN(DN$)+1)=FILENAME$
|
|
6050 FILENAME$=DN$
|
|
6060 RETURN
|
|
|
|
|
|
===== RWP.BAS Description ====
|
|
|
|
Okay, let's look at the program. Line 120 dimensions string variables for
|
|
disk number, filename, and directory listing. Line 130 sets a variable
|
|
named OFF equal to 40000, used to turn TRAP off by setting it to a line
|
|
number higher than 32767. See line 1080.
|
|
|
|
In Lines 1040-1080 note testing for the ASC value of a character. That's
|
|
how you test a GET. Note lines 1110-1120 prompt then shoot control back
|
|
to 1000 for wrong input. This also takes care of returns from
|
|
subroutines, which fall down into 1120. It's a handy -catch-all- at the
|
|
bottom of a menu.
|
|
|
|
As mentioned earlier, I like the idea of the program being 'smart' about
|
|
filenames. I want the program to operate correctly if I enter the
|
|
complete drive number and filename, or D: and filename, or just the plain
|
|
filename. Realizing this would be used in each subroutine, the way to go
|
|
is to code this routine once, and put it in a subroutine, hence the
|
|
NORMALIZE filename subroutine at line 6000.
|
|
|
|
Note that we set a TRAP statement at the beginning of each function, then
|
|
GOSUB 6000 to normalize and input filename.
|
|
|
|
Line 2040 opens an IOCB, 2050 GETs a byte and 2060 prints it to the
|
|
screen. Line 2070 causes looping until the end of file, when TRAP returns
|
|
control to the (R)ead prompt.
|
|
|
|
The (W)rite subroutine works the same way. Lines 3040 and 3050 open two
|
|
IOCB's, used to read from the keyboard and write to the disk drive. Note
|
|
line 3070 looks for a CONTROL+Z to quit writing. How did I know that
|
|
CONTROL+Z was a 26? I didn't. I wrote the following little dittie and ran
|
|
it.
|
|
|
|
10 CLOSE #1:OPEN #1,4,0,-K:-
|
|
20 GET #1,A
|
|
30 PRINT A
|
|
40 GOTO 20
|
|
|
|
I ran this for various inputs. It printed a 65 for uppercase A which I
|
|
know is correct, and a 26 for CONTROL+Z. (Actually I have an ATASCII
|
|
chart that said 26 too.)
|
|
|
|
The (P)rint subroutine is similar, but note line 4010 sets TRAP to 4060
|
|
to prompt if the printer is off. When we don't use 4060 (printer is on),
|
|
TRAP is set to 4000 in 4070. This allows automatic return to the (W)rite
|
|
prompt at the end of printing.
|
|
|
|
In the (D)irectory subroutine, line 5030 checks for null input, and 5040
|
|
checks for drive # 1-9. In lines 5060-5080 I -built-up- the filename to
|
|
include the drive number, by bringing the drive number in as a character
|
|
with a GET, testing it, then converting it to a string, so I could
|
|
concatenate it with a -D- and -:*.*- for a Dn:*.* filename. Got that?
|
|
Look again. You just start from the left, and add things to the right
|
|
with the concatenation format, until you've got the string you want.
|
|
There are other ways, but this is the one that came up this time.
|
|
|
|
The NORMALIZE subroutine checks for null input, then checks to see if the
|
|
filename contains a drive portion.
|
|
|
|
==== Interesting Quirk ====
|
|
|
|
I encountered an interesting wrinkle in writing the normalize subroutine.
|
|
I initially thought that any filename less than 3 characters must not
|
|
have a drive specified, as D:A for example, would be the shortest
|
|
possible name that includes a drive number. I thought that I'd test for a
|
|
filename length under three, and if TRUE, would concatenate the filename
|
|
to D: to make it legal. I thought I'd test names over 2 characters in
|
|
length for a colon. My first code was:
|
|
|
|
6010 IF LEN(FILENAME$)<3 OR FILENAME$(2,2)<>-:- OR FILENAME$(3,3)<>-:-
|
|
THEN GOTO 6030
|
|
6020 RETURN
|
|
6030 DN$=-D:-
|
|
6040 DN$(LEN(DN$)+1)=FILENAME$
|
|
6050 FILENAME$=DN$
|
|
6060 RETURN
|
|
|
|
This would graft on a default drive number to any plain filename. Looking
|
|
this over, it seemed awkward to have to jump over line 6020. If you have
|
|
this situation, you can fix it by switching your logic around, from
|
|
greater than to less than etc. as:
|
|
|
|
6010 IF LEN(FILENAME$)>2 ...etc.
|
|
|
|
This looked good, so I coded:
|
|
|
|
6010 IF LEN(FILENAME$)>2 AND (FILENAME$(2,2)=-:- OR FILENAME#(3,3)=-:-)
|
|
THEN RETURN
|
|
6020 DN$=-D:-
|
|
6030 DN$(LEN(DN$)+1)=FILENAME$
|
|
6040 FILENAME$=DN$
|
|
6050 RETURN
|
|
|
|
This looked good. Parenthesis and all. I reasoned that if the filename
|
|
was longer than 2, then it would check both places for the colon, and
|
|
RETURN if it found one, and fall down into the concatenate section if
|
|
not. Note lines 6020-6040 concatenate FILENAME$ to D:, then assign the
|
|
completed name back to FILENAME$. Looks good doesn't it?
|
|
|
|
It didn't work! It bombed with error 5 - -a string exceeded it's
|
|
dimensioned length.- If FILENAME$ was only one character long, the test
|
|
at line 6010 bombed trying to check the 2nd and 3rd character of a one
|
|
letter string. Having put the AND in there, made it always check the 2nd
|
|
and 3rd places! What's the solution? Simple.
|
|
|
|
FIRST test for a length greater than 2, and then test the 2nd and 3rd
|
|
places like this:
|
|
|
|
6020 IF LEN(FILENAME$)>2 THEN IF FILENAME$(2,2)=-:- OR FILENAME$(3,3)=-:-
|
|
THEN RETURN
|
|
|
|
Got that? If has two IF-THEN tests in the same line. This is legal, and
|
|
often needed. Study on this example if it doesn't make sense. Try typing
|
|
in these code lines, and experimenting. (Dimension first.)
|
|
|
|
Try this. It's a fun program, and instructive. When you are floundering
|
|
in the future, coding I/O, just pull out this program listing and refer
|
|
to it for examples of syntax, or hacks. Modify it, and play with it to
|
|
see what you can do. Note that you need quotes around device:filename in
|
|
an OPEN # statement, except when you use the name of a string variable in
|
|
the statement. (Lines 1010 and 2040 for example.)
|
|
|
|
_______________________________________
|
|
ACTION! FOR BASIC PROGRAMMERS
|
|
A New Series by Dave Arlington
|
|
_______________________________________
|
|
|
|
So what is the idea of starting this column? Well, one thing I have
|
|
always heard a lot of is that -I would love to learn ACTION! since I have
|
|
heard so much about it, but it is so different from BASIC, and the manual
|
|
is no help. Where can I learn it?- I tried to get WNYAUG's resident
|
|
ACTION! expert, Brandon Brooks to write a column on ACTION! but for one
|
|
reason or another we only got one from him. So you're stuck with me.
|
|
|
|
Not that I'm any great ACTION! expert like Brandon. In fact, I'll be
|
|
learning it along with the rest of you since I recently started getting
|
|
into it. I DO have some qualification in that I've programmed in a lot of
|
|
different languages and can seem to pick them up pretty fast. Hopefully
|
|
I'll be able to stay ahead of you folks!
|
|
|
|
Why ACTION!? Let's talk a little bit first on the shortcomings of BASIC.
|
|
It seems lately I have read a few articles from BASIC die-hards defending
|
|
the language. There was an column in PC magazine a few months ago, and
|
|
two very recent ones in COMPUTE! In the editorial column in this month's
|
|
COMPUTE! (Sept. '87) Richard Mansfield talks about -... good old
|
|
reliable, understandable, BASIC...- He writes that BASIC still gets used
|
|
by most programmers because -BASIC is the most natural language.-
|
|
|
|
I'm sorry, but that's a lot of hogwash. Anyone who thinks that BASIC is
|
|
understandable and natural, please turn to any BASIC listing at least a
|
|
page long and tell me exactly what the programmer is doing at each step.
|
|
I don't think too many people could take me up on that. At least in TURBO
|
|
BASIC, we have the beginnings of a BASIC that is more natural and
|
|
understandable. Let's face it, the real reason that BASIC is so prevalent
|
|
today is that when personal computers first came out, BASIC was the only
|
|
langauge that could fit in the amount of memory available. Since everyone
|
|
grew up on BASIC, they felt most comfortable with it. It's like the
|
|
number of Apple computers sold each year simply because the children have
|
|
used them in school so much. It has very little to do with BASIC's
|
|
inherent plusses. It's just force of habit. Look at the newer large
|
|
memory machines like the ST. Very few people are programming in BASIC or
|
|
if they are, it is something like GFA BASIC that looks almost like
|
|
PASCAL.
|
|
|
|
I never did like ATARI BASIC. I have long searched for an alternative. I
|
|
have tried LOGO, PASCAL, Assembly, TURBO BASIC and am now looking at C
|
|
(and of course, ACTION!). LOGO is a really underrated language that is
|
|
more than turtle graphics. However it is too slow and does not give you
|
|
great detail about adding machine language routines to speed it up. KYAN
|
|
PASCAL is a great PASCAL version for the 8-bits and is almost as fast as
|
|
ACTION! (look for an upcoming review), but really needs a RAMdisk to
|
|
develop software and does not directly take advantage of the ATARI's
|
|
special capabilities since it is designed to be a standard language. (One
|
|
that will run virtually unchanged on any machine.) Assembly language is
|
|
like wanting to write your name and having to contruct the pen and paper
|
|
yourself from raw materials. If you have to program in BASIC, TURBO BASIC
|
|
is the way to go and will be used for most comparisons with ACTION! in
|
|
this column. It is still tied down to line numbers and wasteful varaibles
|
|
though.
|
|
|
|
ACTION! is like the best of all worlds for anyone considering programming
|
|
on the ATARI. It is almost as fast as machine language, but CAN be as
|
|
easy to learn (or easier!) than BASIC. It is modular like C and PASCAL so
|
|
you can build little pieces at a time and test them. However, the
|
|
compiler and editor reside in a cartridge so you do not have to load
|
|
those things seperately like you would with PASCAL or C. It is written
|
|
specifically for the ATARI so it takes advantage of all the ATARI's
|
|
special features (with a few exceptions). It has many other beautiful
|
|
things that make a programmer's life easy that we will be getting into as
|
|
the series goes on.
|
|
|
|
This month, we'll talk a little about the negative things in ACTION!,
|
|
show a little demo routine, and explain it just a little.
|
|
|
|
First, the negative things. One of the reasons more people don't program
|
|
in ACTION! is the horrendous manual. Unusual for an OSS product, the
|
|
manual abounds with typographical errors and important features that are
|
|
glossed over in some appendix. Want some examples?
|
|
|
|
On page 61, an example of order of operations shows that 43 MOD 7*2+19
|
|
equals 21 when it should be 31. On page 167, they show the OPEN library
|
|
procedure taking four arguments. A little later on page 188, they have an
|
|
example where it only uses three. (Technically, this is correct. You CAN
|
|
pass a PROCedure less than the correct number of arguments, but it only
|
|
confused me.) Tucked away in a paragraph on page 167 is the notice that
|
|
-Remember, the maximum length of a string is 255 characters.- Funny, how
|
|
could I remember, when there is no other reference in the manual? As a
|
|
last example, on the second last page of the manual we are finally told
|
|
in a note in an example that we can use a colon -:- to separate
|
|
statements as well as a space.
|
|
|
|
The manual fails in other ways as well. One minute it is very detailed,
|
|
assuming a novice user. The next minute we are breezing by bit-wise
|
|
operators like everyone knows what they are. The manual does say that it
|
|
is not intended as a tutorial on the language, however considering it is
|
|
the only book to date written on the language, it could have been a
|
|
little more introductory. Anyways.... I guess that's why this column was
|
|
born. Out of my frustration with the manual, I felt there had to be
|
|
others who wanted to learn ACTION! but needed someone to explain it
|
|
better.
|
|
|
|
Having said all that. Let's look at the first sample program in ACTION!.
|
|
It is essentially the same routine I put in the TURBO BASIC column two
|
|
months back that will load in any alternative character set (like those
|
|
on this month's disks of the month. PLUG PLUG). THIS IS NOT meant to be
|
|
an introduction to ACTION!. That will come next month. I just wanted to
|
|
show how similar ACTION! can be to BASIC in some instances. Please ignore
|
|
the first two procedures in the example for now, the ones call PROC
|
|
Burst() and PROC BGet(). I borrowed these from the ACTION! ToolKit disk
|
|
so the main routine would look more like our BASIC example (TURBO BASIC,
|
|
that is) from two months ago. OK, here goes:
|
|
|
|
|
|
; *******************************
|
|
; Character Set Loader in Action!
|
|
; *******************************
|
|
|
|
; For the purposes of this first
|
|
; article, ignore these first two
|
|
; procedures. I borrowed them from
|
|
; the Action! ToolKit for the purposes
|
|
; of this article.
|
|
|
|
PROC CIO=$E456(BYTE areg,xreg)
|
|
|
|
CARD FUNC Burst(BYTE chan,mode,
|
|
CARD addr,buflen)
|
|
|
|
TYPE IOCB=[BYTE id,num,cmd,stat
|
|
CARD badr,padr,blen
|
|
BYTE a1,a2,a3,a4,a5,a6]
|
|
|
|
IOCB POINTER iptr
|
|
|
|
chan==&$07
|
|
iptr=$340+(chan LSH 4)
|
|
iptr.cmd=mode
|
|
iptr.blen=buflen
|
|
iptr.badr=addr
|
|
CIO(0,chan LSH 4)
|
|
RETURN(iptr.blen)
|
|
|
|
CARD FUNC BGet(BYTE chan CARD addr,len)
|
|
|
|
CARD temp
|
|
|
|
temp=Burst(chan,7,addr,len)
|
|
RETURN (temp)
|
|
|
|
|
|
; *************************************
|
|
; This is the procedure we're concerned
|
|
; with this month. It is the main
|
|
; program. Notice how close it is to
|
|
; the TurboBasic code.
|
|
|
|
PROC main()
|
|
|
|
CARD HiMem=741, ChsetStart
|
|
|
|
BYTE ChsetBase=756
|
|
|
|
ChsetStart=(HiMem-1024)&$FC00
|
|
HiMem=ChsetStart
|
|
Open(1,-D:FANCY3.FNT-,4,0)
|
|
BGet(1,ChsetStart,1024)
|
|
Close(1) ChsetBase=ChsetStart/256
|
|
|
|
RETURN
|
|
|
|
|
|
OK, Let's get started. Boot your ACTION! cartridge and type in the
|
|
example exactly as you see it. You can leave off the semi-colons and
|
|
anything after them on a line. They are ACTION!'s version of BASICs
|
|
REMark statement. You may also substitute the name of any character font
|
|
you have in place of FANCY3.FNT.
|
|
|
|
When you're all done typing, hit Shift-Control-W to write your file to
|
|
disk. Then hit Shift-Control-M to go to the monitor. (Just a white bar
|
|
across the top of the screen.) Hit -C- to compile your program. The
|
|
compiler will complain if you have made any errors and will put you in
|
|
the approximate area of the mistake when you go back to the editor.
|
|
Assuming it compiled OK, make sure your disk with the font you named is
|
|
in the drive and hit -R- to run your compiled program. Now go back to the
|
|
editor and look at your program in its new font.
|
|
|
|
We'll just take a brief look at the main program this month and explain
|
|
more next time. The main program starts where it says PROC main() and
|
|
ends where it says, RETURN. Sort of like a GOSUB or PROCEDURE in TURBO
|
|
BASIC. The first two lines in the main program that start with the words
|
|
CARD and BYTE will be explained in great detail next month. Right now
|
|
we'll just say that those are variables we will be using in our main
|
|
program.
|
|
|
|
The first actual line in the program says that we are going to start our
|
|
new character set at HiMem (which stands for the top of RAM memory, or
|
|
Himemory) minus 1024 bytes. Remember from two months ago, that is the
|
|
size of a character set. That funny stuff at the end with the dollar sign
|
|
and the FC00 we'll deal with some other time. It just makes sure our
|
|
character set starts in the right place.
|
|
|
|
The next line resets where the computer thinks High Memory is to where
|
|
the character set starts. That way the computer won't go high enough to
|
|
write stuff into our new character set. By the way, do you notice that in
|
|
BASIC, we use memory location 106, called RAMTOP and we also have to call
|
|
Graphics 0 to set things right because the computer puts the screen
|
|
display stuff under RAMTOP? Well, ACTION! stuffs some other stuff up
|
|
there besides the screen display and HiMem (location 741 and 742) has the
|
|
screen display and the other stuff OVER it not under it. That's why we
|
|
don't have to do a Graphics 0 call.
|
|
|
|
Next we Open a channel to the disk file we want to use. This is just like
|
|
BASIC. Next we use the BGet command to load in 1024 bytes of our new
|
|
character set and stick them at ChsetStart. The BGet command is not built
|
|
into the ACTION! cartridge. It is part of an extra disk, called the
|
|
ACTION! ToolKit. Here is one nice thing about ACTION! that BASIC can't
|
|
do. Someone else can write a routine to do a BGet command for instance
|
|
and you can load it in and use it without having to understand how it
|
|
works. For instance, now YOU have a routine that loads in an alternate
|
|
character set that you can use in your own ACTION! programs! The BGet
|
|
command here works exactly the same as in TURBO BASIC so I won't bother
|
|
explaining that whole thing again.
|
|
|
|
The next line simply closes the disk file and points the computer to our
|
|
new character set. The RETURN ends the program.
|
|
|
|
_______________________________________
|
|
UP/COMING FOR THE 8-BIT by Bill Pike
|
|
_______________________________________
|
|
Reprinted from the PAC Newsletter
|
|
|
|
We have recently been given a demo copy of STjr published by Merrill Ward
|
|
& Associates. This is a new Graphics Operating System (GOS) is designed
|
|
for the 8-bit computers.
|
|
|
|
This system supports an ST MOUSE, that's right an ST MOUSE in a 8-BIT
|
|
ATARI. The MOUSE is connected directly to joystick port #1. A joystick
|
|
in port #2 is also supported as well as the cursor control keys &
|
|
spacebar. A demo disk can be obtained from Merrill Ward at 255 North El
|
|
Clelo Rd., Suite 222, Palm Springs Calf. 92262. The price for this disk
|
|
is $5.00 and the price is applied to the purchase of the final version of
|
|
the program at a projected cost of $59.99.
|
|
|
|
The demo disk received has a screen much like that of the ST GEM system,
|
|
the icons are very similar. The DOS on the disk is a Version of
|
|
SpartaDos, however all the commands have been superseded by the graphics
|
|
environment. In other words all commands are given graphically rather
|
|
than typing in a command. The mouse action is fast and accurate.
|
|
|
|
The pull-down windows are implemented and are quite fast, much faster
|
|
than expected using some other graphic systems as a guide. This shows
|
|
what can be done. The same publisher has a program called THE CELEBRITY
|
|
COOKBOOK VOL.1 ($39.95) for the ST & 8-bit where the mouse interface and
|
|
pull-down windows are fully implemented, for this program. (See the next
|
|
column for a review). However most of the expected functions like
|
|
diskcopy, file copy, etc. are not on the demonstration disk. These
|
|
functions are in the menus but do not operate.
|
|
|
|
The publisher hopes that this will become the operating system of the
|
|
future for the Atari 8-bit systems. However it is unclear if the
|
|
purchase of the final version will license the purchaser to use this
|
|
system for his/hers own programs or if a additional license fee would be
|
|
charged for commercial use of this operating environment.
|
|
|
|
The final program is supposed to be on a cartridge and use ADOS as its
|
|
base. It will have bank switched ROM and let the operator use the RAM
|
|
under the cartridge so it will take up no operating room, similar to the
|
|
DOSXL system.
|
|
|
|
Here is something really new for the Atari 8-bit machines that shows a
|
|
lot of promise. The action is as fast as the ST, on the screen. I can
|
|
see real promise for this type of program. It will be interesting what
|
|
happens. If you have $5 bucks to spend, and want to see just what can be
|
|
done and want to be first in line for the final version, this would
|
|
probably be a good way to spend it. Did I say that you should also
|
|
beg/borrow/steal a mouse from your friendly neighborhood ST user? I
|
|
guess I didn't but you do.
|
|
_______________________________________
|
|
CELEBRITY COOKBOOK REVIEW by Bill Pike
|
|
_______________________________________
|
|
Reprinted from the PAC Newsletter
|
|
|
|
|
|
I realize that the diet of a computer person consists mostly of pizza,
|
|
hamburgers, twinkies, and soda pop, etc. I also realize that it is nice
|
|
to be able to include other values of a gustatorial nature. A program
|
|
has arrived for those who enjoy eating and entertaining, such as the
|
|
better half. The program is published by Merrill Ward & Associates.
|
|
The cost of this program is $39.95 and is available for the 8-bit as well
|
|
as the ST machines.
|
|
|
|
The 8-bit version uses the GOS system developed by the publisher. In
|
|
other words you can use a ST mouse in joystick port #1 or a joystick in
|
|
port #2 or the keyboard. This makes for a very user friendly program.
|
|
My wife, who finds just everything about a computer unfriendly, sat down
|
|
with this program for a full hour non-stop. This is a new record for
|
|
her. In-fact the only reason she left the keyboard is that she had to go
|
|
to a baby shower that she was late for as it was. I feel that this is
|
|
the highest recommendation for the program available, even if I didn't
|
|
say anything else.
|
|
|
|
Getting to the meat or fish or fowl of the program. You are given the
|
|
choice of the cookbook or filer on the first screen. The cookbook gives
|
|
you access to the recipes as well as a bartenders guide, beverages, soups
|
|
& sauces, etc. You also have access to a wine directory and guide.
|
|
|
|
There are also main courses & desserts available. All in all there are
|
|
about 45 recipes as well as party tips and beverage recommendations. Most
|
|
of the recipes have a short story about the dish from the celebrity who
|
|
wrote the recipe. You can also save your own favorite recipes on the
|
|
filer disk. The filer program can be configured to use two drives so
|
|
that the main program can be in drive one and the data disk in drive 2.
|
|
You can use as many data disks as you wish. There are also sort
|
|
functions available to make selection easier.
|
|
|
|
The instructions are straight forward and easily used. The entire
|
|
program is menu driven. This makes for a very user friendly program.
|
|
|
|
There is also a resize feature. This allows changing the amounts of
|
|
ingredients to the number of servings. The resize works very rapidly and
|
|
will just as easily change a 12 portion recipe to 2 portions or 30
|
|
portions, up to 999 portions.
|
|
|
|
You can request a printout of the full recipe, the ingredients with
|
|
quantities, or just a shopping list of ingredients. If you resize the
|
|
recipe before requesting the printout the quantities will be increased or
|
|
decreased depending on the number of portions you request.
|
|
|
|
There are 5 additional volumes planned for a total of more than 300
|
|
recipes. The cost of the additional disks are not given but I assume the
|
|
price will be less than the main program.
|
|
|
|
The program is copy protected by a 10X10 3 number matrix on a separate
|
|
card. In fact you are told to make backup disks when you first read the
|
|
instructions. These are the sheets of paper you generally put up on a
|
|
shelf or lose immediately upon opening the program. The code requested
|
|
is a random combination of a row and a column on the card, which changes
|
|
every time you use the program. This is a very good program and should
|
|
be in the library of all computer users, even those without a spouse.
|
|
|
|
_______________________________________
|
|
ST MODIFICATION by Jeff Rigby
|
|
_______________________________________
|
|
Modification to the ST power-on reset delay timer
|
|
|
|
The following modification will cause the ST to be in a Halt condition
|
|
for apx 14 sec following turn-on. This allows a Hard Drive time to go
|
|
through its initialization. The modification will not affect reset
|
|
timing (.3 sec). It's relatively simple in that it requires the
|
|
replacement of only one resistor (in the 520 & 1040 series).
|
|
|
|
If you have a Hard Drive for your ST you presently have to turn on the
|
|
HD, wait until it stops making noise (initialization...about 14 sec) and
|
|
then turn on your computer. With the circuit modification below you can
|
|
now turn both on at the same time (idiot proof).
|
|
|
|
520ST and 1040ST
|
|
|
|
All computers have reset circuts and a circuit to perform a reset after
|
|
the computer has been turned on (allowing the power supply to stabilize).
|
|
In the ST these two reset circuits are in one chip, a 556 timer IC (a 556
|
|
is two 555 timers in one package). Both circuits use the same timing
|
|
components for a delay of .3 seconds. One circuit holds the reset low
|
|
for .3 sec after the reset button has been pushed and the other holds the
|
|
reset low for .3 seconds after power turn-on. This second circuit (power
|
|
on reset) is the one we are going to change.
|
|
|
|
Basically we are looking at a 22Uf cap charging from B+ through a
|
|
resistor (12k). When the voltage on the cap reaches trigger level the
|
|
555 timer turns off allowing the reset line to go high.
|
|
|
|
The formula for Time T with Cap C and Resistor R is as follows:
|
|
|
|
Resistor = R
|
|
Cap = C T= (1.1)*R*C
|
|
Time (hold down) = T
|
|
|
|
For a stock ST
|
|
R = 12k
|
|
C = 22Uf
|
|
|
|
Thus: T=(1.1)*(12000)*(0.000022)
|
|
T=.29 sec
|
|
|
|
Ok now for your computer....
|
|
|
|
Turn on your Hard drive and count the seconds until the activity light
|
|
goes out. Mine is about 14 seconds. This time is what you need to
|
|
determine the value of the resistor you are going to add to your ST.
|
|
|
|
For a time of 14 sec we use the following formula to determine the
|
|
resistor we need.
|
|
|
|
R= (14 sec)/(1.1)*(0.000022)
|
|
R= 578k
|
|
|
|
Look in your ST for a Chip that has the number 556 on it (NEAR THE RESET
|
|
BUTTON). Off pin 8 you will find a resistor with the color bands;
|
|
brown, red, orange (12k).
|
|
|
|
520ST R83
|
|
1040ST R9
|
|
|
|
Cut this resistor loose and install a 560K resistor; green, blue, yellow.
|
|
|
|
Now reassemble and check. Extremes of temperature can affect the timing
|
|
of this RC circuit. I have found that a very cold computer (40F) can
|
|
knock almost two seconds off the circuits reset time. Also, the 22Uf cap
|
|
is manufactured with a tolerance of 20%. A 20% difference can make a 4
|
|
second difference in your calculations. You may want to install a
|
|
variable resistor in place of a fixed resistor. If you are like me,
|
|
you can't wait for your computer to come on and you will want the min
|
|
wait time that still allows the HD to initialize properly. The variable
|
|
resistor will allow you to set the time to the nearest second. Use a
|
|
360K resistor in series with a 500 K pot.
|
|
|
|
MEGA ST
|
|
|
|
Atari changed the design of the Reset circuit in the Mega ST. There are
|
|
no longer two seperate circuits for reset. I had to kluge my Mega to get
|
|
the same functionality. See below:
|
|
|
|
--| |--*
|
|
c3 |
|
|
| 1000Uf 1000Uf @ 16v ($1.50)
|
|
*---|>|-*--| |----* Gnd
|
|
diode | | 1 amp diode (.50)
|
|
*--[][]---*
|
|
| 33k ohm 33k ohm @ 1/4 watt (.50)
|
|
|
|
|
*--|>|-----* 5v
|
|
diode 1 amp diode (.50)
|
|
|
|
C3 is a 10Uf cap under the switching power supply. This cap is charged
|
|
by a resistor network similar to the 555 circuit in the 520ST. When the
|
|
voltage reaches 1.2v the reset line goes high. The circuit has the same
|
|
.3 sec delay for reset and 13 seconds for turn-on.
|
|
|
|
The above circuit connects to the Mega at three places: 5v, Ground and
|
|
the positive terminal of C3.
|
|
|
|
Increasing the value of the 1000Uf cap increases the turn-on reset delay.
|
|
The 33K resistor is used to fine tune the reset delay for power turn-on.
|
|
Increasing the value of the resistor decreases reset delay and decreasing
|
|
the value increases power on reset delay. Typical resistor values are
|
|
from 18k (19 sec) to 50k (11 sec).
|
|
|
|
The bottom diode discharges the 1000Uf cap to the 5v supply (when you
|
|
turn off the computer the 5v supply goes to 0) when you turn the Mega
|
|
off. You should count to 5 before turning a Mega back on to insure a
|
|
complete cold boot. Waiting 1 sec will not allow the 1000Uf to discharge
|
|
enough (the 5v supply in the Mega discharges slowly after dropping to
|
|
.6v) and your power-on reset delay may drop to 9 sec from 13 sec.
|
|
|
|
The top diode provides isolation so that pressing the reset button after
|
|
the 1000Uf cap has charged (power on) will cause only a .3 sec reset.
|
|
|
|
The above modifications require some technical skill and should be done
|
|
by a service center or a qualified person. Intersect Software makes no
|
|
guarantees reguarding the reliablity of the above modifications. You, as
|
|
always, perform the modifications at your own risk.
|
|
|
|
This technical note may be freely copied as long as the credits remain
|
|
intact.
|
|
_______________________________________
|
|
ZMAGAZINE Issue #112 June 27, 1988
|
|
Copyright (c)1988 APEInc, Ron Kovacs
|
|
All Rights Reserved
|
|
_______________________________________
|