5618 lines
257 KiB
Plaintext
5618 lines
257 KiB
Plaintext
@(#)top:
|
||
|
||
########
|
||
##################
|
||
###### ######
|
||
#####
|
||
##### #### #### ## ##### #### #### #### #### #### #####
|
||
##### ## ## #### ## ## ## ### ## #### ## ## ##
|
||
##### ######## ## ## ## ##### ## ## ## ## ##
|
||
##### ## ## ######## ## ## ## ### ## ## #### ## ##
|
||
##### #### #### #### #### ##### #### #### #### #### #### ######
|
||
##### ##
|
||
###### ###### Issue #14
|
||
################## Version 1.0
|
||
######## November 1996
|
||
|
||
-------------------------------------------------------------------------
|
||
|
||
@(#)contents: Table of Contents
|
||
|
||
|
||
Features
|
||
6. The Commodore Telnet BBS by Bo Zimmerman
|
||
(Reference: net)
|
||
In this age of internetworked computer systems, is the
|
||
Commodore left out? No way, as Bo Zimmerman describes how to
|
||
coax your Commodore BBS system to play the networking game.
|
||
Bo shows how to set up your BBS so that Internet users can
|
||
"telnet" to your BBS from anywhere on the 'Net.
|
||
8. Menu Toolbox III by Jeff Jones
|
||
(Reference: toolbox)
|
||
You've got this neat idea for a game, utility, or productivity
|
||
application. The engine is complete and working, but the user
|
||
interface is a mess. Do you scrap the project because you're
|
||
not up to the task of writing a whole UI engine? Nonsense. Jeff
|
||
presents a rich set of functions and subroutines to tame that
|
||
killer application.
|
||
11. The CMD Nirvana: The Guts and Glory by Todd Elliott
|
||
(Reference: hw)
|
||
Has your computer system started looking like the multi-headed
|
||
beast from a "B" movie? Are you tired of having so many items
|
||
on your desk? Do you envy IBM PC owners with their all-in-one
|
||
computer? Well, if you answered YES! to any of the above, let
|
||
Todd show you his souped up C128DCR. Learn how you, too, can
|
||
"upgrade" your computer system and refine its image.
|
||
13. Jim Butterfield: The Commodore Guru - An Interview by Jim Lawless
|
||
(Reference: jb)
|
||
Jim Butterfield has long been associated with the Commodore
|
||
computer system, from the days of the KIM-1 to the present.
|
||
Many of us learned machine language through Jim's articles or
|
||
books, while most have benefitted from his early work on
|
||
creating memory maps and documenting KERNAL routines for the
|
||
Commodore line. Jim Lawless talks to the ubiquitous Commodore
|
||
Guru.
|
||
|
||
Columns
|
||
4. Hi Tech Trickery by Alan Jones
|
||
(Reference: trick)
|
||
In part II of Alan's "Heavy Math" series, he moves right into
|
||
Linear Programming and how to accomplish it on the C64. If you're
|
||
still not sure what LP math is, read on, as you'll be surprised
|
||
at which everyday problems fall into this category of mathematics.
|
||
15. Hacking BASICs by Richard T. Cunningham
|
||
(Reference: basic)
|
||
Even as more and more programmers take up the ML flag and wave it
|
||
proudly, there are many who either use BASIC entirely, or prototype
|
||
pieces of code in BASIC before converting to ML. Richard outlines
|
||
some common "gotchas" in the ever-present programming language.
|
||
17. Twiddling the Bits by Ward Shrake
|
||
(Reference: bits)
|
||
OK, VIC-20 enthusiasts, listen up. Resident VIC-20 cartridge expert
|
||
Ward Shrake details exactly how the VIC-20 and its cartridges work
|
||
together to allow the user to play games and use applications on
|
||
cartridge. Ward details how to archive your collection of VIC
|
||
carts, as well as how the computer recognizes and executes code on
|
||
a cartridge.
|
||
|
||
Departments
|
||
1. The (cough, cough) Hacking Editor
|
||
(Reference: editor)
|
||
2. Input/Output
|
||
(Reference: io)
|
||
3. Newsfront
|
||
(Reference: news)
|
||
5. Hacking the Mags
|
||
(Reference: mags)
|
||
7. UseNuggets
|
||
(Reference: usenet)
|
||
9. FIDO's Nuggets
|
||
(Reference: fido)
|
||
10. The Hacking Review
|
||
(Reference: review)
|
||
12. Hack Surfing
|
||
(Reference: surf)
|
||
14. Commodore Trivia
|
||
(Reference: trivia)
|
||
16. ? DS, DS$: rem The Error Channel
|
||
(Reference: error)
|
||
18. The Next Hack
|
||
(Reference: next)
|
||
19. Hacking the Code
|
||
(Reference: code)
|
||
|
||
-------------------------------------------------------------------------
|
||
|
||
@(#)legal: Commodore Hacking Legal Notice
|
||
|
||
Commodore and the respective Commodore product names are trademarks or
|
||
registered trademarks of ESCOM GmbH or Visual Information Services
|
||
Corporation. Commodore Hacking is in no way affiliated with ESCOM GmbH
|
||
or Visual Information Services Corporation (VISCorp), owners of said
|
||
trademarks. Commodore Hacking is published 4 times yearly by:
|
||
|
||
Brain Innovations Inc.
|
||
10710 Bruhn Avenue
|
||
Bennington, NE 68007
|
||
|
||
The magazine is published on on-line networks free of charge, and a nominal
|
||
fee is charged for alternate mediums of transmission.
|
||
|
||
Permission is granted to re-distribute this "net-magazine" or "e-zine" in
|
||
its entirety for non-profit use. A charge of no more than US$5.00 may be
|
||
charged by redistribution parties to cover printed duplication and no more
|
||
than US$10.00 for other types of duplication to cover duplication and media
|
||
costs for this publication. If this publications is included in a
|
||
for-profit compilation, this publication must be alternately available
|
||
separately or as part of a non-profit compilation.
|
||
|
||
This publication, in regards to its specific ordering and compilations of
|
||
various elements, is copyright (c) 1995-96 by Brain Innovations,
|
||
Incorporated, unless otherwise noted. Each work in this publication
|
||
retains any and all copyrights pertaining to the individual work's contents.
|
||
For redistribution rights to individual works, please contact the author
|
||
of said work or Brain Innovations, Inc.
|
||
|
||
Brain Innovations, Inc. assumes no responsibility for errors or omissions
|
||
in editorial, article, or program listing content.
|
||
|
||
-------------------------------------------------------------------------
|
||
|
||
@(#)info: Commodore Hacking Information
|
||
|
||
Commodore Hacking is published via the Internet 4 times yearly, and is
|
||
presented in both ISO-8859-1 and HTML versions. This and previous issues
|
||
can be found at the Commodore Hacking Home Page
|
||
(http://www.msen.com/~brain/chacking/), as well as via FTP
|
||
(ftp://ccnga.uwaterloo.ca/pub/cbm/hacking.mag/)
|
||
|
||
In addition, the Commodore Hacking mail server can be used to retrieve each
|
||
issue. To request a copy of an issue, please send the following electronic
|
||
mail message:
|
||
|
||
To: brain@mail.msen.com
|
||
Subject: MAILSERV
|
||
Body of Message:
|
||
|
||
help
|
||
catalog
|
||
send c=hacking13.txt
|
||
quit
|
||
|
||
To retrieve a PKZIP 1.01 archive of the individual articles in Commodore
|
||
Hacking, request the file c=hacking13.zip
|
||
|
||
To subscribe to the Commodore Hacking and receive new issues as
|
||
they are published, add the following command to you MAILSERV message
|
||
prior to the quit command:
|
||
|
||
subscribe c=hacking Firstname Lastname msglen
|
||
|
||
(msglen is largest size of email message in line you can receive. Each
|
||
line is roughly 50 characters, so 600 lines is about 30000 bytes. When
|
||
in doubt, choose 600)
|
||
|
||
example:
|
||
|
||
subscribe c=hacking Jim Brain 600
|
||
|
||
Although no fee is charged for this magazine, donations are gladly accepted
|
||
from corporate and individual concerns. All moneys will be used to defray
|
||
any administrative costs, subscribe to publications for review, and
|
||
compensate the individual authors contributing to this issue.
|
||
|
||
As part of a magazine promotion, Commodore Hacking Issue #12 was
|
||
professionally laid out on printed format. These printed copies are for
|
||
sale.
|
||
|
||
If you can not obtain Commodore Hacking through any other means and wish
|
||
to purchase a copy on disk or would like to purchase the professionally
|
||
printed Issue #12, please address a check or money order to "Jim Brain"
|
||
and mail to:
|
||
|
||
Jim Brain
|
||
10710 Bruhn Avenue
|
||
Bennington, NE 68007
|
||
|
||
Disk copies of each issue: USD$5.00
|
||
Professionally printed copy of Issue #12: USD$6.00
|
||
|
||
All prices cover only duplication and materials and include shipping in
|
||
the United States. For disk copies, please specify format:
|
||
|
||
Computer Disk Size Capacity Notes
|
||
|
||
CBM/PETSCII 5.25 inch 170 kB 1541 format
|
||
340 kB 1571 format
|
||
3.50 inch 800 kB 1581/FD2000 format
|
||
1.6 MB FD2000/FD4000 format
|
||
IBM/ASCII 3.50 inch 720 kB Double Density
|
||
1.4 MB High Density
|
||
|
||
Any persons wishing to author articles for inclusion in Commodore Hacking
|
||
are encouraged to view the submission guidelines on the WWW
|
||
(http://www.msen.com/~brain/pub/c-hacking-submit.txt) or via the MAILSERV
|
||
server (send c-hacking-submit.txt).
|
||
|
||
=========================================================================
|
||
|
||
@(#)rch: Reading C=Hacking
|
||
|
||
Starting with Issue 11 of Commodore Hacking, the new QuickFind indexing
|
||
system is utilized to aid readers of the text version in navigating the
|
||
magazine. At the top of each article or other important place in the
|
||
magazine, a word prefixed with a special string is present. (See the
|
||
title of this article for an example.) Throughout the magazine, if an
|
||
article is mentioned, it will be followed by a reference string. For
|
||
example, if we mentioned this article, we would add (Reference: rch) after
|
||
the name. By using your favorite editor's search function and searching
|
||
for the string after the word "Reference:", prefixed by the magic prefix
|
||
string, will move you directly to the article of choice. To merely skip to
|
||
the next article in the magazine, search only for the magic prefix string.
|
||
|
||
Some handy indexing strings possibly not referenced anywhere are:
|
||
|
||
top top of issue
|
||
bottom bottom of issue
|
||
contents table of contents
|
||
legal legal notice
|
||
|
||
For those with access to a UNIX system, the command "what" can be
|
||
run on the issue, which will result in all the article titles being
|
||
printed.
|
||
|
||
A slightly different magic prefix string "@(A)" is used to delimit
|
||
sub-topics or main heading in articles. The text after the magic string
|
||
differs depending on article content. For the Input/Output column
|
||
(Reference: io), the text after the magic prefix will either be "c" for
|
||
comment, or "r" for response. In features and columns, a number after
|
||
the prefix indicates the ordinal of that heading or sub-topic in the
|
||
article. If a specific sub-topic is referenced elsewhere in the article,
|
||
a sub-topic reference will be indicated. A reference to "@(A)r" would
|
||
be written as "(SubRef: r)".
|
||
|
||
As time goes on, the role of this indexing system will be expanded and
|
||
changed to ease navigation of the text version, but minimize the clutter
|
||
added by these extra items.
|
||
|
||
=========================================================================
|
||
|
||
@(#)editor: The Hacking Editor
|
||
by Jim Brain (j.brain@ieee.org)
|
||
|
||
Sometimes, it's important to look back and see how far we've come.
|
||
The following story comes to mind:
|
||
|
||
A young boy sits in the living room and flips earnestly through a
|
||
Montgomery Wards catalog looking for some item. The year is 1983.
|
||
At last he finds the item and presents the book to his father, who
|
||
is reading a periodical in his easy chair. "Dad," the boy begins,
|
||
"I want to buy one of these with my savings." The father, startled
|
||
upon hearing of such a prospective purchase, looks up and reaches for
|
||
the catalog. "What is it you want to buy?" he asks. "That video game
|
||
on the top of the page is what I want," the boy explains. The father
|
||
looks at the pertinent page and notices a glossy picture of an Atari
|
||
VCS2600 console system, complete with options. Frowning, the father
|
||
raises his head and look in the boy's eyes. "Son," he starts, "I am
|
||
not going to let you buy one of these video game systems. All they are
|
||
good for is playing games, and that's too much money to spend to buy a
|
||
game." The boy protests, stating that "all his friends" own one and
|
||
that it the "thing" to own today. The father, known for being stubborn,
|
||
refuses to budge on the issues, but concludes the exchange by handing the
|
||
catalog back and saying, "If you want to buy a machine that plays games,
|
||
buy one of those new computer systems. That way, you can play games with
|
||
it and also use it for other things when the games get old and boring."
|
||
The boy takes back the book and sulks for a while as he flips through the
|
||
pages. As the hurt wears off, he notices a section near the video console
|
||
page that shows off those new computer systems his Dad referred to. At
|
||
first, the kid's eye is drawn to the shiny silver Texas Instruments TI-99/4
|
||
computer system pictured in the catalog. He is about to jump up and
|
||
again hand the catalog to his Dad when he realizes the "new-fangled"
|
||
item is priced at $322.00. His heart sinks, for his savings account only
|
||
holds a bit over $250.00 and the machine looked so impressive. So, beaten
|
||
again, the young boy flips the page and resigns himself to never owning
|
||
anything "cool". However, the next page pictures a different computer
|
||
system and a quick check confirms the price is within budget: $233.00.
|
||
The computer isn't as impressive looking as the TI, but the boy will not
|
||
be without a "video game", and this fits the bill.
|
||
|
||
Needless to say, the computer was a Commodore VIC-20, and the boy bought
|
||
a few games for the unit, including a Space Invaders clone and a Pac-Man
|
||
clone. As the father predicted, the boy lost interest in the unit after a
|
||
while and packed the system away. However, as the boy entered 7th grade, he
|
||
again pulled the unit out when he learned that one of his classrooms was
|
||
equipped with Commodore VIC machines. His interest in computers as tools
|
||
started there and grew with the years.
|
||
|
||
As I finish my first year of editorship of Commodore Hacking, I am looking
|
||
back at the events that have occurred in the last year and those that have
|
||
occurred over the years since I first learned about Commodore computers.
|
||
Commodore owners have come from 3.5kB and 22 by 23 screens with the
|
||
VIC-20 to CBM machines with features like multiple megabytes of RAM, 33.6
|
||
kbps FaxModems, gigabyte hard drives, 8-20 MHz operation, and a host of
|
||
other options. No, I don't think Commodore computers can solve all the
|
||
world's problems. However, they and their owners should be commended on
|
||
their loyalty and dedication to the market and to the advances that have
|
||
kept the machines out of closets and dumpsters. While I won't doubt that
|
||
there are more IBM PC clones in the world today, I wonder how many PC
|
||
units are resting under tons of refuse in the city dump.
|
||
|
||
Here at Hacking Headquarters, I am impressded by what we have accomplished
|
||
with the publication, but I have already outlined improvements that can be
|
||
made and things I didn't quite get implemented this past year. As always,
|
||
your letters and comments are always appreciated. The publication depends
|
||
on reader feedback to ensure that covers subjects of interest to the
|
||
Commodore enthusiast. Of course, some things, like the technical focus
|
||
of Commodore Hacking, define the magazine and its place among the various
|
||
Commodore publications. However, even that can be continually improved.
|
||
So, as you look back on the past year of Commodore usage, take a look at
|
||
our progress or lack thereof and send us a note, if only to tell us to
|
||
change nothing. Remember, we can't increase the publication's usefulness
|
||
to you if we don't know where it currently falls short.
|
||
|
||
As for the boy in the above story, I think he's come a long way since that
|
||
fateful day in 1983. He no longer thinks TI's look better than CBM's. In
|
||
fact, I think he has earned an impressive reputation as a Commodore
|
||
advocate. Then again, I might be a bit biased, so you be the judge. The
|
||
boy in the story was a youngster named Jimmy. Jimmy Brain.
|
||
|
||
Enjoy YOUR magazine,
|
||
|
||
Jim Brain (j.brain@ieee.org)
|
||
editor
|
||
|
||
=========================================================================
|
||
|
||
@(#)io: Input/Output
|
||
|
||
Obviously, Commodore Hacking depends on the comments and article
|
||
submissions from the Commodore community to flourish. Everyone sees the
|
||
articles, but let's not forget those comments. They are very helpful,
|
||
and every attempt is made to address concerns in them. Address any
|
||
comments, concerns, or suggestions to:
|
||
|
||
Commodore Hacking
|
||
10710 Bruhn Avenue
|
||
Bennington, NE 68007
|
||
j.brain@ieee.org (Internet)
|
||
|
||
@(A)c: Hey! You Characters! Sit Down!
|
||
|
||
From: Adam Vardy (abe0084@InfoNET.st-johns.nf.ca)
|
||
|
||
Dear C=Hacking,
|
||
|
||
In the last issue there was some source code for printing very big
|
||
numbers. This source code is all in uppercase. This seems to be true
|
||
whenever source code is included in the magazine. I am wondering why
|
||
that is. This makes it rather difficult for me to extract the source and
|
||
put it into a form that my assembler can deal with. I can't load the
|
||
source right into Power Assembler. It only accepts lowercase code. It
|
||
is puzzling to me why you do this, because I would think any assembler
|
||
that accepts plain text would work this way too.
|
||
|
||
Another thing is this. In the last issue one of the uuencoded files in
|
||
the magazine was dim4. The source code for the included files is for the
|
||
Merlin Assembler. OK. So I try to read these files. I'm having
|
||
problems with this. If I try to More them in ACE, I can't. It's
|
||
unreadable. They seem to be text, but however I try to read them, I get
|
||
weird characters or other stuff. Loading them into a word processor or
|
||
into ZED, or anything doesn't work.
|
||
|
||
I don't have Merlin. But I would think it must have some way to save
|
||
plain text source. That way, everyone can at least read it, right?
|
||
|
||
@(A)r:
|
||
Code is printed in the magazine as it is received by Commodore Hacking.
|
||
The only formatting done to source code in articles and columns is to
|
||
indent each line 3 spaces. The source code to which you refer above was
|
||
in a USENET posting and was captured from the comp.sys.cbm newsgroup in
|
||
uppercase. Our theory is that some folks who upload code to the Internet
|
||
do not do an PETSCII-ASCII translation, which would cause the effect of
|
||
switching all lowercase characters to uppercase. However, we are not
|
||
certain that there all assemblers expect lowercase, which is why we do
|
||
not try to alter case of source code.
|
||
|
||
As for your second problem, we accept part of the blame. We are attempting
|
||
to obtain allof the source code used in the publciation in ASCII or
|
||
PETSCII format. However, a number of assemblers, including Turbo-Assembler,
|
||
do have an internal format that is neither ASCII nor PETSCII. Merlin may
|
||
also have such a format. However, we are unfamiliar with Merlin, so it
|
||
may not have an option to output code in ASCII or PETSCII, as Turbo-
|
||
Assembler does. Our suggestion is to contact the author of the article
|
||
directly and ask for an ASCII copy of the source and accept our apologies.
|
||
|
||
|
||
@(A)c: A Plea for Information
|
||
|
||
From: MICHAEL I DEMING <m.deming@genie.geis.com>
|
||
|
||
Dear C=Hacking,
|
||
|
||
An article or series of articles on the 80 column chip would be very helpful
|
||
e.g. how to use sprites, a screen dump and other things like that. If I knew
|
||
how to do this I would write the articles but I don't so I am begging for
|
||
any info on this chip.
|
||
|
||
@(A)r:
|
||
Always check back issues of Commodore Hacking for prior articles on topics.
|
||
See Commodore Hacking Information (Reference: info) for directions on how
|
||
to access back issues. VDC information is included in Issue 1 as part of
|
||
Craig Bruce's "Simple Hires Line Drawing Package for the C128" and as part
|
||
of Craig Taylor's "An In-Depth Look at the 8563 Video Chip on the C= 128" in
|
||
issue 2. As for the other topics, other articles in Commodore Hacking touch
|
||
on those issues, but we always appreciate new articles dealing with these
|
||
topics.
|
||
|
||
@(A)c: All I Can Say is Wow!
|
||
|
||
From: George Szaszvari <gsz@dial.pipex.com>
|
||
|
||
In Commodore Hacking #13 Preface:
|
||
|
||
>Whew! Folks, here is the long awaited Issue #13 of Commodore Hacking.
|
||
>Hacking Headquarters has produced an issue overflowing with technical
|
||
>articles sure to satisfy even the most discerning Commodore enthusiast.
|
||
>In fact, this issue is OVERFLOWING with 384 kB of material, so empty out
|
||
>that mailbox. Here it comes...
|
||
|
||
Yeah, a real BUMPER issue, thanks!
|
||
|
||
@(A)r:
|
||
Well, the size is a both a blessing and a curse. While we are happy about
|
||
the number and diversity of articles, we know there are those who can't
|
||
handle a large issue like #13, so we are trimming the size a bit from #14.
|
||
However, thanks for the comments.
|
||
|
||
@(A)c: Speaking of Kudos!
|
||
|
||
From: Brett Tabke
|
||
|
||
Dear C=Hacking,
|
||
|
||
Thank you! One of, if not THE, best issues yet!
|
||
|
||
I can't thank you enough for all the work you've done here Jim.
|
||
Between Hacking, The FAQ, and the CBM product documetation, you have
|
||
put out more valuable information in 6 months than most of the pay
|
||
magazines to in their lifetime. The CBM products listing is a rare
|
||
treasure that every CBM owner should take time to read.
|
||
|
||
@(A)r:
|
||
We don't know what to say. We're just happy that everyone stood by us
|
||
during the move and the delay in getting #13 out. By th way, for those who
|
||
have not seen. The CBM Products List to which Brett Tabke refers is
|
||
available as "cbmmodel.txt" on the MAILSERV and through the WWW.
|
||
(http://www.msen.com/~brain/pub/cbmmodel.txt) If you prefer to wait, an
|
||
updated copy will be presented in Commodore Hacking #15.
|
||
|
||
@(A)c: Who's Got the Right Copyright?
|
||
|
||
From: Ruth Hackley (fgm@rosenet.net)
|
||
|
||
Dear C=Hacking,
|
||
|
||
I am Ruth Hackley, Ron's wife, and newsletter editor for the L.C.C.U.G. in
|
||
Eugene. Are there any portions of C=Hacking that can be used in the
|
||
newsletter. We plan to provide the magazine on disk to our library as
|
||
well.
|
||
|
||
@(A)r:
|
||
The entire publication can be redistributable as a complete work, as
|
||
explained in the Commodore Hacking Legal Notice (Reference: legal). As
|
||
well, individual articles can be reprinted with permission from the author
|
||
of the article. Commodore Trivia is a special case. Permission has been
|
||
given by the author to reprint Commodore Trivia in newsletters and
|
||
publications, just as _Commodore World_ and this publication do.
|
||
|
||
@(A)c: A Little Lacking
|
||
|
||
From: Scott Brockway <fungus@eskimo.com>
|
||
|
||
Dear C=Hacking,
|
||
|
||
I thought the magazine was sort of a transactor replacement. When I
|
||
downloaded issue 12 of C=Hacking I was not just a bit disappointed. I
|
||
like all the technical stuff and now I fear the mag is no longer for me.
|
||
|
||
Hey C=H, Put the code back in!
|
||
|
||
@(A)r:
|
||
We are sorry you felt this way. It was not, nor is it currently, our
|
||
intention to leave technical readers without articles of interest. We ask
|
||
that you take a good look at the magazine. Others have initially thought
|
||
the magazine lacked technical content, but later determined that the style
|
||
of some articles had changed and the technical articles were separated by
|
||
a few less technical offerings. However, be aware that due to the time and
|
||
space constraints we are trying to fit Commodore hacking in will reduce the
|
||
number of technical articles by 1 or possibly 2 each issue over the old
|
||
issues. Also, some technical articles do not contain any code pieces.
|
||
|
||
In the case of Issue 12, we were forced to redo the issue after an important
|
||
technical article from a semi-regular writer did not appear. The resulting
|
||
rework might have shown through. We hope Issue 13 provided enough
|
||
technical content. Our most technical readers might find the current
|
||
issue a bit light on content, due to problems associated with Commodore
|
||
Hacking's recent relocation efforts. We ask that the technical readers
|
||
bear with us as we ramp up in our new location.
|
||
|
||
One of our continual problems, and one of Craig Taylor's (the previous
|
||
editor) as well was finding quality technical articles to publish. One way
|
||
to solve the problem is to delay the publication date, a tactic Craig might
|
||
have used. However, we are trying to get back on a stable schedule. So,
|
||
if you are up to it, write up a technical piece for inclusion in the next
|
||
issue.
|
||
|
||
@(A)c: A Bit of Their Own Medicine
|
||
|
||
From: wanderer_rtc@usa.pipeline.com (R. T. Cunningham)
|
||
|
||
Dear C=Hacking,
|
||
|
||
I just read CHacking #13 and was very impressed with the amount of work
|
||
put into it. While I was reading the HTML tutorial, I came to a
|
||
not quite brilliant idea.
|
||
|
||
While working on an HTML viewer, take time to see if you can work standard
|
||
C/G viewing. I would love to do up a bunch of web pages using C/G with the
|
||
familiar disclaimer up on top, previously posted by someone else and
|
||
plagiarized by me, <best viewed using a Commodore 8 Bit Computer>. This
|
||
would please quite a few people (besides me of course). Who says we have
|
||
to be able to see 256 colors!
|
||
|
||
@(A)r:
|
||
Oh, do we detect a bit of revenge here? I am sure Jim Brain can arrange C/G
|
||
graphics in the HTML viewer he is working on, but we can see a problem:
|
||
|
||
The eventual goal of the HTML viewer is to grow the application into a
|
||
full fledge WWW Browser. If a site uses C/G graphics exclusively, the
|
||
large number of Commodore enthusiasts that view WWW sites with non-CBM
|
||
graphical browsers will not see the C/G graphics.
|
||
|
||
In addition, some would-be Commodore enthusiasts who explore these C/G
|
||
graphics enabled sites might leave thinking we are snobs and never return.
|
||
We don't need that.
|
||
|
||
We think a slightly altered suggestion is better. When designing the
|
||
"<IMG>" tag in he HTML viewer, allow it to understand the optional
|
||
attribute "CBMSRC". That way, a Commodore site can safely display graphics
|
||
to non-CBM browsers and still put the "Best Viewed with a C64" on the
|
||
page. All the graphics on the page would then be specified by an image tag
|
||
looking like: <IMG SRC="junk.gif" CBMSRC="better.cg">. The CBMSRC attribute
|
||
could then be used on a CBM browser to display the alternate C/G graphic.
|
||
A non=CBM browser would ignore the CBMSRC attribute, and a tag like:
|
||
<IMG CBMSRC=...> would be ignored by the browser as well, since it contains
|
||
no SRC attribute. And, best of all, if you really wanted to keep the
|
||
Netscape browsers out, simply put <IMG SRC="better.cg">.
|
||
|
||
@(A)c: UU what?
|
||
|
||
From: Cameron Kaiser <ckaiser@sdcc13.ucsd.edu>
|
||
|
||
Dear C=Hacking,
|
||
|
||
I noticed that the last C-Hacking had a number of uuencoded
|
||
files concatenated to each other. This presents a problem in unix
|
||
because a number of crufty uudecoders don't recognize them together
|
||
(only the first one). I have made a PERL script that folks can use to
|
||
fix this. I'll leave it in
|
||
ftp.armory.com/pub/user/spectre/UNIX/multiuu.pl
|
||
|
||
@(A)r:
|
||
We appreciate the utility. If someone wants to take advantage of this
|
||
helpful utility, simply FTP the file to your local UNIX account and execute:
|
||
chmod u+x multiuu.pl
|
||
Then you should be able to uudecode multiple part files with this program.
|
||
|
||
@(A)c: Comfortable Reading
|
||
|
||
From: rbthomas@freenet.edmonton.ab.ca
|
||
|
||
I have d-loaded a few issues of C= Hacking and converted them to GEOS and
|
||
looked at them with geoWrite but that is a clumsy process. Also, I
|
||
understand some of the issues have program files in them and these need
|
||
to be extracted for use. How does a person go about this?
|
||
Thanks in advance for any help you can offer.
|
||
I have a 1581 and an FD-2000 drive so the space isn't a problem with
|
||
storing the file. I would like to read it in comfort also. TWS won't
|
||
handle it.
|
||
|
||
@(A)r:
|
||
To help people who can't handle the large size of Commodore Hacking,
|
||
each issue is now available as an archive of individual articles and already
|
||
decoded executable files. Commodore Hacking Information (Reference: info)
|
||
has information on how to obtain and dowload the archive files.
|
||
|
||
=========================================================================
|
||
|
||
@(#)news: Newsfront
|
||
|
||
@(A): Commodore Hacking CANCELED!
|
||
|
||
As many know, one of the distribution mediums for Commodore Hacking is
|
||
USENET, which is a services that operates primarily on the Internet.
|
||
After dutifully "posting" Issue #13, Hacking Headquarters was informed
|
||
that the posting had been "canceled". Since normally only the original
|
||
poster can delete or "cancel" a posting, we were alarmed. The culprit
|
||
turned out to be a automated program that had been installed on USENET
|
||
since Issue #12 was published. The program, called a "cancel robot" or
|
||
"cancelbot" for short, had been created by an individual and installed
|
||
on one USENET node. This specific cancelbot watches for large postings
|
||
to non-binary newsgroups (newsgroups that do not have "binary" or
|
||
"binaries" in their names) that contain large UUencoded binary files.
|
||
It then "forges" a cancel message by masquerading as the original poster.
|
||
Since USENET contains very little security, this notion of "forging"
|
||
postings can be done quite easily.
|
||
|
||
Without detailing the technical side of USENET, suffice it to say that
|
||
a posting from one site immediately begins its journey to all other sites
|
||
on USENET, being replicated along the way. The cancelbot canceled the
|
||
posting immediately after it showed up on its server. The cancel message
|
||
then began its journey to each server, canceling the article at each site.
|
||
Given the propogation delay of USENET, the posting was up long enough for
|
||
some readers to acquire it, but not everyone. Therefore, a pointer to
|
||
the location of the issue was posted later.
|
||
|
||
Along with the pointer posting, Commodore Hacking asked the USENET newgroup
|
||
comp.sys.cbm how it should ahndle the situation. We offered three
|
||
suggestions and asked for comment. They were:
|
||
|
||
1. Request an exclusion for the publication from the cancelbot
|
||
2. Publish only a pointer to the location of the new issue.
|
||
3. Publish the issue stripped of UUencoded binary files.
|
||
|
||
Suggestions 1 and 2 received an equal number of votes, with suggestion 3
|
||
receiving a couple of votes and 1 person voting to split the issue into
|
||
multiple parts. Needless to say, the issue is still undecided.
|
||
|
||
Therefore, for the current issue, we have requested an exclusion from the
|
||
USENET cancelbot. However, since most readers can now access the
|
||
publication via the World Wide Web, Electronic Mail, and FTP, we are
|
||
considering publishing only an announcement in the future. The
|
||
announcement will highlight the newest issue and detail where to obtain
|
||
it.
|
||
|
||
Some of the survey respondents mentioned that a few readers may only have
|
||
access to USENET as a means of receiving the magazine. If you are one of
|
||
those folks, PLEASE WRITE US! We are continuing to post the entire issue
|
||
on USENET for your benefit and may not continue to do so if we don't hear
|
||
from you. The postal mail address is located in this issue (Reference:
|
||
legal). If Commodore Hacking does not receive any aformentioned letters
|
||
or objections, we will consider posting only new issue announcements in
|
||
the future. Doing so would relieve some burden on the USENET system,
|
||
which was really not designed to handle a posting of C=Hacking's size.
|
||
If you have any questions about the potential impact of this change,
|
||
please mail us at Hacking Headquarters.
|
||
|
||
@(A): The The Underground Went South!
|
||
|
||
Shortly after the release of Commodore Hacking #13, Underground Magazine
|
||
editor Scott Eggleston informed his subscribers that changes in his life
|
||
had forced him to cut back on the time devoted to publishing, and that he
|
||
was merging The Underground with the newly announced LOADSTAR LETTER
|
||
commercial publication. As reported in the last issue, Scott will co-
|
||
edit the new expanded LOADSTAR LETTER with Jeff Jones and unfilled
|
||
Underground subscriptions will be filled with LOADSTAR LETTER
|
||
subscriptions on a 1 for 1 basis.
|
||
|
||
@(A): Get Yer QWKRR128 5.0! Read All About It!
|
||
|
||
In Commodore Hacking #13, Gaelyne Gasson (formerly Gaelyne Moranec),
|
||
described how to read Internet electronic mail offline by using an
|
||
offline mail reader like QWKRR128. Hot on the heels of that article,Rod
|
||
Gasson has announced the availability of a beta of version 5.0 of the
|
||
QWKRR128 software. Available to all registered users of QWKRR128, the
|
||
beta includes a number of enhancements and bug fixes, including:
|
||
|
||
1. Supports full 255byte character sets.
|
||
2. Reads messages of ANY length (including the ability to print, export,
|
||
or small.dat them).
|
||
3. Separate VIP & TWIT lists.
|
||
4. UUdecodes messages of any length as long as the UUencode is in a
|
||
single message. (It won't decode if the file is split over several
|
||
messages).
|
||
5. Decodes MIME messages (Base64). Same restriction as UUdecodes.
|
||
6. Added keyboard tables so it can be configured to 'international
|
||
standards'.
|
||
7. Updated the 'auto-netmail' routines to include Internet Email as well
|
||
as fido netmail.
|
||
8. Improved the address book so it will handle both the fidonet format
|
||
addresses and email style addresses.
|
||
9. Added the ability to ATTACH files to a message or reply. These
|
||
attaches are limited in length to about 8megs (the max that the QWK
|
||
format can handle).
|
||
10. Improved the routines to detect a valid Q.NDX file (the name of the
|
||
new QWKRR index file). This means these no longer have to be manually
|
||
scratched prior to reading a new mail packet.
|
||
11. Added code so that you no longer have to quit QWKRR in order to read
|
||
a different mail packet.
|
||
12. Improved the macros so that whole words can be used as a 'trigger'.
|
||
This can be used as a 'simple' spell corrector. (eg, a macro such as
|
||
"Ismeal=Ismael" will ensure that you'll never transpose the "a" and "e"
|
||
in Ismael again.
|
||
13. Added a 'scrap macro' that can be defined and used while in the
|
||
editor itself, without the need to add it to your macro file).
|
||
14. Added code so that quote initials can be changed 'on the fly' (This
|
||
is useful when quoting from Email messages where the default initials are
|
||
often meaningless).
|
||
15. Added time/date stamping to the zipped REP packets. (Some BBS's
|
||
didn't like having the same date/time stamp on all mail packets).
|
||
16. Improved access speed by about 3 times for Ramlink users.
|
||
17. Improved tagline handling. You can have up to 10,000 taglines in one
|
||
category. Tagline files are now numbered from .000 to 999.
|
||
18. Several cosmetic changes and bug fixes.
|
||
|
||
The new beta version is available from the 221b Baker Street BBS in the
|
||
US and GEOZ BBS in Australia and at:
|
||
|
||
ftp://ccnga.uwaterloo.ca/pub/cbm/INCOMING/telecomm/qwkrrv5b.lzh
|
||
ftp://hal9000.net.au/pub/cbm/qwkrr/qwkrrv5b.lzh
|
||
|
||
More complete information is available at:
|
||
|
||
http://www.hal9000.net.au/~moranec/qwkrr10.html
|
||
|
||
@(A): Centsible Software Address Update (And Some Bad News)
|
||
|
||
The folks at Centsible Software have moved! Well, they are still at the
|
||
same location, but they have "electronically moved", to sprynet.com. The
|
||
new information appears below:
|
||
|
||
Centsible Software
|
||
PO Box 930
|
||
St. Joseph, MI 49085
|
||
616-428-9096 (Orders and Information 12-6pm EST)
|
||
616-429-7211 (Bulleting Board System and Facsimile)
|
||
Cents@sprynet.com (Internet Contact)
|
||
http://home.sprynet.com/sprynet/cents (WWW URL)
|
||
|
||
On a sad note, Centsible contacted Hacking Headquarters later to note
|
||
that they will soon be closing down Centsible Software. All outstanding
|
||
orders will be completed, and the closure won't happen immediately, but
|
||
soon Centsible will be all but a memory.
|
||
|
||
@(A): Brace Yourself, There's More
|
||
|
||
Software Support International (SSI), has recently decided that they will
|
||
start focusing more on IBM compatible sales. In an initial announcement,
|
||
SSI indicated that they would no longer carry Commodore products after
|
||
January 1, 1997, but later announced that they would continue to sell
|
||
products as long as existing stock holds up. However, they will no
|
||
longer promote the CBM or Amiga product lines. The latest catalog from
|
||
SSI will be the last to carry CBM and Amiga merchandise.
|
||
|
||
@(A): And Now for Some Good News
|
||
|
||
Arkanix Labs, a West Coast hardware and software developer, recently
|
||
announced that they had acquired Threshold Productions International.
|
||
Petar Strinic (note the 'a' in Petar) announced that the acquisition
|
||
would expand their presence in the market. Arkanix Labs develops for the
|
||
MS-DOS and C64/128 systems, and is working on SuperCPU products. To find
|
||
out more about the company, visit their WWW Site at: www.arkanixlabs.com
|
||
or contact Mr. Strinic at: petars@arkanixlabs.com
|
||
|
||
@(A): The Underground To Live on in LOADSTAR LETTER
|
||
|
||
Scott Eggleston, editor of The Underground, has recently sent notice to
|
||
all Underground readers that recent changes in his life have prompted him
|
||
to discontinue publishing of The Underground. Determined that
|
||
Underground subscribers would not be left in the lurch, Scott has
|
||
arranged for each subscriber to receive issues of the newly launched
|
||
commercial LOADSTAR LETTER publication (See Newsfront in C=H #13). While
|
||
the size of each issue will be smaller, the issues will arrive monthly,
|
||
as opposed to The Underground's bimonthly schedule.
|
||
|
||
Scott, not bowing out of publishing entirely, will be brought on as
|
||
Associate Editor of LOADSTAR LETTER. Subscribers should expect to
|
||
receive their first issue of the merged publication at the same time The
|
||
Underground #15 would have arrived.
|
||
|
||
As well, Scott will continue to offer back issues of The Underground for
|
||
US$2.50 per issue. The Underware disk will no longer be available from
|
||
Eggleston, although reader Tom Adams (tom.adams@neteast.com) has agreed
|
||
to copy the disks as long as he is able to do so.
|
||
|
||
If you need to contact Scott Eggleston, you may do so at:
|
||
|
||
egglest1@cougarnet.byu.edu
|
||
|
||
@(A): Video Interface Computer (VIC) Software Available
|
||
|
||
Ghislain deBlois (dh374@freenet.carleton.ca) is currently releasing a
|
||
number of games and utilities for the avid Commodore VIC-20 user
|
||
community. Intending to release them in "cassette/disk of the month"
|
||
fashion, deBlois' first installment contains:
|
||
|
||
o Meteor Zone
|
||
o Mini Assembler
|
||
o Vicfall!
|
||
o Ringside
|
||
|
||
Future installments promise titles like: Realms of Quest, Ice Hockey,
|
||
Bosing, and Screen Magic (a multi-color hi-res drawing program). All
|
||
programs are written for the unexpanded VIC-20 computer system (VC-20 in
|
||
Europe) to better serve VIC enthusiasts. For more information, contact
|
||
deBlois at his electronic mail address.
|
||
|
||
@(A): Get on the Super CPU list!
|
||
|
||
Brett Tabke, of PHD Software, has created a mailing list for owners of
|
||
the CMD SuperCPU accelerator cartridge. To subscribe to the list, send a
|
||
message to:
|
||
|
||
listserve@giga.or.at
|
||
|
||
with a message body of:
|
||
|
||
subscribe super-cpu firstname lastname
|
||
|
||
@(A): Mailing Lists, Take Two!
|
||
|
||
For those who live in on the OTHER side of that little pond from the US,
|
||
or if you just want to keep up on the developments there, there is a new
|
||
electronic mailing list for European 64 enthusiasts. Simply send email
|
||
to:
|
||
|
||
listserv@lentil.demon.co.uk
|
||
|
||
with a subject of:
|
||
|
||
MAILSERV
|
||
|
||
and a body of:
|
||
|
||
subscribe 64EUROPE
|
||
END
|
||
|
||
The list address is: 64europe@lentil.demon.co.uk
|
||
|
||
@(A): It's Better than Novaterm 9.6!
|
||
|
||
Nick Rossi has recently announced that patch "A" for the latest version
|
||
of Novaterm (9.6) is now available. Citing the help of early purchasers
|
||
of the product, Nick noted a list of bug fixes that have been
|
||
incorporated in the new release, including:
|
||
|
||
* Estimated file length omitted from Zmodem upload, to avoid confusing BBS's.
|
||
* The "funny ASCII" problem when capturing to the buffer in ANSI or VT102
|
||
mode has been fixed.
|
||
* Due to the above, you should remove the ".opt ansi" line from all your
|
||
scripts and recompile them.
|
||
* A bug in the script function that checks for incoming strings was
|
||
fixed.
|
||
* The "Save buffer when full" option now works properly with hardware
|
||
flow control.
|
||
* A bug in the recovery function of the BBGRam driver was fixed.
|
||
* A bug in one ANSI screen clearing function was fixed.
|
||
* Several errors in the font81.ANSI character set were fixed: ASCII 160
|
||
was changed to <20>, and the fractions &188;, &189;, and &190; were put in
|
||
their proper order.
|
||
* Typing a shift-space now sends a space, rather than the <20> character.
|
||
* Color was added to the VT102 terminal emulation.
|
||
* A real-time clock driver was added to read from the CMD SmartMouse and
|
||
SmartTrak.
|
||
* Functions in the text editor were fixed: loading/saving in the buffer
|
||
and changing the device number.
|
||
|
||
If you have already purchased Novaterm 9.6, you can receive a free
|
||
upgrade by making a backup of your master disk and sending the master
|
||
disk back to:
|
||
|
||
Nick Rossi
|
||
10002 Aurora Ave. N. #3353
|
||
Seattle, WA 98133 U.S.A.
|
||
|
||
Copies of the latest release are available in either 1541 or 1581 disk
|
||
formats for USD$29.95 plus USD$1.50 for shipping and handling. The
|
||
software is accompanied by a 90 page user manual.
|
||
|
||
For more information on the upgrade or Novaterm in general, visit the
|
||
Novaterm 9.6 WWW Site: http://www.eskimo.com/~voyager/novaterm.html or
|
||
contact Mr. Rossi via email at: voyager@eskimo.com.
|
||
|
||
@(A): Who's Got the Rights to the Commodore 8-bit line?
|
||
|
||
That is a very good question. Ever since Commodore was sold to ESCOM
|
||
GmbH, Commodore 8-bit users have wondered who owns the intellectual
|
||
rights to the Commodore 8-bit line of computers. Now that ESCOM has
|
||
declared bankruptcy and initiated the sale of the Amiga line to US based
|
||
Visual Information Service Corporation (VISCorp), CBM enthusiasts are
|
||
even more curious. The sale, evidently drawn up before the bankruptcy
|
||
declaration, would place Amiga technology into the hands of VISCorp,
|
||
which was started by several ex-Commodore engineers. However, even if or
|
||
when the deal is finalized, who owns the rights to the CBM 8-bit line may
|
||
still be a mystery.
|
||
|
||
@(A): New Address for Meeting 64/128 Users Through the Mail
|
||
|
||
Tom Adams, president of the mail correspondence club called Meeting
|
||
64/128 Users Through the Mail, asks that all electronic correspondence
|
||
for either him or the club be addressed to:
|
||
|
||
tom.adams@neteast.com
|
||
|
||
@(A): Complete you Transactor Collection!
|
||
|
||
Karl Hildon, one of the producers of the now-defunct _Transactor_
|
||
publication, has announced that he is now able to provide electronic
|
||
copies of any issue of the technical magazine for USD$5.00. Issues can
|
||
be scanned in the format of your choice, and will be electronically
|
||
mailed to the purchaser.
|
||
|
||
To order, mail Karl Hildon your Visa Card account number (visa only) and
|
||
expiration date and issue number request to karl@inforamp.net. If you
|
||
need to consult an index first, there is one located at:
|
||
http://vanbc.wimsey.com/~danf/cbm/transactor.idx
|
||
|
||
Mr. Hildon also mentioned that if demand warrants, he will also make
|
||
available the _Transactor_ companion disks.
|
||
|
||
Also, Mr. Hildon has announced that he can also make available copies of
|
||
_The Inner Space Anthology_ for USD$20.00 or CAN$20.00. Follow the above
|
||
directions to obtain copies of this out of print resource.
|
||
|
||
@(A): "Ultimate" Demonstration Contest Announced
|
||
|
||
Commodore Zone and Tim Wright have announced the Commodore 64 Golden
|
||
Fleece Award 1997 contest. An award of $100.00 will be presented to the
|
||
author of a demo program that represents the best in demo construction
|
||
and captures the spirit that have made demos a staple of Commodore
|
||
history. The deadline for entry is February 1, 1997, and entries should
|
||
be sent to "Binary Zone P.D. Entries must fit on a single side of a 1541
|
||
disk, and will be judged as complete works. Authors can enter as many
|
||
works as they wish. Entries will be judged on programming ability,
|
||
graphics expertise, and musical content as well as overall presentation.
|
||
All entries must be previously unreleased material. Entries should be
|
||
accompanied by contact details, and the winner will be featured in Binary
|
||
Zone P.D. For further information, or to enter the contest, contact:
|
||
|
||
Jason 'Kenz' Mackenzie
|
||
Binary Zone P.D.
|
||
34 Portland Road
|
||
Droitwich
|
||
Worcestershire
|
||
England
|
||
WR9 7QW
|
||
|
||
@(A): Possible Products for SuperCPU 'Puter
|
||
|
||
PROTOVISION, a game development company, is currently working on
|
||
compression tools for the SuperCPU, as well as some utilities for the
|
||
new unit that are designed to take full advantage of the 16 bit
|
||
processing power of the 65C816. In addition, the company is
|
||
investigating the possibility of developing a new graphical operating
|
||
system for the unit that will run in 16 bit mode and take advantage of
|
||
the 16 megabytes of addressing and the new opcodes available in the
|
||
accelerator. The new system will be able to multitask and offer several
|
||
graphics modes and capabilities.
|
||
|
||
@(A): New OS Version Available
|
||
|
||
For those who enjoyed reading about Andre Fachat's OS/A65 operating
|
||
system in the last issue of Commodore Hacking (Issue 13, Section: os),
|
||
Andre has updated his multitasking OS to version 1.3.10b. New in this
|
||
version is:
|
||
|
||
* MORE AVAILABLE TASKS and STACK SPACE for systems w/o MMU (C64): New
|
||
compile option STACKCOPY for systems without MMU. Allows more tasks and
|
||
gives each task more stack space.
|
||
|
||
* new 9600 baud RS232 driver for C64! (see comp.sys.cbm FAQ)
|
||
|
||
* new 6551 ACIA driver for the C64 (connected to IRQ line)
|
||
|
||
* new 16550A UART driver for all supported machines!
|
||
|
||
* New GETB and PUTB kernel calls, to get and put a whole data block from
|
||
and to a stream. It is used by the FSIEC filesystem currently.
|
||
|
||
* Better NMI handling:
|
||
New CTRLNMI kernel call, and modified SETNMI call. SETNMI now sets the
|
||
NMI routine address, and enables NMI routine chaining. There also must be
|
||
a link to a control routine that can enable and disable the NMI line.
|
||
Therefore FSIEC and FSIBM now call CTRLNMI to switch the NMI on and off
|
||
around their time critical regions.
|
||
|
||
* Introduced return code to device IRQ routines. This allows to return
|
||
from the IRQ routines prematurely, if one IRQ routine signals that it has
|
||
removed an IRQ source (if SYSINPORT is not available).
|
||
|
||
It is available on the World Wide Web at:
|
||
|
||
http://www.tu-chemnitz.de/~fachat/csa/
|
||
|
||
@(A): Current Releases for the Commodore from CWI
|
||
|
||
Computer Workshops, Inc., is currently distributing NewView, an image
|
||
effects generato, and HyperLink, a hypermedia authoring system. More
|
||
information on these titles and their upcoming 3D Game, "Nether", are
|
||
available at:
|
||
|
||
http://www.armory.com/~spectre/
|
||
|
||
@(A): Commodore Hacking Selected for Inclusion in PC Webopaedia
|
||
|
||
Sandy Bay Software, Incorporated has selected Commodore Hacking's
|
||
World Root WWW Site to be included in a virtual encyclopedia of WWW
|
||
sites. Visit the PC Webopaedia at:
|
||
Dear Webmaster:
|
||
|
||
http://www.sandybay.com/pc-web
|
||
|
||
@(A): LOADSTAR's Pass Around Issue is Available
|
||
|
||
J and F Publishing has announced that LOADSTAR Issue #148 has been
|
||
selected to be a "pass-around" issue. This issue is available for free
|
||
and is intended to allow non-subscribers a chance to see what is in the
|
||
disk-based monthly magazine. Issue #148 is available at:
|
||
|
||
http://www.loadstar.com/pass.html
|
||
|
||
Wraptorized and ARCed versions are available for 1541 and 1581, while
|
||
Compression Kit, .d64 images, and PKZip version are available in 1541
|
||
format.
|
||
|
||
Screen shots of the issue are available at:
|
||
|
||
http://www.loadstar.com/148contents.html
|
||
|
||
The issue is packed, filling over 700 kB, and includes articles like:
|
||
|
||
* How to Copy Files
|
||
* Super Snapshot Bypass Switch Installation
|
||
* 'Lectronic Formulator
|
||
* Directomeister II Directory Editor
|
||
* Menu Toolbox III, as published in C=Hacking #14 (Reference: toolbox)
|
||
* GEOS Fonts (Ronda and Triana)
|
||
|
||
Download the issue today, and share it with your friends and user groups.
|
||
|
||
@(A): Hey! It's the Commodore Man!
|
||
|
||
If you're in the market for some used equipment or require some service
|
||
on your CBM system, contact:
|
||
|
||
Jon Searle, The Commodore Man
|
||
Service and Software
|
||
1307 Golfview Drive
|
||
Grain Valley, MO 64029
|
||
|
||
Jon offers over 1000 titles, documentation, books, magazines, and
|
||
hardware. A catalog can be requested for a nominal fee. Until December
|
||
31, 1996, Jon is offering a "Buy 3, Get 1 Free" offer on software
|
||
titles. Write for details and restrictions.
|
||
|
||
@(A): GEOS III, Revenge of the 8-bit GUI!
|
||
|
||
Maurice Randall, creator of such GEOS offerings as GeoFAX and many
|
||
utilities for CMD, has announced that he is formally working on GEOS 3.0.
|
||
He has successfully reverse engineered GEOS 2.0 and is now working to
|
||
incorporate changes into the OS that will provide more seamless support
|
||
for peripherals announced since the release of GEOS 2.0. Among the
|
||
changes is a number of bug fixes to the original GEOS OS code and some
|
||
enhancements to allow shortening of the OS code or faster execution. A
|
||
time or formal name for the project has not been determined, but the new
|
||
version will require some type of RAM expansion.
|
||
|
||
At a recent Lansing Area Commodore Club meeting, Maurice demonstrated
|
||
some of the changes that may show up in the final GEOS 3.0 system. They
|
||
include:
|
||
|
||
o Removal of 15 file limit in file lists.
|
||
o Ability to use CMD devices in Native Mode.
|
||
o Ability to read CMD FD DD disks in a 1581 drive.
|
||
o Ability to create CMD Native partitions on a RAMDisk.
|
||
o Ability to read/write MS-DOS floppies as native files on 1571,81, or
|
||
FD.
|
||
o Ability to read single bytes from drives.
|
||
o Ability to utilize 4 separate disk drives simultaneously
|
||
|
||
These changes are incorporated in new disk driver code that can be used
|
||
by any existing GEOS application. The new drivers utilize a radically
|
||
different Configure program with more options than the current setup
|
||
application of the same name.
|
||
|
||
Maurice stated that he will likely take a half-written desktop
|
||
replacement he has written titled "Dashboard" and develop it into what
|
||
will become the replacement for DeskTop in GEOS 2.0.
|
||
|
||
Although the new system will require the use of RAM expansion, the system
|
||
will not require a SuperCPU or other speed enhancement unit to operate.
|
||
|
||
@(A): Explosive Commodore Surfing Power
|
||
|
||
Brain Innovations, Inc., recently announced that they had revamped the
|
||
popular WWW Links pages on Jim Brain's Commodore home Page. The new
|
||
site, completely automated, offers many advantages over the older set of
|
||
pages. The new site, called CaBooM!, can display links in either HTML
|
||
TABLE or UNORDERED LIST format, include or exclude graphics, and include
|
||
or exclude link descriptions. The site is organized into categories and
|
||
sub-categories. Surfers can automatically add new sites to the system
|
||
and specify which categories fit the site. Users can also update sites
|
||
at a later date by specifying their user ID and password used to create
|
||
the site. New and updated entries are identified with appropriate
|
||
comments, and sites can be listed in multiple categories. Check out the
|
||
new system at:
|
||
|
||
http://www.msen.com/~brain/cbmlinks/index.html
|
||
|
||
=========================================================================
|
||
|
||
@(#)trick: HEAVY MATH - Part 1: Introduction to Linear Programming (LP)
|
||
by Alan Jones (alan.jones@qcs.org)
|
||
|
||
This article describes the Linear Programming problem. LP software is
|
||
being developed for the C64 to emphasize that the C64 is capable of
|
||
solving HEAVY MATH problems. It describes some of the C64 program design
|
||
issues and gives readers an opportunity it influence the development of
|
||
the software.
|
||
|
||
@(A): Introduction
|
||
|
||
Linear Programming, LP, is the simplest type of constrained numerical
|
||
optimization problem. It's simplest (standard) form is:
|
||
|
||
max P = c'x
|
||
|
||
s.t. Ax = b
|
||
x >= 0
|
||
|
||
That is, we want to find the solution vector x which maximizes the
|
||
function P, which is a linear combination of elements of x, while
|
||
satisfying the linear equation Ax = b, and with each element of x >= 0.
|
||
A is a matrix with typically more columns than rows. The maximization
|
||
problem itself is easy, except for the inequalities and determining which
|
||
elements of x are fixed at a bound and which are free.
|
||
|
||
Assume x is a vector of 20 variables and we have 10 equality constraints
|
||
making A a 10 by 20 matrix. Solving the problem involves choosing 10 of
|
||
the variables to be bound (at zero), eliminating those 10 columns from A
|
||
and solving the reduced linear system, say B*xb = b, for the other 10
|
||
elements of x, xb. Then sort through the solutions to find the feasible
|
||
solutions that satisfy all of the constraints, x >= 0, and chose from
|
||
them the solution that will maximize the function P. Taking 20 columns
|
||
of A 10 at a time we will have 184,756 solutions to solve and evaluate!
|
||
|
||
@(A): LP Development
|
||
|
||
LP is an important problem that requires a computer and clever algorithms
|
||
to solve non-trivial problems. The development of LP algorithms
|
||
parallels the early development of computers. George Dantzig published
|
||
his first paper on his simplex method in 1947. LP problems have long
|
||
been studied in mathematics, economics, and business fields, but the
|
||
simplex method and the computer were the big breakthroughs. Just imagine
|
||
the problem of allocating and distributing limited resources to millions
|
||
of soldiers in WW II. There are many types of problems that can be
|
||
solved as LP problems, and some have specialized algorithms for their
|
||
efficient solution.
|
||
|
||
@(A): LP Examples
|
||
|
||
The inequality constraint occurs naturally. Many processes are
|
||
irreversible. For example you can burn fuel in rocket at a positive fuel
|
||
flow rate to produce thrust, but you can't unburn the exhaust to refill
|
||
the tanks. A table leg can push on the floor but not pull (unless
|
||
bolted). A rope, cable, or chain can pull but not push. You can't buy or
|
||
sell negative quantities of a new item. You can't start assembling a
|
||
machine before the parts arrive.
|
||
|
||
LP problems can also be written in more general forms. Perhaps the most
|
||
general is:
|
||
|
||
max P = c'x
|
||
|
||
s.t. bl <= Ax <= bu
|
||
xl <= x <= xu
|
||
|
||
Where bl an xl are vectors of lower bounds and bu and xu are vectors of
|
||
upper bounds.
|
||
|
||
The LP forms can be manipulated with simple algebraic operations and by
|
||
adding constraints and "slack" variables. Most numerical optimization
|
||
problems are set up to minimize a cost function. Historically, LP
|
||
problems are set up as maximization problems. If your function P is a
|
||
total cost to be minimized, simply multiply the vector c by -1 and
|
||
maximize instead. Multiplying the i'th constraint equation by -1 will
|
||
change the sign of all the elements of the i'th row of A, bl, bu, and
|
||
change the direction of the inequalities, but not change x(i). The i'th
|
||
constraint above is actually two equations and can be written (neglecting
|
||
the subscripts):
|
||
|
||
Ax <= bu
|
||
Ax >= bl
|
||
|
||
To convert them to equality constraints:
|
||
|
||
Ax + y1 = bu
|
||
Ax + -y2 = bl
|
||
|
||
y1 and y2 are additional variables both >= 0 added to take up the "slack"
|
||
in the inequality equations. When the constraint is free (i.e. could be
|
||
ignored) the slack variable is >0. When the constraint is active, the
|
||
slack variable is constrained to zero. The slack variables are simply
|
||
appended to the vector x and treated as normal variables.
|
||
|
||
Lower bounds on x can be removed with a change of variable, x = y - xl,
|
||
without adding more rows or variables.
|
||
|
||
xl <= x <= xu, becomes 0 <= y <= xu - xl
|
||
|
||
Upper bounds on x can be handled by adding slack variables. The expanded
|
||
problem could look like:
|
||
|
||
Ax = b
|
||
x + xs = xu
|
||
x >= 0, xs >= 0
|
||
|
||
This can double the length of the x vector and add an equal number of
|
||
equality constraints. A fair amount of algebraic manipulation is
|
||
possible to get a LP into the form required by the solution software.
|
||
This can significantly increase the problem size. Good software will use
|
||
the more general forms of the LP program and use a more sophisticated
|
||
solution logic instead of increasing the problem size.
|
||
|
||
Mixture problems are probably the easiest to describe for illustrating
|
||
the importance of LP. Suppose you are producing cans of mixed nuts. You
|
||
want to find the percentage of each nut to mix and package at the lowest
|
||
cost, or maximum profit. You check the commodities prices of the various
|
||
nuts available at different times and places. c(i) could be the price
|
||
per pound of each nut, i, and x(i) would be the percent of that nut to be
|
||
mixed. One constraint is that the percentages total 100. The Marketing
|
||
Department may demand no more than 25% peanuts and no less than 5% of
|
||
Cashews, pecans, and almonds. Each nut may be scored for crunchiness,
|
||
and other aspects of taste to meet other constraints. Of course no x(i)
|
||
can be less than zero. You can do the same thing with "real fruit juice"
|
||
drinks. Mix the cheapest available fruit juices while balancing
|
||
sweetness, acidity, color, taste, and other factors.
|
||
|
||
Another type of problem is project scheduling. Suppose you are going to
|
||
design and build a bridge, or spacecraft. You identify all of the
|
||
tasks that must be accomplished, and then estimate their completion time
|
||
and constraints. E.g. task 43 can't begin until tasks 16, 17, and 41
|
||
have been completed. You could then set up a LP problem to schedule each
|
||
task so as to complete the project in the minimum time. Various other
|
||
performance criteria can be embedded in a LP problem.
|
||
|
||
@(A): Non Linear Programming (NLP)
|
||
|
||
LP is also a special case of Non Linear Programming, NLP. The NLP
|
||
problem is similar to the LP problem except that the objective function P
|
||
and constraint equations can be nonlinear functions. NLP is a much more
|
||
expensive problem to solve. An approach to solving a NLP is to linearize
|
||
the problem at a point to get a LP subproblem. Solving the LP gives a
|
||
search direction for the NLP problem. You then advance in the search
|
||
direction until you have made sufficient improvement in the objective
|
||
function or diverged too far from the constraints. You then correct back
|
||
to the constraints and linearize again. The sequence is repeated until
|
||
the solution is found.
|
||
|
||
@(A): C64 Software?
|
||
|
||
Computers were not created by secretaries and typesetters. Although
|
||
computers can do a lot of things, they were created to do Heavy Math.
|
||
The first electronic computer, the Attanasoff-Berry Computer, ABC, was
|
||
built to solve systems of up to 29 linear equations, although it could be
|
||
adapted to solve other problems as well. The second and third, ENIAC and
|
||
EDVAC, were intended to solve ODEs (Ordinary Differential Equations, i.e.
|
||
computing artillery range tables), as well as more general usage.(ENIAC's
|
||
first operational use was solving a 25 by 25 set of linear equations from
|
||
Los Alamos to see if an atomic bomb might be feasible. The ABC could
|
||
have solved this problem, but it had a read/write reliability problem and
|
||
Attanasoff was called up for other war related work instead of perfecting
|
||
the ABC.) And I have already discussed the LP problem.
|
||
|
||
Software for the C64 has been readily available and published in the C64
|
||
related literature for solving systems of linear equations and
|
||
numerically integrating differential equations (4th order Runge-Kutta
|
||
being typical). However nothing is available or published for solving LP
|
||
problems on a C64. I do recall seeing a one inch ad in some Commodore
|
||
magazines trying to sell software to solve small LP problems on a C64,
|
||
maybe 15-20 equations, but I never read any reviews of it and I always
|
||
suspected it to be poor software. I intend to plug this hole by writing
|
||
a good LP program for the C64.
|
||
|
||
This is Part 1 of at least a two part series on LP for the C64. Part 2
|
||
will include the presentation of the C64 LP program. I usually hate
|
||
multi-part articles that could have been published as one large article.
|
||
However, in this case Part 2, and indeed the C64 LP computer program, has
|
||
not been written yet. Part 2 will be dependent on reader feedback!
|
||
No feedback means no reader or user interest and I won't bother to submit
|
||
Part 2. I have not written a LP program before, or even used one much
|
||
on other systems. There is a very good chance that some readers will
|
||
have experience with LP software and can offer practical suggestions
|
||
for writing C64 LP software. I would also like to hear from any reader
|
||
who may have some type of LP problem that they would like to be able to
|
||
solve, perhaps something related to a hobby or home computing application.
|
||
Also, someone may be able to point me to an ideal LP reference book or
|
||
even provide suitable source code to examine.
|
||
|
||
Choosing a LP solution method for the C64 is not an easy task.
|
||
Appropriate reference books and papers are hard to come by. There is
|
||
nothing in the CBM literature that I am aware of. Many books have been
|
||
published on the LP subject. However, most are old books written for
|
||
business students or for training clerks to solve small problems by hand,
|
||
and they use outdated methods. These are easily found in local libraries
|
||
and at small colleges. LP is still an active research area and many new
|
||
journal articles are still being written, as well as new books. However,
|
||
the focus in on solving VERY large LP problems using sparse matrix
|
||
algebra techniques, and newer methods such as Karmarker or interior-point
|
||
methods. There is even a LP FAQ available. Two of the best references
|
||
that I have found so far are: "Computer Solution of Linear Programs", J.
|
||
L. Nazareth (1987), and "Advanced Linear Programming", B. A. Murtagh
|
||
(1981). The LP source codes that I have looked at were either too crude,
|
||
suitable only for small problems, too poorly documented, or suited only
|
||
for large problems on large computers. This gives you some idea of where
|
||
I am at, should you want to provide helpful feedback.
|
||
|
||
Our C64 (and 128) does arithmetic slowly, but reliably, and has limited
|
||
memory. We would not want to solve a large LP problem with thousands of
|
||
constraints and variables on a C64 even if we could. Still, we want to
|
||
be able solve problems as large as practical using efficient methods. At
|
||
the heart of the solution algorithm we must be able to solve an n by n
|
||
system of equations, where n is the number of constraint equations. For,
|
||
say n = 70, we will need 24,500 bytes to store the full matrix, leaving
|
||
the rest for the OS/language/LP program. The simplex type solutions
|
||
typically require computation time = K * n~3, so we will not likely want
|
||
to solve any LP problems on the C64 with more than 70 constraints.
|
||
|
||
The desire to solve huge LP problems also motivated the development of
|
||
sparse matrix algebra techniques. Matrices associated with LP tend be
|
||
very sparse. The idea is to be able to store only the non-zero elements,
|
||
to store them in data structures that can be used effectively by linear
|
||
equation solvers, and to use larger but often slower external memory
|
||
efficiently. These codes have a higher overhead in terms of code size
|
||
and computation/FP multiply. However, these codes can compute the same
|
||
results with substantially fewer multiplies than simpler code for dense
|
||
or full matrices. They often perform faster overall, at least on scalar
|
||
computers. Our 6502 can zip through complicated data structures and ML
|
||
code fairly fast compared to the cost of a FP multiply. Using sparse
|
||
matrix techniques is possible with the C64, but not required. I think
|
||
the complications of using sparse matrix methods is not warranted in this
|
||
case. Users wanting to solve large sparse problems are free to disagree.
|
||
|
||
@(A): Types of LP Problems
|
||
|
||
There are several LP solution methods: (primal) simplex, revised simplex,
|
||
dual simplex, primal-dual simplex, Karmarker, and others. There are also
|
||
many variations among these. I have chosen the revised simplex method
|
||
for the C64 program. Some other choices might be better for some types
|
||
of LP problems, and I may also write a primal-dual simplex program.
|
||
|
||
In the revised simplex method, the constraint matrix A can be stored
|
||
outside of main memory (on disk or REU) and brought in a column at a
|
||
time. The matrix A can be stored in a sparse matrix form. This is
|
||
probably a good idea for our slow disk storage, but unnecessary for our
|
||
REU storage. A square matrix B will be based on a set of n columns of A.
|
||
At each iteration a new column of A is chosen to enter B and an old
|
||
column is re moved. Each column represents an element of x and the
|
||
objective is to get the unbound variables selected into B with the
|
||
remaining variables set to their limits. At each iteration we have to
|
||
solve many linear systems using B with different right hand side vectors
|
||
and then update B to account for the column addition and removal.
|
||
|
||
There are several ways to work with the matrix B. B can be explicitly
|
||
inverted. The inverse can then be explicitly updated using the Sherman-
|
||
Morrison-Woodburry formula, or updated in product form by storing a
|
||
sparse matrix factor that accounts for the update. The later is
|
||
preferred for sparse implementations, but the storage used grows with
|
||
each iteration and eventually a new explicit inverse of B will have to be
|
||
computed. Both methods are numerically unstable and can have excessive
|
||
growth of roundoff errors, necessitating error checks and occasional
|
||
reinversion.
|
||
|
||
B can also be efficiently used in an LU factored form. B = LU where L is
|
||
lower triangular and U is upper triangular. The updating is difficult,
|
||
especially when exploiting sparcity and external storage. Bartels and
|
||
Golub (1969) developed a numerically stable way of updating the L and U
|
||
factors that enabled L to be stored externally, with U stored in main
|
||
memory. Forrest and Tomlin (1972) developed a method that allows both L
|
||
and U to use external storage. This is the method used in most
|
||
commercial codes for solving large LP problems. However, it is not
|
||
numerically stable and needs to be monitored and refactored. Sanders
|
||
(1976) developed a variation of the Bartels-Golub method that is stable
|
||
and allows most of U to be stored externally. Fletcher and Matthews
|
||
(1984) developed a stable method for updating the LU factors explicitly
|
||
in main memory.
|
||
|
||
In the Fletcher-Matthews update we have: PBQ = LU. B is the unfactored
|
||
matrix, P is a row permutation matrix, Q is a column permutation matrix,
|
||
L is a unit lower triangular matrix, and U is an upper triangular matrix.
|
||
L and U are stored explicitly (not in a factored form) in a square matrix
|
||
B. L and U are first formed using a normal LU factorization (Gaussian
|
||
elimination). P is a row permutation matrix that represents the partial
|
||
pivoting normally used to stabilize Gaussian elimination. Q is an
|
||
optional column permutation that represents the full pivoting that could
|
||
be done with Gaussian elimination to get better numerical stability. P
|
||
and Q are completely defined by integer arrays. In the update, one
|
||
column of B is removed, the rest of the vectors are shifted left to fill
|
||
the gap, and the entering vector placed in the right most column of B.
|
||
L, U, and P are then updated to a stable factorization of the new B
|
||
matrix. Pivoting is still required for stability, but only two adjacent
|
||
rows can be exchanged. This is a weaker form of stability than Gaussian
|
||
elimination with partial pivoting. It may be advisable to use some more
|
||
extreme measures to assure greater accuracy, such as preliminary scaling
|
||
of the problem (equilibration), full pivoting in the initial
|
||
factorization, or doing a final refactorization. Q is not changed during
|
||
the update (no column pivoting for stability), but we will have to keep
|
||
track of where each column of A is located in B (or the LU factorization
|
||
of B). The update is also cheaper when the column of B removed is
|
||
farther to the right.
|
||
|
||
I have chosen to use the Fletcher-Matthews update. This choice is ideal
|
||
for dense LP problems, but less so for sparse problems. It limits the
|
||
number of constraints that we can handle. It also has consequences for
|
||
other program design choices that must be made for the C64 LP program.
|
||
Using the simple standard form keeps the program logic simple, but
|
||
converting problems with inequality constraints and upper and lower
|
||
bounds to standard form will make the problem size bigger. This will be
|
||
more expensive to solve when not taking advantage of sparcity, and make
|
||
our size limit more significant. I am leaning toward solving LP
|
||
problems in the form:
|
||
|
||
Max P = c'x
|
||
|
||
s.t. Ax = b
|
||
xl <= x <= xu
|
||
|
||
There are many more program design choices to make. There are different
|
||
strategies for selecting the entering and leaving variables (columns).
|
||
There are different ways to pick a starting B matrix. There are
|
||
different ways to perform "Phase 1" of the revised simplex algorithm.
|
||
Many of the internal tests of floating point results involve tolerances.
|
||
These tolerances do affect the performance of the program. However, I
|
||
have only seen arbitrary suggested tolerances. These tolerances should
|
||
be determined by the floating point precision used, the problems size,
|
||
matrix condition number, and perhaps some problem specific parameters. I
|
||
have not seen any numerical analyses indicating how to set the
|
||
tolerances.
|
||
|
||
I have completed the subroutines to perform the Fletcher-Matthews update,
|
||
matrix factorization, and solving linear systems. Your interest and
|
||
feedback can influence other major parts of the program, or even convince
|
||
me to use a different updating method. Or perhaps everyone would rather
|
||
not see the sequel? You can reach me via e-mail at: alan.jones@qcs.org
|
||
|
||
Since I am writing this software it will be developed in the COMAL 2.0
|
||
language, which is fast and very readable (and thus easily translated to
|
||
other languages). A typical commercial LP code represents about 10 man
|
||
years of development. The C64 software will represent perhaps 10 days,
|
||
plus past research, or 10 weeks of part time effort, and be submitted for
|
||
the next issue of C=Hacking. It won't be the best software, but it will
|
||
be good. Over a period of perhaps a year, we can incorporate and publish
|
||
changes (hopefully not actual bugs). Then it can be translated be to ACE
|
||
assembly or some other language to make it available to more C64/128
|
||
users.
|
||
|
||
@(A): Conclusion
|
||
|
||
The C64 LP software is being developed simply to fill an empty slot in
|
||
C64 software. It is also to emphasize that the C64 can indeed be used
|
||
for HEAVY MATH, subject only to constraints of limited speed, memory, and
|
||
software. There is little demand for solving LP problems on a C64,
|
||
otherwise it would have been done many times already. This article will
|
||
not interest many C64/128 users. It does not even come close to
|
||
describing how to write a working LP program. It does describe what LP
|
||
is and some of the issues involved in designing a LP program for the C64.
|
||
I do thank those that read this far. Don't forget to write.
|
||
|
||
=========================================================================
|
||
|
||
@(#)mags: Hacking the Mags
|
||
|
||
Not everything good and/or technical comes from Commodore Hacking, which
|
||
is as it should be. (We still think we have the most, though...) Thus,
|
||
let's spotlight some good and/or technical reading from the other
|
||
Commodore publications.
|
||
|
||
If you know of a magazine that you would like to see summarized here, let
|
||
C=Hacking know about it. These summaries are only limited by Commodore
|
||
Hacking's inability to purchase subscriptions to all the Commodore
|
||
publications available. We are very grateful to those publications that
|
||
send complimentary copies of their publications for review.
|
||
|
||
@(A): Commodore World (http://www.the-spa.com/cmd/cwhome.html)
|
||
Although a bit late, Issue 15 made its way to our mailbox and opened
|
||
with an apology from VP Charles Christianson detailing why the current
|
||
issue took so long to reach subscribers. As we suspected, it was due
|
||
to SuperCPU shipments and general bug-swatting. However, another factor
|
||
that wasn't as obvious was some personnel changes in the publication.
|
||
Gaelyne Gasson goes over the various graphics formats and how to
|
||
convert them to viewable formats on the Commodore. The GEOS programmers
|
||
will appreciate Maurice Randall's article on VLIR files, and Doug Cotton
|
||
presents Part 2 of his discussion on file transfer utilities. The
|
||
demo scene gets a little press with Sherry Freedline's piece on
|
||
demos, including a section on _Driven_, reviewed below. Commodore
|
||
Hacking even got a mention or two in Max Cottrell's report on the
|
||
Lansing Area Commodore Club Expo '96.
|
||
|
||
@(A): DisC=overy (http://www.eskimo.com/~drray/discovery.html)
|
||
Arriving on the Internet October 1st, Issue 2 of this new publication
|
||
maintains the level of content started in Issue 1. We suppose it's
|
||
too early to tell, but it looks like one will show up every 4 months.
|
||
The issue starts with three detailed pieces on VIC video techniques,
|
||
including a discussion of the Super Hires FLI technique by Roland
|
||
Toegal and 'Count Zero', a starter article on using raster interrupts
|
||
by Mike Gordillo and 'Dokken', and how to use simple text scroll
|
||
routines in programs by Mike Gordillo. Steve Judd details the basics of
|
||
using the SID chip, and Andreas Varga steals the issue with an
|
||
interview with SID creator Bob Yannes. The article is a must read.
|
||
The highlights of the hardware section is a Atari 2600 cartridge
|
||
reader for the VIC-20 by Ravid Noam and how to upgrade a Commodore
|
||
16 to 64 kB by Martin Gierich.
|
||
|
||
@(A): Driven (http://soho.ios.com/~coolhnd/)
|
||
In addition to the funky banner on Driven #15, the issue mentions
|
||
the resurgence of the Demo Scene and congratulates all the recent
|
||
Driven 4kB Competition entrants. If you are interested in demos and
|
||
what effects are possible, be sure to check out the recent entries.
|
||
#15 details the CMD Swiftlink in an article by Perry Eidelbus.
|
||
Users undecided on purchasing a SL, or programmers unsure of whether to
|
||
develop for the unit should read this piece. In a look back, 'The Hobbitt'
|
||
runs through the history of the NTSC demo scene. Also, if you
|
||
didn't get a chance to take a look at DisC=overy yet, there's an
|
||
interview with editor Mike Gordillo in this issue.
|
||
|
||
In between #15 and #16, Driven published the "Driven 4K Compo Edition",
|
||
containing reviews and comments on the entries submitted for the recent
|
||
Driven competition.
|
||
|
||
Driven #16 contains a look into the world of Computer Workshops, Inc.
|
||
(CWI) by Cameron Kaiser, as well as a detailed description of Craig
|
||
Bruce's ACE OS, available on the Internet. As well, there are the
|
||
usual notices of new demo releases and groups. The editors remark that
|
||
they feel #16 is the best Driven yet.
|
||
|
||
@(A): LOADSTAR (http://www.loadstar.com)
|
||
Sometimes, we read LOADSTAR purely for the entertainment factor. And
|
||
I don't mean the games on the disk. In Issue 145, Jeff Jones outlines
|
||
his top ten email pet peeves. #145 delves into a rare topic in C64
|
||
circles: Musical Instrument Digital Interface (MIDI). Fender goes over
|
||
the protocol and how it can be used with a 64/128. On the heels of that
|
||
article is a piece by John Serafino that creates MIDI tracks for
|
||
your own enjoyment. Bo Zimmerman presents a "Presenter" for LOADSTAR
|
||
that utilizes GEOS. In addition, Bo gives GEOS users a handy utility
|
||
that archives files and can even create .d64 images. To supplement
|
||
Maurice Randall's _Commodore World_ article on VLIR files, Roger
|
||
Detaille details the revisions in the directory that GEOS disks dictate.
|
||
As a bonus, Issue #145 contains Driven 12, reviewed in C=Hacking Issue
|
||
13 (Reference: mags) as well as DisC=overy #1, also reviewed last time.
|
||
|
||
Issue 146 starts off on an apologetic note, as Jeff repents for
|
||
redistributing DisC=overy #1 not in its entirety. It brings up an
|
||
important point that compilations like DisC=overy and C=Hacking can
|
||
only be freely redistributed in their entirety. Diving into the issue,
|
||
developers looking to design their own fonts might find use in Anthony
|
||
Rose's Font Studio, Bob Markland's Font Viewer II, or Bob's Font Studio
|
||
Printer. Jeff presents his entry in the Directory Editor arena:
|
||
DirectoMeister I.
|
||
|
||
Demo Scene folks will enjoy "Omni's First Demo" on Issue 147.
|
||
Continuing with the video theme, Andrew Martin present Hires Sketch II,
|
||
an art creation application. Of interest to GEOS DTP (Desktop
|
||
Publishing) folks is a set of two GEOPaint documents containing
|
||
some clip-art.
|
||
|
||
As mentioned in Newsfront (Reference: news), Issue 148 has been released
|
||
to the Commodore community as a "pass-around" issue. Distribution is
|
||
encouraged. Although not technical in nature, everyone should read the
|
||
piece describing this issue. It gives some insight into the workings
|
||
of LOADSTAR and its ex-parent company, SOFTDISK. Fender Tucker shows
|
||
how to add a bypass switch to a Super Snapshot cartridge, while Jeff
|
||
revamps his Directomeister I into version II. As well, Menu Toolbox III,
|
||
included in this issue (Reference: toolbox) is available on LS148.
|
||
As well, Commodore Hacking #13 is included on the 3.5" disk version.
|
||
|
||
@(A): The Underground
|
||
Issue #14 is the last issue for this publication. It has merged with
|
||
LOADSTAR LETTER. See Newsfront (Reference: news) for more information.
|
||
We were hoping to get the last issue in to review it, but C=Hacking's
|
||
recent relocation sent the issue off into never-never land. Anyway,
|
||
we wish Scott Eggleston and his family the best. He will continue to
|
||
edit LOADSTAR LETTER.
|
||
|
||
Other magazines not covered in this rundown include:
|
||
|
||
* _64'er_
|
||
* _Atta Bitar_ (_8 bitter_)
|
||
* _COIN!_
|
||
o _Commodore 64/128 Power User Newsletter (CPU)
|
||
o _COMMODORE CEE_
|
||
o _Commodore Gazette_
|
||
* _Commodore Network_
|
||
* _Commodore Zone_
|
||
o _LOADSTAR 128_
|
||
o _LOADSTAR LETTER_ (We received an electronic copy, but couldn't print it)
|
||
* _Gatekeeper_
|
||
o _Vision_
|
||
|
||
Notes on Legend:
|
||
* = We have never received an issue of this publication.
|
||
o = We have not received a new issue of this publication to review.
|
||
+ = We will begin reviewing this magazine in the next issue.
|
||
|
||
In addition, others exist that C=Hacking is simply not aware of. As soon
|
||
as we can snag a copy of any of these, or get the foreign language ones
|
||
in English :-), we will give you the scoop on them.
|
||
|
||
============================================================================
|
||
|
||
@(#)net: The Commodore Telnet BBS
|
||
by Bo Zimmerman (ez13942@swt.edu)
|
||
|
||
@(A): Overview
|
||
|
||
The following are instructions for setting up a Commodore computer as a
|
||
telnet-able BBS. It relies on a modem connection with a PC running LINUX
|
||
with a telnet daemon. The Commodore is connected to the PC via a null
|
||
modem cable. The LINUX box has a modified version of minicom, which
|
||
comes with the slackware distribution (and others I would imagine), and a
|
||
shell script, all described in greater detail below. The essential goal
|
||
is this: when a user telnets to the LINUX machine and logs in as the BBS
|
||
user, the PC will run the modified minicom, which is set up to
|
||
communicate with the COM port connected to the Commodore. When minicom
|
||
starts up, it will signal the Commodore that a connection has been made
|
||
by setting the modem port's DTR signal. The Commodore BBS program goes
|
||
online because the DTR line is attached to the DCD line in the cable. So
|
||
long as the user is still in minicom, the connection remains, and wa-la!
|
||
A Commodore on the net!
|
||
|
||
Part I : Required Components (SubRef: 1)
|
||
Part II : RS232 Adapter Instructions (SubRef: 2)
|
||
Part III: Setting up the LINUX box (SubRef: 3)
|
||
Part IV : Setting up the Commodore BBS program (SubRef: 4)
|
||
Part V : What's missing (SubRef: 5)
|
||
Part VI : Credits (SubRef: 6)
|
||
|
||
@(A)1: Part I: Required Components
|
||
|
||
1) Commodore 64/128/VIC-20
|
||
2) Sufficient Commodore drives for your BBS software.
|
||
3) Commodore BBS software with DCD initiation capabilities (see part IV)
|
||
4) Standard RS232 null modem cable adaptor for the Commodore
|
||
5) PC 386 or better running Linux
|
||
6) Network capabilities for the Linux machine (ethernet card, PPP
|
||
connection, or other connection)
|
||
|
||
@(A)2: Part II: RS232 Adaptor Instructions
|
||
|
||
(This is cut and pasted from some instructions I downloaded off of
|
||
ftp.funet.fi and then modified for a standard 9 pin female COM port on a
|
||
PC).
|
||
|
||
|
||
USER PORT STD. DB9 COM NULL DB9 COM
|
||
CABLE CABLE
|
||
|
||
| +------\ | |
|
||
| 2 | \ 3 | |
|
||
M -|------------------| U1-A O-------|- 2 TX ----------|- 3 RX
|
||
| | / | |
|
||
| +------/ | |
|
||
| \ | |
|
||
| | \ | |
|
||
| 3| \ 4 4+------\ | |
|
||
D -|---|U3-B O----+---| \ 6 | |
|
||
| | / | 5| U1-B O-------|- 7 RTS ----------|- 8 CTS
|
||
| | / +---| / | |
|
||
| / +------/ | |
|
||
| | |
|
||
| \ | |
|
||
| | \ | |
|
||
| 5| \ 6 9+------\ | |
|
||
E -|---|U3-C O----+---| \ 8 | |
|
||
| | / | 10| U1-C O-------|- 4 DTR ------+---|- 6 DSR
|
||
| | / +---| / | | |
|
||
| / +------/ | | |
|
||
| | | |
|
||
| | | |
|
||
| / | | |
|
||
B -|---+ / | | | |
|
||
| | 3 / | 1 | | |
|
||
C -|-----------------O U2-A -----------|- 2 RX ------|---|- 3 TX
|
||
| \ | | | |
|
||
| \ | | | |
|
||
| \ | | |
|
||
| | | |
|
||
| | | |
|
||
| | | |
|
||
| / / | | |
|
||
| / | / | | | |
|
||
| 10 / |11 6 / | 4 | | |
|
||
L -|----O U3-E ------O U2-B -----------|- 6 DSR ---+ +---|- 1 DCD
|
||
| \ | \ | | | |
|
||
| \ | \ | | | |
|
||
| \ \ | | |
|
||
| | | |
|
||
| | | |
|
||
| / / | | |
|
||
| / | / | | | |
|
||
| 12 / |13 8 / | 10 | | |
|
||
K -|----O U3-F ------O U2-C -----------|- 8 CTS ---|------|- 7 RTS
|
||
| \ | \ | | | |
|
||
| \ | \ | | | |
|
||
| \ \ | | |
|
||
| | | |
|
||
| | | |
|
||
| / / | | |
|
||
| / | / | | | |
|
||
| 8 / | 9 11 / | 13 | | |
|
||
H -|----O U3-D ------O U2-D -----------|- 1 DCD ---+------|- 4 DTR
|
||
| \ | \ | | |
|
||
| \ | \ | | |
|
||
| \ \ | |
|
||
| | |
|
||
| | |
|
||
N -|-----------------------------------|- 5 SIG GND ----------|- 5
|
||
| | |
|
||
| +5V | |
|
||
2 -|----+------------+ +------|- PROTECTIVE GND --------|-
|
||
| | | | | |
|
||
| | | | | |
|
||
| --+-- 0.1uF | ------- | |
|
||
| --+-- 10V | --- | |
|
||
| | | - | *********************************
|
||
A -|----+ | | * *
|
||
| | | | * U-1 1488 RS-232 XMTR *
|
||
| ------- | 14 +----+ 7 | * *
|
||
| --- +----| U2 |--+ | * U-2 1489 RS-232 RCVR *
|
||
| - | +----+ \ | * *
|
||
| | \ | * U-3 7404 HEX INVERTER *
|
||
| | 14 +----+ 7\ | * *
|
||
| +----| U3 |--+ | * DIODES SIGNAL DIODES *
|
||
| |\ | +----+ | | * WILL WORK HERE *
|
||
| | \| | | * *
|
||
10-|----| |---+--------+ | | * NOTE: THE RS-232 VOLTAGE *
|
||
| | /| + | | ------- | * BE APPX +/- 10 VOLTS *
|
||
| |/ | --+-- | --- | * WHICH IS OK TO USE *
|
||
| 100uF --+-- 14 | - | * PER RS-232 STANDARD *
|
||
| 15V | +--|--+ | * *
|
||
| | | | 7 | * *
|
||
| ------- | U1 +----+ | *********************************
|
||
| --- | | | |
|
||
| - +--|--+ | |
|
||
| 1 | ------- |
|
||
| | --- |
|
||
| 120uF | - |
|
||
| 15V | /| | | *********************************
|
||
| +|| |/ | | | * *
|
||
11-|--||----+---| |----+----+ | * Commodore User Port to RS-232 *
|
||
| || | |\ | | | * Adaptor designed by Stephen *
|
||
| | | \| | | * Coan, Version 2, 03-NOV-83. *
|
||
| | | | * *
|
||
| -------- 100uF ---+--- | * This general design has also *
|
||
| \ / 15V ---+--- | * been used in other devices *
|
||
| \/ + | | * where a negative voltage was *
|
||
| -------- | | * not available for the RS-232 *
|
||
| | | | * *
|
||
| | | | * The user port is a 44 pin *
|
||
| +-------+----------+ | * edge connector and the PC COM *
|
||
| | | * port is a female DB 9 (as on *
|
||
| | | * on a joystick) *
|
||
| ------- | * *
|
||
--- | * *
|
||
- | * *
|
||
| * *
|
||
| *********************************
|
||
|
|
||
|
|
||
|
||
|
||
You'll want to follow the instructions for the NULL modem cable for the
|
||
sake of this project, so use the pin settings on the right hand side.
|
||
|
||
@(A)3: Part III: Setting up the LINUX box
|
||
|
||
You should know now that if you don't have root access to the LINUX
|
||
machine, you should give up now. Secondly, you need to have the machine
|
||
already configured with respect to its network hardware and the telnet
|
||
daemon. The popular slackware distribution sets all this up during its
|
||
installation process.
|
||
|
||
The first step will be to create the above shell "new_minicom" and its
|
||
accompanying configuration "cua0".
|
||
|
||
1. Log on as root, and enter the /usr/bin directory.
|
||
2. Run minicom by entering its name followed by the name of the port
|
||
you'll be using. For instance, enter:
|
||
|
||
"minicom -l -o cua0" for com port 1.
|
||
"minicom -l -o cua1" for com port 2.
|
||
|
||
3. Enter CTRL-A followed by 'z' to view a menu of options.
|
||
4. Enter CTRL-A,P for communication parameters. You'll want the
|
||
parameters to be: 2400 baud, 8 bits, no parity, 1 stop bit. Exit this
|
||
menu when done.
|
||
5. Enter CTRL-A,T for terminal parameters. ANSI, Backspace, and enabled
|
||
are fine settings.
|
||
6. Enter CTRL-A,O for configuration parameters. Select the third option-
|
||
communication port setup. Make sure the serial device reads "/dev/cua0"
|
||
for com port 1 or "/dev/cua1" for com port 2. Baud/parity/bits should
|
||
read as you set them above. Hardware and software flow control should
|
||
BOTH be turned OFF!
|
||
7. Exit back to the parameters menu and select "modem and dialing." The
|
||
reset and initialization strings should be blank. Auto baud detect,
|
||
hang-up drops DTR, and modem has DCD line should all read YES.
|
||
8. Exit back to the parameters menu again and hit the option "save
|
||
configuration as cua0" (or cua1 if you are using com 2).
|
||
9. Exit minicom altogether by entering CTRL-A,X.
|
||
10.We will make this our TEMPORARY new_minicom by entering from the
|
||
shell:
|
||
|
||
cp minicom new_minicom
|
||
|
||
If you want to test the RS232 cable, now would be a good time. Run
|
||
minicom with the following options:
|
||
|
||
new_minicom -l -o cua0 (or cua1 for com port 2)
|
||
|
||
The next step is to create the BBS "user."
|
||
|
||
1. Log on as root and run the program "adduser." Call your account "bbs"
|
||
and give it the name "bbs." After the user is created, you should have a
|
||
directory called "/home/bbs."
|
||
|
||
2. Now load the file "/etc/passwd" into emacs and find the line
|
||
containing the information about your BBS. The characters between the
|
||
first and second colons in the line are the encrypted password. Delete
|
||
these characters. Next change the default shell (the part following the
|
||
last colon) to point to the file /usr/bin/new_minicom -l -o cua0.
|
||
|
||
3. When complete, excepting the ID number (504), your line should look
|
||
identical to this one:
|
||
|
||
bbs::504:100:bbs:/home/bbs:/usr/bin/new_minicom -l -o cua0
|
||
|
||
If you are using com 2, change the shell command to read "cua1" instead
|
||
of cua0.
|
||
|
||
The next step is a little tricky. You'll need to make some changes to
|
||
minicom to make it much more secure against abuse by users. Without
|
||
changes, the user can enter all the commands you did above! It will be
|
||
necessary to have extensive knowledge of C and knowledge of compiling in
|
||
LINUX to perform these changes. ;)
|
||
|
||
Now that you're frightened, you'll be glad to know that the necessary
|
||
files are available at:
|
||
|
||
147.26.162.107
|
||
|
||
in the "lib" subdirectory.
|
||
|
||
The only files you'll really need are "new_minicom", which must be copied
|
||
to your /usr/bin directory, and the file "wb.rc" (discussed below), which
|
||
must be copied to /home/bbs. Also available is the file "newminicom.zip"
|
||
which contains all the modified source code.
|
||
|
||
The following changes, to the best of my memory, were made:
|
||
|
||
1. All CTRL-A commands have been disabled, with the exception of CTRL-
|
||
A,X.
|
||
2. Minicom will automatically exit on the reception of the sequence CTRL-
|
||
A,CTRL-B,CTRL-C,CTRL-D from the modem.
|
||
3. Spawning out has been disabled.
|
||
4. The status windows have been removed.
|
||
5. ANSI has been made permanent.
|
||
6. A "busy" message for already connected processes has been added.
|
||
7. A "cleaning up" message for the com port has been added in the event
|
||
of an abnormal exit.
|
||
|
||
After new_minicom is set up in the /usr/bin directory, you may think
|
||
you're done. Well, you almost are! You may need to make sure there are
|
||
no protections on the com port, on minicom, or on other necessary files.
|
||
Do this with the "chmod" command. You'll want to turn on read and write
|
||
for the com port as follows:
|
||
|
||
chmod +r /dev/cau0 (or cua1)
|
||
chmod +w /dev/cau0 (or cua1)
|
||
|
||
Read and execute abilities can be added to minicom similarly:
|
||
|
||
chmod +x /usr/bin/new_minicom
|
||
|
||
Now you're done, right? No, but the last step requires a bit of
|
||
explanation. Our telnet session is maintained because we have an actual
|
||
user logged on and running a program. Should this user disconnect
|
||
themselves from their telnet session without logging off, we are actually
|
||
left with an open session of new_minicom still running in LINUX. Normally
|
||
we wouldn't care, except that so long as new_minicom is running, the com
|
||
port is protected from use, such that the system will be eternally busy!
|
||
What we need to do then is to have a shell script, with root privileges,
|
||
that will keep an eye on copies of new_minicom running without a telnet
|
||
daemon connection. The following shell script will do that.
|
||
|
||
>From the /home/bbs directory, create the file "wb.rc" (I call it the
|
||
watch-boy) and enter the following lines:
|
||
|
||
set temp=1
|
||
while (temp=1)
|
||
do
|
||
pid=`ps -auxg | grep 'new_minicom' | grep -v 'grep' | grep 'bbs' \
|
||
| grep '?'| awk '{print $2}'`
|
||
tty=`ps -auxg | grep 'new_minicom' | grep -v 'grep' | grep 'bbs' \
|
||
| grep '?' | awk '{print $7}' | grep '?'`
|
||
if [ 'expr $tty : "?"' ]
|
||
then
|
||
kill -9 $pid
|
||
fi
|
||
sleep 60
|
||
done
|
||
|
||
|
||
[!NOTE!: The two lines with the backslash (\) are extensions of the
|
||
prior lines. For instance, the characters "| awk '{print $2}'`" should
|
||
immediately follow the end of the line that reads "...grep '?'". Do not
|
||
include the backslashes!]
|
||
|
||
What this actually does is to look for occurrences of "new_minicom" being
|
||
run by a user called "bbs" in which there is no terminal connection. It
|
||
then kills those processes and goes to sleep for awhile before checking
|
||
again.
|
||
|
||
This file can also be downloaded from 147.26.162.107 in the "lib"
|
||
subdirectory.
|
||
|
||
Last thing to do then is to activate the watchboy by adding the following
|
||
line to the file /etc/rc.d/rc.local /home/bbs/wb.rc &
|
||
|
||
You can start up the watch boy as root without rebooting the machine,
|
||
but the above will make sure it is started up whenever the LINUX box is
|
||
restarted.
|
||
|
||
Now on to the Commodore side.
|
||
|
||
@(A)4: Part IV: Setting up the Commodore BBS program
|
||
|
||
Thankfully, doing this is MUCH easier than setting up the LINUX box. The
|
||
requirements on the Commodore end are actually very few, since what we
|
||
end up doing is have the LINUX machine act as our modem and phone
|
||
connection. As far as the BBS program is concerned (with few exceptions),
|
||
it is acting completely as normal.
|
||
|
||
You'll first want to select the BBS program to work with. Make sure it
|
||
is one that is written in BASIC so that you can modify it easily. The
|
||
BBS should also support ASCII, and preferably ANSI as well. For the time
|
||
being, ANSI is the only way we'll get any color at all out of LINUX. The
|
||
BBS program should support 2400 baud through the modem port. If not,
|
||
you'll need to lower the set baud rate in minicom above.
|
||
|
||
Detecting a connection is accomplished by simply watching the Data
|
||
Carrier Detect line on the modem port. That will be bit 4 in location
|
||
56577. When the following BASIC condition becomes true, the BBS should
|
||
go online:
|
||
|
||
(peek(56577)and16)=16
|
||
|
||
The BBS program should go online by swinging its Data Terminal Ready
|
||
signal high. This can be done with the following:
|
||
poke56577,6:poke56579,6
|
||
|
||
The BBS program should hang up whenever it detects the Data Carrier
|
||
Detect line go low. That's done with something similar to the peek
|
||
above:
|
||
|
||
(peek(56577)and16)=0
|
||
|
||
Lastly, the program will hang-up by doing two things. The first thing is
|
||
to tell minicom to terminate. This is done by the following:
|
||
print#2,chr$(1);chr$(2);chr$(3);chr$(4);
|
||
|
||
Where print#2 is above you should substitute the proper modem channel for
|
||
the number 2.
|
||
|
||
The second is to drop the Data Terminal ready signal by entering:
|
||
|
||
poke56577,0:poke56579,32
|
||
|
||
If the BBS program does all these things, it will perform admirably.
|
||
|
||
@(A)5: Part V: What's to Come
|
||
|
||
There are two current problems with this configuration for a telnet
|
||
Commodore BBS. One is that Commodore graphics do not work. For a long
|
||
time this baffled me, and I looked all over the minicom source for the
|
||
solution. It wasn't there. Now I'm thinking it has something to do with
|
||
the telnet daemon itself, which is the next place to check. When it's
|
||
solved, I'll let you know.
|
||
|
||
The other problem concerns time lag. Normally, lag is unimportant, but
|
||
some transfer protocols are now especially sensitive to lag time. For
|
||
this reason, along with translation problems mentioned above and the
|
||
sensitivity of minicom to its termination codes, make the operation
|
||
of the stream transfer protocols on the telnet BBS impossible. Perhaps
|
||
some modified uuencoding packet based protocol could be written and
|
||
patched in to the BBS program. If any such solution presents itself,
|
||
it will be pursued.
|
||
|
||
@(A)6: Part VI: Credits
|
||
|
||
Very few of these are my original ideas. Special thanks to Matt Beall of
|
||
California (mathew@cinenet.net) for most of the modifications done to
|
||
minicom. The project itself is the brain child of Henry Knoepfle of
|
||
Arizona, who helped me through all the linux changes. Early in August,
|
||
as soon as I get my own BBS program properly configured, I'll be putting
|
||
it back up on the same machine that the ftp files are on. Telnet to it
|
||
and log on as user "bbs" with no password. Good luck!
|
||
|
||
=========================================================================
|
||
|
||
@(#)usenet: UseNuggets
|
||
|
||
COMP.SYS.CBM: The breeding ground of programmers and users alike. Let's
|
||
see what topics are showing up this month:
|
||
|
||
@(A): To C or Not To C, That Is The Question
|
||
|
||
Over the past few months, there has been some discussion of the C
|
||
programming language, a common language used in the development of many
|
||
UNIX, Windows, and Macintosh applications. We're not exactly sure what
|
||
sparked the discussion, but GNU C came up very early. For those who
|
||
don't know, the Free Software Foundation (FSF) is an organization that
|
||
sponsors the creation and maintenance of many fine applications and
|
||
utilities. One such group of applications are known as the GNU (GNU's
|
||
Not UNIX) applications. Many people use the GNU utilities because they
|
||
can be compiled and run on many different machines. One of the more
|
||
popular apps is GNU C, which can be run on many computer systems as well
|
||
as create object code for all the supported environments. The system is
|
||
highly customizable, which explains why there was talk of both porting
|
||
GNU C to the Commodore 64, and/or using a DOS or UNIX version of the
|
||
compiler to create object code that would run on the C64. The thread
|
||
has drug on for quite a while, but seems to be winding down. We're not
|
||
sure there was a general consensus, but many remarked that GNU C is
|
||
simply too large to run on a C64. In addition, the assumptions it makes
|
||
about the supported hardware architectures makes cross-compilation a near
|
||
impossibility. Still, many are searching for a way to bring ANSI C
|
||
to the Commodore system.
|
||
|
||
Success may come from CMD, as Doug Cotton mentioned that they were
|
||
looking into a 65C816 cross compiler with the hopes of porting a small
|
||
free C compiler to the 64 environment.
|
||
|
||
@(A): The SuperCPU this and the SuperCPU that....
|
||
|
||
Now that the SuperCPU has started shipping from CMD, the newsgroup has
|
||
been abuzz with questions and thoughts about the units. However, it
|
||
seems the group is always one step ahead of CMD. Now that the units have
|
||
started appearing on user's doorsteps, questions about the planned 128
|
||
unit and the SCPU RamCard have dominated the topics. The fact that the
|
||
64 unit actually contains 128 kB or RAM confused some folks, who wanted
|
||
to know why they were paying for this extra RAM, and how they could take
|
||
advantage of it now that they have it. Then, as fast as folks described
|
||
that the extra RAM was actually used to "shadow" the ROM so that the
|
||
KERNAL could run at full speed, the topic switched from present RAM to
|
||
planned RAM.
|
||
|
||
Questions ranging from how much RAM would be available on the RamCard, to
|
||
how fast the RAM could be accessed, to what style of modules could be
|
||
used have been debated. CMD, the developers of the RamCard, acknowledged
|
||
that the full address space of 16 megabytes would be available on the
|
||
unit and that they would try to provide speeds as fast as economically
|
||
possible. CMD has also stated that they will be utilizing the same 30 pin
|
||
SIMM technology that is used in the company's RamLink product. Some
|
||
Usenetters debated that 72 pin SIMMs were becoming more cost effective,
|
||
but CMD countered that only those that upgrade to the full capacity of
|
||
the unit would realize any cost savings.
|
||
|
||
The substantial increase in power the SuperCPU provides the programmer
|
||
brought many questions and comments on planned or potential new operating
|
||
systems for the unit. As of yet, none have surfaced, but only time will
|
||
tell. For its part, CMD has made GEOS compatibility a staple of the new
|
||
unit, so that OS will run correctly. At least one commercial venture,
|
||
PROTOVISION, is allegedly planning an all GUI OS for the unit. See
|
||
Newsfront (Section: news) for more information.
|
||
|
||
Brett Tabke, of PHD Software Systems, announced that he is busy upgrading
|
||
his Karma assembler for the 128 to run on the new unit and praised the
|
||
virtues of the new opcodes, modes, and options available when operating
|
||
the unit in "Native mode." This started some discussion on writing code
|
||
that only runs on the new processor. The sides were split almost
|
||
immediately, as all noted that while the new applications would run very
|
||
well on the SCPU, they would not run at all on a stock 64. Proponents
|
||
noted that new software demands the purchase of the SCPU, while purists
|
||
maintained that that would limit the software to a small market segment.
|
||
|
||
@(A): The "Virtual 1541"!
|
||
|
||
Now, before you start thinking of 3-dimensional plastic cases and track
|
||
0 head knocking in quadrophonic sound, let's explain the topic. Many
|
||
users have expressed a desire to virtualize the IBM PC as a glorified
|
||
1541 drive with full emulation. The closest thing as yet is the 64NET
|
||
package, which allows you to load and save programs to the IBM PC hard
|
||
drive like it was a regular CBM drive. The drawback to 64NET is its non-
|
||
standard access method. Before you can access the emulated CBM drive, you
|
||
have to load special software on the 64 and use a special user port
|
||
cable. So, for users who demand perfect emulation, no choices exist yet.
|
||
The lack of options haven't dented the dreams of many who outlined the
|
||
"technical specifications" of such a virtual disk drive.
|
||
|
||
=========================================================================
|
||
|
||
@(#)toolbox: Menu Toolbox III
|
||
by Jeff Jones (jeff@loadstar.com)
|
||
Copyright 1996: J and F Publishing
|
||
|
||
@(A): Introduction
|
||
|
||
This toolbox has the most versatile menu commands I've ever coded, and
|
||
will make your BASIC and ML programs scream with speedy scrolling menus
|
||
and file selectors with multi- item selectability. That's right. I said
|
||
scrolling! Because of its size, there are only two versions of MENU
|
||
TOOLBOX III:
|
||
|
||
Filename SYS Location Notes
|
||
|
||
MENUTOOLS 1000 4096 (Reference: code, SubRef: menucode1)
|
||
MENUTOOLS 8000 32768 (Reference: code, SubRef: menucode2)
|
||
|
||
These are the optimal locations for BASIC. It's 8K (33 blocks) in length,
|
||
but your programs will be much smaller, and have access to RAM under ROM
|
||
for array, screen and menu storage. You won't suffer for memory.
|
||
|
||
There are four types of menus:
|
||
|
||
o Custom Item Menus
|
||
o File Requestors
|
||
o Screen Menus
|
||
o Instant Pages (from BASIC only)
|
||
|
||
@(A): ML and Compiler Users
|
||
|
||
You usually can't use SYS 32768,1,2,3,4,5 from ML or compiled programs so
|
||
you'll have to POKE the parameters into a location and then tell the
|
||
toolbox where to get the parameters. You tell MENU TOOLBOX II where to find
|
||
the parameters by loading the .X and .Y registers with the low and high
|
||
bytes of the location and then SYSing. From BASIC, the .X register is
|
||
location 781 and the .Y register is 782. Here I'll use $033C (+828) as an
|
||
example. The high/low bytes for location 828 are 3 high and 60 low. The
|
||
following BASIC example of the lattice command works equally well as BASIC
|
||
or compiled.
|
||
|
||
poke828,x1
|
||
poke829,x2
|
||
poke830,y1
|
||
poke831,y2
|
||
poke832,t1
|
||
poke833,t2
|
||
poke834,c1
|
||
poke835,c2
|
||
poke781,60
|
||
poke782,3
|
||
sys32768+102
|
||
|
||
This may look slow, but in compiled programs, POKE commands are executed
|
||
at near ML speeds. If there is a chance that you're going to compile your
|
||
program, you may want to use the ML/compiler protocols from the start. It's
|
||
heck converting a program. I know (Directomeister).
|
||
|
||
ML programmers can embed parameters within their programs. It's actually
|
||
easier from ML than compiled:
|
||
|
||
background ldx <b'lattice
|
||
ldy >b'lattice
|
||
jsr 32768+102
|
||
rts
|
||
b'lattice .byt 0,39,0,24,9,10,15,12
|
||
|
||
@(A): Instant Pages
|
||
|
||
SYS 32768+198,PAGENAME$, items,list$..., hotkeys$
|
||
|
||
Since it's by far the easiest to use, we'll discuss instant pages
|
||
first. A page is a computer screen with a user interface setup. Instant
|
||
page allows you to create with one SYS a screen with a tiled background, a
|
||
title bar, and a centered working menu complete with hotkeys. Consider the
|
||
following code:
|
||
|
||
10 T$="M Y D A T A B A S E"
|
||
20 A$(1)="OPEN DATABASE (O)"
|
||
30 A$(2)="DEFINE FIELDS (D)"
|
||
40 A$(3)="ADD RECORD (A)"
|
||
50 A$(4)="SEARCH RECORDS (S)
|
||
60 A$(5)="PRINT RECORDS (P)"
|
||
70 A$(6)="RETURN TO LOADSTAR (Q)"
|
||
80 A$(7)="odaspq"
|
||
90 sys32768+198,T$,6,A$(1),A$(2),A$(3),A$(4),A$(5),A$(6),a$(7)
|
||
100 onf%gosub200,300,400,500,600,700
|
||
110 goto 10
|
||
|
||
Make sure the number of items in your list$ matches the number declared
|
||
with ITEMS. If you RUN this program, a typical LOADSTAR type program will
|
||
pop up on the screen:
|
||
|
||
M Y D A T A B A S E
|
||
OPEN DATABASE (O)
|
||
DEFINE FIELDS (D)
|
||
ADD RECORD (A)
|
||
SEARCH RECORDS (S)
|
||
PRINT RECORDS (P)
|
||
RETURN TO LOADSTAR (Q)
|
||
|
||
CRSR/RETURN TO SELECT
|
||
|
||
You'll have a CRSR/RETURN menu with hotkeys for each menu item, and more
|
||
hotkeys if you simply include them. The menu is automatically centered left
|
||
to right and top to bottom. CRSRing to ADD RECORD or pressing [A] will exit
|
||
the menu and the variable, F%, will be 3. This is how you know which item
|
||
or hotkey was selected by the user. There can be up to 40 hotkeys defined
|
||
so that your page goes beyond the items presented on the menu. If hotkey
|
||
#20 is pressed, the menu is exited, and F%'s value is 20. It's not
|
||
mandatory for your menu to have alternative hotkeys, but if you do, list
|
||
the menu's hotkeys first, and in the same order that they appear in the menu
|
||
so that F% is always the same as the menu choices and the hotkeys.
|
||
|
||
Lines 10-80 set up the data for the menu into variables since you can see
|
||
that there's no way all this text could fit on one line. Just imagine it
|
||
with 20 hotkeys.
|
||
|
||
Line 90 calls the routine. Program flow is transferred to MENU TOOLBOX II
|
||
until a menu item or hotkey is pressed.
|
||
|
||
Line 100 is one way of dispatching flow of the program based on the user
|
||
input.
|
||
|
||
Ironically, this feature will only work from BASIC. I wrote the INSTANT
|
||
PAGE feature as a simple driver to test MENU TOOLBOX II's ability to take
|
||
commands from ML. I liked the routine I ended up with and decided it should
|
||
be added to the package. Adding links for ML for this routine could be done
|
||
-- but since I wrote the routine with many parameters intending for it to
|
||
be called from BASIC, it becomes more difficult, even convoluted, to write
|
||
ML links for a program which is essentially a series of ML links. Plus
|
||
there's no time left this month.
|
||
|
||
@(A): Instant Page Setup: SYS 32768+201, tilea, tileb, colora, colorb,
|
||
title color, highlight color, menu color,
|
||
message color, frame color, frame on,
|
||
background, border
|
||
|
||
You can use my bland default colors or you can use your own. This command
|
||
simply changes the presets.
|
||
|
||
Your background is made up of a mesh of two characters, A & B, in two
|
||
colors. TILE A is one of the characters in the tiled background (0-255)
|
||
TILE B is the other tile in the background
|
||
|
||
COLOR A is the color of TILE A, 0-15 where COLOR A has the following
|
||
effect:
|
||
|
||
COLOR A VALUE COLOR
|
||
|
||
0 BLACK
|
||
1 WHITE
|
||
2 RED
|
||
3 CYAN
|
||
4 PURPLE
|
||
5 GREEN
|
||
6 BLUE
|
||
7 YELLOW
|
||
8 ORANGE
|
||
9 BROWN
|
||
10 LIGHT RED
|
||
11 DARK GRAY
|
||
12 MED GRAY
|
||
13 LIGHT GREEN
|
||
14 LIGHT BLUE
|
||
15 LIGHT GRAY
|
||
|
||
This chart applies to all subsequent color values mentioned in the
|
||
documentation.
|
||
|
||
COLOR B is the color of TILE B
|
||
|
||
TITLE COLOR is the color of the title of the page.
|
||
|
||
HIGHLIGHT COLOR is the color of the highlight bar of the menu
|
||
|
||
MENU COLOR is the color of the menu
|
||
|
||
MESSAGE COLOR is the color of the message at the bottom of the screen,
|
||
"CRSR/RETURN To Select."
|
||
|
||
FRAME COLOR is the color of the frames surrounding the title and menu.
|
||
|
||
FRAME ON turns the frame around the menu on with a nonzero value. You
|
||
might need to turn off the frame to squeeze in extra menu items. Maybe you
|
||
don't like frames, either.
|
||
|
||
BACKGROUND is the background color
|
||
|
||
BORDER is the border color
|
||
|
||
@(A): Change Message: SYS 32768+204,New Message$
|
||
|
||
In case your page needs a custom message at the bottom of the screen,
|
||
change it here. Keep it less than 38 characters.
|
||
|
||
@(A): Screen To Menu: SYS 32768+63,y,x1,x2,n,t,h,"keys"
|
||
|
||
Screen To Menu is an easy way to create a CRSR/RETURN menu from a vertical
|
||
list of options that you've previously printed on the screen. So any list
|
||
on your screen can be made to "spring to life" as a CRSR/RETURN menu. There
|
||
may be up to 24 items, as wide as the entire screen. It's up to you to
|
||
write the subroutines that correspond to each menu item.
|
||
|
||
After an item is selected, the variable, F%, tells you which item was
|
||
selected. It will hold a value between 1 and the number of items in the
|
||
menu. Here it is in use:
|
||
|
||
150 sysaddr,y,x1,x2,n,t,h,"hotkeys"
|
||
160 on f% goto200,300,400,500,600...
|
||
|
||
"f%" is the nth item selected.
|
||
|
||
Y is the starting row on the screen.
|
||
|
||
X1 is the left extreme of the highlight bar.
|
||
|
||
X2 is the right extreme of the highlight bar.
|
||
|
||
N is the number of items in the menu.
|
||
|
||
T is the text color of the unhighlighted items in the menu.
|
||
|
||
H is the highlight bar color.
|
||
|
||
NOTE: If you don't want the highlight bar to reverse items, add 128 to
|
||
the color codes (0-15) of parameters T and H.
|
||
|
||
The MENU command has been extended per imperial order of Maurice Jones.
|
||
Maurice likes to press one key instead of using CRSR/RETURN menus, which
|
||
force you to press more than one key. The new "keys" field allows you to
|
||
define hotkeys for each menu item, and also for flow control beyond the
|
||
CRSR/RETURN menu.
|
||
|
||
For instance, you have five items on your menu, but "keys" is defined as
|
||
"12345qlprt". 1-5 happen to be hotkeys for the menu in this example. You
|
||
can use mnemonic keys if you like. If the user CRSRs to item 4 and presses
|
||
RETURN, F% will become 4. If they press 4, f% becomes 4. But as a bonus, if
|
||
the user presses "l", which is seventh in the KEYS string, F% becomes 7. If
|
||
they press "r", F% becomes 9, and so on. MENU now has the power of
|
||
BRANCHER. You can have up to 40 hotkeys in the string.
|
||
|
||
What would you use these hotkeys for? Well you might have a CRSR/RETURN
|
||
menu, but also "q" to quit and SPACE to go to another menu. The only new
|
||
requirement is that you now have to define hotkeys for each of your menus.
|
||
It's a good idea to let your users know about the hotkeys.
|
||
|
||
To use screen menus from ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
jsr 32768+162
|
||
|
||
User input is returned in 253
|
||
|
||
Parameters is a stream of legal parameter bytes followed by the length of
|
||
the hotkey string, followed by the hotkey string.
|
||
|
||
|
||
@(A): Introduction to Scrolling Menus
|
||
|
||
These menus are more involved to implement, but well worth the setup time.
|
||
The multi-file selector in DISKMEISTER is an example of a quirky BASIC/ML
|
||
slow POKE (pardon the pun). You need self-contained ML to handle your
|
||
menus, especially scrolling ones. MENU TOOLBOX will create its own pointers
|
||
for the menu items you define. Normally these pointers will be right at the
|
||
end of the ML. Each item in your menu will take up 4 bytes. The pointers
|
||
can extend under ROM and IO with no problem. If you don't want the pointers
|
||
to be at their default location, you can change the array location with the
|
||
following SYS.
|
||
|
||
@(A): Change Location: SYS 32768+27,location
|
||
|
||
>From ML
|
||
|
||
ldx <location
|
||
ldy >location
|
||
jsr 32768+126
|
||
|
||
Since the default pointers will begin around $a000, you will want to
|
||
change the location if you have data such as a screen stored there.
|
||
Typically you'll want the pointers somewhere where they won't cost you
|
||
anything, which is usually under some ROM.
|
||
|
||
You'll also want to use this command if you want to switch between
|
||
pointers for different menus.
|
||
|
||
@(A): Declaring Menu Items
|
||
|
||
Before MENU TOOLBOX can create a menu for you, you must either BLOAD a
|
||
directory, an EDSTAR PRG text file with a list of menu items in it, or
|
||
declare items from DATA statements. I've included tools to make this
|
||
process easy. Since directories are so structured, they don't need pointers
|
||
so all you have to do is tell MENU TOOLBOX where to BLOAD the directory:
|
||
|
||
@(A): Bload Directory: SYS 32768+39,"$:*",device,location
|
||
|
||
Before you can show a file requestor, you must first have a directory in
|
||
memory. You can BLOAD a directory anywhere in RAM, even under IO at
|
||
$D000-$DFFF. There is NO NEED to use the CHANGE LOCATION command after
|
||
BLOADing a directory. F% holds the number of files, but keep in mind that
|
||
counting starts from 0, not 1.
|
||
|
||
>From ML:
|
||
|
||
ldx <filename
|
||
ldy >filename
|
||
lda namelength
|
||
jsr 32768+138
|
||
|
||
the directory filename, usually "$:*" must be followed immediately in
|
||
memory by the device number byte and then the low/high bytes of the load
|
||
address.
|
||
|
||
@(A): File Requestor: SYS 32768+45,x,y1,y2,r,c,h,s,m
|
||
|
||
This command will pop up a scrolling (if necessary) menu on your screen.
|
||
Your users will be able to CRSR up and down or page with the + and - keys.
|
||
You should print this somewhere on the screen so that your users will know.
|
||
Lotta parameters? Here's what they mean:
|
||
|
||
X is the upper left hand corner of the requestor box. Since directories
|
||
are always going to be about 32 columns across, you would never have a
|
||
number more than 6 here.
|
||
|
||
Y1 is the top row of the menu, 0- 20.
|
||
|
||
Y2 is the bottom row in the menu. Y2 determines how much of your screen
|
||
will be taken up by the file requestor.
|
||
|
||
R stands for REVERSE mode. If you want all the items in the menu to be
|
||
printed in reverse, put a 1 here. Highlighted items will appear unreversed.
|
||
|
||
|
||
C is the color of the menu and all unhighlighted menu items.
|
||
|
||
H is the color of the highlighted (current) item.
|
||
|
||
S is the color of selected files (if the menu is in multi-file select
|
||
mode.
|
||
|
||
M is for MULTI MODE. It allows the user to select more than one file. Make
|
||
this a 0 for a normal single file and 1 for multi-file selection ability.
|
||
Files are selected with SPACE or RETURN. To exit the requestor you must
|
||
press F1. Your program should inform the user of this if they are in the
|
||
multi file mode.
|
||
|
||
When in single mode the file name is returned in W$, the position in the
|
||
directory is in I% and the block size of the selected file is in B%.
|
||
|
||
>From ML:
|
||
|
||
ldx <location
|
||
ldy >location
|
||
jsr 32768+144
|
||
|
||
Have parameters as a stream of bytes in the order and extremes presented
|
||
above. When in single mode, .X and .Y point to the filename and .A holds
|
||
the file length. Compiler users, .A is location 780, .X is 781 and .Y is
|
||
782.
|
||
|
||
You can find F% at 253, I% at $14 and b% at $22
|
||
|
||
@(A): Index Items: SYS32768+33,item
|
||
|
||
This command works best with bloaded directories, but can be used on
|
||
normal scrolling menu data. It returns the filename or menu item string of
|
||
ITEM into w$. When f% <> 0, it means the item or file has been selected. So
|
||
when you have a multi file menu, do a loop to check each file. If f% <> 0,
|
||
act on that file.
|
||
|
||
[Big note:] if you're hurting for string array space or suffering from
|
||
garbage collection blues, why not store/load lists into menu item slots in
|
||
high memory? You can use INDEX to check your hidden pseudo arrays, and
|
||
DEFINE MENU ITEM (below) to store/flag items. Such arrays won't be dynamic,
|
||
but they can come in handy.
|
||
|
||
>From ML:
|
||
|
||
ldx <item
|
||
ldy >item
|
||
jsr 32768+132
|
||
|
||
.X and .Y point to the returned string and .A holds the string length. F%
|
||
is in locations 253 and 254 always.
|
||
|
||
|
||
@(A): Menus from BASIC Strings
|
||
|
||
Menu items can also exist in BASIC, but preferably in DATA lines and not
|
||
in dynamic strings since some dynamic strings can change location after a
|
||
garbage collection.
|
||
|
||
MENU TOOLBOX has to know a few things about your menu items before it can
|
||
make a menu out of them. It has to know each item's place in the menu. Is
|
||
it item number one or three hundred? If you have many items, you can tell
|
||
MENU TOOLBOX all about your menu in a FOR loop with the following command.
|
||
This isn't difficult to do. All you have to do is:
|
||
|
||
@(A): Define Menu Item: SYS32768+30,item$,index,selected
|
||
|
||
Here you're telling the system the place of a certain string in your menu.
|
||
If you're doing this from an array, you can use a FOR loop.
|
||
|
||
ITEM$ will always be a string variable, probably from an array or from
|
||
DATA read into a string. If your menu items are in DATA statements, you
|
||
don't need to DIMension an array to hold the strings. You can READ the data
|
||
into a throwaway variable like a$ and then
|
||
|
||
sys32768+42,a$,index,selected
|
||
|
||
in a FOR loop. If you will want to print the menu item somewhere outside
|
||
of the menu, you will probably want and need an array. In any case, string
|
||
DATA in arrays doesn't take up any memory except for pointers.
|
||
|
||
INDEX is just the item's place in the menu.
|
||
|
||
SELECTED is whether or not the item should be considered selected when the
|
||
menu pops up. You can use this even when not in multi-select mode to show
|
||
that some items are not available or to highlight items to show that some
|
||
pending action is needed.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
lda string'length
|
||
jsr 32768+129
|
||
parameters .asc "item name"
|
||
.word index
|
||
.byt selected
|
||
|
||
@(A): Menu COmmand: SYSaddr+42,x1,x2,y1,y2,r,c,h,s,o,l,m
|
||
|
||
This command will pop up a scrolling (if necessary) menu on your screen.
|
||
Your users will be able to CRSR up and down or page with the + and - keys.
|
||
You should print this somewhere on the screen so that your users will know.
|
||
Here's what the parameters mean:
|
||
|
||
X1 is the upper left hand corner of the requestor box.
|
||
|
||
X2 is the right extreme of the menu. Any menu item that exceeds the width
|
||
defined by X1 and X2 will be truncated.
|
||
|
||
Y1 is the top row of the menu, 0- 20.
|
||
|
||
Y2 is the bottom row in the menu. Y2 determines how much of your screen
|
||
will be taken up by the menu.
|
||
|
||
R stands for REVERSE mode. If you want all the items in the menu to be
|
||
printed in reverse, put a 1 here. Highlighted items will appear unreversed.
|
||
|
||
C is the color of the menu and all unhighlighted menu items.
|
||
|
||
H is the color of the highlighted (current) item.
|
||
|
||
S is the color of selected menu items.
|
||
|
||
O is the offset, in case you've sectioned off your menu items, generally
|
||
zero. If you want to pop into the menu at a particular point (say at the
|
||
last item selected which you've preserved), use offset to do so. The rest
|
||
of the menu is still accessible.
|
||
|
||
L is the limit or the highest menu item allowed. Note that this will
|
||
usually be one less than f% when you use the Rack Em Up command.
|
||
|
||
M is for MULTI MODE, which allows the user to be able to select more than
|
||
one item. Outside of a file requestor, there are few uses for this. Make
|
||
this a 0 for a normal single item and 1 for multi-item selection ability.
|
||
Items are selected with RETURN or SPACE. To exit a multi-select menu you
|
||
must press F1. Your program should inform the user of this if they are in
|
||
the multi item mode.
|
||
|
||
When RETURN is pressed in single mode, the item number is returned in F%.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
jsr 32768+141
|
||
parameters .byt x1,x2,y1,y2,,r,c,h,s
|
||
.word o,l
|
||
.byt m
|
||
|
||
|
||
@(A): Set Mode: SYS32768+48,n
|
||
|
||
Sometimes you may have a regular menu and a directory set up in memory.
|
||
You may want to set the proper mode for FIND AND CLEAR with this command
|
||
before using it. N is 0 for normal retrieval and 1 for file requestor
|
||
retrieval.
|
||
|
||
|
||
@(A): BLOADT Text File: SYS32768+15,file$,device,location
|
||
|
||
This command will BLOAD a standard EDSTAR text file into memory and place
|
||
a zero at the end of the file to mark the end. It can also be used as a
|
||
regular BLOAD.
|
||
|
||
FILE$ is the filename of the file you want to BLOAD.
|
||
|
||
DEVICE is any legal device number.
|
||
|
||
LOCATION is anywhere in RAM except the IO area $D000-$DFFF. Again, you
|
||
really should take advantage of areas outside of BASIC and beneath ROM.
|
||
|
||
You can indeed use packed text if you BLOAD it with DTEXT, published on
|
||
LOADSTAR #122 and the COMPLEAT PROGRAMMER.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
lda filename'length
|
||
jsr 32768+114
|
||
parameters .asc "filename"
|
||
.byt device
|
||
.word location
|
||
|
||
@(A): Rack 'em Up: SYS32768+36,location
|
||
|
||
This command simply itemizes every line in a text file that you've BLOADed
|
||
so that it can be used as a menu. Pointers for each line in the text file
|
||
will be located starting from the end of the file. So don't BLOAD a file
|
||
that ends too close to $FFFF or the beginning of important data.
|
||
|
||
F% tells you the number of lines it has itemized. Save this into another
|
||
variable because you will need the value to set a limit (bottom) to any
|
||
menu made with the BLOADed data.
|
||
|
||
The longest length of a line is stored in $14 (decimal 20). If you want
|
||
your resulting menu properly centered, check out this location immediately
|
||
after the call as this location is heavily trafficked by Menu Toolbox and
|
||
BASIC.
|
||
|
||
>From ML:
|
||
|
||
ldx <location
|
||
ldy >location
|
||
jsr 32768+135
|
||
|
||
@(A): Text File Reader
|
||
|
||
You would simply BLOAD a text file using the aformentioned command, and
|
||
then RACK IT UP. Next just define a regular menu wide enough to accommodate
|
||
the text anywhere on the screen. Don't forget to prompt your users to press
|
||
RETURN to exit the reader (which is really a big menu).
|
||
|
||
|
||
@(A): Report Location: SYS32768+54
|
||
|
||
If you don't want to rack up a text file again, you can find out and store
|
||
exactly where the menu pointers begin with this command. The location will
|
||
be reported in F%. Remember that F% is an integer variable, and has a max
|
||
of 32767. So if F% is negative, subtract it from 32768:
|
||
|
||
SYSAD+69:ad=f%:iff%<0thenad=32768- f %
|
||
|
||
>From ML:
|
||
|
||
jsr 32768+153
|
||
|
||
Location returned in .X and .Y
|
||
|
||
|
||
@(A): Get Word: SYS32768+51,color,cursor,limit,text$
|
||
|
||
Your program will probably need input from the user. Here you have the
|
||
best input routine I've ever done. It allows you to cursor through
|
||
already-typed text, and it allows you to predefine the text from a variable
|
||
or static string, allowing the user to just hit RETURN if they don't want
|
||
to change the text as it appears at the blinking cursor. The results of
|
||
editing (or non-editing) is returned in W$.
|
||
|
||
COLOR is the color of text that is typed by the user.
|
||
|
||
CURSOR is the color of the flashing cursor.
|
||
|
||
LIMIT is the maximum length of the input.
|
||
|
||
TEXT$ will usually be null. If not, the contents of the variable will be
|
||
printed at the current location of the cursor, respecting the COLOR
|
||
parameter. The length of TEXT$ overrides LIMIT only if it's longer than
|
||
LIMIT.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
jsr 32768+150
|
||
rts
|
||
parameters .byt color,cursor,limit
|
||
.byt length of default string
|
||
.asc "default string"
|
||
|
||
Returns location of edited string in .X and .Y. .A holds the length of
|
||
the string.
|
||
|
||
@(A): Start Memory Print: SYS32768+60,location,string$
|
||
|
||
@(A): Continue Memory Print: SYS32768+63,string$
|
||
|
||
Use START MEMORY print to start a list of text in memory. This command
|
||
allows you to print to memory in case you want to build a menu from
|
||
software instead of a table or file. You can print a list in memory, RACK
|
||
it up, and make a scrolling menu out of it. Works beneath ROMs, too. A
|
||
carriage return is appended to the string in memory.
|
||
|
||
Once you've started memory printing, just keep sending strings with
|
||
continue memory print. The updated address of the end of your menu is kept
|
||
in locations 251 and 252. USE NO OTHER COMMANDS while building your list
|
||
with memory print! You might corrupt 251 and 252.
|
||
|
||
The final item in your menu should end with a character string 0 so that
|
||
RACK IT UP knows where the end of your list is.
|
||
|
||
sys32768+63,final$+chr$(0).
|
||
|
||
START From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
lda string'length
|
||
ldx <start
|
||
ldy >start
|
||
jsr 32768+156
|
||
|
||
CONTINUE From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
lda string'length
|
||
jsr 32768+159
|
||
|
||
@(A): Scroll Up: SYS32768+18,x1,x2,y1,y1
|
||
|
||
This scrolls a section of the screen defined by the extremes above. Scroll
|
||
need not be used with menus. That's done automatically, but since the code
|
||
exists for the MENU command, I thought I'd give you direct access to it if
|
||
you want. The cursor is placed right where new screen text would appear
|
||
according to the parameters of the scroll.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
jsr 32768+117
|
||
rts
|
||
parameters .byt x1,x2,y1,y2
|
||
|
||
@(A): Scroll Down: SYS32768+21,x1,x2,y1,y1
|
||
|
||
This scrolls a section of the screen defined by the extremes above.
|
||
|
||
>From ML:
|
||
|
||
ldx <parameters
|
||
ldy >parameters
|
||
jsr 32768+120
|
||
rts
|
||
parameters .byt x1,x2,y1,y2
|
||
|
||
@(A): Clear Row: SYS32768+24,code,color
|
||
|
||
In case you have to blank a duplicated line in the scroll area, this
|
||
command will do it using the screen code and color you specify. Cursor
|
||
position isn't changed.
|
||
|
||
>From ML:
|
||
|
||
ldx code
|
||
ldy color
|
||
jsr 32768+123
|
||
|
||
@(A): Titles
|
||
|
||
In order to make use of the internal tiles, you MUST use a custom font in
|
||
your program. The use of fonts in programs is beyond the scope of this
|
||
article. FOr information on fonts, please see LOADSTAR's Compleat
|
||
Programmer or Font Finale on LOADSTAR #92.
|
||
|
||
Here is the command structure of the tile functions. Since I made three
|
||
versions of the program, I'll refer to only the $C000 version. Replace
|
||
32768 with the other addresses if you will be using other versions.
|
||
|
||
@(A): Lattice: SYS 32768,x1,x2,y1,y2,t1,t2,c1,c2
|
||
|
||
This command will create a colorful pattern on the screen. If T1 and T2
|
||
were 1 and 2, the grid would consist of As and Bs in the following fashion:
|
||
|
||
abababababababa
|
||
bababababababab
|
||
ababababbababab
|
||
|
||
These lattices can be any dimension, as thin as a column or row and as
|
||
large as the entire screen. They can be very colorful and eye-catching as
|
||
you will see in DIRECTOMEISTER on our pass-around issue, available from our
|
||
web page at http://www.loadstar.com/
|
||
|
||
X1 is the leftmost column of the lattice, 0-39.
|
||
|
||
X2 is the rightmost column of the screen, 0-39 > X1.
|
||
|
||
Y1 is the top row of the lattice, 0-24.
|
||
|
||
Y2 is the bottom of the lattice, 0-24 > Y1. Note that if Y2 is greater
|
||
than 24, the lattice can overwrite your BASIC program at $0801 (+2049).
|
||
|
||
T1 is the screen code of the tile in your lattice, 0-255. You can find the
|
||
screen code of any character by printing it at HOME and then issuing the
|
||
command:
|
||
|
||
print peek(1024)
|
||
|
||
T2 is the screen code of the other tile in your lattice. It can be the
|
||
same as T1 if you like. You can still get a lattice effect by using the
|
||
same tile with a lattice of color only.
|
||
|
||
C1 is the color of T1, 0-15.
|
||
|
||
C2 is the color value of T2 in your lattice. As with tile selection, C1
|
||
and C2 can have identical values with T1 and T2 having different values,
|
||
creating a lattice of tiles and not color. If T1, T2, C1 and C2 are all the
|
||
same, then what you have is a block. There's a simpler way to get a block.
|
||
|
||
>From ML:
|
||
|
||
ldx <params
|
||
ldy >params
|
||
jsr 32768+102
|
||
rts
|
||
params .byt x1,x2,y1,y1,t1,t2,c1,c2
|
||
|
||
@(A): Block: SYS 32768+3,x1,x2,y1,y2,code,color
|
||
|
||
This routine will draw a block of characters on the screen. It will also
|
||
paint an area of the screen without changing the characters if you use a
|
||
CODE of 255. It can erase portions of the screen if you use spaces, and it
|
||
can draw single lines or rows of characters if you like. It is a mainstay
|
||
of my programming. Can't do without it.
|
||
|
||
X1 is the leftmost column of the block, 0-39.
|
||
|
||
X2 is the rightmost column of the screen, 0-39 > X1.
|
||
|
||
Y1 is the top row of the block, 0-24.
|
||
|
||
Y2 is the bottom of the block, 0-24 > Y1. Note that if Y2 is greater than
|
||
24, the block can overwrite your BASIC program at $0801 (+2049).
|
||
|
||
CODE is the screen code of the tile in your block, 0-254. You can find the
|
||
screen code of any character by printing it at HOME and then issuing the
|
||
command:
|
||
|
||
print peek(1024)
|
||
|
||
When a CODE of 255 is issued, the BLOCK program will not alter the screen
|
||
at all, only the color. This allows you to change (PAINT) colors of
|
||
portions of the screen without having to re-print them. If you must use
|
||
character #255 on the screen, use LATTICE with both screen codes set to
|
||
255. With both codes and both colors set the same, LATTICE becomes BLOCK.
|
||
|
||
COLOR is the color of CODE, 0-15.
|
||
|
||
>From ML:
|
||
|
||
ldx <params
|
||
ldy >params
|
||
jsr 32768+105
|
||
rts
|
||
params .byt x1,x2,y1,y2,code,color
|
||
|
||
@(A): Outline Box: SYS 32768+6,x1,x2,y1,y2,color
|
||
|
||
This routine will pop up a box on the screen using the CMDR-A,S,Z,X,
|
||
SHIFT-ASTERISK and SHIFT-MINUS characters. The area inside the box will not
|
||
be affected.
|
||
|
||
X1 is the leftmost column of the box, 0-39.
|
||
X2 is the rightmost column of the screen, 0-39 > X1.
|
||
|
||
Y1 is the top row of the box, 0-24.
|
||
|
||
Y2 is the bottom of the box, 0-24 > Y1. Note that if Y2 is greater than
|
||
24, the box can overwrite your BASIC program at $0801 (+2049).
|
||
|
||
COLOR is the color of the box, 0-15.
|
||
|
||
>From ML:
|
||
|
||
ldx <params
|
||
ldy >params
|
||
jsr 32768+108
|
||
rts
|
||
params .byt x1,x2,y1,y2,color
|
||
|
||
@(A): Copy Tile: SYS32768+9,FONT LOCATION,TILE,CHAR
|
||
|
||
This is a magic command. Within the ML are 60 tiles, lifted from TILE
|
||
STYLIST. This command will copy any of those tiles to any character in your
|
||
font. All you have to do is tell the command where your font is.
|
||
|
||
FONT LOCATION is the location of your font in memory.
|
||
|
||
TILE is the built in tile 0-9, that you want to have copied into your
|
||
font.
|
||
|
||
CHAR is the screen code of the character you want replaced with the tile.
|
||
|
||
>From ML:
|
||
|
||
ldx <parms
|
||
ldy >parms
|
||
jsr 32768+111
|
||
rts
|
||
parms .word font'location
|
||
.byt tile,char
|
||
|
||
@(A): More Than Sixty Tiles?: SYS32768+12
|
||
|
||
If you use this command, you must be a tile fanatic. You can use values
|
||
greater than 99 for TILE if you BLOAD a tile font into the proper location.
|
||
This will only work with the $9000 and $0800 versions of TILE TOOLBOX. It
|
||
can work with the $C000 version, but under normal circumstances, you can't
|
||
BLOAD to the $D000 area, which is where the VIC chip and I/O are.
|
||
|
||
To get the proper BLOAD location, SYS32768+12. The address will be
|
||
returned in the .X and .Y registers. For BASIC users, the address will be
|
||
returned in locations 781 and 782.
|
||
|
||
ML users would simply insert the JSR before a LOAD:
|
||
|
||
jsr 32768+12
|
||
jsr LOAD
|
||
|
||
BASIC users would BLOAD their font into place this way:
|
||
|
||
20 sys57812"tiles",8,0:poke780,0: sys32768+12:sys65493
|
||
|
||
This would give you a total of 266 tiles in memory if your tile font is 9
|
||
blocks long, but you will only be able to access the first 256, including
|
||
the ten already in the ML.
|
||
|
||
@(A): Animation
|
||
|
||
You can use the COPY TILE command for animation by copying a series of
|
||
tiles into the same CHAR. This will be much faster than drawing new
|
||
characters or re-drawing an entire lattice or block. Of course if you're
|
||
changing just one character, you can poke one byte on the screen, but the
|
||
advantage of copying is that you have information [outside] of your font so
|
||
your font isn't crowded and barely usable for text.
|
||
|
||
@(A): Shade: SYS 32768+96,x1,x2,y1,y2
|
||
|
||
SHADE paints with intelligence. I have always used BLOCK to shade an area
|
||
with a uniform color just beneath and to the left of a box I'm about to
|
||
draw. This gives a nice 3-D effect. SHADE does one better. If there are
|
||
multiple colors in the area, each color is assigned a darker shade. So your
|
||
overlapping windows will have a consistent shading effect.
|
||
|
||
SHADE can have a flash-type cycling effect when used repeatedly on the
|
||
same section of a screen. Eventually it will only cycle between blacks and
|
||
all the shades of white.
|
||
|
||
>From ML:
|
||
|
||
ldx <parms
|
||
ldy >parms
|
||
jsr 32768+192
|
||
rts
|
||
parms .byt x1,x2,y1,y2
|
||
|
||
@(A): Screen Stash: SYS 32768+66,page
|
||
|
||
@(A): Screen Restore: SYS 32768+69,page
|
||
|
||
@(A): Screen Merge: SYS 32768+87,page
|
||
|
||
Without screen swapping, pop-up help screens and menus would be
|
||
cumbersome. These two routines will store a screen at any page (256 byte
|
||
section) in memory. To store the current screen at $d000 (53248), you
|
||
would:
|
||
|
||
SYS 32768+66,53248/256
|
||
|
||
To get the screen back:
|
||
|
||
SYS 32768+99,53248/256
|
||
|
||
$D000 is at page 208. Note that each screen takes up 8 pages, and should
|
||
be kept 8 pages apart.
|
||
|
||
Note that screen stash stores the current border and background colors, as
|
||
well as cursor position per imperial order of Maurice Jones. Screen restore
|
||
will bring back the border and background colors of the stored screen.
|
||
|
||
SCREEN MERGE will restore a screen "under" an existing screen, meaning
|
||
that every place where there's a SPACE can be written to by the screen
|
||
being merged. Background and border colors aren't changed by MERGE.
|
||
|
||
In case you're confused about what screen merge does, MERGE would be a
|
||
simple screen restore on a blank screen. On a screen with something,
|
||
anything that's not a SPACE or SHIFT SPACE, MERGE allows restored screen to
|
||
bleed through without wiping out the current screen.
|
||
|
||
You can use MERGE in games like Concentration, where you only want to
|
||
reveal part of the screen at a time.
|
||
|
||
STASH From ML:
|
||
|
||
lda page
|
||
jsr32768+165
|
||
|
||
RESTORE From ML:
|
||
|
||
lda page
|
||
jsr32768+168
|
||
|
||
MERGE From ML:
|
||
|
||
lda page
|
||
jsr32768+183
|
||
|
||
@(A): Link: SYS 32768+72
|
||
|
||
Though all TOOLBOX routines that affect the screen use LINX and keep line
|
||
links clear, you can call LINX directly with a SYS 32768+72. Same from ML.
|
||
|
||
@(A): Print At: SYS32768+75,x,y,string$
|
||
|
||
This will print text anywhere on the screen. X and Y are your screen
|
||
parameters. STRING can be a literal or a string variable.
|
||
|
||
>From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
ldx row
|
||
ldy column
|
||
jsr 32768+171
|
||
|
||
>From ML the string must terminate in a zero.
|
||
|
||
@(A): Center: SYS 32768+78,row,string$
|
||
|
||
Centers a string (fewer than 41 bytes) on a specified line.
|
||
|
||
>From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
ldx row
|
||
jsr 32768+174
|
||
|
||
String must terminate in zero.
|
||
|
||
@(A): UPcase: SYS 32768+81,variable$
|
||
|
||
Converts all characters in a string to upper case. "We, The People"
|
||
becomes "WE, THE PEOPLE"
|
||
|
||
Note UPCASE will not print the string for you.
|
||
|
||
>From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
jsr 32768+177
|
||
|
||
String must terminate in zero.
|
||
|
||
@(A): LCase: SYS 32768+84,variable$
|
||
|
||
Converts all characters in a string to lowercase. "We, The People" becomes
|
||
"we, the people". Great for use before a test of input like Y and y or N
|
||
and n to consistently lowercase input.
|
||
|
||
>From ML:
|
||
|
||
lda <string'loc
|
||
sta $22
|
||
lda >string'loc
|
||
sta $23
|
||
jsr 32768+180
|
||
|
||
String must terminate in zero.
|
||
|
||
@(A): CHARACTER SWAP: SYS32768+90,a,b,c
|
||
|
||
CHAR SWAP will search the screen for parameter A and change it to
|
||
parameter B with the color, C. Here A and B are screen codes as revealed in
|
||
LOADSTAR LETTER #34 or page 376 of your Programmer's Reference Guide. But
|
||
the quickest way to find out a screen code is to print the character in the
|
||
HOME position and then:
|
||
|
||
print peek(1024)
|
||
|
||
or if your screen is moved:
|
||
|
||
print peek(peek(648)*256)
|
||
|
||
In a flash, you can change every instance of a character to another
|
||
character, or you can leave the character the same and just change its
|
||
color. This is good for font animation where absolute speed isn't a factor.
|
||
|
||
Note: if you want to change characters, but not their colors, send a color
|
||
code of 128.
|
||
|
||
>From ML:
|
||
|
||
ldx <parms
|
||
ldy >parms
|
||
jsr 32768+186
|
||
parms .byt a,b,c
|
||
|
||
@(A): COLOR SWAP:SYS32768+93,c1,c2
|
||
|
||
This changes every instance of a target color on the screen to another
|
||
color.
|
||
|
||
>From ML:
|
||
|
||
ldx <parms
|
||
ldy >parms
|
||
jsr 32768+189
|
||
parms .byt a,b,c
|
||
|
||
@(A): BRANCHER:SYS32768+99,"string"
|
||
|
||
BRANCHER adds very quick flow control to BASIC programs. Send this routine
|
||
a string and it will wait until a key, included in that string, is pressed.
|
||
The string can be up to 207 bytes long. Imagine the BASIC code necessary to
|
||
check 207 hot keys! This call will handle it in one command -- and much,
|
||
MUCH faster.
|
||
|
||
When a valid key is pressed, BRANCHER will inform you which key was
|
||
pressed by passing its instring position to the F% variable
|
||
|
||
1000 SYS 32768+99,"mdvc":on f% goto100,200,300,400
|
||
|
||
Here's the BASIC equivalent:
|
||
|
||
1000 geta$:if a$<>"m"anda$<>"d" anda$<>"v"anda$ <>"c"then1000
|
||
1010 ifa$="m"then100
|
||
1020 ifa$="d"then200
|
||
1030 ifa$="v"then300
|
||
1040 ifa$="c"then400
|
||
|
||
Not only is this code more bulky, but imagine how clunky it would be if
|
||
you had 25 active keys.
|
||
|
||
>From ML:
|
||
|
||
ldx <string'loc
|
||
ldy >string'loc
|
||
stx $22
|
||
sty $23
|
||
jsr 32768+195
|
||
|
||
String must terminate in a zero.
|
||
|
||
@(A): License Agreement
|
||
|
||
As with all LOADSTAR tools, we encourage you to use them in your
|
||
programming endeavors. You can do so without a licensing fee as long as you
|
||
mention somewhere briefly in the docs that you got the routines from
|
||
LOADSTAR. If you'd prefer not to mention us, write for permission.
|
||
LOADSTAR's tools may be used in commercial products, and programs published
|
||
in other magazines under the same provisions.
|
||
|
||
========================================================================
|
||
|
||
@(#)fido: FIDO's Nuggets
|
||
by Geoff Sullivan (sunfish@gis.net)
|
||
|
||
Summer slows things down everywhere, except perhaps in Zone 3, and the
|
||
Commodore FIDO Echos are no different. I like to think we Commodore users
|
||
have other interests beside our computers, and that we pursue them at this
|
||
time of year. Message flow was slow, and at times sporadic. There was some
|
||
discussion of a hitch in the system, and even now, I've been over a week
|
||
without one new message arriving at my node. There is also concern that
|
||
the Internet has absorbed some of the Echo traffic too. More of us have
|
||
access to it, and there is no doubt that it's faster.
|
||
|
||
@(A): Warning: Killer App. Movie at 11.
|
||
|
||
The C128 killer application with a life of it's own, QWKRR, by Rod Gasson,
|
||
is in version 5.0b at this writing. There are known bugs in it and Rod has
|
||
posted the symptoms and cautions frequently on the Echos. Users are able to
|
||
respond and help Rod work out the bugs from his Australian lab, while most
|
||
of us in the Northern Hemisphere are enjoying a warm summer!
|
||
|
||
@(A): The Canon Is of Little Use, Sir.
|
||
|
||
Traffic has been light in the Geos Echo, but a major topic has been the use
|
||
of Canon InkJet printers with Geos. Manufacturers are now catering more and
|
||
more to Microsoft's Plug-n-Play concept, while we plug-n-pray. Only the
|
||
older InkJet printers, such as the BJ-200 and 600 series, have actual DIP
|
||
switches for manual configuration. Until software is available for us to
|
||
configure the newer printers, their use will be limited.
|
||
|
||
@(A): Catch What WAVE?
|
||
|
||
Discussion of Maurice Randall's Wave for Geos 128 has been centered around
|
||
speculation as to what it will end up being. Will it be a SLIP/PPP
|
||
connection to the Web, or a high speed terminal program? Only Maurice knows
|
||
for sure, and lately he's been busy tweaking software for CMD's Super CPU,
|
||
the C64 version of which has begun shipping.
|
||
|
||
@(A): Speed Thrills....
|
||
|
||
Speaking of the Super CPU, the few users that have them by now are raving.
|
||
I expect the message base to have more information as more SCPU's are put
|
||
into service. We have all read the hype before, but actual user experiences
|
||
posted on the Echos are confirming the awesome speed of this accelerator
|
||
cartridge.
|
||
|
||
@(A): Ingenious Commodore Usage
|
||
|
||
Finally, an often asked question is, "What do you DO with a Commodore
|
||
computer?". There is much to do, and recently a thread addressing that
|
||
subject was begun. John Davis' story of how he and his VIC-20 increased his
|
||
Union participation by using a mail-merge program to personalize meeting
|
||
announcements brought a smile. He also has used his SX-64 to do sing-alongs
|
||
for kids at a local campground. SID is his only instrument!
|
||
|
||
So, that's a glimpse into the world of FIDO, the wonder dog of networks,
|
||
for this time.
|
||
|
||
Here, boy....
|
||
|
||
=========================================================================
|
||
|
||
@(#)review: The Hacking Review
|
||
by Tom Warnes
|
||
|
||
@(A): The Compleat Crossword, published by J and F Publishing.
|
||
|
||
This is a collection of crossword games which are made a little simpler
|
||
because the computer is watching to make sure you don't cheat. To start,
|
||
simply load the disk just like any LOADSTAR offering: LOAD"!",8,1
|
||
(substitute 8 with whatever device you are accessing). You'll find
|
||
most of the actions and key mappings identical to those found on the
|
||
LOADSTAR menu program.
|
||
|
||
The start up screen gives you the option of finding out about the
|
||
people are who created the puzzles in "All About This Disk". The other
|
||
choices are "Change Title", "Change Music" and "Exit to Basic". The
|
||
Change Title only allows you to change the background screen. The
|
||
Change Music becomes a heaven sent option after you've been playing this
|
||
game for a few hours, or even minutes. You may find yourself really
|
||
hating the background music; therefore, I'll give a few tips on turning
|
||
the music off completely. The music doesn't come on until you've loaded a
|
||
puzzle into your computer off of the disk. To turn the music off
|
||
completely hold down the CNTR key while pressing the S key or press the
|
||
CLR/HOME key. The CLR/HOME key acts as a toggle as does the CNTR-S
|
||
combination.
|
||
|
||
There were a few minor bugs on the disk that I found annoying. In the
|
||
option "All About This Disk" only a summary of the creators of the puzzles
|
||
is given. They don't attempt to explain the different functions or how to
|
||
access them. My suggestion would be to add an extra subgroup called
|
||
something like "Credit to the Creators" to put their names in, and in the
|
||
"All About This Disk" put a more complete description of the choices
|
||
available to the user. The "Change Title" had me stumped for a short while
|
||
until I discovered it only changes the texture of the background screen,
|
||
not the color to help someone who has been staring at the screen trying to
|
||
solve these puzzles.
|
||
|
||
The puzzles themselves are interesting even if sometimes they don't stick
|
||
to the theme of the puzzle. There is a small hiccup in the music presenter,
|
||
as it had a small problem playing the last song on the list available to
|
||
the user. It acted like a cassette player playing a cassette that has the
|
||
tape wound to tight on the spools.
|
||
|
||
Except for these minor problems it was interesting having the computer
|
||
keeping me honest. One big thing that has bothered me for years is the
|
||
fact no one has found a way to reward the player for successfully
|
||
completing a game on the computer. I've seen a simple message flashed on
|
||
the screen or even a colorful display. This is not for everyone. A
|
||
possible reward would be to have a timed series of puzzles so the player
|
||
could compete against time. A feature I liked was the fact that you could
|
||
mark a puzzle as having been completed, or if you're like me, one that
|
||
you've worked on and still have to complete. You are given this option
|
||
each time you go from a puzzle to the start-up screen. Most of these
|
||
puzzles seem to have come from the mind of Barbara Schulak, a name you
|
||
will recognize from the Loadstar 128 collection.
|
||
|
||
@(A): The Compleat Lee O., distributed by J and F Publishing.
|
||
|
||
Speaking of the Loadstar 128 collection the next group of programs
|
||
came from those disks. It is called the complete Lee O. This is a
|
||
collection of programs submitted to Loadstar to be put out on their 128
|
||
Loadstar disks. The programmer, Leo O. Clinton, tried to help fill the
|
||
barren field of 80 column programming. They are all utility programs.
|
||
Their titles are "Mutual Funds", "Resumes", "Genealogy", "Auto Expense
|
||
Tracking", "Kitchen Upkeep" (Recipes), and "Home Finances". All of these
|
||
programs come on one disk and it is highly recommended that you copy
|
||
each onto a dedicated disk. To explain the working of the programs,
|
||
I sometimes borrowed heavily from the text that Leo O. Clinton typed in
|
||
to explain the workings of his programs.
|
||
|
||
@(A)subapp: Mutual Funds
|
||
|
||
Works with drive 8 only. Keeps 253 transactions in each of 16 Mutual
|
||
Fund Accounts. Computes profit/loss, investment and total returns and
|
||
investment and fund performers. Output can be to screen, disk or printer
|
||
if you have included all the recommended files on your disk. Escape will
|
||
take you one level back from the level you<6F>re working on. You can add
|
||
accounts, delete accounts, modify accounts, or add transactions. This
|
||
program works on the trade date of your accounts and must be entered in
|
||
the request for date.
|
||
|
||
@(A)subapp: Resume Writer
|
||
|
||
This program is important in today's shifting job market. It works with
|
||
a wide range of disk drives. It can create a resume after you type in
|
||
the answers to a range of questions. It creates a resume to your personal
|
||
preference. The chronological option lists last job first, or you can go
|
||
with most important job first and on down to the least important. All
|
||
information can be saved to disk and then recalled and printed when you
|
||
need it.
|
||
|
||
@(A)subapp: Pedigree 128
|
||
|
||
Keeps track of 5 generations of your family. Gives you the option of
|
||
creating a full page of information for each member. If you get stuck
|
||
and don't know how to answer a question, the help screens will steer you
|
||
in the right direction. After the title screen is displayed a chart will
|
||
show you the relationship of the people you are entering. Drives 8 through
|
||
11 are supported. This is really a fine program for someone interested
|
||
in his or her family relations.
|
||
|
||
@(A)subapp: Auto Expense
|
||
|
||
If you're one of the people you see at the gas pumps jotting down
|
||
mileage, cost and quantity of gas in a little book, this program is for
|
||
you. This program keeps a record of 18 cars with the possibility of 252
|
||
entries for each car per disk. The program is menu driven. After you enter
|
||
data you can use what you have entered to create graphs or print a
|
||
record for the car you pick. The graphs will show you Actual mileage,
|
||
Cumulative mileage, or a Cents per mile Pie Chart.
|
||
|
||
@(A)subapp: Cook's Helper
|
||
|
||
This program is a electronic recipe box with a lot of extra features
|
||
thrown in. It allows you to make up a weekly menu and will help make
|
||
up a shopping list so you can get all the ingredients you will need.
|
||
There is a conversion calculator to help you go from metric to American
|
||
Standard, and also an option to convert to different quantities.
|
||
Entering the recipes into this program is a little different, as you must
|
||
use various buttons to access certain menus. For example, you press the
|
||
F1 key whenever you want to print quantities. A list will appear and you
|
||
use the cursor keys to select the proper quantity. I have used this
|
||
program since it first came out on Loadstar 128 and it saves on the
|
||
number of piles of paper I have laying around.
|
||
|
||
@(A)subapp: Fiduciary
|
||
|
||
The closest program that I can relate to this program is Sylvia Porter's
|
||
Personal Finance 128 series put out by Timeworks. Sylvia Porter's has a
|
||
few more small functions this program doesn't have. This program allows
|
||
you to know what your transactions have been, balance your checkbook,
|
||
create a budget and show you how close you are to staying within that
|
||
budget. It shows you what Assets/Liabilities you have, and allows you to
|
||
see in a chart where your money is going. A 30+ page manual that explains
|
||
what functions this program is capable of is available for you to print out.
|
||
|
||
=========================================================================
|
||
|
||
@(#)hw: The CMD Nirvana: The Guts and Glory
|
||
by Todd Elliott (telliott@ubmail.ubalt.edu)
|
||
http://ubmail.ubalt.edu/~telliott/commodore.html
|
||
|
||
@(A): Introduction
|
||
|
||
Before you begin, download the CMD Nirvana picture off of my WWW site!
|
||
Take a good look at the picture, and if it doesn't whet your appetite,
|
||
this article will! This is the computer that I use at home for my various
|
||
programming projects and good old fashioned entertainment. It consists of
|
||
a C128DCR with three built-in foreign components: a 12 VDC fan, CMD HD 85
|
||
megabyte drive and a FD 4000 3.5 disk drive. The case is painted obsidian
|
||
black. It does have a 4MB RAMLink hooked up with a 1750 REU and a
|
||
Swiftlink or Action Replay cartridge. Other peripherals circling the CMD
|
||
Nirvana's universe are an 1541, 1571, a SlikStik, MW350 printer interface,
|
||
in addition to a host of books and magazines dedicated solely to the
|
||
c64/128 line. (Soon, it will have a SuperCPU 20!) It is a very powerful
|
||
computer, but it doesn't cure my malady of starting programming projects,
|
||
but only to leave them unfinished to do the next one. All of this power
|
||
is corrupting, indeed!
|
||
|
||
@(A): Disclaimer:
|
||
|
||
This article, while resembling a how-to-do-it-yourself article, is only
|
||
meant for entertainment and informational purposes and is to be used at
|
||
the reader's own risk. Mr Elliott, Commodore Hacking, nor Brain
|
||
Innovations, Inc. can be held responsible for any damages and/or injuries
|
||
occurring as a result of following this information contained in this
|
||
document. Electronic circuitry is fragile and can be damaged easily.
|
||
Users must use ground strips or some other means of protecting their
|
||
circuitry from accidental discharges of static electricity. Also,
|
||
soldering equipment, electronic outlets, etc. pose a significant danger
|
||
to self, and extreme care should be used in operating these items or
|
||
working on electronic circuitry. Be sure to unplug the electronic
|
||
circuitry before commencing work. I also disclaim any and all warranties,
|
||
both express or implied.
|
||
|
||
Tremendous thanks goes to Al Anger, who, with his substantial assistance,
|
||
made this CMD Nirvana computer a reality. Thanks, Al Anger! For those who
|
||
don't know him, take a peek at Commodore World's Issue Ten cover, and
|
||
you'll see his C128T (Tower) computer, plus a host of other hardware
|
||
projects. But, Mr. Anger did not write this article and is not
|
||
responsible for its contents, in which the disclaimer above still
|
||
applies. You can reach Al Anger at coyote@bridge.net. Thanks also go to
|
||
Max Cottrell, who did the scans of the photographs, courtesy of MC
|
||
Photography, mcphoto@izzy.net. The standard disclaimer also applies to
|
||
Max Cottrell and MC Photography.
|
||
|
||
@(A): A Verbal Tour
|
||
|
||
Let's begin with a visual inspection of the front panel: The plastic
|
||
panel contains a sticker overlay for the CMD HD, which is located on the
|
||
left side of the panel. The HD sticker overlay is located next to the
|
||
C128D's POWER-ON LED on its right. The FD 4000 occupies the right side of
|
||
the plastic panel. The right side of the plastic front panel is used to
|
||
house a receptacle for the C128D's built-in 1571 disk drive, with a
|
||
swinging gate. But, the built-in 1571 drive was removed, and the left
|
||
side panel was cut and filed smoothly with the correct dimensions to fit
|
||
a FD 4000 disk drive snugly. (Well,almost.)
|
||
|
||
Continuing with the visual inspection, we turn to the left side of the
|
||
C128D. The metal casing was cut to allow for the fan, power cord and
|
||
off/on switch to be accessible. If you note the picture carefully, the
|
||
cuts on the case aren't in perfect sync with the interior. I guess the
|
||
design won't be winning any art awards anytime soon. ;) The main thing is
|
||
that I can access the off/on switch, and be able to plug/unplug the power
|
||
cord without any difficulty. As for the fan opening, a circular opening
|
||
as shown in the picture is not needed. In fact, a wave of lines cut on
|
||
the case would be sufficient to allow air circulation. Going to the back
|
||
end of the C128D, you will see wires snaking out of the receptacle in
|
||
which the power cord formerly went through.
|
||
|
||
@(A): Opening the Hood
|
||
|
||
Let's dispense with the visual inspection and actually open the 'hood' of
|
||
the CMD Nirvana computer! Yes, I know it's not a pretty sight and may
|
||
look daunting to you, but it can be done! From the top view, it looks
|
||
like the power supply for the C128D has been moved from its original
|
||
position 90 degrees counterclockwise. The CMD HD motherboard now occupies
|
||
the lower left corner of the C128D case. The FD 4000 juts across the
|
||
lower right corner of the C128D front panel and the C128D case. As you
|
||
can see, the internal 1571 disk drive has been ripped out. Wires are
|
||
everywhere, but most of them settle down in the blank area in the upper
|
||
right corner of the C128D case.
|
||
|
||
@(A): Digging In
|
||
|
||
Ah, where will we start? Let's take a closer look at the plastic front
|
||
panel of the C128D. The CMD HD front panel was inserted and attached to
|
||
the plastic front panel of the C128D, and is not attached to the metal
|
||
case of the C128D. The marriage of the CMD HD front panel and the C128D's
|
||
plastic front panel was accomplished by four screws and three pieces of
|
||
plastic. First, I used masking tape to cover the CMD HD's metal case on
|
||
the front side. This front side already has holes drilled on it by CMD or
|
||
some OEM manufacturer. I used an X-Acto<74> knife to cut holes in the
|
||
masking tape, popping through the holes in the metal case. When finished
|
||
with the poking of the holes in the masking tape, I have a 'drill image',
|
||
so I peel off the tape from the CMD HD's metal case, and affix it to the
|
||
C128D's plastic front panel on the left side. Making sure that
|
||
everything's aligned, I proceeded to drill holes, following the 'drill
|
||
image', in the plastic front panel. After peeling off the masking tape,
|
||
and then doing a test fit with the CMD HD's front panel with its
|
||
protruding LEDs, and swap buttons, it was a perfect fit! I then made the
|
||
connection more solid with four screws and pieces of plastic, by
|
||
attaching the CMD HD's front panel to the left side of the C128D's
|
||
plastic front panel. Then, I superimposed the sticker overlay for the CMD
|
||
HD perfectly with the LED's and the push-buttons, and used spray-on glue
|
||
to make the overlay a permanent part of the C128D's plastic front panel.
|
||
|
||
@(A): Preparing the FD-4000
|
||
|
||
As for the FD 4000, I used a saw to cut off portions of the plastic front
|
||
panel of the C128D where the internal 1571 disk enclosure used to be, cut
|
||
in correct dimensions to fit the FD 4000. It was still rough, so I used a
|
||
file to smooth the edges, on a gradual basis, until the FD 4000 made a
|
||
snug fit. I measured the front cavity of the FD 4000 and used those same
|
||
measurements to make the cut on the C128D's plastic front panel on the
|
||
right side. As you can see from the picture, there is little room for
|
||
error, especially at the top of the plastic front panel. Generally, the
|
||
cut was made as far as to the right side of the C128D's plastic front
|
||
panel as possible.
|
||
|
||
@(A): Preparing for the CMD Hard Drive
|
||
|
||
Now, to the internals of the C128D. I had to move the power supply
|
||
counterclockwise 90 degrees to make room for the CMD HD. I quickly ran
|
||
into a snag, as the power connector between the PCB and the power supply
|
||
was too short. I had to cut off all the wires on the power connector,
|
||
then enlarged it by soldering all wiring to a cannibalized wiring from a
|
||
power supply wire to both ends of the power connectors. For further
|
||
clarification, a close-up of both ends is supplied. The cannibalized
|
||
power wiring was very convenient, as they were color marked, and it was
|
||
easy for me to make sure that the wiring corresponded with each end of
|
||
the power supply connectors. Next, I spliced the +-12 VDC wires on the
|
||
power supply connector to supply continuous power to the fan. Usually a
|
||
fan comes with black and red wires. Splice the black wire of the fan to
|
||
the black wire of the power supply. Splice the red wire of the fan to the
|
||
yellow wire of the power supply. Next, the fan was attached to the power
|
||
supply with screws, to the right of the power cord connector.
|
||
|
||
The structural improvements to the PCB was made by bending the PCB power
|
||
connector end at a 45 degree angle, for it would collide with the
|
||
position of the CMD HD's PCB. Last, I connected one end of the entire
|
||
power supply to the back edge of the C128D's metal case. This was
|
||
accomplished by bending the end of the power supply at a 90 degree angle
|
||
and screwing it together to the metal case of the C128D. However, one end
|
||
of the power supply remained unsupported and would tip over onto the PCB,
|
||
causing possible malfunctions for the C128D. So, a makeshift support was
|
||
propped upon the C128D's PCB to support the remaining end of the power
|
||
supply. This support, like all other supports used, were fitted with
|
||
black electrical tape at the bottom to prevent shorts on the PCB. The
|
||
massive heat sink covering the VIC - II chip and the 80 column display
|
||
chip supported the other end of the power supply.
|
||
|
||
@(A): Installing the HD
|
||
|
||
With the power supply situated 90 degrees counterclockwise, we now have
|
||
room to insert the PCB for the CMD HD 85 megger. I took the CMD HD's PCB
|
||
out of its original metallic case that CMD supplied. (NOTE: If you do
|
||
that, you may void CMD's warranty on the unit.) But the CMD HD's PCB
|
||
could not just sit atop the C128D's motherboard, for there may be
|
||
accidental electrical shorts or other problems. So, the CMD HD's PCB just
|
||
hovered above the C128D's motherboard by approximately 1/4 of an inch.
|
||
This was accomplished by erecting two support beams above the C128D's
|
||
motherboard. The beams were obtained at a hardware store. They are
|
||
aluminum and are easily malleable with pliers. I screwed down one end of
|
||
the beam to the middle edge of the motherboard, leaving the other end of
|
||
the beam covered with electrical tape. I could have screwed down the
|
||
other end, but might have cut the motherboard in a way that Commodore
|
||
never intended and screwed up the whole thing. All supports listed in
|
||
this article are screwed down on existing 'drilled holes' in the c128d's
|
||
PCB. Please note that the support beam is nearly aligned with the
|
||
motherboard's power connector. I put electrical tape on top of the
|
||
support beam, as this top will support the CMD HD's PCB. This is to
|
||
ensure a smooth operation of the unit without any electrical shorts or
|
||
other problems. Also, look at the rear view of the support beam in the
|
||
picture, for it can give you a clear idea of how tall it is in relation
|
||
to the C128D's motherboard.
|
||
|
||
As for the other support beam, it is screwed down on both ends to the
|
||
C128D's motherboard on the far left side. This support beam is taller
|
||
than the one explained earlier. The reason is that the CMD HD's PCB will
|
||
be screwed on that support beam, so this support beam would have to be
|
||
aligned parallel to the top of the first support beam. Then the second
|
||
support beam is covered with electrical tape and two holes are drilled at
|
||
both ends, which align perfectly with the CMD's HD PCB's drilled holes.
|
||
(See photo for further clarification.)
|
||
|
||
Finally, to attach the CMD HD's PCB to the two support beams, I made sure
|
||
that both beams were in alignment and supported the PCB in a level
|
||
fashion, almost parallel to the C128D's motherboard. I attached one end
|
||
of the CMD HD's PCB, which has no cable connectors, to the second support
|
||
beam on the far left of the C128D's motherboard. Two screws were used to
|
||
make a secure connection to the support beam. The other end of the CMD
|
||
HD's PCB, the one with all the cable connectors, rested on the first
|
||
support beam, but was not screwed down. It could be done, but as the PCB
|
||
was already secured, I didn't bother. The cables running out of the CMD
|
||
HD's PCB are in a tight space, due to the FD 4000. As you may note from
|
||
the picture, there is no room for the internal 1571. If you decide to do
|
||
an internal CMD HD operation on your C128D, you must sacrifice your
|
||
internal 1571 drive.
|
||
|
||
@(A): Installing the FD
|
||
|
||
With the CMD HD PCB out of the way, I began work on the FD 4000. Before
|
||
the FD 4000 was inserted, I cut off pin one of the C128D's chip U113.
|
||
This pin gives a signal that the internal 1571 drive is in existence.
|
||
With that pin cut, the C128D no longer recognizes the existence of the
|
||
internal 1571 drive. It will, however, recognize any peripherals using
|
||
the serial bus, as I use a external 1571 as Drive #8 in my system. I took
|
||
the FD 4000 mechanism and the motherboard (it's built as a single unit)
|
||
out of its original case that CMD supplied. (NOTE: Doing so may void
|
||
CMD's warranty on the FD x000 unit.) I used trial and error to position
|
||
the FD 4000 drive in the C128D's metal casing. This is to ensure that the
|
||
FD 4000 would not protrude too far out of the C128D's plastic front
|
||
panel, or intrude too far inside the C128D's plastic front panel. As you
|
||
can see from the following picture, the FD 4000 unit protrudes from the
|
||
C128D's metal case by approximately 1 1/2 inches.
|
||
|
||
Lastly, I attached a support beam to the bottom right in front of the
|
||
C128D's metal case. This involved some cutting on the edge of the bottom
|
||
of the C128D's metal case in order to make the FD 4000 fit the C128D's
|
||
metal case. The bottom edge of the C128D's metal case was not cut out
|
||
completely, rather, it was bent inwards with pliers, creating a small
|
||
surface for the FD 4000 to rest upon. Again, trial and error was used to
|
||
determine how much to cut and bend the bottom edge, so that the FD 4000
|
||
unit would fit the C128D's metal case and the plastic front panel.
|
||
Finally, the FD 4000 unit was screwed upon the support beam. This FD 4000
|
||
also rests upon the bent in bottom edge. This creates a stable surface
|
||
for the FD 4000 unit to operate without having to insert a second support
|
||
beam onto the C128D's motherboard to support the other edge of the FD
|
||
4000 unit.
|
||
|
||
Finally, I connected the cables to the CMD HD's PCB and the FD 4000, and
|
||
attached the ribbon cables to the CMD HD's PCB, including that of the
|
||
hard disk drive and the front panel controls. I extended the length of
|
||
the power-on LED wire for the C128D's power supply. This extension was
|
||
made by adding more wire and resoldering the connections. This was
|
||
necessitated because the 90 degree turn of the power supply made all the
|
||
wiring too short. :( Ah, the wisdom of CBM to cut costs by making
|
||
everything short and sweet! I made sure that the CMD HD and the FD 4000's
|
||
on/off switches were already in the ON position. Last, I bought Velcro<72>
|
||
from an art supply store, and liberally applied it to the CMD HD 85 MB
|
||
drive mechanism. The opposite end of the Velcro<72> attachment was pasted on
|
||
the inside of the top metallic case of the C128D. This was positioned
|
||
roughly 3 inches from the front edge of the top metallic case. Trial and
|
||
error was used here to determine the optimum measurements. The CMD HD 85
|
||
mechanism was then attached to the inside of the top metallic case of the
|
||
C128D unit by Velcro<72>. This is a safe method, for the CMD HD has been
|
||
running for almost a year without any glitches. Close the case carefully
|
||
(The HD is on the case, after all!), and attach all the power to a power
|
||
control center with individual switches. The individual switches then can
|
||
be used to control a specific peripheral such as the internal FD 4000 or
|
||
the CMD HD 85, without having to open the unit to access the off/on
|
||
switches, or drilling holes in the case of the C128D to attach these same
|
||
switches. Convenient, isn<73>t it?
|
||
|
||
@(A): Lessons Learned
|
||
|
||
Before concluding the article, it seems possible that one could put a
|
||
1581 drive in lieu of the FD x000 drives. It's possible, but I do not own
|
||
a 1581, so I really cannot comment. I would guess that the general
|
||
guidelines for the FD x000 drives would apply to the 1581. Granted, all
|
||
of this looks quick and dirty. But when I first started out with this
|
||
project with Al Anger, we didn't have step-by-step manuals, or other
|
||
references. It was truly a new territory for me. (Al has already done
|
||
such hacks for his C= computers before me, and his experience was
|
||
invaluable.) However, there were some bloopers. One, the c128d died upon
|
||
powering up. It turned out that the fan +- 12 VDC wiring was connected to
|
||
the wrong wire, and shut down the system. With that fixed, the c128d
|
||
powered up okay, but now, the CMD HD died. If that wasn't frustrating
|
||
enough, it was difficult to find out what went wrong, and I was wondering
|
||
if the FD 4000 would be next. The culprit was a break on the CMD HD PCB.
|
||
I accidentally drilled a cut on the PCB. With some soldering, I fixed it
|
||
by building a bridge between the break in the CMD HD PCB. Whew!
|
||
Everything now worked, and has worked since. Consider those bloopers
|
||
invaluable lessons learned in dealing with sensitive electronic
|
||
circuitry.
|
||
|
||
@(A): Conclusion
|
||
|
||
These are just general guidelines and are meant for entertainment
|
||
purposes only. It serves as an inspiration to those who always dreamed of
|
||
building their own C= beasts. I'm sure that there are countless users
|
||
that have customized their computers, and with these general guidelines,
|
||
undoubtedly, some users will want to create such a monster with rich C= 8
|
||
bit computing power!
|
||
|
||
@(A): Postscript
|
||
|
||
For those Commodore users who do not have access to graphical browsers,
|
||
you can contact the author for a Word v7.0 document printout with
|
||
pictures. The cost is $3 dollars for people living in the U.S. Canadian
|
||
readers will have to pay slightly more in U.S. dollars.
|
||
|
||
=========================================================================
|
||
|
||
@(#)surf: Hack Surfing
|
||
|
||
For those who can access that great expanse of area called the World
|
||
Wide Web, here are some new places to visit that are of interest to the
|
||
Commodore community. In early 1994, when the US Commodore WWW Site
|
||
started, the number of sites online that catered to Commodore numbered
|
||
in the 10's. Now, the number is in the 100's. What a change.
|
||
|
||
If you know of a site that is not listed here, please feel free to send
|
||
it to the magazine. The following links have been gleaned from those
|
||
recently changed or added to _CaBooM! - Your One Stop Commodore Links Site_.
|
||
(http://www.msen.com/~brain/cbmlinks/).
|
||
|
||
To encourage these sites to strive to continually enhance their
|
||
creations, and because we like to gripe :-), we'll point out
|
||
improvements that could be made at each site.
|
||
|
||
@(A): Companies
|
||
|
||
o Centsible Software
|
||
URL: http://home.sprynet.com/sprynet/cents/
|
||
Centsible Software has been a common name in Used Software Distribution
|
||
for a while now. their WWW Site contains catalogs for the different
|
||
platforms they support. C=Hacking gripe: Although the site is
|
||
very informative and works well for either text or graphical
|
||
browsers, it is rather plain. A bit of text here and some judicious
|
||
use of HTML 1.0 tags would spice it up immensely. Text Browser
|
||
compatibility shouldn't force WWW sites to be dull.
|
||
|
||
o Arkanix Labs, Inc.
|
||
URL: http://www.arkanixlabs.com/
|
||
Arkanix Labs recently purchased Threshold Productions International in
|
||
order to expand their presence in the Commodore Market. They have a
|
||
stocked WWW Site, complete with a catalog and recent news press
|
||
releases. C=H gripe: For the graphical set, the site is heavy
|
||
on graphics, although it does offer text link alternatives.
|
||
|
||
o Herne Data Systems, Inc.
|
||
URL: http://ourworld.compuserve.com/homepages/herne_data/cpm.htm
|
||
In the 1980's, HDS created some utilities for the C128's CP/M
|
||
mode. Jugg'ler 128 allowed the CP/M user to read over 140 different
|
||
disk formats, while Scramb'ler 128 encrypted files and disks. Although
|
||
HDS doesn't support these products anymore, they do provide them
|
||
and numerous reference works on their WWW Site. C=H gripe: text
|
||
based browsers might not handle the HTML TABLE very well.
|
||
|
||
@(A): Demo Groups
|
||
|
||
o Demolition
|
||
URL: http://www.cei.net/~rreed/
|
||
As the Webmaster puts it, " Demolition is currently more of a concept
|
||
than anything." Demolition is slated to become a disk based demo
|
||
programming resource magazine. However, at present, the site contains
|
||
a few articles on topics like boolean logic and VIC internals. In
|
||
addition, the site contains a comprehensive bibliography of basic and
|
||
demo related programming articles. C=H gripe: The bibliography is on
|
||
the main page, making it a lengthy piece of text.
|
||
|
||
@(A): Reference Works
|
||
|
||
o The Commodore Web Ring
|
||
URL: http://www.ncf.carleton.ca/~ag090/HomePage.ringpage.html
|
||
Although not a WWW site per se, this site starts you off on a journey
|
||
through various Commodore WWW sites. It's entertaining and will
|
||
undoubtedly take you somewhere you wouldn't have been before. C=H
|
||
gripe: Graphical surfers might find the large "buttons" annoying.
|
||
|
||
o Info and Files for Commodore GEOS
|
||
URL: http://www.radiks.net/irv_cobb/geos2.html
|
||
This, a sub page under Irv Cobb's home page, offers various GEOS
|
||
utilities that were either programmed by Irv or that he finds useful. GEOS
|
||
users should bookmark this page. C=H gripe: As above. A bit of
|
||
HTML 1.0 would spice this page right up.
|
||
|
||
o The History of Commodore
|
||
URL: http://www.geocities.com/SiliconValley/Heights/8329/History.html
|
||
A sub page of "The Commodore Haven", this sites gives the low-down
|
||
on Commodore, from its inception to its demise. C=H gripe: well done
|
||
page.
|
||
|
||
o Commodore Pictures
|
||
URL: http://www.swt.edu/~ez13942/commie/cbmpics.htm
|
||
Although the author of the page is not mentioned, he takes us on a tour
|
||
of his various Commodore computer systems. It's always interesting
|
||
to see how folks use their machine. C=H gripe: The graphics and the
|
||
captions are all on one page, which makes the page a bit lengthy.
|
||
|
||
o The KIM-1 page
|
||
URL: http://www.magic.ca/~yhpun/ianpun.html
|
||
For anyone who doesn't know what a KIM is or how it relates to Commodore,
|
||
this page is for you. Featuring pictures and explanations of both
|
||
the KIM-1 and the author's home-made expansion board, this site offers
|
||
a glimpse of the life of the 6502 pre-CBM. C=H gripe: The KIM-1 stuff
|
||
is on the same page as the author's personal and business information.
|
||
|
||
o CBMSearch - a search engine for searching Commodore related software.
|
||
URL: http://www.ts.umu.se/~yak/cccc/cbmsearch/
|
||
Bookmark this site. Now. Offering a concise way to find Commodore
|
||
software quickly and easily, CBMSearch can relieve the headache of
|
||
trying to find CBM titles on the Internet. C=H gripe: Can't really
|
||
say there is a gripe. The page is concise and could be spruced up
|
||
a bit, but in this case, function overrules form.
|
||
|
||
@(A): User Groups
|
||
|
||
o Bronx User's Group (BUG)
|
||
URL: http://www.mediaworks.com/bug/
|
||
As Commodore Authorized User Group #0065, BUG's WWW site contains
|
||
links to mail each of the officers and some links to other sites.
|
||
A phone number is given for information. C=H gripe: The site's a
|
||
bit low on content. We applaud the presence, but a map or some info
|
||
about the group would be nice.
|
||
|
||
o Stone Mountain User's Group - Contains information on when and where we meet.
|
||
URL: http://www.cris.com/~Derektp/
|
||
Although supporting all orphaned computer systems, SMUG (love the
|
||
acronym) appears to focus on the CBM systems and contains information
|
||
on meeting places and times. C=H gripe: As above, the content is a bit
|
||
low, but at least directions and times are given.
|
||
|
||
o ICPUG Independent Commodore Products User Group
|
||
URL: http://www.icpug.org.uk/
|
||
Although not devoted exclusively to the CBM 8-bit line, ICPUG does
|
||
support them. A wealth of information, including the ability to join
|
||
and club news is available. C=H gripe: For the graphical set, the
|
||
site is a bit heavy on graphics. (For these sites, viewing with Lynx
|
||
offers faster response.)
|
||
|
||
@(A): Individual Commodore Users
|
||
|
||
o Commie web page -- Better red than IBM
|
||
URL: http://www.swt.edu/~ez13942/commie/
|
||
Bo Zimmerman titles his page this peculiar way. He offers some history
|
||
on his use of Commodore systems and offers some pictures of his
|
||
various equipment. He also presents the Commodore Pictures page,
|
||
detailed above. C=H gripe: the background makes for hard reading on
|
||
some graphical browsers.
|
||
|
||
o Don's Page
|
||
URL: http://people.delphi.com/novan/
|
||
In an effort to offer people with text browsers some picture content,
|
||
Don has included ASCII art in his page. We are impressed. Basically,
|
||
the site details Don's hobbies and how the Commodore fits in. C=H
|
||
gripe: We really think the ASCII is great, but there's no reason to
|
||
make all the text in the document mono-spaced.
|
||
|
||
o Dave's Commodore 64 page
|
||
URL: http://www.csun.edu/~hbbuse08/c64.html
|
||
This page is for those looking for game information, SID tunes, and
|
||
emulators. (Note: some of the files on this site are copyrighted.)
|
||
C=H gripe: The top says "This page looks best when viewed with
|
||
Microsoft's Internet Explorer or Netscape!"
|
||
|
||
o John Elliott's Home Page
|
||
URL: http://www.nsis.com/~prof/
|
||
John has a very extensive site detailing computers in education,
|
||
including a piece on using "obsolete computers" in the classroom.
|
||
A number of pieces available on the site include education conference
|
||
highlights, and a discussion of how he finally hooked up to the
|
||
Internet. The site is best viewed with Lynx, as it is enhanced for
|
||
Lynx! (that's a switch) C=H gripe: The layout of the pages seems a
|
||
bit haphazard, but maybe it's just us.
|
||
|
||
o Irv Cobb's home page
|
||
URL: http://www.radiks.net/irv_cobb/
|
||
If you want to know about Irv or where he grew up, it's all here.
|
||
Hyperlinks are spread throughout the text to direct you to different
|
||
topics. C=H gripe: none. Although it isn't as "splashy" as some
|
||
pages, it is laid out well, and looks fine, although simplistic, on a
|
||
graphical browser.
|
||
|
||
o Commodore 64 Online
|
||
URL: http://www.geocities.com/SiliconValley/Park/4645/
|
||
Tim Plelp's site is brimming with links to his favorite utilities and
|
||
applications. Also included is a comprehensive list of PD/Shareware
|
||
titles. C=H gripe: use unordered lists instead of "*" for the various
|
||
items.
|
||
|
||
o Commodore Connection
|
||
URL: http://www.gis.net/~sunfish/crcbm.html
|
||
Geoff Sullivan's personal site offers articles and software to make
|
||
using a C64 or 128 more enjoyable. Besides links to other sites,
|
||
he also offers up Perfect Print fonts and articles on how to expand your
|
||
REU to 2MB and how to build a simple RS-232 converter. Of special
|
||
interest is a collection of customized GEOS mouse pointer icons and a
|
||
program called QWIKSTASH that will copy files in GEOS on bootup.
|
||
C=H gripe: Great resource, but little information about Geoff and how
|
||
he uses his CBM.
|
||
|
||
=========================================================================
|
||
|
||
@(#)jb: Jim Butterfield: The Commodore Guru - An Interview
|
||
by Jim Lawless (jimbos@radiks.net)
|
||
|
||
@(A): Introduction
|
||
|
||
My initial interest in the Commodore 64 computer began in 1983. At the
|
||
time, my primary source of information pertaining to the C64 came from
|
||
Compute! and Compute!'s Gazette publications. One author's name stood
|
||
from the rest; Jim Butterfield.
|
||
|
||
I used to turn to Jim's articles immediately when I managed to get my
|
||
hands on a new magazine. Mr. Butterfield has the rare ability to
|
||
describe complex subjects in simple terms.
|
||
|
||
I'm certain that I'm not alone when I credit Jim with having taught me
|
||
a lot about the inner workings of the Commodore 64. As important as
|
||
the specifics of writing code for the C64 was Jim's style. He would
|
||
often write code that was readily portable to multiple CBM machines.
|
||
His code had longevity and purpose. The solidity of his programs left
|
||
me with a lasting impression pertaining to how software should be
|
||
developed.
|
||
|
||
The following interview with Jim was conducted via e-mail.
|
||
|
||
Q: What was the first programming language that you learned?
|
||
|
||
A: In about 1963, an assembly language called COGENT for a computer that
|
||
few people have ever heard of: a Collins Radio C-8401. That was shortly
|
||
followed by work on an IBM 1401, which had a machine language that was
|
||
alphanumeric. (Honest! You could keypunch M/L directly!)
|
||
|
||
Q: Were numbers expressed in Base-36?
|
||
|
||
A: No. Decimal.
|
||
|
||
The basic machine had 1000 bytes (not 1K) of (7-bit) memory (core, not
|
||
RAM!) so addresses ranged from 000 to 999 (and were given in decimal, of
|
||
course). Expanded machines had 4K, then 16K ... the addresses were
|
||
slightly more complex in that case.
|
||
|
||
Thus, to move bytes from an area at, say address 123 to address 456 the
|
||
instruction would be M123456. I AM NOT MAKING THIS UP!!!!
|
||
|
||
Q: Did you guys have contests to spell out goofy words as part of a
|
||
program? (I know of a programmer who used to regularly use the return
|
||
code $0BAD to indicate a problem...)
|
||
|
||
A: No (the addresses mixed in with the op codes ruled that out), but you
|
||
could do fun things on a 1401 if the system manager wasn't looking ..
|
||
such as play music.
|
||
|
||
Q: What was the first computer that you owned?
|
||
|
||
A: Not counting the TUTAC-1, which was powered by rubber bands and was
|
||
more correctly a logic machine: The KIM-1, a single-board microcomputer
|
||
made by MOS Technologies, Inc., of Norristown PA. MOS Technologies was
|
||
subsequently acquired by Commodore.
|
||
|
||
Q: When did you first encounter a Commodore computer?
|
||
|
||
A: When Commodore acquired MOS Technologies, the computer that I had
|
||
owned for over a year became a Commodore computer. Subsequently, an
|
||
employee of MOS Technologies, Chuck Peddle, convinced Jack Tramiel of
|
||
Commodore that they should launch a personal computer called "The PET".
|
||
I got one of those not long after they started production.
|
||
|
||
Q: Did you have formal training in computer programming?
|
||
|
||
A: Yes, on that long-ago Collins C-8401. But this was more a process-
|
||
control machine; it didn't use of any the newfangled (at the time)
|
||
languages such as Fortran and Cobol. So my training was in machine
|
||
language/assembler.
|
||
|
||
Q: What was the first book that you wrote?
|
||
|
||
A: A couple of enthusiasts and I collaborated on a volume called "The
|
||
First Book of KIM", a book describing how to do things with the KIM-1
|
||
single board computer. That computer was powered by a 6502,by the way;
|
||
in fact the KIM-1 board itself was designed as a engineering prototype
|
||
for people who wanted to try out the chip.
|
||
|
||
Q: Was it similar to the Altair where you had to manually increment an
|
||
address-counter before you could throw the switches to set the byte at
|
||
that address?
|
||
|
||
A: No, the KIM-1 had an operating system in ROM. That's one of the
|
||
things that made all KIM users "equal" and able to share programs, while
|
||
the other early micro owners had quite a scattering of stuff.
|
||
|
||
Q: What COULD you do with a KIM-1?
|
||
|
||
A: Hey, watch it! That's like saying, "What could you do with a
|
||
Commodore 64"? Although the KIM-1 came with a hexadecimal keypad rather
|
||
than a keyboard, and output to a six-digit LED display, you could use
|
||
those to good advantage AND hook up extra stuff. Play music? Play
|
||
Blackjack? Hunt the Wumpus? Skeet shoot? Unless you had the budget for a
|
||
printer, you'd have a hard time doing an accounts receivable, of course.
|
||
But this is the 6502 we're talking about! And we all know it can do
|
||
ANYTHING!
|
||
|
||
Q: What was the last book that you wrote?
|
||
|
||
A: It's probably the revised version of "Machine Language For the
|
||
Commodore 64, 128, and Other Commodore Computers". In 1985 and 1986,
|
||
however, I did produce a "pocket diary" reference guide for Commodore 8-
|
||
bit computers.
|
||
|
||
Q: Have you ever written articles or books on subjects that are not
|
||
computer-related?
|
||
|
||
A: My first writing experience was a treatise on transistor theory,
|
||
published by Popular Electronics in August of 1959. Not much else.
|
||
|
||
Q: Did you write commercial software for any of the Commodore computers?
|
||
|
||
A: As a general rule, no. All my stuff is public domain. At one time, I
|
||
had written a simple spell-checking engine that was incorporated into a
|
||
word processing package for a while.
|
||
|
||
Q: SuperMon was a tool that I used daily when developing ML routines or
|
||
exploring the C64. What prompted you to write SuperMon?
|
||
|
||
A: In the early days of Commodore personal computers, there were quite a
|
||
few machine language monitors around. They were partly based on some
|
||
publicly published code by Steve Wozniak (of Apple!), and partly based
|
||
on the MOS Technology TIM monitor, from KIM-1 days.
|
||
|
||
Two variants of the basic monitor caught my eye: NewMon, which added
|
||
several useful features to the basic Machine Language Monitor; and
|
||
HiMon, which sited the monitor in upper memory where it wouldn't
|
||
conflict with BASIC programs. I decided to put the two together and
|
||
generate a self-relocating MLM. That was desirable in early PET/CBM
|
||
days, where some computers would come with 8K RAM, some with 16K, and
|
||
others with 32K; you couldn't assume where the top of memory would be.
|
||
|
||
In those days, almost every Commodore computer came with a small built-
|
||
in MLM, and the first Supermon was an add-on. Later, as Commodore
|
||
changed the style of the MLM packages they built into newer machines
|
||
such as the 128, I went back and modified those earlier versions so that
|
||
they would work the same across all platforms.
|
||
|
||
Q: Did you ever expand the mini-assembler in SuperMon into a full-blown
|
||
assembler development package?
|
||
|
||
A: No. I hustled Brad Templeton into writing PAL, so that there would be
|
||
an assembler available for those who needed it. There had been a few
|
||
assemblers around before that - Commodore had one, and another was the
|
||
MAE system - but I was sure that somebody like Brad could do better.
|
||
|
||
Q: Even Superman had to put up with Kryptonite. Describe your worst
|
||
experience as a software developer / technical writer.
|
||
|
||
A: My first publication of SuperMon in Compute! magazine had the wrong
|
||
end-of-address supplied (my fault). I got a LOT of mail and phone calls
|
||
on that one.
|
||
|
||
Q: I had heard a rumor pertaining to your software development habits
|
||
that indicated you would approach a given project with full force. You
|
||
would focus your undivided attention on it until it was complete. Is
|
||
this rumor accurate?
|
||
|
||
A: Possibly. If I have a project under way, it "follows me around" until
|
||
it's complete; I fret over it and can't put it away until all the pieces
|
||
are in place.
|
||
|
||
Q: If so, did you ever change this methodology?
|
||
|
||
A: Not to any great extent. A half-written program bugs me, and I won't
|
||
rest until it's finished.
|
||
|
||
I might, however, decide that I'm taking the wrong track, and scrap a
|
||
program completely in order to start over. This isn't a loss: the first
|
||
attempt can show you what's really wanted.
|
||
|
||
Q: Your articles made you seem a bit omniscient. You always had the
|
||
inside info on the newest CBM computers and always seemed to be able to
|
||
explain their complexities in a manner that would suggest that you had a
|
||
lot of time to study them. I don't know a whole lot about your
|
||
employment during the mid/late 80's. Were you affiliated with CBM? A
|
||
beta-tester?
|
||
|
||
A: I had many friends in Commodore Canada, but I never worked for the
|
||
company, although I did contract work for them on occasion.
|
||
|
||
The big problem was not getting information from Commodore; it was
|
||
learning to ignore most of it. Commodore was bubbling over with ideas
|
||
and plans that never came to fruition. There was no point in writing
|
||
about projects that never happened (the Commodore music box? the cash
|
||
register? the videotape/disk storage device?). I took the position:
|
||
"Don't tell me about it until it's a real product!".
|
||
|
||
Commodore Canada was an excellent source of information, and I relied on
|
||
them to keep me from straying too far into technical speculation.
|
||
|
||
Q: Did you use any high-level languages on CBM computers?
|
||
|
||
A: BASIC, of course. COMAL, a BASIC derivative language from Denmark,
|
||
was nicely constructed. Played around a little with C, but that language
|
||
doesn't fit comfortably into an 8-bit environment.
|
||
|
||
Q: What was your favorite computer that CBM produced?
|
||
|
||
A: I don't know that I have a single favorite. The early PET/CBM
|
||
machines were great "discovery" platforms, where we could investigate
|
||
these wonderful new computers. The advent of the VIC-20 and the
|
||
Commodore 64 brought color and sound, which added to the charm of these
|
||
home computers; but they paid a penalty in slow disk access and screen
|
||
width limitations. Today, perhaps the Commodore 128 ranks as the best,
|
||
or at least the computer with most general usability. But it wasn't
|
||
produced in quantities as great as some of the earlier machines, and so
|
||
the user community hasn't been quite as furious.
|
||
|
||
Q: What kind of home computer do you currently use?
|
||
|
||
A: C128 .. Amiga .. Pentium system. All three.
|
||
|
||
Q: Who were your influences as related to writing?
|
||
|
||
A: Nobody specific. Just tried to write it as I would say it.
|
||
|
||
Q: Who were your influences as related to programming?
|
||
|
||
A: I've worked with a lot of sharp programmers over the years. Not one I
|
||
can pick out especially.
|
||
|
||
Q: If you could relive the CBM glory years, would you do anything
|
||
differently?
|
||
|
||
A: I don't think so. On another path, I could have gone for big bucks;
|
||
but making money carries a responsibility to support and service, and
|
||
that would have taken the fun out of it.
|
||
|
||
Q: Is your current job computer-related?
|
||
|
||
A: I'm currently more or less retired.
|
||
|
||
Q: If you had not chosen a career in computing, what field of endeavor
|
||
would you most likely have pursued?
|
||
|
||
A: Before computers, I worked in electronics and telecommunications.
|
||
|
||
Q: What are your current hobbies?
|
||
|
||
A: Reading; travel; films; raising my daughter. (That's a hobby???)
|
||
|
||
Q: What sort of technical literature do you currently read?
|
||
|
||
A: Mostly reference material. Current magazines are heavy on the "what's
|
||
for sale" stream; to my mind, that's not the fun part of computing.
|
||
|
||
Q: Are you surprised that a sort of "CBM renaissance" has been taking
|
||
place the last few years ( ...availability of C64 emulators on multiple
|
||
platforms and such...the SuperCPU from CMD...).
|
||
|
||
A: It's a shame that Commodore wasn't able to/interested in keeping the
|
||
8-bit line going. It's good to see that is happening.
|
||
|
||
Surprised? A little. But enthusiasts and user groups have always had a
|
||
stronger effect than manufacturers are willing to admit.
|
||
|
||
Q: What is your opinion on the way consumer computing has evolved since
|
||
the inception of the early PET machines?
|
||
|
||
A: The average computer user today has a lot less fun than we still have
|
||
with the early machines. The industry message today is "Buy it and use
|
||
it, and then turn it off .. don't worry or think about how it all
|
||
works". That's sure a lot less fun for tinkerers.
|
||
|
||
Q: What words of wisdom would you care to impart on a new (or
|
||
revitalized) generation of CBM hackers?
|
||
|
||
A: Enjoy what you're doing! If it becomes drudgery, you're doing it
|
||
wrong!
|
||
|
||
=========================================================================
|
||
|
||
@(#)trivia: Commodore Trivia
|
||
by Jim Brain (j.brain@ieee.org)
|
||
|
||
@(A): Introduction
|
||
|
||
As some may know, these questions are part of a contest held each month on
|
||
the Internet, in which the winner receives a donated prize. I encourage
|
||
those who can received the newest editions of trivia to enter the contest.
|
||
|
||
This article contains the questions and answers for trivia editions #29-32,
|
||
with questions for edition #33.
|
||
|
||
If you wish, you can subscribe to the trivia mailing list and receive the
|
||
newest editions of the trivia via Internet email. To add your name to the
|
||
list, please mail a message:
|
||
|
||
To: brain@mail.msen.com
|
||
Subject: MAILSERV
|
||
Body:
|
||
subscribe trivia Firstname Lastname
|
||
help
|
||
quit
|
||
|
||
@(A): Trivia Questions and Answers
|
||
|
||
This edition should be sub-titled "Programmer's Trivia".
|
||
|
||
Q $1C0) What are the two configurations for the LORAM, HIRAM, GAME, and EXROM
|
||
pins that will allow the use of a full 64kB of RAM in the C64?
|
||
|
||
A $1C0) There are actually 4 configurations, in two categories:
|
||
|
||
LORAM 0 0 (X means either 1 or 0)
|
||
HIRAM 0 0
|
||
GAME 1 X
|
||
EXROM X 0
|
||
|
||
Q $1C1) What is the first thing that the C64 (and VIC) KERNAL does upon
|
||
powerup?
|
||
|
||
A $1C1) The first thing each does is reset the stack pointer to $ff.
|
||
|
||
Q $1C2) What KERNAL routine is used to set a DOS channel to input?
|
||
|
||
A $1C2) CHKIN ($ffc6)
|
||
|
||
Q $1C3) What KERNAL routine is used to set a DOS channel to output?
|
||
|
||
A $1C3) CHKOUT ($ffc9)
|
||
|
||
Q $1C4) Before calling the routines in $1C2 and $1C3, what register must
|
||
you load?
|
||
|
||
A $1C4) You must load .X with the logical file number.
|
||
|
||
Q $1C5) What 3 devices can the KERNAL NOT load from?
|
||
|
||
A $1C5) keyboard (0), RS-232 (2), or screen (3). The first and last are
|
||
somewhat obvious, but allowing RS-232 loads would have made
|
||
loading from a remote machine possible. Incidentally, you can't
|
||
save to any of these devices, either.
|
||
|
||
Q $1C6) In the Commodore KERNAL, there are "high" and "low" level routines.
|
||
To which class of routines does "SECOND" belong?
|
||
|
||
A $1C6) low. It is used to specify the secondary address, as the '7' in
|
||
open 4,4,7.
|
||
|
||
Q $1C7) If a programmer calls the KERNAL routine "STOP" and the RUN/STOP
|
||
key is NOT pressed, what is returned in the .A register?
|
||
|
||
A $1C7) .A will contain a byte representing the last row of the keyboard
|
||
scan.
|
||
|
||
Q $1C8) The Commodore KERNAL routines are all accessed via a jump table.
|
||
What routine is used to change the values in the KERNAL jump table?
|
||
|
||
A $1C8) The appropriately named VECTOR ($ff8d) call, which few programmers
|
||
actually use.
|
||
|
||
Q $1C9) A call is made to a KERNAL routine, the call returns with the C
|
||
bit set and the .A register holds $02. What error does this
|
||
indicate?
|
||
|
||
A $1C9) "File already open"
|
||
|
||
Q $1CA) If a call to READST is made, and a $40 is returned in .A, what
|
||
does this indicate?
|
||
|
||
A $1CA) End of File.
|
||
|
||
Q $1CB) What routine can be called to determine the physical format of the
|
||
Commodore 64 screen in characters?
|
||
|
||
A $1CB) The also appropriately named SCREEN ($ffed) call.
|
||
|
||
Q $1CC) The Commodore 64 starts a non-destructive RAM test at what location?
|
||
|
||
A $1CC) $0300.
|
||
|
||
Q $1CD) Which way does the RAM test proceed: up or down?
|
||
|
||
A $1CD) up.
|
||
|
||
Q $1CE) Which KERNAL routine is used ONLY in conjunction with a Commodore
|
||
IEEE card?
|
||
|
||
A $1CE) SETTMO ($ffa2), which sets the IEEE bus card timeout flag. I infer
|
||
that Commodore thought many people would use the IEEE interface.
|
||
(Anyone know any more about this?)
|
||
|
||
Q $1CF) Many hybrid BASIC/ML programs use SYS to transfer control from BASIC
|
||
to ML. However, a few use USR(X). When using the latter function,
|
||
where does BASIC fetch the ML routine's starting address from?
|
||
|
||
A $1CF) 785 and 786, in classic LO:HI format.
|
||
|
||
The "BASIC" Trivia Set
|
||
|
||
Q $1D0) To load a program from the current location on a cassette tape, what
|
||
two key combination must a user press on a VIC-20 or C64.
|
||
|
||
A $1D0) SHIFT and the RUN/STOP key. Note that the same key sequence loads
|
||
a file from disk on the SX-64 or C128 in 128 mode.
|
||
|
||
Q $1D1) If I issue the BASIC statement OPEN "JIM,S,W", What type of file
|
||
am I opening?
|
||
|
||
A $1D1) A sequential file.
|
||
|
||
Q $1D2) Is BASIC in the Commodore computer systems an "interpreted" or
|
||
"compiled" language
|
||
|
||
A $1D2) interpreted. When a program has been "Blitzed!", it is then
|
||
compiled.
|
||
|
||
Q $1D3) What type of variable is A%?
|
||
|
||
A $1D3) An integer variable.
|
||
|
||
Q $1D4) If I issue the BASIC line PRINT:PRINT "A","B" what column does
|
||
the "B" show up on when run on a C64?
|
||
|
||
A $1D4) Column 11, if we number columns from 1.
|
||
|
||
Q $1D5) What column does "B" show up on if I run the BASIC line in $1D4 on
|
||
a VIC-20?
|
||
|
||
A $1D5) Column 12. Since the VIC has 22 columns, the natural column spacing
|
||
was 11 positions, instead of 10 on 40 and 80 column CBMs.
|
||
|
||
Q $1D6) Alphebetically, what is the first BASIC 2.0 command to have a 3
|
||
letter abbreviation?
|
||
|
||
A $1D6) CLOSE.
|
||
|
||
Q $1D7) How many times does the statement FOR T=1TO0 execute?
|
||
|
||
A $1D7) once. A BASIC for loop always executes at least once. This is
|
||
different from languages like 'C', which would not execute the loop
|
||
at all. Feature or bug, who knows...
|
||
|
||
Q $1D8) What base does the BASIC LOG command use for its logarithm
|
||
function?
|
||
|
||
A $1D8) base e. (2.7....) (one of the entrants claims that "e" in the 64
|
||
isn't quite as accurate as we think. He was quoting 2.85....
|
||
|
||
Q $1D9) A = NOT B can be written as which expression:
|
||
|
||
a) A = -B
|
||
b) A = -(B+1)
|
||
|
||
A $1D9) b. NOT computes the twos-complement of the number, not the simple
|
||
ones-complement negation. This feature simpleifies subtraction in a
|
||
CPU, since subtractions can be performed as additions.
|
||
|
||
Q $1DA) What does INT(-15.43) return?
|
||
|
||
A $1DA) -16. INT returns the next LOWER integer.
|
||
|
||
Q $1DB) What does ASC$("JIM") return?
|
||
|
||
A $1DB) ASC$ returns an error. That's what I get for writing these late
|
||
at night. What I menat was "ASC", returns the value of the first
|
||
character of a string, in this case 'J'. Since I didn't specify
|
||
if this was a uppercase 'j' or lowercase 'J' in graphics mode, the
|
||
result could either be 74 or 202.
|
||
|
||
Q $1DC) What is the abbreviation for GET#?
|
||
|
||
A $1DC) Technically, there is none. However, on the C128 at least, GET#
|
||
shares the same token as GET, so typing gE# will indeed work.
|
||
This is different from PRINT and PRINT#, which have different
|
||
tokens.
|
||
|
||
Q $1DD) What is the largest integer value that Commodore BASIC can handle?
|
||
|
||
A $1DD) Again, this was a little ambiguous. I was looking for the maximum
|
||
value that an integer variable can hold, which is 32767, but line
|
||
numbers (which are integers) can be up to 63999.
|
||
|
||
Q $1DE) What is the ONLY Commodore Editor key not affected by "quote mode"
|
||
|
||
A $1DE) The DEL key. I would have answered return, but the 64 PRG spells
|
||
it out that only this key is unaffected.
|
||
|
||
Q $1DF) What is the range of RND?
|
||
|
||
A $1DF) 0.0 <= RND < 1.0, or [0,1). Both mean that the range is from 0 to
|
||
1, including 0, but not 1.0.
|
||
|
||
The "VIC Chip" Trivia Set
|
||
|
||
Q $1E0) We all know that VIC stands for Video Interface Chip. However,
|
||
in what computer was a VIC chip first used?
|
||
|
||
A $1E0) The VIC-I was used in the VIC-20.
|
||
|
||
Q $1E1) What is the difference between the 6566 and 6567 VIC chips?
|
||
|
||
A $1E1) The 6566 has fully decoded address lines. The '67 has multiplexed
|
||
address lines for connection to DRAM.
|
||
|
||
Q $1E2) On what computer would one find a VIC-II chip?
|
||
|
||
A $1E2) C64, C64C, 64SX.
|
||
|
||
Q $1E3) On what computer would one find a VIC-IIe chip?
|
||
|
||
A $1E3) C128, C128D
|
||
|
||
Q $1E4) On what computer would one find a VIC-III chip?
|
||
|
||
A $1E4) C65 (64DX)
|
||
|
||
Q $1E5) Versions of each VIC chip exist for each computer model/video
|
||
standard combinations suppoerted by Commodore. What model/video
|
||
standard would the 6569 work with?
|
||
|
||
A $1E5) C64 type machine using the PAL-B standard. Note that there are also
|
||
PAL-N and PAL-M standards, which required different VIC-II models.
|
||
|
||
Q $1E6) How much memory could be directly addressed by a VIC-II chip?
|
||
|
||
A $1E6) 16 kilobytes.
|
||
|
||
Q $1E7) How many control registers does the VIC-I contain?
|
||
|
||
A $1E7) 16 control registers.
|
||
|
||
Q $1E8) How many control registers does the VIC-II contain?
|
||
|
||
A $1E8) 47 control registers.
|
||
|
||
Q $1E9) The VIC-II series introduced Movable Object Blocks to the
|
||
Commodore programmer. By what common name are MOBs known?
|
||
|
||
A $1E9) "sprites"
|
||
|
||
Q $1EA) What are the dimensions of a MOB?
|
||
|
||
A $1EA) 24 dots wide by 21 tall.
|
||
|
||
Q $1EB) What difference between the VIC-I and VIC-II causes VIC-II equipped
|
||
systems to potentially operate slightly slower than VIC-I equipped
|
||
systems, all other items held constant?
|
||
|
||
A $1EB) Even with all of the fancy features of the VIC-II (like sprites)
|
||
turned off, the VIC-II doesn't have quite enough time to do all
|
||
of its work, which includes refreshing the DRAM ICs in addition to
|
||
the work of drawing the screen and reading the Paddle inputs. So,
|
||
every 8th rasterline, the VIC has to "steal cycles" from the CPU to
|
||
fetch character data from RAM. Since this time is not available to
|
||
the CPU to execute programs, a simple program written on each
|
||
machine will execute faster on the VIC because its CPU doesn't
|
||
have to fight the video IC for cycles.
|
||
|
||
Q $1EC) In addition to supporting graphical output to an external display,
|
||
what other vitally important function do the VIC chips (starting
|
||
with the VIC-II) perform?
|
||
|
||
A $1EC) They refresh the Dynamic RAM of the computer periodically. If the
|
||
DRAM is not refreshed, it would lose its contents.
|
||
|
||
Q $1ED) Many people know that the VIC-II can deliver up to 320x200
|
||
resolution without much trouble. What is the maximum resolution of
|
||
the VIC-III chip?
|
||
|
||
A $1ED) According to the specifications, it is supposed to handle 1280H by
|
||
400V interlaced and non-interlaced.
|
||
|
||
Q $1EE) Between the development of the VIC-II and the VIC-IIe, there was a
|
||
related, though not very similar video IC developed for CBM machines.
|
||
Name its TLA (three letter acronym).
|
||
|
||
A $1EE) TED (Text Editting Device). It was developed for the 264 series
|
||
(Plus/4, C16).
|
||
|
||
Q $1EF) How many pins does a VIC-II chip contain?
|
||
|
||
A $1EF) Every VIC-II has 40 pins.
|
||
|
||
The "BASIC Tokens" Trivia Set
|
||
|
||
The following questions refer to the way Commodore "crunched"
|
||
BASIC programs by substituting one of more bytes called "tokens"
|
||
for BASIC keywords in a BASIC program. The resulting code was
|
||
smaller, since multiple character keywords were internally replaced
|
||
with smaller length tokens.
|
||
|
||
(All the answers were taken from _Commodore Magazine_, April 1987,
|
||
pp 82-85.)
|
||
|
||
Q $1F0) Commodore BASIC tokens start at what number?
|
||
|
||
A $1F0) $80, or 128.
|
||
|
||
Q $1F1) BASIC 2.0 defines tokens without gaps up to $ca. What keyword
|
||
is represented by $cb?
|
||
|
||
A $1F1) GO.
|
||
|
||
Q $1F2) Why is the token for PI strange?
|
||
|
||
A $1F2) It is token $ff, or 255.
|
||
|
||
Q $1F3) All versions of Commodore BASIC contain at least a subset of
|
||
tokens. At what number does this subset end?
|
||
|
||
A $1F3) $ca.
|
||
|
||
Q $1F4) BASIC 4.0 defines tokens beyond $cb. What is the last token
|
||
included in BASIC 4.0?
|
||
|
||
A $1F4) $da.
|
||
|
||
Q $1F5) There was a BASIC 4.0+ included in the B series. It extends the
|
||
BASIC with some new commands not in 4.0. What token range are
|
||
these new commands at?
|
||
|
||
A $1F5) $db-$e8.
|
||
|
||
Q $1F6) When a user plugs a Super Expander into a Commodore 64, he or
|
||
she gains access to 25 new BASIC commands. The tokens for these
|
||
commands are defined differently from the previous tokens. What
|
||
is the difference?
|
||
|
||
A $1F6) They are two byte tokens of the form: $fe XX, where XX ranges from
|
||
$80 to $9e.
|
||
|
||
Q $1F7) When the Plus/4 and C-16 was developed, new commands were added
|
||
to BASIC. In addition, many commands from BASIC 4.0 were also
|
||
included. Unfortunately, the tokens for BASIC 4.0 commands included
|
||
in these new machines differed from those in the older BASIC 4.0.
|
||
If a user lists a program written in BASIC 4.0 on a Plus/4, what
|
||
will the BASIC 4.0 CONCAT command show up as?
|
||
|
||
A $1F7) CONCAT is $cc in BASIC 4.0, and is RGR in BASIC 3.5.
|
||
|
||
Q $1F8) What is the last token used in the Plus/4 line?
|
||
|
||
A $1F8) $fd.
|
||
|
||
Q $1F9) If you list a program written on the Plus/4 with the keyword
|
||
SCALE on a BASIC 4.0/4.0+ machine, what happens?
|
||
|
||
A $1F9) SCALE on BASIC 3.5 is token $e9, which is not in the BASIC 4.0(+)
|
||
list. The PET will crash. Interstingly, tokens above $e9 do not
|
||
crash the PET.
|
||
|
||
Q $1FA) When the C128 was released, it shared many tokens with the Plus/4.
|
||
However, at $ce, the 128 differs from the Plus/4. The Plus/4 token
|
||
$ce corresponds to RLUM, but the C128 uses the token another way.
|
||
What is peculiar about the C128 usage?
|
||
|
||
A $1FA) The C128 uses $ce as a prefix byte for a range of two-byte tokens
|
||
that range from $02 to $0a.
|
||
|
||
Q $1FB) The C128 shares many keywords with the Super Expander cartridge
|
||
for the C64. As with the Plus/4, though, keywords don't map to
|
||
the same token. To what token does the C128 keyword SPRITE
|
||
(token: $fe $07) correspond to on the Super Expander equipped 64?
|
||
|
||
A $1FB) $fe $93.
|
||
|
||
Q $1FC) What keyword was not included in BASIC v1, but was included in
|
||
BASIC v2?
|
||
|
||
A $1FC) GO, token $cb.
|
||
|
||
Q $1FD) The C128 defines all the tokens from $fe $02 to $fe $26, with the
|
||
exception of two tokens. Name one of them.
|
||
|
||
A $1FD) $fe $20 and $fe $22.
|
||
|
||
Q $1FE) The Plus/4 line had the ability to add keywords dynamically when
|
||
running cartridges. At what point in the token list do these
|
||
"added" keywords show up in the Plus/4 line?
|
||
|
||
A $1FE) They use $fe as a prefix byte for two-byte tokens.
|
||
|
||
Q $1FF) If a programmer want to write a single program to run on a
|
||
B128, a plus/4, and a C128, what version of BASIC is the lowest
|
||
common denominator?
|
||
|
||
A $1FF) Unfortunately, BASIC 2.0 is it.
|
||
|
||
The C128 Set:
|
||
|
||
Q $200) How many general purpose central processin units does a C128
|
||
contain?
|
||
|
||
Q $201) The Commodore 128 contains a MMU IC. What does MMU stand for?
|
||
|
||
Q $202) What Commodore produced cartridge is specifically mentioned in
|
||
the 128 PRG as being incompatible with the 128?
|
||
|
||
Q $203) The C128 introduces the concepts of "banks" How many such banks
|
||
are recognized by the C128 BASIC?
|
||
|
||
Q $204) What version is the BASIC included in the C128 in native mode?
|
||
|
||
Q $205) Can any of the BASIC graphics commands be used on the 80 column
|
||
screen?
|
||
|
||
Q $206) How many high-level graphics commands are available on the C128
|
||
in C128 mode?
|
||
|
||
Q $207) In C128 mode, at what location does screen memory start?
|
||
|
||
Q $208) The 80 column IC in the 128 can display how many full character
|
||
sets of 256 characters each at one time?
|
||
|
||
Q $209) Many have scorned the C128's 80 column video IC. What about this
|
||
IC makes it so hard to use?
|
||
|
||
Q $20A) What number is the 80 column IC referenced by?
|
||
|
||
Q $20B) What machine language addressing modes cannot be used with the
|
||
80 column chip?
|
||
|
||
Q $20C) The C128 contains keyboard keys not present on the C64. What IC
|
||
is used to read these keys? (besides the CIA, as on the 64)
|
||
|
||
Q $20D) Following the introduction of the C128, a new version of was
|
||
developed. Name it.
|
||
|
||
Q $20E) Many people refer to C128s as 16k or 64k units. To what does this
|
||
refer?
|
||
|
||
Q $20F) According to the C128 literature, the C128 can be expanded to use
|
||
how much memory?
|
||
|
||
=========================================================================
|
||
|
||
@(#)basic: Hacking BASICs
|
||
by R. T. Cunningham (wanderer_rtc@usa.pipeline.com)
|
||
|
||
@(A): Introducation
|
||
|
||
Although BASIC is not an "advanced" language, such as Assembly or C, it's
|
||
been used far more often than any other since the first Commodore computer
|
||
was introduced. It is not my intent to provide information here that is
|
||
widely available in user manuals, newsletters, or other forums. What I am
|
||
going to present is what I have learned from "The School of Hard Knocks"
|
||
or, in other words, by trial and error.
|
||
|
||
@(A): Detecting Drives Connected
|
||
|
||
If your program attempts to access a device number that is not connected to
|
||
computer in the serial chain, like fetching a directory, your program will
|
||
halt with "?device not present error in (line number)". How do we prevent
|
||
this from happening? The answer is to open the device number, close the
|
||
device number, and check the status variable:
|
||
|
||
open15,10,15:close15:ifst<>0then (act on device not being present)
|
||
|
||
Any number returned by the status variable other than 0 will indicate that
|
||
the device is either not connected or not turned on.
|
||
|
||
In my own programs, I like to do this check for all of the drives early in
|
||
the program by stashing the device numbers in an array. Legal device
|
||
numbers for disk drives are 8 to 30, with 30 being used as configuration
|
||
mode for a CMD drive. Since I know of no other drive that can use device
|
||
#30, I won't include that device number in the loop. The array should be
|
||
dimensioned to at least 21. I prefer 22 and to use the first variable (0)
|
||
to hold the number of devices. I keep the "start up" device number in a
|
||
non-array variable so that I can return to it after the drive checking
|
||
routine has been completed:
|
||
|
||
10 dimdv(22):dv(0)=0:rem set number of devices to 0
|
||
20 dv=peek(186):rem current device # of last drive accessed
|
||
30 ifdv<8thendv=8:rem prevents non-disk device #s
|
||
40 fora=1to22:rem device #s 8-29 minus 7 so that array starts at 1
|
||
50 open15,a+7,15:close15
|
||
60 ifst<>thendv(0)=dv(0)+1:dv(dv(0))=a+7:rem increment number of devices
|
||
and store device numbers
|
||
70 next
|
||
|
||
If I have device number 8, 10, 12 and 14 connected, dv(0) will now contain
|
||
4, dv(1) through dv(4) will contain those device numbers. You can now use
|
||
this array to check for a valid device number prior to an access command:
|
||
|
||
100 rem d equals the device number selected in this example
|
||
110 fl=0:rem set flag to 0
|
||
120 fora=1todv(0):rem check total number of drives attached
|
||
130 ifd=(dv(a))thenfl=1:rem set flag to 1 if a match is found
|
||
140 next
|
||
150 rem continue with drive access only if flag is set to 1
|
||
|
||
@(A): Selective GOTO (GO TO) Routine:
|
||
|
||
When acting on a number the ON/GOTO command set works by either using a
|
||
numeric variable or the value of a string, if the string contains a number:
|
||
|
||
10 onagoto100,200,300,400
|
||
|
||
or
|
||
|
||
10 onval(a$)goto100,200,300,400
|
||
|
||
What if we want to use a non-numeric character with ON/GOTO, especially
|
||
with a list of choices presented to the user?
|
||
|
||
In the C128's native mode the INSTR function can be used:
|
||
|
||
10 rem keys accessible by user are A,B,C,D and stored in a$ response
|
||
20 oninstr("ABCD",a$)goto100,200,300,400
|
||
|
||
or
|
||
|
||
20 a=instr("ABCD",a$):onagoto100,200,300,400
|
||
|
||
On the 64, since INSTR is not an available function, we can emulate the
|
||
function with a different routine:
|
||
|
||
20 on-1*(a$="A")-2*(a$="B")-3*(a$="C")-3*(a$="D")goto100,200,300,400
|
||
|
||
or
|
||
|
||
20 a=-1*(a$="A")-2*(a$="B")-3*(a$="C")-3*(a$="D"):onagoto100,200,300,400
|
||
|
||
Note that the first 1* is not necessary but the - is. I've added it for
|
||
clarity only.
|
||
|
||
In the first example, INSTR returns the place number (sequence) of each
|
||
character in the string. In the second example, the place number is
|
||
obtained by multiplying the negative sequence number by the signed value of
|
||
a$. The signed value of a string is always -1 (I think!).
|
||
|
||
When working with a program that is designed to work in both 64 and 128
|
||
modes, the INSTR function should not be used since the other method will
|
||
also work in 128 mode.
|
||
|
||
More proficient readers might want to demonstrate the machine language
|
||
equivalents of both drive detection and INSTR routines? I for one would
|
||
like to add them to my ML arsenal.
|
||
|
||
=========================================================================
|
||
|
||
@(#)error: ? DS, DS$: rem The Error Channel
|
||
|
||
We are not aware of any errors with issue 13.
|
||
|
||
=========================================================================
|
||
|
||
@(#)bits: Twiddling the Bits: VIC-20 ROM Cartridge Exploration and Archiving
|
||
by Ward Shrake (wshrake@aol.com)
|
||
|
||
@(A): Introduction
|
||
|
||
This article's primary purpose is to enable you to understand the basic
|
||
principles of making an archival backup of a ROM cartridge. However, I do
|
||
wish to point out the following important points, before I begin:
|
||
|
||
@(A): Disclaimer
|
||
|
||
1. This is NOT intended for any sort of illegal purposes! The
|
||
information can be misused, if one wants to badly enough. However, so can
|
||
virtually every other piece of information on the planet. Fire is a good
|
||
thing, as are hammers, saws, and other tools, but all of them can be
|
||
misused. I urge the reader to use this information in a proper fashion
|
||
and to take the time to reflect on what you are doing, to avoid hurting
|
||
anyone or anything.
|
||
|
||
2. I am releasing this information for two basic reasons (besides basic
|
||
hacker pride in obscure technical knowledge). First, the Vic20 died many
|
||
years ago. Commodore helped accelerate its death, by pushing the C64
|
||
computer onto the market, at a time when all the companies out there had
|
||
a lot at stake. I don't blame Commodore from a marketing sense; they just
|
||
wanted to stay alive themselves in a cutthroat market environment.
|
||
However, this means a lot of people still have the idea that the Vic20
|
||
was/is a piece of obsolete junk. This is not true, but the public acts as
|
||
if it were. The end result is that a lot of perfectly good hardware and
|
||
software is thrown away on a regular basis. Once it is in a landfill
|
||
somewhere, it<69>s rather difficult for anyone to use it! Hence my two-fold
|
||
concern: to help show the public (and Commodore Guru types) the Vic20 is
|
||
a very cool gaming machine, and to physically rescue the software for the
|
||
system before all of it is lost forever. I take little pleasure in
|
||
thinking that 50,000 years from now some archaeologist will dig up our
|
||
landfills and think we must have had some really cool stuff!
|
||
|
||
3. I really like the term "Digital Archaeology." (I wasn't the first to
|
||
use it, however.) Basically, it means that with the many rapid advances
|
||
in the computer sciences, lots of stuff gets lost or forgotten in the
|
||
rush to replace everything every few years. Whereas an entire
|
||
civilization might take hundreds or even thousands of years to die out
|
||
and be all but forgotten, the history, lore, and software of computers
|
||
can be gone in just a few years. If we don't revive it now, who will
|
||
remember how to use any of this stuff? There are only a few people around
|
||
now that can do it, and their memories are getting fuzzy with the passage
|
||
of time. I don't mean to preach; I just think this is as good a time as
|
||
ever!
|
||
|
||
A small group of concerned individuals, myself included, have begun the
|
||
task of archiving all the VIC-20 cartridges known to exist. The project
|
||
also includes documenting every aspect of the VIC-20 hardware and how
|
||
it operates.
|
||
|
||
@(A): General information about Vic20 cartridge software
|
||
|
||
A Vic20 cartridge is approximately 5.5 inches wide, 3 and 3/8ths inches
|
||
deep, and 5/8ths inches tall, when viewed as if ready to be installed.
|
||
Most of the cartridges that were made by Commodore are either a beige or
|
||
dark brown colored plastic with a tan or metallic all-text label. Some
|
||
third-party companies had more interesting looking cartridges; most of
|
||
the plastic cases were black as a general rule, with white also being
|
||
used at times. In rare cases, oddly-shaped carts existed, for example,
|
||
carts by UMI. Some of these seem to be more epoxy-based than plastic,
|
||
with glitter inside it! Only a few companies really had fancy, full-
|
||
colored labels on their cartridges.
|
||
|
||
The most common memory configuration, inside the casing, is one bank of
|
||
8k. ROM was standard for the larger companies, but EPROM's were also used
|
||
at times, even by Commodore themselves. Four-kilobyte cartridges do
|
||
exist, as do 8k cartridges made up of two banks of 4k chips. (Memory was
|
||
expensive then, as you can no doubt imagine, and some companies had to
|
||
make due with whatever they could get cheap enough.) 16K cartridges do
|
||
exist as well, although the bulk of these were done by the largest
|
||
companies. Commodore made a few 16k carts, as did Atari, Sega, Hes, and a
|
||
few others.
|
||
|
||
If other standard cartridge memory configurations existed in the Vic's
|
||
day, the author is currently unaware of them. (I would like to hear of
|
||
any, if they do/did exist, especially if they were once made
|
||
commercially.) There may be a few exceptions, for instance, for carts
|
||
that modified the Vic20's own inherent abilities; for example, 40 and 80
|
||
column boards. But the rule of thumb here is that 8k was the accepted
|
||
standard, with 4k and 16k at times. All of these cartridge
|
||
configurations, by the way, are using 8-bit memory because the Vic20 is
|
||
an 8-bit computer.
|
||
|
||
Inside a typical Vic20 cartridge is one double-sided, etched circuit
|
||
board, with some form of memory chip(s) on it. This may be a "standard"
|
||
IC chip as we are used to seeing (24 or 28 pin ROM, in a DIP package), or
|
||
it could be a blank circuit board, with a tiny blob of black epoxy
|
||
material on it, under which are presumably the internal components of a
|
||
typical, normal ROM chip.
|
||
|
||
The standard circuit board size is approximately 3 and 9/16ths inches
|
||
wide, and 1 and 3/4 inches deep. A cart fits into a 44-position, double-
|
||
sided card edge connector, located in the back, left hand side of the
|
||
Vic20.
|
||
|
||
On the cart circuit board itself, there might be several wire traces or
|
||
jumpers, which, if there, are meant to configure the cartridge to a
|
||
certain memory arrangement. These jumpers are meant to connect the BLK or
|
||
RAM lines to the system ground. These lines, when connected, tell the
|
||
Vic20 where to place the cartridge within the Vic20's internal memory
|
||
mapping scheme.
|
||
|
||
While all "normal," autostart game cartridges are located in one fixed
|
||
area of memory, this is not true with all cartridges. A rare few of the
|
||
total Vic20 cart collection did not use the autostart procedure; you had
|
||
to type in a systems number to start the program running after inserting
|
||
it. These are very rare, however (6 out of 150+ so far). Most cartridges
|
||
all autostart after insertion and power-up, just as cartridges do in game
|
||
console systems.
|
||
|
||
All this memory banking may seem confusing. If it does, remember this:
|
||
Every cartridge that autostarts must have at least one bank of memory in
|
||
Block 5, or the autostart procedure will not function. If it autostarts,
|
||
there has to be some memory in Block 5. That may help relieve some
|
||
confusion. There may be additional memory installed as well, in some
|
||
cases, for more storage space. The location of this additional memory is
|
||
less important than the location of the autostart bank. However, there
|
||
are only three additional 8k banks left, for a total of four banks of
|
||
user-added RAM or ROM memory. The Vic20 was built when memory was
|
||
expensive, and computers were designed to be bare-bones memory-wise with
|
||
the capability to expand on later. This may take some getting used to at
|
||
first, but understanding it gets easier in time. Take it in stride for
|
||
now.
|
||
|
||
@(A): The Cartridge Auto-Starting Feature
|
||
|
||
Please note that if you already understand the autostarting system used
|
||
in the Commodore 64, this is nearly identical in procedure. Only certain
|
||
codes and memory locations differ; the rest applies to both machines.
|
||
|
||
The "normal" spot for an 8K cartridge to be located in memory is in
|
||
"Block 5"(which is located at $A000 to $BFFF). Again, this is not the
|
||
only possible spot in memory for a cartridge to be located, but it is the
|
||
only spot where the Vic20 will look for a cartridge that automatically
|
||
starts on power-up. This is because (at power up) the Vic20 looks for a
|
||
precise code in a precise spot to see if it should autostart a cartridge
|
||
or not. If the Vic20 finds this EXACT five-byte code, EXACTLY where it is
|
||
supposed to be located in memory, the Vic20 turns control over to the
|
||
cartridge. If not, it gives over control to the user, via the normal,
|
||
power-up Basic READY prompt screen.
|
||
|
||
|
||
This 8K autostart sequence code is shown below:
|
||
|
||
Address Hex value Decimal value ASCII values
|
||
|
||
$A004 $41 65 Capitol "A"
|
||
$A005 $30 48 Digit "zero"
|
||
$A006 $C3 195 Reverse "C" character
|
||
$A007 $C2 194 Reverse "B" character
|
||
$A008 $CD 205 Reverse "M" character
|
||
|
||
(You may note that the code above is symbolically saying $A000, and
|
||
Commodore Business Machines. In other words, that this is the right
|
||
software, for the right machine. The C64 uses $8000 instead.)
|
||
|
||
If the computer finds this five-byte sequence exactly as shown, it turns
|
||
its control over to the machine language program in the cartridge. To do
|
||
so, it needs to know where the program begins. There are four bytes which
|
||
determine this, as shown in the chart below. Note that this is in the
|
||
cart, not the Vic20.
|
||
|
||
Address What this byte of information contains
|
||
|
||
$A000 Low-byte of 16-bit "cold start" address (power-up)
|
||
$A001 High-byte of 16-bit "cold start" address
|
||
$A002 Low-byte of 16-bit "warm start" address (restore key)
|
||
$A003 High-byte of 16-bit "warm start" address
|
||
|
||
Let's do a quick summary of this before we go on. You plug a cartridge
|
||
into the Vic20. You turn the power on. The Vic20 starts its own built-in
|
||
operating system software. It gets itself ready to be used, either by the
|
||
user (in BASIC) or by a cartridge's program.
|
||
|
||
One of the last steps in the computer's start-up sequence is to look at a
|
||
certain spot in memory, to see (A) if there is a cartridge inserted
|
||
there, and (B) if it is the proper type. It does both these tasks through
|
||
simple assumptions. Assuming that the existence of an autostart code
|
||
sequence at a certain memory address implies a cartridge is present, the
|
||
computer looks for the "A0CBM" code sequence. If it finds it, it then
|
||
transfers control to the locations specified at $A000-$A003, as defined
|
||
above. (In many cases, this address is $A009 or 40969 ... the next
|
||
byte possible after all the start-up codes.)
|
||
|
||
@(A): How to Archive Vic20 ROM Cartridges
|
||
|
||
Now that we know how the autostart process works, what can we do with
|
||
that information? Well, to archive a cartridge's internal ROM memory to
|
||
either tape or diskette, you have to know how the autostart process
|
||
works. This is necessary because you have to figure some way around it to
|
||
be able to get to that "no carts inserted" normal power-up screen. This
|
||
means that you then have full control of the machine, instead of the
|
||
cartridge being in full control.
|
||
|
||
Simply put, there are only two steps to archiving a cartridge from its
|
||
cart to disk or tape.
|
||
|
||
1. Find some method of defeating the autostart process, so that the
|
||
Vic20 powers up with the cartridge in memory, but does not start it up.
|
||
So that you are in control, instead of the cartridge running the show.
|
||
|
||
2. Copy that area in memory where the cartridge resides, to tape or
|
||
disk. The resulting program is called an "image" of the cartridge's
|
||
memory.
|
||
|
||
After that, assuming there is no copy-protection coded into the original,
|
||
you have a working version of the program stored on disk/tape instead of
|
||
on ROM.
|
||
|
||
Some problems may arise, but don't worry, they are easy to get around if
|
||
you know how to do it.
|
||
|
||
A. There may be more than one block of memory to copy. The one found at
|
||
Block 5 is easy, because if the cart auto-starts, there must be memory
|
||
that needs to be copied. However, additional memory may be present. You
|
||
will need to determine where it is, and how much of it there is.
|
||
|
||
B. Depending on how you transferred the image to disk (assume I mean
|
||
"disk or tape" from now on), was the loading address information stored
|
||
with the image? If it was you can reload it easily next time. Without
|
||
those two important address bytes (these are separate from those we
|
||
discussed earlier), the software won't load properly, and so will not
|
||
work.
|
||
|
||
OK, so now you're convinced it<69>s impossible, right? For every problem,
|
||
there is always a number of solutions. I wrote a small program that
|
||
eliminates most of the problems inherent in archiving carts, and have
|
||
figured out ways of eliminating most of the hassles. The program also
|
||
makes the process more reliable, since archiving rare and cool things is
|
||
the main idea. I'll make that program publicly available, soon, after a
|
||
bit of polishing.
|
||
|
||
But you still have to get around that auto-start procedure. Without doing
|
||
that first, you are dead in the water before you've even started. So,
|
||
here's how you get around the autostart procedure. After that, its all
|
||
downhill!
|
||
|
||
There are a number of suggested methods shown below. My suggestion is to
|
||
pick out the method you like best and stick with it. The rest will just
|
||
be to satisfy your built-in hacking curiosity, OK? Other methods exist
|
||
but I didn't feel they warranted the space here. These are some of the
|
||
best ways.
|
||
|
||
@(A)method1: Inserting a Cartridge Into a Powered Computer
|
||
|
||
Please pay attention to what I am about to say: this is the only method I
|
||
DO NOT recommend! I mention it mainly because it represents a very real
|
||
risk of killing your hard-to-replace Vic20 computer system. This is
|
||
supposed to be an exercise in keeping things alive and usable, not
|
||
killing more off! If you feel you want to try this, you do it at your own
|
||
risk!
|
||
|
||
I once knew a guy that wanted to archive Vic20 carts, but wasn't willing
|
||
to go to a lot of effort to find a good way to get around the autostart
|
||
feature. When he told me what he was doing, I tried to warn him. He kept
|
||
on doing it, saying he'd "just be careful." The next thing I know, he is
|
||
asking me how to repair a computer that died suddenly. I told him the
|
||
truth: (A) you don't, you go find and buy another one, and (B) you listen
|
||
to me the next time I tell you that you're risking your almost
|
||
irreplaceable hardware.
|
||
|
||
If that didn't convince you, well, I tried. There are better methods, by
|
||
far! If you can't find a better one than this, pay someone to modify your
|
||
Vic20, or just loan the cart in question to someone who is more used to
|
||
doing this!
|
||
|
||
@(A)method2: Altering Your Computer's Operating System ROM
|
||
|
||
What this method does is change the copy of the code to check for, inside
|
||
the Vic20, so that no cartridge's unaltered code ever matches it. So no
|
||
autostart.
|
||
|
||
No cart will ever match the modified start-up code in your new operating
|
||
system, so none will ever be seen as a cart. However, having one of these
|
||
chips installed permanently could be a bad idea, as you cannot test or
|
||
start your saved images quite as easily. The image won't autostart
|
||
either, unless you are willing to keep swapping chips back and forth, or
|
||
unless you know how to decode the starting addresses and type in systems
|
||
numbers.
|
||
|
||
This is an elegant way to solve the problem, providing you possess tools
|
||
to read and program EPROM ICs and can obtain replacement ICs that
|
||
are pin-compatible. Thus, the elegant solution requires a substantial
|
||
amount of resources.
|
||
|
||
However, one chip does exist, which is expensive if you buy it new, and
|
||
may be hard to find as well. (Try posting to "comp.sys.cbm.") If you can
|
||
find a Motorola 68764 chip, you're almost there! Just copy the Kernal rom
|
||
to disk, modify the "A0CBM" code found there to be anything but that, and
|
||
burn a new EPROM of your modified Kernal rom. The manual to the Promenade
|
||
EPROM-writing machine makes programming these chips a snap. And the
|
||
Promenade is still available today, from it makers, Jason-Ranheim Co.
|
||
(Phone: 916-878-0785, or 1-800-421-7731.) These same 68764 chips work
|
||
with C64's internals, too.
|
||
|
||
This does work. It has the advantage of requiring no modifications to
|
||
your Vic20 which can't be easily reversed. Before I got tired of swapping
|
||
Kernal chips back and forth, this was my preferred method of archiving
|
||
cartridges.
|
||
|
||
@(A)method3: Using a Cartridge Port Epander
|
||
|
||
I've come to feel that a plug-in board is the best way to modify things
|
||
just long enough to get past the start-up process, skip the autoboot
|
||
phase, and get down to business. If you can find one, buy it! It makes
|
||
life so much easier and nicer, in more ways than just this one. I highly
|
||
recommend buying one.
|
||
|
||
Basically, this device lets you plug in lots of carts at once, and with
|
||
just a button press, decide which one to use at any given time. Well,
|
||
that switch is all you need! Just (A) turn the computer off and insert a
|
||
cartridge, (B) make sure all the switches are de-activated, (C) turn the
|
||
computer on. You should now be looking at a normal, BASIC power-up
|
||
screen. Now (D) press the button that activates the slot that your
|
||
cartridge is plugged into, so that the cartridge is now mapped into
|
||
memory properly, although belatedly, and (E) follow the instructions in
|
||
the next part of this text, to archive the cart.
|
||
|
||
Note that you can modify your Vic20 to do the same thing if you are handy
|
||
with a soldering iron. But as I don't want anyone killing their only
|
||
Vic20, maybe I'll save that for another article ... this one is almost at
|
||
deadline, and I don't want to rush things and make any mistakes!(Besides,
|
||
I don't know yet if anyone is interested enough to modify their Vic20's
|
||
to do this??)
|
||
|
||
@(A): Saving One or More Blocks of cartridge Memory to Disk or Tape
|
||
|
||
Once you've defeated the auto-start feature of the Vic20, the memory
|
||
contained in the cartridge is just another block of memory as far as the
|
||
Vic20 is concerned. You have full access privileges, with all that goes
|
||
with it, including the ability to save it to external storage.
|
||
|
||
You have three basic choices to save the block of memory to tape/disk.
|
||
You can either (A) wait until I release my program that does it
|
||
automatically, or (B) use a "memory save" feature of a machine language
|
||
monitor program (not built in) to save the 8K block of ROM memory, or you
|
||
can (C) just change four POKE's in the Vic20's memory. With this, your
|
||
cartridge is seen as if it were in the BASIC program memory area so that
|
||
the built-in "SAVE" command works.
|
||
|
||
It really works. The beauty of it all is that no additional programs are
|
||
needed. To save any block of cartridge-usable memory in the Vic20, just
|
||
type in four easy POKE commands, then tell the Vic to SAVE the program as
|
||
it would normally save any BASIC program. (You can even copy the system
|
||
ROMs that way, if you want to.)
|
||
|
||
For those of you already familiar enough with Commodore's style and
|
||
memory arrangement schemes to make sense of this, bytes 43 and 44
|
||
(decimal, not hex) are the pointers to the Start of Basic memory area,
|
||
and bytes 45 and 46 are the pointers to the Start of Variables, or in
|
||
other words, the End of Basic. Follow this chart, to save a block of
|
||
memory from these areas via pokes:
|
||
|
||
Block # Hex Address Poke 43,x Poke 44,x Poke 45,x Poke 46,x
|
||
5 $a000-bfff x = 0 x = 160 x = 0 x = 192
|
||
3 $6000-7fff x = 0 x = 96 x = 0 x = 128
|
||
2 $4000-5fff x = 0 x = 64 x = 0 x = 96
|
||
1 $2000-3fff x = 0 x = 32 x = 0 x = 64
|
||
|
||
Here's an example: to save block 5 (the most commonly used memory block)
|
||
you do the following steps.
|
||
|
||
0. Follow the previous instructions, to get to this point. (The
|
||
cartridge has been inserted, power is now turned on, and the autostart
|
||
has been defeated. The Vic20 is showing you its normal BASIC power-up
|
||
screen.)
|
||
|
||
1. Type the following, hitting RETURN after each line. (Type
|
||
carefully!)
|
||
|
||
POKE 43,0 (and return)
|
||
POKE 44,160 (and return)
|
||
POKE 45,0 (and return)
|
||
POKE 46,192 (and return)
|
||
SAVE "FILENAME.EXT",8 (and return)
|
||
|
||
2. Wait for the disk drive to finish its saving process. (Be patient.)
|
||
|
||
3. If you have more 8k blocks to copy, repeat all the previous steps,
|
||
but adjust the POKE statements, according to the information in the
|
||
chart. Note that the pokes to 43 and 45 are always zero; even page
|
||
increments. Also, note that the computer will get confused or lock up if
|
||
you try to copy another block of memory without starting completely over.
|
||
|
||
4. When the busy light turns off again, turn the Vic20's power back
|
||
off. Remove the cartridge, and if you have a modified 8k or 16k RAM
|
||
expander insert it or activate it. If you have a 32k RAM expander, you
|
||
can use it.
|
||
|
||
5. Load the disk's directory up, (or rewind the tape), and see if the
|
||
file has been properly saved to the disk. It should show a file size of
|
||
33 blocks, if all has gone well ... 32 blocks x 256 bytes each = 8k, plus
|
||
one block for the disk drive's overhead and the file loading address.
|
||
|
||
6. If everything looks fine so far, just load the newly created "image"
|
||
into RAM memory, to see if it runs. Remember a few tips: as with the C64,
|
||
you always have to use the ,8,1 loading conventions for any machine
|
||
language program to reload into memory back where it came from.
|
||
|
||
Also, to properly load up an image that has more than one 8k bank, you
|
||
will have to type NEW after each load to reset some memory pointers.
|
||
Otherwise, it moves BASIC to where the cart now is and gets confused. So
|
||
multi-loads are: (A) LOAD"file1",8,1 (B) NEW (C) LOAD"file2",8,1
|
||
|
||
7. The last step is starting up the image, to see it in all its new
|
||
glory! To do this, all you have to do is (A) press the reset button
|
||
you've installed yourself, or if you don't have one installed, (B) type
|
||
the following "reset" command into the computer... SYS 64802 (and
|
||
return).
|
||
|
||
8. At this point, your image is probably running. If it is not,
|
||
carefully recheck all the previous instructions. You may have made a
|
||
mistake or two there, somewhere. (One mistake I have often made is to
|
||
forget to re-activate the expansion chassis' slot, and essentially save
|
||
empty air.)
|
||
|
||
@(A): Troubleshooting
|
||
|
||
But if you recheck everything, and it STILL doesn't work, try archiving
|
||
another cartridge. If the first does not work, but the second one does,
|
||
you have likely found one of the few protected carts out there. How to
|
||
"break" the copy protection is way out of the scope of this article, so I
|
||
can't help you there! Sorry. But usually, everything will be fine by now,
|
||
if you've followed the instructions carefully, step-by-step. Only about
|
||
10% of the VIC-20 cartridges were copy protected.
|
||
|
||
=========================================================================
|
||
|
||
@(#)next: The Next Hack
|
||
|
||
What? Why are you reading this? Aren't you happy with the issue you
|
||
have? We walked through the snow with no shoes uphill both ways to
|
||
deliver this to you and you are still asking for more? Have you even
|
||
read the issue you have in your hot little hands? Demanding reader,
|
||
aren't you. OK, here's what's coming up:
|
||
|
||
o We continually receive comments from folks trying to learn ML
|
||
programming. They have copies of C=Hacking in hand, but lament that
|
||
the concepts are too advanced for them. Well, next time we'll review
|
||
some resources for the beginning ML programmer. Two of them, _Coder's
|
||
World_ and _Bonkers_ are organized in publication format and go
|
||
over many of the details that every ML programmer must learn.
|
||
|
||
o We're not sure which one will get here first, but Frank Kontros
|
||
is writing up some of his impressive hardware and software projects
|
||
as we write. It might be the EPROM programmer, the Digital I/O
|
||
board, or one of his many software exploits. WE'll spotlight one
|
||
next time.
|
||
|
||
o For many years, Commodore 64/128 users have been able to purchase
|
||
stereo SID cartridges like the SID Symphony by CMD. However, there's
|
||
not an overabundance of games or applications that take advantage
|
||
of the second SID. Frank Kontros overcomes that problem in a non-
|
||
obvious way by showing how to build a "pseudo'stereo" adaptor for
|
||
your C64 or 128. The effect is noticeable and it requires no programming
|
||
changes.
|
||
|
||
o And, of course, C=Hacking's regular goodies.
|
||
|
||
Now, go back and re-read those articles. We need some sleep....
|
||
|
||
=========================================================================
|
||
|
||
@(#)code: Hacking the Code
|
||
|
||
Being a technical, developer oriented magazine, some articles featured
|
||
in C=H include executables or other binary files as part of the article.
|
||
All such binary files are included on the soft copy of this issue in this
|
||
section. In an effort to retain the integrity of such binary files through
|
||
distribution over various computer networks, the binaries in this section
|
||
have been encoded using the UUcode format, a popular Internet
|
||
binary-to-readable text encoding method. In order to execute or otherwise
|
||
utilize these binary files, one must feed this section of the magazine
|
||
to a UUdecoding application. Typical examples include UUXFER for the 64,
|
||
uudecode on the ACE OS for the 64 and 128, and uudecode on most UNIX OS
|
||
machines. Some encoders can decode multiple files, while others will
|
||
require the user to manually split this section into individual pieces
|
||
prior to decoding.
|
||
|
||
In addition to this section, there are other ways to retrieve the
|
||
binary files featured in this issue. For those with World Wide Web
|
||
access, the files are available at http://www.msen.com/~brain/pub/
|
||
To retrieve "dim4.lnx", simply access the URL:
|
||
|
||
http://www.msen.com/~brain/pub/dim4.lnx
|
||
|
||
For those with electronic mail access only, the Commodore Hacking
|
||
MAILSERV server also contains a copy of these files. To retrieve a
|
||
copy of "dim4.lnx", send the following email message:
|
||
|
||
To: brain@mail.msen.com
|
||
Subject: MAILSERV
|
||
Body of Message:
|
||
|
||
send dim4.lnx
|
||
help
|
||
quit
|
||
|
||
For some articles published in Commodore, the author or authors may also
|
||
have other methods for accessing files mentioned in the article. These
|
||
methods are described in the respective article.
|
||
|
||
Commodore Hacking always attempts to provide the reader with as many
|
||
options as possible to retrieve uncorrupted binary files. Although none
|
||
of these above methods is foolproof, the added redundancy helps overcome
|
||
any shortcomings.
|
||
|
||
WARNING: The UUCode format translates files from binary to ASCII, not
|
||
PETSCII. Therefore, either decode this section before downloading this
|
||
section to a PETSCII mode computer system, or download this section without
|
||
translation to PETSCII. Some decoder programs can handle PETSCII converted
|
||
UUCode files, but the practice is not recommended because conversion is
|
||
typically done in a telecommunications program and accuracy in
|
||
translation cannot be guaranteed.
|
||
|
||
@(A)menucode1: Menu Toolbox at $1000 (4096)
|
||
|
||
begin 644 mbox1000.bin
|
||
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
|
||
M\%')%/!8KJLK\`-,VBB@`+FL*\U0+/`(R,!2T/-,VBBM4"S)#?`LR13P,ZX#
|
||
M+.P4+)`#[A0L[@,LK5`LKJHKCH8"(-+_(.@IK`,LK5`LD?U,VBBM%"R%_"``
|
||
M*DSH)ZT#+-`#3-HHS10LL`8@NBI,VBBM%"S0`TS:*,X4+,X#+*F=(-+_J2`@
|
||
MTO\@TO^IG2#2_R#2_R#H*4S:**D!A?NM`RP8;00LJ+'1"8"1T:VI*Y'S8*D`
|
||
MA?NM`RP8;00LJ+'1*7^1T:VJ*Y'S8"``*JT#+,D!L`8@Z"E,VBC.`RP@Z"FI
|
||
MG2#2_TS:*"``*JT#+,T4+)`#3-HH[@,L(.@IJ1T@TO],VBBMJROP"ZT4+,VK
|
||
M*Y`#3-HHI?V%^:7^A?KF^=`"YOJL%"RQ_9'YB,P#+-#VK`,LR*D@D?VM!"R%
|
||
MTR!LY>X4+*T4+,DGD`6I)HT4+*`!L?T@TO_(S!0L\/60\ZT#+!AM!"R%TR!L
|
||
MY4S:**7]..D!A?FE_ND`A?JL`RS([A0LL?V1^<C,%"SP]I#TSA0LK00LA=,@
|
||
M;.7.`RR@`;'](-+_R,P4+-#UJ2`@TO_.%"RM`RP8;00LA=-,;.6M/2R%_:T^
|
||
M+(7^3"H@(-T;A/N%_""H'8U0+*``(!H@L2*1^R#T(\C,4"S0\ZD-D?L@(B!,
|
||
M]".M62R-HRNM5RR-I"NM6"R-I2NI`(U7+(U8+(U9+""C)NY7+-`#[E@LK5@L
|
||
MS40LD.VM5RS-0RR0Y?#CK:,KC5DLK:0KC5<LK:4KC5@L(),EK:,KC5DLK:0K
|
||
MC5<LK:4KC5@L3/LC``````!&!P$`04)#1$5&1TA)2DM,34Y/4%%24U155E=8
|
||
M65K!PL/$Q<;'R,G*R\S-SL_0T=+3U-76U]C9VB`Q,C,T-38W.#DP*RU<(2,D
|
||
M)28G*"E>*BXO.CT-%`````````````````````````!7)```ORT````````(
|
||
M```````````````````````````````````````!`>\O````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M`````````````````````````````````0$!``````!4````````````````
|
||
M`````````0\)#@(&``4)"P(`"P4&#`````````````````````````!?:0$"
|
||
M#PP")!<7`R46%J`#P]+3TB_2Q=35TLX@U$\@TT5,14-4````````````````
|
||
M````````````!P$```$/`P,$`````````````````````*`#```G`!@#`28!
|
||
M%U]I`PX"(P,%`R0"!`$$(P,#H`$`````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M`````````````$*))!I8))%"B'-P<(AG!P>!&!AF9A@8@8!D1@@08B8!!Q@@
|
||
M,`P$&.`D),,8&,,D)%6J5:I5JE6JS#/,,\PSS#-F@68\9H%F/%K;&.?G&-M:
|
||
M$1$B(D1$B(@1$2(R3$2(B,`P#`/`,`P#P#`,"]`P#`,1$:JJ1$2JJO5$1$!?
|
||
M1$0$B%`@4(@```"J5:I5JE6J5:JJJJI55555`@H(*""@@((!`0$"`@49X0$"
|
||
M'.`!`AS@B!$B1(A$(A$B1(A$(D2(1`000@@A!!``0*1*!"!2)0)!(A2(%")!
|
||
M"$$JE"*4*D$4@1@89F88&($!)F(0"$9D@(/&;#@8#`8#*!""1((0*`#=$7=$
|
||
MW1%W1`Q@`QC`!C"!4HA2`"6()0`4$LDDDT@H*!ADK()J3#``_\#>WL;V]@9T
|
||
M(A>[<2)'[G6NU;I7ZEVKP]L8?GX8V\.`1`@0($0"`?__________`1$0?!`1
|
||
M`<<1$1'^$1$1[_]@9F9F9F8&P_`\#\/P/`\0.$2"`8)$.(1F2!`DS$(!<(@'
|
||
M`'"(!P`B290B22*42:2DI*1*2DI*$43N1!%$[D0!;6T0;6T![J2DI.1*2DI.
|
||
@*`!4`"@``0`2"81"0H0)$D2(1(A$B$2(B@4B4*A0(@50
|
||
`
|
||
end
|
||
|
||
@(A)menucode2: Menu Toolbox at $8000 (32768)
|
||
|
||
begin 644 mbox8000.bin
|
||
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
|
||
M\%')%/!8KJN;\`-,VIB@`+FLF\U0G/`(R,!2T/-,VIBM4)S)#?`LR13P,ZX#
|
||
MG.P4G)`#[A2<[@.<K5"<KJJ;CH8"(-+_(.B9K`.<K5"<D?U,VIBM%)R%_"``
|
||
MFDSHEZT#G-`#3-J8S12<L`8@NII,VIBM%)S0`TS:F,X4G,X#G*F=(-+_J2`@
|
||
MTO\@TO^IG2#2_R#2_R#HF4S:F*D!A?NM`YP8;02<J+'1"8"1T:VIFY'S8*D`
|
||
MA?NM`YP8;02<J+'1*7^1T:VJFY'S8"``FJT#G,D!L`8@Z)E,VIC.`YP@Z)FI
|
||
MG2#2_TS:F"``FJT#G,T4G)`#3-J8[@.<(.B9J1T@TO],VIBMJYOP"ZT4G,VK
|
||
MFY`#3-J8I?V%^:7^A?KF^=`"YOJL%)RQ_9'YB,P#G-#VK`.<R*D@D?VM!)R%
|
||
MTR!LY>X4G*T4G,DGD`6I)HT4G*`!L?T@TO_(S!2<\/60\ZT#G!AM!)R%TR!L
|
||
MY4S:F*7]..D!A?FE_ND`A?JL`YS([A2<L?V1^<C,%)SP]I#TSA2<K02<A=,@
|
||
M;.7.`YR@`;'](-+_R,P4G-#UJ2`@TO_.%)RM`YP8;02<A=-,;.6M/9R%_:T^
|
||
MG(7^3"J0(-V+A/N%_""HC8U0G*``(!J0L2*1^R#TD\C,4)S0\ZD-D?L@(I!,
|
||
M]).M69R-HYNM5YR-I)NM6)R-I9NI`(U7G(U8G(U9G""CENY7G-`#[EB<K5B<
|
||
MS42<D.VM5YS-0YR0Y?#CK:.;C5F<K:2;C5><K:6;C5B<().5K:.;C5F<K:2;
|
||
MC5><K:6;C5B<3/N3``````!&!P$`04)#1$5&1TA)2DM,34Y/4%%24U155E=8
|
||
M65K!PL/$Q<;'R,G*R\S-SL_0T=+3U-76U]C9VB`Q,C,T-38W.#DP*RU<(2,D
|
||
M)28G*"E>*BXO.CT-%`````````````````````````!7)```OYT````````(
|
||
M```````````````````````````````````````!`>^?````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M`````````````````````````````````0$!``````!4````````````````
|
||
M`````````0\)#@(&``4)"P(`"P4&#`````````````````````````!?:0$"
|
||
M#PP")!<7`R46%J`#P]+3TB_2Q=35TLX@U$\@TT5,14-4````````````````
|
||
M````````````!P$```$/`P,$`````````````````````*`#```G`!@#`28!
|
||
M%U]I`PX"(P,%`R0"!`$$(P,#H`$`````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M````````````````````````````````````````````````````````````
|
||
M`````````````$*))!I8))%"B'-P<(AG!P>!&!AF9A@8@8!D1@@08B8!!Q@@
|
||
M,`P$&.`D),,8&,,D)%6J5:I5JE6JS#/,,\PSS#-F@68\9H%F/%K;&.?G&-M:
|
||
M$1$B(D1$B(@1$2(R3$2(B,`P#`/`,`P#P#`,"]`P#`,1$:JJ1$2JJO5$1$!?
|
||
M1$0$B%`@4(@```"J5:I5JE6J5:JJJJI55555`@H(*""@@((!`0$"`@49X0$"
|
||
M'.`!`AS@B!$B1(A$(A$B1(A$(D2(1`000@@A!!``0*1*!"!2)0)!(A2(%")!
|
||
M"$$JE"*4*D$4@1@89F88&($!)F(0"$9D@(/&;#@8#`8#*!""1((0*`#=$7=$
|
||
MW1%W1`Q@`QC`!C"!4HA2`"6()0`4$LDDDT@H*!ADK()J3#``_\#>WL;V]@9T
|
||
M(A>[<2)'[G6NU;I7ZEVKP]L8?GX8V\.`1`@0($0"`?__________`1$0?!`1
|
||
M`<<1$1'^$1$1[_]@9F9F9F8&P_`\#\/P/`\0.$2"`8)$.(1F2!`DS$(!<(@'
|
||
M`'"(!P`B290B22*42:2DI*1*2DI*$43N1!%$[D0!;6T0;6T![J2DI.1*2DI.
|
||
@*`!4`"@``0`2"81"0H0)$D2(1(A$B$2(B@4B4*A0(@50
|
||
`
|
||
end
|
||
|
||
=========================================================================
|
||
@(#): bottom
|
||
|
||
|
||
|