home *** CD-ROM | disk | FTP | other *** search
Text File | 2019-04-13 | 262.5 KB | 5,617 lines |
- @(#)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 a, and the fractions &188;, &189;, and &190; were put in
- their proper order.
- * Typing a shift-space now sends a space, rather than the a 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 youre 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. 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.
- from an art supply store, and liberally applied it to the CMD HD 85 MB
- drive mechanism. The opposite end of the Velcro. 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.. 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, isnt 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, its 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 its 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
- M`!!,>1M,]!M,&QU,0!U,$1M,WR9,^1U,;AY,XQY,)R%,%1],0Q],!B=,AB!,
- M,2%,WR5,=BA,?2A,"2M,%BM,'2M,TQ%,SQ!,3!%,O11,$A-,<1-,.Q-,6!-,
- ME!-,G!-,^Q-,/11,FQ1,'!M,+1M,/AM,3QM,RQ1,]A1,!Q5,&!5,(15,*!5,
- M7!5,>!5,B!5,K15,.A9,P!9,Q!9,!Q=,$!=,%Q=,&A=,;A=,@A=,BQ=,EA=,
- MO1=,PQ=,R1=,TA=,YQ=,]A=,$1A,)AE,3QA,[QHX(/#_CLHLC,DL(-T;A/R8
- MP`2P`6`8:02%_JD`A?V%^ZD3(-+_(`4?>*D`A0&B`Z``L=&1^\8!L?/F`9']
- MR-#QYM+F_.;TYO[*$.;&_J#IQ@&M(-#F`9']R,8!K2'0Y@&1_<BMRBR1_<BM
- MR2R1_:EWA0%8KLHLK,DL&$SP_ZD`C:HL(-T;A/R8&&D$A?ZI`(7]A?NI$R#2
- M_R`%'WBI`(4!H@.@`+'1C5`L+*HL$`FM4"PIO\D@T`RQ^Y'1L?W&`9'SY@'(
- MT-[FTN;\YO3F_LH0T\;^+*HL,!^@Z;']Q@&-(-#(Y@&Q_<8!C2'0Y@'(L?V%
- MULBQ_873J7>%`:D`C:HL6$QLY:D`A?V%_HU0+(W$+"#=&YBL4"R9HRSN4"S`
- M!=#O(*@=R1F0`JD9C<4LH`"Q(IEF+,C,Q2S0]2"]%*ZC+*``C+LL&"#P_R`%
- M'ZVH+(V\+"#<$B#D__#[H@"-Q"RNNRR.4"S)$?`0R9'P'R#U$LD-\"_0`$PD
- M$NZ[+*V[+,VF+-!2J0"-NRQ,I1+.NRRMNRS)__`#3*42K*8LB(R[+$RE$JW$
- M+/`&K5`L3(`2K;LL&&VC+*J@`"#P_R`%'ZVG+(V\+"#<$JV[+!AI`87]J0"%
- M_DPJ(*VC+!AMNRRJH``8(/#_(`4?K:@LC;PL(-P2K:,L&&U0+*J@`!@@\/\@
- M!1^MIRR-O"P@W!),)!*LI"RMO"R1\S`&L=%)@)'1R,RE+/#MD.M@JIA(H`"*
- MV68LT`B,NRRB#8[$+,C,Q2S0[6BHBF`@O10@W1N$TR#=&X36(&SE(*@=C5`L
- MK5`L\`V@`+$B(-+_R,Q0+-#U8""H'<D`\!6-4"R@`+$BR4&0!`F`D2+(S%`L
- MT/!@(*@=C5`LR0#P#J``L2(I?Y$BR,Q0+-#T8"#=&YBJH``8(/#_(*@=C5`L
- M2HW$+*D4..W$+(73(&SE3"@3J?^-JBQ,41$@W1N,QBP@W1N,QRP@W1N,R"P@
- MO12I$R#2_R`%'ZD8A?N@)['1S<8LT`RMQRR1T:W(+#`"D?.($.K&^S`=J2@8
- M9=&%T:D`9=*%TABI*&7SA?.I`&7TA?1,O1.I$TS2_R#=&XS++"#=&XS,+""]
- M%*D3(-+_(`4?J1B%^Z`GL?,I#\W++-`%K<PLD?.($._&^S#)&*DH9?.%\ZD`
- M9?2%]$P6%"#=&XQ<+"#=&XQ=+"#=&XQ>+"#=&XQ?+""]%*762*732*Y>+*``
- M&"#P_R`%'\Y<+*Q=++'S*0^JO:LLD?.(S%PLT/"EULU?+/`+YM8@;.4@!1],
- M;11HA=-HA=9,;.4@J!V%^R#D__#[H`#1(M`+R)B%_:D`A?Y,*B#(Q/O0[/#C
- MH!BYV0`)@)G9`(@0]6!(J0&-S2QH("D8JJD!H``@NO\@1QB%%"!'&(45IA2D
- M%:D`(-7_H`"8D:Y@AON$_*`#L?N9!RR($/A,_!V&^X3\H`.Q^YD'+(@0^$QQ
- M'HX,+(P-+$SO'HX]+(P^+&`@&B".%RR,&"R-&2R&^X3\&&7[A?NI`&7\A?R@
- M`+'[C54L($<8C58L($<8C1HL("(@3#`?CE4LC%8LJ0&-S2RI`(T/+(U7+(U8
- M+(U9+$Q?'X;[A/RD^Z7\H@&.S2Q,"2=(J0&-S2QH("D8KATLJ0&@`""Z_R!'
- M&(44($<8A16F%*053*(@J0&-S2R&^X3\H``@&B"I`(T>+(T/++'[C4HLC1\L
- MC0<L($<8C4LLC0@LC2`L($<8C4PLC0DLC2$L($<8C4TLC0HLC2(L($<8C48L
- M($<8C4<LC20LC0TL($<8C4@L($<8C4DL($<8C5<LC4$L($<8C5@LC4(L($<8
- MC4,L($<8C40L($<8C44L("(@3*@AAON$_"`:(*D!C1XLJ0"-#RR@`+'[C4HL
- MC1\LC0<L&&D=C4LLC0@LC2`L($<8C4PLC0DLC2$L($<8C4TLC0HLC2(L($<8
- MC48L($<8C4<LC20LC0TL($<8C4@L($<8C4DLJ0"-5RR-02R-6"R-0BRN/RRM
- M0"R.0RR-1"P@1QB-12P@(B!,J"&-'BQ@AON$_*D!C<TLH`"Q^XVJ*XV&`B!'
- M&(VI*R!'&(VK*Z73C00LJ0"-`RR-%"P@1QB-4"P@1QBE^X4BI?R%(ZU0+$RB
- M**X]+*P^+$P'&X;[A/Q,("M,("NI`8W-+(;[A/RI`(7]A?Z-4"R-Q"R@`+'[
- MC:,L($<8C:0L($<8C:4L($<8C:8L($<8C:<L($<8C:@L($<8C5`L($<8($<8
- MION&(J;\AB.M4"Q,\Q&-4"PX(/#_CLHLC,DLK%`LF$SD$*BI`(VJ+$Q4$1@@
- M\/^E(J0C3!ZK&"#P_R"O%TJ-Q"RI%#CMQ"R%TR!LY4PH$Z``L2+P`\C0^8Q0
- M+)A@(*\73$43(*\73&(3J*G_C:HL3%01("`8C<8L($<8C<<L($<8C<@L3*X3
- M("`8C<LL($<8C<PL3`<4("`8C5PL($<8C5TL($<8C5XL($<8C5\L3%44AB*$
- M(ZD!C<TL(*\73)X4AON$_*``L?M@AON$_(7](+W_I?T89?N%^ZD`9?R%_*``
- ML?N-'2Q@(/0CH`"Q^V`@W1N,SBP@W1N,SRP@W1N,TBP@W1N,TRP@W1N,#BT@
- MW1N,#"T@W1N,#RT@W1N,""T@W1N,$"T@W1N,"2T@W1N,"RT@W1N,"BU@K<XL
- MC2TMK<\LC2XMK=(LC2\MK=,LC3`MK0XMC3DMK0PMC3\MK0\MC2(MK0@MC=TL
- MK1`MC2@MC3DMK0LMC2'0K0HMC2#0HB2@+2`^&Z(IH"T@'!NB,:`M(/87HC6@
- M+2`^&Z(ZH"T@+1NBU*`L(/87HMB@+"`M&ZT(+8V&`JD!A<>IWH4BJ2R%(Z[:
- M+$R6%R"8&*D`C1$MC1(MC1,M(*@=CG\MC(`MC8$MJ0&%QZT_+8V&`JV!+4J-
- M4"RI%#CM4"RHKCPM&"#P_Z``L2(@TO_(S($MD/6I`8T2+:D`C1$M(-T;C'@M
- MC",M(*@=CE`LC'HMC7LMK1(M"AAM$BVJK5`LG7\MK7HMG8`MK7LMG8$MS1$M
- MD`.-$2WN$BW.(RW0R2"H'8U&+<D`\`V@`+$BF4<MR,Q&+9#UK1$M&&D"2HU0
- M+*D4..U0+(T=+8T8+8T4+:T1+1AI`6T=+8T>+8T9+8T5+:UX+1AI`DJ-4"RI
- M#3CM4"R-'RV-&BV-%BVM>"T8:0%M'RV-("V-&RV-%RVM"2WP'LX8+>X9+<X:
- M+>X;+:T0+8T<+<X4+>X5+<X6+>X7+<X4+<X5+>X6+>X7+:(4H"T@]A>M"2WP
- M!Z(8H"T@/ANB':`M("T;K!TMR*X?+>@8(/#_K2(MC88"J0&%QZD`C2,MK2,M
- M"AAM(RVJO8(MA2*]@RV%([V$+8U0+*``L2(@TO_(S%`LT/7FUJX=+>B&TR!L
- MY>XC+:TC+<UX+9#$KA\MZ(Y`+:X=+8Y!+:X>+8Y"+:UX+8U#+:T/+8U$+:T,
- M+8U%+:)`H"U,'Q<@J!V-4"R@`+$BF=XLR,Q0+)#UJ0"1(F"-#`..#0.,#@-@
- MHN^@+XX-`XP.`V"&%(05H`>Q%)DK+(@0^$R7&X84A!6@!;$4F2LLB!#X3`H<
- MAA2$%:`$L129*RR($/A,5!R&%(05H`6I`)DK+(@0^J``L12-+RS(L12-,"S(
- ML12-*RS(L12-+2Q,71VI`(74C3<L(.8;(-T;KC<LF)TK+.XW+*TW+,D(D.RM
- M+2R%UB!LY2`%'Z76*0&--RRL*RRN-RR]+RR1T;TQ+)'S[C<LK3<L*0&--RS(
- MS"PLD.+PX"#^'*76S2XLD,SPRJD33-+_(/VN((JM3/>WH!BYV0`)@)G9`(@0
- M]6"I`(U0+"#=&YBN4"R=*RSN4"S@!=#O(.8;I=9(I=-(KBTLH``8(/#_(`4?
- MSBLLK"PLK2\LR?_P`I'1K3`LD?.(S"LLT.REULTN+/`&(/X<3"(<J1,@TO]H
- MA=-HA=9,;.4@YANEUDBETTBN+2R@`!@@\/\@!1^L+"RM+RQ(*8`);I'1:)'S
- MB*TO+$@I@`E`D=%HD?.(S"LLT.VM+RQ(*8`)<)'1:)'S(/X<I=;-+BRP':TO
- M+$@I@`E=K"LLD=&L+"R1T6B1\ZPK+)'S3)H<K"PLK2\L2"F`"7V1T6B1\XBM
- M+RQ(*8`)0)'1:)'SB,PK+-#MK2\L2"F`"6V1T6B1\VB%TVB%UB!LY4SF&^;6
- MJ2@89=&%T:D`9=*%TJDH&&7SA?.I`&7TA?1@(-T;C"LL(-T;C"PL(-T;C"TL
- M(-T;C"XL(-T;C"\LHBN@+$Q4'"#=&XPO+(TP+"#=&XPK+"#=&XPM+*D`C2PL
- MC2XLH`(.*RPN+"R($/>@`@XM+"XN+(@0]ZTO+!AM+2R-H!VM,"QM+BR-H1VM
- M*RP8:1>-G1VM+"QI+HV>'2`:(*`'N3DLF0#`B!#W3"(@(/VN()ZM(*.VIB*D
- M(V"E>DBE>TB&>H1[((NPA4F$2FB%>VB%>F"%9(1E3%*JH$^I`)F_+8@0^F`@
- MW1N,!RP@W1N,""P@W1N,"2P@W1N,"BQ@(.`=K`<LK@DLC@XL&"#P_R`%'QBE
- MT6DHA?NETFD`A?P8I?-I*(7]I?1I`(7^K`<LL?N1T;']D?/(S`@L\/*0\.X.
- M+*T.+,T*++`=&*71:2B%T:72:0"%TABE\VDHA?.E]&D`A?1,#!ZN"BRL!RP8
- M3/#_(`4?(.`=K`<LK@HLC@XL&"#P_R`%'SBET>DHA?NETND`A?PXI?/I*(7]
- MI?3I`(7^K`<LL?N1T;']D?/(S`@L\/*0\,X.+*T.+,T)+/`=.*71Z2B%T:72
- MZ0"%TCBE\^DHA?.E].D`A?1,@1ZN"2RL!RP8(/#_3`4?(-T;C0PL(-T;C0TL
- MK`<LK0PLD=&M#2R1\\C,""SP\)#N8*72..V(`AAIV(7TI=&%\V`@J!V.%RR,
- M&"R-&2P@W1N,52R-5BP@W1N,&BP@^!\@&B"@`[D7+)'[B!#X3"(@J0&-#RRI
- M`(W-+(U7+(U8+(U9+"#=&XQ5+(U6+*T>+/`7K54LC5<LK58LC5@LJ0"-52R-
- M5BQ,LB<@^!\@&B"@`['[F1<LB!#X("(@K0\LT#>I28VH*ZU9+!AM5RR%_844
- MJ0!M6"R%_H45KLTLT`,@*B"M&BR%_:D`A?ZI1HVH*Z[-+-`P("H@K1<LA?VM
- M&"R%_J``(!H@L?V9ORW(S!DLD/7P\ZT9+(T4+"`B(*T/+/`#3.@G8*U5+(7]
- MK58LA?X&_2;^!OTF_ABM/2QE_87[K3XL9?Z%_&!(J71XA0%H8$BI=X4!:%A@
- MK<TL\`:I`(W-+JZNJE_4BE_DBI`(7]A?ZMJ"N%^ZDEA?RE>DBE>TBI^X5Z
- MJ0"%>R"+L*``I?Z11\BE_9%':(5[:(5ZH`)HD5_(:)%?8*TK+(U5+*TL+(U6
- M+&`@J!T@O?\@W1N,'2R8JJD!H``@NO\@W1NF%*05CALLAJZ,'"R$KZD`(,#_
- M(,S_H@$@QO\@Y/\@Y/^@`"#D_R`:()&N("(@YJ[0`N:O(+?_*4+PZ*D!(,/_
- M(,S_I:XX[1LLC3\LI:_M'"R-0"R@!$Y`+&X_+(@0]ZT_+#CI`HT_+(7]K4`L
- MZ0"-0"R%_B`J(*T;+!AI((T;+*T<+&D`C1PL8"#=&XP]+(T^+&"I`(W-+(U!
- M+(U"+(T>+(T/+"#=&XQ*+(P?+(P'+"#=&XQ++(P(+(P@+"#=&XQ,+(P)+(PA
- M+"#=&XQ-+(P*+(PB+"#=&XQ&+"#=&XQ'+(PD+(P-+"#=&XQ(+"#=&XQ)+"#=
- M&XQ7+(U8+"#=&XQ#+(U$+"#=&XQ%+*F@KD8LT`*I((TC+(T,+*(?H"P@+1NM
- M32PX[4PLC4XLK4LL..U*+(U;+""3):D`(.3_\/O)+=`"J9W)*]`"J1W)(-`"
- MJ0W)7]`"J87)5-`+KD4L\`8@/RL@^R/)$=`,($HD(+<B(/LC3-<AR9'0#"!*
- M)"#S(B#[(TS7(<D3T`D@2B0@425,UR')D]`)($HD(&TE3-<AR1W0"2!*)"`G
- M)4S7(<F=T`D@2B0@.R5,UR')A=`(K44L\`-,2B3)#=!-($HDK5DL&&U7+(7]
- MJ0!M6"R%_JU%+/`2(*,F(/LCJ1&-=P*I`87&3-<AJ0&-#RRM'BSP`TRR)R!?
- M'ZU9+!AM5RR%_:D`;5@LA?Y,*B!,UR&M62S-3BRP!.Y9+&"M62P8;5<LA?NI
- M`&U8+(7\I?S-1"R0"*7[S4,LD`%@(/P=(.\>[E<LT`/N6"Q,,".M62SP!,Y9
- M+&"M6"P-5RS0`6"M0BS-6"R0":U!+,U7+)`!8"!Q'B#O'JU7+#CI`8U7+*U8
- M+.D`C5@L3#`CK5DL&&U7+(U5+*D`;5@LC58LK1XL\`8@7R9,4",@>Q^M1BR%
- MQZU'+*X:+/`#K4DLC88"K4PL&&U9+*JL2BS(&"#P_R`%'ZT7+(7[K1@LA?RL
- M2BRMA@*1\\C,2RR0^/#VK1XLT!F@`"`:(+'[("(@(-+_R,Q;++`%S!DLD.I@
- MK1<LA?NM&"R%_"`:(*``L?N%_2#T(['[*7^F_2`B("#-O2#T(ZD@(-+_(-+_
- MH``@&B"Q^R`B("#2_\BETSCM'RS)'9#J8.;[T`+F_&"M'BSP`TR9)*U9+!AM
- M5RR-52RI`&U8+(U6+"!['ZU,+!AM62RJK$PLR!@@\/\@!1^L2BRQT4F`D=&M
- M2"RN&BSP`ZU)+)'SR,Q++)#G\.5@K1XL\`-,X"2M62P8;5<LC54LJ0!M6"R-
- M5BP@>Q^M3"P8;5DLJJQ,+,@8(/#_(`4?K$HLL=%)@)'1K4<LKAHL\`.M22R1
- M\\C,2RR0Y_#E8*U9+!AM5RR-52RI`&U8+(U6+"!?)JU,+!AM62RJK$PLR!@@
- M\/\@!1^L2BRQT4F`D=&M2"RN&BSP`ZU)+)'SR,Q++)#G\.5@K5DL&&U7+(U5
- M+*D`;5@LC58L(%\FK4PL&&U9+*JL3"S(&"#P_R`%'ZQ*++'128"1T:U'+*X:
- M+/`#K4DLD?/(S$LLD.?PY6"M3BR-62R-42P@MR+.42S0^$S[(ZD`C5DLK4XL
- MC5$L(/,BSE$LT/A,^R.M62SP"*D`C5DL3/LCK4$LC5<LK4(LC5@L3),EK5DL
- MS4XLL`FM3BR-62Q,^R.M0RPX[4XLC5<LK40LZ0"-6"Q,DR6I`(U9+*(?H"P@
- M+1L@,"/N62RM'BSP(ZU`+-`>K3\LS5DLL!:M62R-3BS.3BP8;0DLC0HLC4TL
- M3-<EK5DLS4XLD,KPR*D`C5DL3/LCJ0&-'BRI`(W-+(T/+"#=&XQ*+(P?+(P'
- M+)@8:1V-2RR-""R-("P@W1N,3"R,"2R,(2P@W1N,32R,"BR,(BP@W1N,1BP@
- MW1N,1RR,)"R,#2P@W1N,2"P@W1N,22RI`*B,5RR,02R-6"R-0BRL/RRM0"R,
- M0RR-1"P@W1N,12Q,J"&@!`Y5+"Y6+(@0]ZT;+!AM52R-%RRM'"QM5BR-&"RM
- M%RR%^ZT8+(7\H``@&B"Q^XVF*\BQ^T@I?XVG*V@I@(T:+$PB(*T>+-`1(/@?
- M(!H@H`.Q^TF`D?M,(B"M62P8;5<LC54LJ0!M6"R-5BP@7R8@&B"@`;'[28"-
- M&BR1^TPB(""H'2"]_R#=&XP=+)BJJ0&@`""Z_R#=&Z84I!6I`"#5_Z``F)&N
- M8"#=&R`:((P%+(T&+*``C'XMYA30`N85L130]N84T`+F%:44C3TLI16-/BRM
- M!2R%%*T&+(45J0"-52R-5BRE%(T7+*45C1@L(!H@H`"Q%/`'R0WP`\C0]4B,
- M&2S,?BV0`XQ^+:D`C1HL("(@(#`?[E4LT`/N5BQH\!NL&2S(F!AM%RR-%RR%
- M%*D`;1@LC1@LA15,32<@(B"M52R%_:U6+(7^[GXMK7XMA11,*B"M62P8;5<L
- MC54LJ0!M6"R-5BP@7R8@&B"B`(X4+*`"L?O(R2+0^;'[R2+P"IV_+>X4+.C(
- MT/`@(B"MS2S05*(1H"P@MAVI%*`L(,X=(-4=J4*-J"NMIBN%_84BK:<KA?Z%
- M(R`J(*E)C:@KK5DL&&U7+(7]A12I`&U8+(7^A14@*B"I1HVH*ZT:+(7]J0"%
- M_DPJ(*U9+!AM5RR%%*D`;5@LA16MIBN%(JVG*X4CK1HLA?VI`(7^J0"-S2RB
- MOZ`MK10L3`<;(-T;C!XL8"#=&XRJ*XR&`B#=&XRI*R#=&XRK*Z73C00LJ0"-
- M`RR-%"P@J!W)`/`AC5`LS:LKD`.-JRN@`+$BF;\M(-+_[A0L[@,LR,Q0+)#L
- MJ;Z%_:DMA?ZI`(T(W(W^*R#H*2#D_]`JK0C<S0(L\/.-`BSN_BNM_BO)`]#F
- MJ0"-_BNE^_`&(``J3-HH(.@I3-HHC5`LR9W0`TP8*LD=T`-,-BK)E-`#3%(J
- MKJLKT!2N%"S@)M`-K5`LC7<"J0&%QDP`*JX#+.P4+)`:KA0L\!7LJRN0$,D-
- 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;6TY%,%8],0X],!I=,AI!,
- M,9%,WY5,=IA,?9A,"9M,%IM,'9M,TX%,SX!,3(%,O81,$H-,<8-,.X-,6(-,
- ME(-,G(-,^X-,/81,FX1,'(M,+8M,/HM,3XM,RX1,]H1,!X5,&(5,(85,*(5,
- M7(5,>(5,B(5,K85,.H9,P(9,Q(9,!X=,$(=,%X=,&H=,;H=,@H=,BX=,EH=,
- MO8=,PX=,R8=,TH=,YX=,]H=,$8A,)HE,3XA,[XHX(/#_CLJ<C,F<(-V+A/R8
- MP`2P`6`8:02%_JD`A?V%^ZD3(-+_(`6/>*D`A0&B`Z``L=&1^\8!L?/F`9']
- MR-#QYM+F_.;TYO[*$.;&_J#IQ@&M(-#F`9']R,8!K2'0Y@&1_<BMRIR1_<BM
- MR9R1_:EWA0%8KLJ<K,F<&$SP_ZD`C:J<(-V+A/R8&&D$A?ZI`(7]A?NI$R#2
- M_R`%CWBI`(4!H@.@`+'1C5"<+*J<$`FM4)PIO\D@T`RQ^Y'1L?W&`9'SY@'(
- MT-[FTN;\YO3F_LH0T\;^+*J<,!^@Z;']Q@&-(-#(Y@&Q_<8!C2'0Y@'(L?V%
- MULBQ_873J7>%`:D`C:J<6$QLY:D`A?V%_HU0G(W$G"#=BYBL4)R9HYSN4)S`
- M!=#O(*B-R1F0`JD9C<6<H`"Q(IEFG,C,Q9S0]2"]A*ZCG*``C+N<&"#P_R`%
- MCZVHG(V\G"#<@B#D__#[H@"-Q)RNNYR.4)S)$?`0R9'P'R#U@LD-\"_0`$PD
- M@NZ[G*V[G,VFG-!2J0"-NYQ,I8+.NYRMNYS)__`#3*6"K*:<B(R[G$RE@JW$
- MG/`&K5"<3(""K;N<&&VCG*J@`"#P_R`%CZVGG(V\G"#<@JV[G!AI`87]J0"%
- M_DPJD*VCG!AMNYRJH``8(/#_(`6/K:B<C;R<(-R"K:.<&&U0G*J@`!@@\/\@
- M!8^MIYR-O)P@W(),)(*LI)RMO)R1\S`&L=%)@)'1R,REG/#MD.M@JIA(H`"*
- MV6:<T`B,NYRB#8[$G,C,Q9S0[6BHBF`@O80@W8N$TR#=BX36(&SE(*B-C5"<
- MK5"<\`V@`+$B(-+_R,Q0G-#U8""HC<D`\!6-4)R@`+$BR4&0!`F`D2+(S%"<
- MT/!@(*B-C5"<R0#P#J``L2(I?Y$BR,Q0G-#T8"#=BYBJH``8(/#_(*B-C5"<
- M2HW$G*D4..W$G(73(&SE3"B#J?^-JIQ,48$@W8N,QIP@W8N,QYP@W8N,R)P@
- MO82I$R#2_R`%CZD8A?N@)['1S<:<T`RMQYR1T:W(G#`"D?.($.K&^S`=J2@8
- M9=&%T:D`9=*%TABI*&7SA?.I`&7TA?1,O8.I$TS2_R#=BXS+G"#=BXS,G""]
- MA*D3(-+_(`6/J1B%^Z`GL?,I#\W+G-`%K<R<D?.($._&^S#)&*DH9?.%\ZD`
- M9?2%]$P6A"#=BXQ<G"#=BXQ=G"#=BXQ>G"#=BXQ?G""]A*762*732*Y>G*``
- M&"#P_R`%C\Y<G*Q=G+'S*0^JO:N<D?.(S%R<T/"EULU?G/`+YM8@;.4@!8],
- M;81HA=-HA=9,;.4@J(V%^R#D__#[H`#1(M`+R)B%_:D`A?Y,*I#(Q/O0[/#C
- MH!BYV0`)@)G9`(@0]6!(J0&-S9QH("F(JJD!H``@NO\@1XB%%"!'B(45IA2D
- M%:D`(-7_H`"8D:Y@AON$_*`#L?N9!YR($/A,_(V&^X3\H`.Q^YD'G(@0^$QQ
- MCHX,G(P-G$SOCHX]G(P^G&`@&I".%YR,&)R-&9R&^X3\&&7[A?NI`&7\A?R@
- M`+'[C56<($>(C5:<($>(C1J<("*03#"/CE6<C%:<J0&-S9RI`(T/G(U7G(U8
- MG(U9G$Q?CX;[A/RD^Z7\H@&.S9Q,"9=(J0&-S9QH("F(KAV<J0&@`""Z_R!'
- MB(44($>(A16F%*053**0J0&-S9R&^X3\H``@&I"I`(T>G(T/G+'[C4J<C1^<
- MC0><($>(C4N<C0B<C2"<($>(C4R<C0F<C2&<($>(C4V<C0J<C2*<($>(C4:<
- M($>(C4><C22<C0V<($>(C4B<($>(C4F<($>(C5><C4&<($>(C5B<C4*<($>(
- MC4.<($>(C42<($>(C46<("*03*B1AON$_"`:D*D!C1Z<J0"-#YR@`+'[C4J<
- MC1^<C0><&&D=C4N<C0B<C2"<($>(C4R<C0F<C2&<($>(C4V<C0J<C2*<($>(
- MC4:<($>(C4><C22<C0V<($>(C4B<($>(C4F<J0"-5YR-09R-6)R-0IRN/YRM
- M0)R.0YR-1)P@1XB-19P@(I!,J)&-'IQ@AON$_*D!C<V<H`"Q^XVJFXV&`B!'
- MB(VIFR!'B(VKFZ73C02<J0"-`YR-%)P@1XB-4)P@1XBE^X4BI?R%(ZU0G$RB
- MF*X]G*P^G$P'BX;[A/Q,()M,()NI`8W-G(;[A/RI`(7]A?Z-4)R-Q)R@`+'[
- MC:.<($>(C:2<($>(C:6<($>(C::<($>(C:><($>(C:B<($>(C5"<($>(($>(
- MION&(J;\AB.M4)Q,\X&-4)PX(/#_CLJ<C,F<K%"<F$SD@*BI`(VJG$Q4@1@@
- M\/^E(J0C3!ZK&"#P_R"OATJ-Q)RI%#CMQ)R%TR!LY4PH@Z``L2+P`\C0^8Q0
- MG)A@(*^'3$6#(*^'3&*#J*G_C:J<3%2!(""(C<:<($>(C<><($>(C<B<3*Z#
- M(""(C<N<($>(C<R<3`>$(""(C5R<($>(C5V<($>(C5Z<($>(C5^<3%6$AB*$
- M(ZD!C<V<(*^'3)Z$AON$_*``L?M@AON$_(7](+W_I?T89?N%^ZD`9?R%_*``
- ML?N-'9Q@(/23H`"Q^V`@W8N,SIP@W8N,SYP@W8N,TIP@W8N,TYP@W8N,#IT@
- MW8N,#)T@W8N,#YT@W8N,")T@W8N,$)T@W8N,"9T@W8N,"YT@W8N,"IU@K<Z<
- MC2V=K<^<C2Z=K=*<C2^=K=.<C3"=K0Z=C3F=K0R=C3^=K0^=C2*=K0B=C=V<
- MK1"=C2B=C3F=K0N=C2'0K0J=C2#0HB2@G2`^BZ(IH)T@'(NB,:"=(/:'HC6@
- MG2`^BZ(ZH)T@+8NBU*"<(/:'HMB@G"`MBZT(G8V&`JD!A<>IWH4BJ9R%(Z[:
- MG$R6AR"8B*D`C1&=C1*=C1.=(*B-CG^=C("=C8&=J0&%QZT_G8V&`JV!G4J-
- M4)RI%#CM4)RHKCR=&"#P_Z``L2(@TO_(S(&=D/6I`8T2G:D`C1&=(-V+C'B=
- MC".=(*B-CE"<C'J=C7N=K1*="AAM$IVJK5"<G7^=K7J=G8"=K7N=G8&=S1&=
- MD`.-$9WN$IW.(YW0R2"HC8U&G<D`\`V@`+$BF4>=R,Q&G9#UK1&=&&D"2HU0
- MG*D4..U0G(T=G8T8G8T4G:T1G1AI`6T=G8T>G8T9G8T5G:UXG1AI`DJ-4)RI
- M#3CM4)R-'YV-&IV-%IVM>)T8:0%M'YV-()V-&YV-%YVM"9WP'LX8G>X9G<X:
- MG>X;G:T0G8T<G<X4G>X5G<X6G>X7G<X4G<X5G>X6G>X7G:(4H)T@]H>M"9WP
- M!Z(8H)T@/HNB':"=("V+K!V=R*X?G>@8(/#_K2*=C88"J0&%QZD`C2.=K2.=
- M"AAM(YVJO8*=A2*]@YV%([V$G8U0G*``L2(@TO_(S%"<T/7FUJX=G>B&TR!L
- MY>XCG:TCG<UXG9#$KA^=Z(Y`G:X=G8Y!G:X>G8Y"G:UXG8U#G:T/G8U$G:T,
- MG8U%G:)`H)U,'X<@J(V-4)R@`+$BF=Z<R,Q0G)#UJ0"1(F"-#`..#0.,#@-@
- MHN^@GXX-`XP.`V"&%(05H`>Q%)DKG(@0^$R7BX84A!6@!;$4F2N<B!#X3`J,
- MAA2$%:`$L129*YR($/A,5(R&%(05H`6I`)DKG(@0^J``L12-+YS(L12-,)S(
- ML12-*YS(L12-+9Q,78VI`(74C3><(.:+(-V+KC><F)TKG.XWG*TWG,D(D.RM
- M+9R%UB!LY2`%CZ76*0&--YRL*YRN-YR]+YR1T;TQG)'S[C><K3><*0&--YS(
- MS"R<D.+PX"#^C*76S2Z<D,SPRJD33-+_(/VN((JM3/>WH!BYV0`)@)G9`(@0
- M]6"I`(U0G"#=BYBN4)R=*YSN4)S@!=#O(.:+I=9(I=-(KBV<H``8(/#_(`6/
- MSBN<K"R<K2^<R?_P`I'1K3"<D?.(S"N<T.REULTNG/`&(/Z,3"*,J1,@TO]H
- MA=-HA=9,;.4@YHNEUDBETTBN+9R@`!@@\/\@!8^L+)RM+YQ(*8`);I'1:)'S
- MB*TOG$@I@`E`D=%HD?.(S"N<T.VM+YQ(*8`)<)'1:)'S(/Z,I=;-+IRP':TO
- MG$@I@`E=K"N<D=&L+)R1T6B1\ZPKG)'S3)J,K"R<K2^<2"F`"7V1T6B1\XBM
- M+YQ(*8`)0)'1:)'SB,PKG-#MK2^<2"F`"6V1T6B1\VB%TVB%UB!LY4SFB^;6
- MJ2@89=&%T:D`9=*%TJDH&&7SA?.I`&7TA?1@(-V+C"N<(-V+C"R<(-V+C"V<
- M(-V+C"Z<(-V+C"^<HBN@G$Q4C"#=BXPOG(TPG"#=BXPKG"#=BXPMG*D`C2R<
- MC2Z<H`(.*YPN+)R($/>@`@XMG"XNG(@0]ZTOG!AM+9R-H(VM,)QM+IR-H8VM
- M*YP8:1>-G8VM+)QIGHV>C2`:D*`'N3F<F0#`B!#W3"*0(/VN()ZM(*.VIB*D
- M(V"E>DBE>TB&>H1[((NPA4F$2FB%>VB%>F"%9(1E3%*JH$^I`)F_G8@0^F`@
- MW8N,!YP@W8N,")P@W8N,"9P@W8N,"IQ@(."-K`><K@F<C@Z<&"#P_R`%CQBE
- MT6DHA?NETFD`A?P8I?-I*(7]I?1I`(7^K`><L?N1T;']D?/(S`B<\/*0\.X.
- MG*T.G,T*G+`=&*71:2B%T:72:0"%TABE\VDHA?.E]&D`A?1,#(ZN"IRL!YP8
- M3/#_(`6/(."-K`><K@J<C@Z<&"#P_R`%CSBET>DHA?NETND`A?PXI?/I*(7]
- MI?3I`(7^K`><L?N1T;']D?/(S`B<\/*0\,X.G*T.G,T)G/`=.*71Z2B%T:72
- MZ0"%TCBE\^DHA?.E].D`A?1,@8ZN"9RL!YP8(/#_3`6/(-V+C0R<(-V+C0V<
- MK`><K0R<D=&M#9R1\\C,")SP\)#N8*72..V(`AAIV(7TI=&%\V`@J(V.%YR,
- M&)R-&9P@W8N,59R-5IP@W8N,&IP@^(\@&I"@`[D7G)'[B!#X3"*0J0&-#YRI
- M`(W-G(U7G(U8G(U9G"#=BXQ5G(U6G*T>G/`7K56<C5><K5:<C5B<J0"-59R-
- M5IQ,LI<@^(\@&I"@`['[F1><B!#X("*0K0^<T#>I28VHFZU9G!AM5YR%_844
- MJ0!M6)R%_H45KLV<T`,@*I"M&IR%_:D`A?ZI1HVHFZ[-G-`P("J0K1><A?VM
- M&)R%_J``(!J0L?V9OYW(S!F<D/7P\ZT9G(T4G"`BD*T/G/`#3.B78*U5G(7]
- MK5:<A?X&_2;^!OTF_ABM/9QE_87[K3Z<9?Z%_&!(J71XA0%H8$BI=X4!:%A@
- MK<V<\`:I`(W-GJZNJE_4BE_DBI`(7]A?ZMJ)N%^ZDEA?RE>DBE>TBI^X5Z
- MJ0"%>R"+L*``I?Z11\BE_9%':(5[:(5ZH`)HD5_(:)%?8*TKG(U5G*TLG(U6
- MG&`@J(T@O?\@W8N,'9R8JJD!H``@NO\@W8NF%*05CAN<AJZ,')R$KZD`(,#_
- M(,S_H@$@QO\@Y/\@Y/^@`"#D_R`:D)&N("*0YJ[0`N:O(+?_*4+PZ*D!(,/_
- M(,S_I:XX[1N<C3^<I:_M')R-0)R@!$Y`G&X_G(@0]ZT_G#CI`HT_G(7]K4"<
- MZ0"-0)R%_B`JD*T;G!AI((T;G*T<G&D`C1R<8"#=BXP]G(T^G&"I`(W-G(U!
- MG(U"G(T>G(T/G"#=BXQ*G(P?G(P'G"#=BXQ+G(P(G(P@G"#=BXQ,G(P)G(PA
- MG"#=BXQ-G(P*G(PBG"#=BXQ&G"#=BXQ'G(PDG(P-G"#=BXQ(G"#=BXQ)G"#=
- MBXQ7G(U8G"#=BXQ#G(U$G"#=BXQ%G*F@KD:<T`*I((TCG(T,G*(?H)P@+8NM
- M39PX[4R<C4Z<K4N<..U*G(U;G""3E:D`(.3_\/O)+=`"J9W)*]`"J1W)(-`"
- MJ0W)7]`"J87)5-`+KD6<\`8@/YL@^Y/)$=`,($J4(+>2(/N33->1R9'0#"!*
- ME"#SDB#[DTS7D<D3T`D@2I0@495,UY')D]`)($J4(&V53->1R1W0"2!*E"`G
- ME4S7D<F=T`D@2I0@.Y5,UY')A=`(K46<\`-,2I3)#=!-($J4K5F<&&U7G(7]
- MJ0!M6)R%_JU%G/`2(*.6(/N3J1&-=P*I`87&3->1J0&-#YRM'ISP`TRRER!?
- MCZU9G!AM5YR%_:D`;5B<A?Y,*I!,UY&M69S-3IRP!.Y9G&"M69P8;5><A?NI
- M`&U8G(7\I?S-1)R0"*7[S4.<D`%@(/R-(.^.[E><T`/N6)Q,,).M69SP!,Y9
- MG&"M6)P-5YS0`6"M0IS-6)R0":U!G,U7G)`!8"!QCB#OCJU7G#CI`8U7G*U8
- MG.D`C5B<3#"3K5F<&&U7G(U5G*D`;5B<C5:<K1Z<\`8@7Y9,4),@>X^M1IR%
- MQZU'G*X:G/`#K4F<C88"K4R<&&U9G*JL2IS(&"#P_R`%CZT7G(7[K1B<A?RL
- M2IRMA@*1\\C,2YR0^/#VK1Z<T!F@`"`:D+'[("*0(-+_R,Q;G+`%S!F<D.I@
- MK1><A?NM&)R%_"`:D*``L?N%_2#TD['[*7^F_2`BD"#-O2#TDZD@(-+_(-+_
- MH``@&I"Q^R`BD"#2_\BETSCM'YS)'9#J8.;[T`+F_&"M'ISP`TR9E*U9G!AM
- M5YR-59RI`&U8G(U6G"![CZU,G!AM69RJK$R<R!@@\/\@!8^L2IRQT4F`D=&M
- M2)RN&ISP`ZU)G)'SR,Q+G)#G\.5@K1Z<\`-,X)2M69P8;5><C56<J0!M6)R-
- M5IP@>X^M3)P8;5F<JJQ,G,@8(/#_(`6/K$J<L=%)@)'1K4><KAJ<\`.M29R1
- M\\C,2YR0Y_#E8*U9G!AM5YR-59RI`&U8G(U6G"!?EJU,G!AM69RJK$R<R!@@
- M\/\@!8^L2IRQT4F`D=&M2)RN&ISP`ZU)G)'SR,Q+G)#G\.5@K5F<&&U7G(U5
- MG*D`;5B<C5:<(%^6K4R<&&U9G*JL3)S(&"#P_R`%CZQ*G+'128"1T:U'G*X:
- MG/`#K4F<D?/(S$N<D.?PY6"M3IR-69R-49P@MY+.49S0^$S[DZD`C5F<K4Z<
- MC5&<(/.2SE&<T/A,^Y.M69SP"*D`C5F<3/N3K4&<C5><K4*<C5B<3).5K5F<
- MS4Z<L`FM3IR-69Q,^Y.M0YPX[4Z<C5><K42<Z0"-6)Q,DY6I`(U9G*(?H)P@
- M+8L@,)/N69RM'ISP(ZU`G-`>K3^<S5F<L!:M69R-3IS.3IP8;0F<C0J<C4V<
- M3->5K5F<S4Z<D,KPR*D`C5F<3/N3J0&-'IRI`(W-G(T/G"#=BXQ*G(P?G(P'
- MG)@8:1V-2YR-")R-()P@W8N,3)R,"9R,(9P@W8N,39R,"IR,(IP@W8N,1IP@
- MW8N,1YR,))R,#9P@W8N,2)P@W8N,29RI`*B,5YR,09R-6)R-0IRL/YRM0)R,
- M0YR-1)P@W8N,19Q,J)&@!`Y5G"Y6G(@0]ZT;G!AM59R-%YRM')QM5IR-&)RM
- M%YR%^ZT8G(7\H``@&I"Q^XVFF\BQ^T@I?XVGFV@I@(T:G$PBD*T>G-`1(/B/
- M(!J0H`.Q^TF`D?M,(I"M69P8;5><C56<J0!M6)R-5IP@7Y8@&I"@`;'[28"-
- M&IR1^TPBD""HC2"]_R#=BXP=G)BJJ0&@`""Z_R#=BZ84I!6I`"#5_Z``F)&N
- M8"#=BR`:D(P%G(T&G*``C'Z=YA30`N85L130]N84T`+F%:44C3V<I16-/IRM
- M!9R%%*T&G(45J0"-59R-5IRE%(T7G*45C1B<(!J0H`"Q%/`'R0WP`\C0]4B,
- M&9S,?IV0`XQ^G:D`C1J<("*0(#"/[E6<T`/N5IQH\!NL&9S(F!AM%YR-%YR%
- M%*D`;1B<C1B<A15,39<@(I"M59R%_:U6G(7^[GZ=K7Z=A11,*I"M69P8;5><
- MC56<J0!M6)R-5IP@7Y8@&I"B`(X4G*`"L?O(R2+0^;'[R2+P"IV_G>X4G.C(
- MT/`@(I"MS9S05*(1H)P@MHVI%*"<(,Z-(-6-J4*-J)NMIIN%_84BK:>;A?Z%
- M(R`JD*E)C:B;K5F<&&U7G(7]A12I`&U8G(7^A14@*I"I1HVHFZT:G(7]J0"%
- M_DPJD*U9G!AM5YR%%*D`;5B<A16MIIN%(JVGFX4CK1J<A?VI`(7^J0"-S9RB
- MOZ"=K12<3`>+(-V+C!Z<8"#=BXRJFXR&`B#=BXRIFR#=BXRKFZ73C02<J0"-
- M`YR-%)P@J(W)`/`AC5"<S:N;D`.-JYN@`+$BF;^=(-+_[A2<[@.<R,Q0G)#L
- MJ;Z%_:F=A?ZI`(T(W(W^FR#HF2#D_]`JK0C<S0*<\/.-`ISN_INM_IO)`]#F
- MJ0"-_INE^_`&(`":3-J8(.B93-J8C5"<R9W0`TP8FLD=T`-,-IK)E-`#3%*:
- MKJN;T!2N%)S@)M`-K5"<C7<"J0&%QDP`FJX#G.P4G)`:KA2<\!7LJYN0$,D-
- 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
-
-
-