magazines:chacking13
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | magazines:chacking13 [2015-04-17 04:34] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
+ | ######## | ||
+ | ################## | ||
+ | ###### | ||
+ | ##### | ||
+ | ##### #### #### ## ##### #### | ||
+ | ##### ## ## #### ## ## | ||
+ | ##### | ||
+ | ##### ## ## ######## | ||
+ | ##### #### #### #### #### ##### #### | ||
+ | ##### ## | ||
+ | ###### | ||
+ | ################## | ||
+ | ######## | ||
+ | ------------------------------------------------------------------------- | ||
+ | </ | ||
+ | ====== Table of Contents ====== | ||
+ | < | ||
+ | | ||
+ | |||
+ | Features | ||
+ | 6. OS/A65: A Multitasking Operating System by Andre Fachat | ||
+ | (Reference: os) | ||
+ | Just when you thought it was safe to run a single program on | ||
+ | your Commodore 64, Andre ups the ante and details a framework | ||
+ | that allows you to coax your machine to do multiple things at | ||
+ | once. If one app was trouble enough, try taming two or more at | ||
+ | a time! | ||
+ | 8. Using UQWK with QWKRR128 by Gaelyne Moranec | ||
+ | (Reference: uqwk) | ||
+ | After years of using QWKRR128 to read BBS email and FIDO echoes, | ||
+ | you want to access the Internet as well. Does that mean you'll have | ||
+ | to shelve QWKRR128? | ||
+ | program called UQWK to package up USENET newsgroups and Internet | ||
+ | electronic mail for offline perusal by QWKR128. | ||
+ | 10. Brad Templeton: The Programmer' | ||
+ | (Reference: pal) | ||
+ | Templeton, the originator of the PAL assembler and a driving force | ||
+ | in programmer aids in the late 70's and early 80's, reflects on | ||
+ | those early years, where programmer tools were pretty spartan. | ||
+ | Travel in time with Brad to an era where IBM specialized in | ||
+ | mainframes, and proprietary schemes were commonplace. | ||
+ | 12. Hacking Graphics by Stephen Judd | ||
+ | (Reference: demo) | ||
+ | We've talked about 2D graphics, and we've talked about 3D | ||
+ | graphics. | ||
+ | article will explain how to do just that, and includes source | ||
+ | and binaries for dim4, an entry in the recent 4k demo contest held | ||
+ | by Driven magazine. | ||
+ | 13. Exploiting the 65C816S CPU by Jim Brain | ||
+ | (Reference: cpu) | ||
+ | So, the eagerly anticipated accelerator from CMD is becoming | ||
+ | available. | ||
+ | applications. | ||
+ | Learn how to take advantage of the extra addressing modes and | ||
+ | wider CPU registers when you flip the '816 into Native mode. In | ||
+ | addition, Jim will detail the preliminary set of " | ||
+ | locations in the CMD SuperCPU. | ||
+ | 14. Using HTML on the Commodore, Part 1 by Jim Brain | ||
+ | (Reference: html) | ||
+ | Your IBM friends are drooling over the World Wide Web and its | ||
+ | markup language: | ||
+ | worried your CBM machine might not be able to handle HTML? Worry | ||
+ | no more. Jim will teach you the HTML language and how it can be | ||
+ | used on the Commodore system. | ||
+ | and its elements and lays the ground work for a Commodore HTML | ||
+ | parsing engine. | ||
+ | |||
+ | Columns | ||
+ | 4. Hi Tech Trickery by Alan Jones | ||
+ | (Reference: trick) | ||
+ | Here's the proof you need to kill off the persistent myth that | ||
+ | 8-bitters can't cut the mustard in complex computations. | ||
+ | lays some groundwork and details a few tricks in stretching | ||
+ | those 8-bits to the limit and beyond. | ||
+ | 15. Hacking Graphics by Todd Elliott | ||
+ | (Reference: gfx) | ||
+ | So you have created the world' | ||
+ | torture chamber of a game. Don't forget the presentation. | ||
+ | shows how to create a 3-dimensional scene that will bring your | ||
+ | dungeon to life. This will give your unsuspecting victim the | ||
+ | most realistic gameplay possible. | ||
+ | | ||
+ | Departments | ||
+ | 1. The (cough, cough) Hacking Editor | ||
+ | (Reference: editor) | ||
+ | 2. Input/ | ||
+ | (Reference: io) | ||
+ | 3. Newsfront | ||
+ | (Reference: news) | ||
+ | 5. Hacking the Mags | ||
+ | (Reference: mags) | ||
+ | 7. UseNuggets | ||
+ | (Reference: usenet) | ||
+ | 9. FIDO's Nuggets | ||
+ | (Reference: fido) | ||
+ | 11. Hack Surfing | ||
+ | (Reference: surf) | ||
+ | 16. Commodore Trivia | ||
+ | (Reference: trivia) | ||
+ | 17. ? DS, DS$: rem The Error Channel | ||
+ | (Reference: error) | ||
+ | 18. The Next Hack | ||
+ | (Reference: next) | ||
+ | 19. Hacking the Code | ||
+ | (Reference: code) | ||
+ | |||
+ | ------------------------------------------------------------------------- | ||
+ | </ | ||
+ | ====== Commodore Hacking Legal Notice ====== | ||
+ | < | ||
+ | |||
+ | Commodore and the respective Commodore product names are trademarks or | ||
+ | registered trademarks of ESCOM GmbH. Commodore Hacking is in no way | ||
+ | affiliated with ESCOM GmbH, owners of said trademarks. | ||
+ | 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 " | ||
+ | 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. | ||
+ | for-profit compilation, | ||
+ | separately or as part of a non-profit compilation. | ||
+ | |||
+ | This publication, | ||
+ | various elements, is copyright (c) 1995-96 by Brain Innovations, | ||
+ | Incorporated, | ||
+ | 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, | ||
+ | |||
+ | Brain Innovations, | ||
+ | in editorial, article, or program listing content. | ||
+ | | ||
+ | ------------------------------------------------------------------------- | ||
+ | </ | ||
+ | ====== Commodore Hacking Information ====== | ||
+ | < | ||
+ | | ||
+ | Commodore Hacking is published via the Internet 4 times yearly, and is | ||
+ | presented in both ISO-8859-1 and HTML versions. | ||
+ | can be found at the Commodore Hacking Home Page | ||
+ | (http:// | ||
+ | (ftp:// | ||
+ | |||
+ | In addition, the Commodore Hacking mail server can be used to retrieve each | ||
+ | issue. | ||
+ | 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. | ||
+ | line is roughly 50 characters, so 600 lines is about 30000 bytes. | ||
+ | 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. | ||
+ | any administrative costs, subscribe to publications for review, and | ||
+ | compensate the individual authors contributing to this issue. | ||
+ | |||
+ | New: As part of a magazine promotion, Commodore Hacking Issue #12 was | ||
+ | professionally laid out on printed format. | ||
+ | for US$6.00. | ||
+ | |||
+ | Any persons wishing to author articles for inclusion in Commodore Hacking | ||
+ | are encouraged to view the submission guidelines on the WWW | ||
+ | (http:// | ||
+ | server (send c-hacking-submit.txt). | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== 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. | ||
+ | magazine, a word prefixed with a special string is present. | ||
+ | title of this article for an example. | ||
+ | article is mentioned, it will be followed by a reference string. | ||
+ | example, if we mentioned this article, we would add (Reference: rch) after | ||
+ | the name. By using your favorite editor' | ||
+ | for the string after the word " | ||
+ | string, will move you directly to the article of choice. | ||
+ | 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 | ||
+ | contents table of contents | ||
+ | legal legal notice | ||
+ | |||
+ | For those with access to a UNIX system, the command " | ||
+ | run on the issue, which will result in all the article titles being | ||
+ | printed. | ||
+ | |||
+ | A slightly different magic prefix string " | ||
+ | sub-topics or main heading in articles. | ||
+ | differs depending on article content. | ||
+ | (Reference: io), the text after the magic prefix will either be " | ||
+ | comment, or " | ||
+ | the prefix indicates the ordinal of that heading or sub-topic in the | ||
+ | article. | ||
+ | a sub-topic reference will be indicated. | ||
+ | be written as " | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== The Hacking Editor ====== | ||
+ | < | ||
+ | by Jim Brain (j.brain@ieee.org) | ||
+ | |||
+ | I recently had to choose between my interest in Commodore computers and | ||
+ | something else. To many, the choice was clear. | ||
+ | hobbies were important, but they simply had to take a back seat when | ||
+ | other pressing issues came up. I'll admit that the decision was hard | ||
+ | to make. I find that strange, do you? I mean, seriously, it's just an | ||
+ | outdated, underpowered, | ||
+ | 8-bit computer system. | ||
+ | |||
+ | If you can explain that to me, then you are a true Commodore enthusiast | ||
+ | as well. We are all bound together by the immense " | ||
+ | systems. | ||
+ | family. | ||
+ | limitations, | ||
+ | them. Although we might have younger and faster family members, we | ||
+ | cherish our Commodore. | ||
+ | in our familiar family member for a newer, shinier model. | ||
+ | of it this way, it seems a bit scary, doesn' | ||
+ | |||
+ | Not to leave you in suspense, the " | ||
+ | was a new employment opportunity and the subsequent relocation of | ||
+ | myself and my family. | ||
+ | machine, I decided that my family came first. | ||
+ | important, are not quite as important. | ||
+ | others who have similar " | ||
+ | the plug on my hobby. | ||
+ | |||
+ | Now, I don't consider myself that important in the scheme of things, | ||
+ | but I did underestimate the consequences of my decision. | ||
+ | and I tallied up what resources would be unavailable as I left, the | ||
+ | amount grew sizable. | ||
+ | stepped forward to help and keep information from becoming unavailable. | ||
+ | Others simply provided moral support and all offered the precious gift | ||
+ | of patience while I turned to matters at hand. | ||
+ | |||
+ | I consider myself lucky that so many offered so much to make the | ||
+ | situation more tolerable. | ||
+ | greatly that deadlines would be missed, pieces of information would go | ||
+ | unpublished, | ||
+ | seekers would find nothing but unanswered questions. | ||
+ | better, I felt I had deserted the people who depended on me. It's amazing | ||
+ | how wrapped up in this I have become. | ||
+ | |||
+ | As you may have guessed, one of the most disturbing resources that was | ||
+ | left unfinished was this issue of Commodore Hacking. | ||
+ | originally scheduled for publication in mid-June, I regretfully shelved | ||
+ | it and spent what little time that remained in preparing for a move. | ||
+ | Luckily, the move is over, and you now hold the newest issue of this | ||
+ | publication. | ||
+ | |||
+ | With this newest issue comes some notes. | ||
+ | graciously agreed to offer her services as assistant editor. | ||
+ | free some of my time to write articles and concentrate on technical | ||
+ | article editing. | ||
+ | columns found in each issue, Geoffrey Welsh is now writing " | ||
+ | Nuggets" | ||
+ | to the delay in publishing this issue and the length of some | ||
+ | submissions, | ||
+ | We apologize for those who will find the excessive size a problem, but | ||
+ | the timeliness of the articles and the sheer volume of current events | ||
+ | information prevented reduction in size. We will return to a more | ||
+ | manageable size by next issue. | ||
+ | laid out and printed version of Commodore Hacking Issue #12. If you | ||
+ | would like one of these copies, please see " | ||
+ | (Reference: info) for more information. | ||
+ | |||
+ | Enjoy YOUR magazine, | ||
+ | |||
+ | Jim Brain (j.brain@ieee.org) | ||
+ | editor | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Input/ | ||
+ | < | ||
+ | |||
+ | Obviously, Commodore Hacking depends on the comments and article | ||
+ | submissions from the Commodore community to flourish. | ||
+ | articles, but let's not forget those comments. | ||
+ | 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: So, You Think You're Fast Enough, Eh? | ||
+ | |||
+ | From: Ralph Mason | ||
+ | |||
+ | Dear C=Hacking, | ||
+ | |||
+ | Keep up the good work with C=Hacking. | ||
+ | about the Super CPU and thought I would add my 2p worth. | ||
+ | |||
+ | You noted that the SuperCPU appeared to be 21.79 times faster but | ||
+ | attributed this to the VIC chip stealing cycles. | ||
+ | part of the story (the smaller part). | ||
+ | likely to be lost or gained due to the jiffy interrupt routine. | ||
+ | standard 64 executed this routine 660 times and scanned the keyboard etc. | ||
+ | during it's count from 1 to 10000. The SuperCPU only executed this code | ||
+ | 31 times. | ||
+ | think if you could turn off these interrupts you would find that the | ||
+ | SuperCPU is actually running short of the 20 times faster than it | ||
+ | appears to be showing. | ||
+ | |||
+ | It's almost stooping to silly IBM style Norton SI numbers or other | ||
+ | useless benchmarks. These will never show the true story. From what I' | ||
+ | read, I'd guess (user' | ||
+ | running real application of around 400%, more or less depending on | ||
+ | the app. | ||
+ | |||
+ | Cheers, | ||
+ | | ||
+ | |||
+ | @(A)r: | ||
+ | Jim Brain replies, | ||
+ | |||
+ | Ralph, after reading your explanation, | ||
+ | stating that the bulk of the time saved on a 20 MHz unit is indeed due | ||
+ | to the fewer interrupts it must service in a given time frame. | ||
+ | since we can rarely turn off the 60 cycle interrupt, the effective speed | ||
+ | is what people will notice. | ||
+ | discussion waxing philosophic, | ||
+ | 400% increase in applications. | ||
+ | |||
+ | @(A)c: A Round of Ice Water for the Editors | ||
+ | |||
+ | From: drankin@crashb.megalith.miami.fl.us (Dave Rankin) | ||
+ | |||
+ | Thank you for all your efforts and putting out this Mag. I and many | ||
+ | others do enjoy seeing all this activity for the 8 bit Commodore. | ||
+ | |||
+ | Dave | ||
+ | |||
+ | @(A)r: | ||
+ | Thanks for the letter. | ||
+ | producing this magazine are appreciated by those in the community that | ||
+ | read it. | ||
+ | |||
+ | @(A)c: There' | ||
+ | |||
+ | From: cjbr@gonix.gonix.com (Jim Lawless) | ||
+ | | ||
+ | Dear C=Hacking, | ||
+ | |||
+ | Just wanted to express my enthusiasm for your electronic publication and | ||
+ | hope to make regular contributions in the coming months. | ||
+ | | ||
+ | I was a C64 hacker from '84 until about '87 when I progressed throughout | ||
+ | the Amiga and into the PeeCee world. | ||
+ | |||
+ | I found out about the C64 emulators for MS-DOS/ | ||
+ | downloaded one this morning. | ||
+ | startup screen again! | ||
+ | |||
+ | My wife expressed some curiosity seeing a pile of old Transactor | ||
+ | magazines next to the recliner today. | ||
+ | about the emulator. | ||
+ | |||
+ | This evening, she returned from a church auction with a C128, a 1541, a | ||
+ | 1650 modem, a westridge mode, and a bundle of software all for $30.00. | ||
+ | |||
+ | I guess it's time to get back to my roots and have some fun! | ||
+ | |||
+ | Jim Lawless, | ||
+ | cjbr@gonix.com | ||
+ | |||
+ | @(A)r: | ||
+ | We appreciate the thanks. | ||
+ | enthusiasts to submit articles to the magazine. | ||
+ | grateful that you have come home again. | ||
+ | downside, we have noticed that many who download one end up buying a | ||
+ | real machine and rediscover the simple elegance of the Commodore | ||
+ | computer. We applaud you for your choice. | ||
+ | |||
+ | |||
+ | @(A)c: Copy Rights! | ||
+ | |||
+ | From: EricJ1@aol.com | ||
+ | |||
+ | I'll make this short and sweet. | ||
+ | Hacking. | ||
+ | is not a problem. | ||
+ | | ||
+ | Thanks | ||
+ | |||
+ | Eric | ||
+ | |||
+ | @(A)r: | ||
+ | We encourage redistribution of Commodore Hacking for non-profit | ||
+ | means. | ||
+ | (Reference: legal). | ||
+ | we would love to see C=H spread throughout the Commodore community. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Newsfront ====== | ||
+ | < | ||
+ | |||
+ | @(A): ACE Release #15 ACE-15 Programmer' | ||
+ | |||
+ | For those of you who have taken advantage of the Advanced Computing | ||
+ | Environment (ACE) operating system written by Craig Bruce, Craig has | ||
+ | published the programmer' | ||
+ | popular application environment. | ||
+ | locations: | ||
+ | |||
+ | ftp:// | ||
+ | http:// | ||
+ | |||
+ | If you haven' | ||
+ | |||
+ | @(A): Unscientific Study Proves Commodore Computers are Preferred! | ||
+ | |||
+ | It seems that as homely as some may think the Commodore computers are, | ||
+ | children warm up to them very quickly. | ||
+ | chosen over more expensive machines, as the following stories attest: | ||
+ | |||
+ | James Grubic (grubic@avicom.net) wrote: | ||
+ | |||
+ | One of the teachers in the school I'm based in actually enjoys using | ||
+ | the older computer systems like the Apple IIe, and her students are | ||
+ | truly excited about using them. The other day, I gave them a 64c to use, | ||
+ | and they were blown away! If you could just see it...a whole gang of | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | And Bob Masse followed up with: | ||
+ | | ||
+ | I am not surprised. | ||
+ | | ||
+ | room alone with it when it is on! On the other hand when He comes | ||
+ | over to his Uncle Bob's house he has a tantrum to use this old | ||
+ | | ||
+ | |||
+ | Bob | ||
+ | | ||
+ | |||
+ | So, once again, bigger is not always better! | ||
+ | |||
+ | @(A): Assembly '96 Is Coming! | ||
+ | |||
+ | Have you ever been to a "demo party"? | ||
+ | one of the staples of the Commodore scene since the beginning of the | ||
+ | reign of the Commodore computer. | ||
+ | Helsinki, Finland. | ||
+ | |||
+ | In case you aren't aware, demo parties are where demo programmers, | ||
+ | computer graphics artists, and computer music artists gather to compete | ||
+ | for prizes. | ||
+ | C64 computer systems. | ||
+ | |||
+ | Assembly '96 is to be held August 16 to 18 in the Helsinki Fair Center, | ||
+ | Rautatielaisenkatu 3, Finland. | ||
+ | If you are in the vicinity, you should stop by and peruse the 1996 | ||
+ | Commodore 64 entries. | ||
+ | Commodore 64 class, please read the rules and information packet | ||
+ | at: http:// | ||
+ | | ||
+ | Prizes of cash are to be awarded to 1st, 2nd, and 3rd place winners in | ||
+ | the demo, graphics, and music categories. | ||
+ | |||
+ | For more information, | ||
+ | ways: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 00620 Helsinki | ||
+ | | ||
+ | |||
+ | @(A): Where in the world is Novaterm 9.6 (NovaRom)? | ||
+ | | ||
+ | Late last year, Nick Rossi informed the Commodore community that he | ||
+ | was developing a new version of his popular 64 terminal emulation | ||
+ | software, Novaterm 9.6. However, Nick stated that 9.6 would be | ||
+ | marketed as a commercial product, not as a shareware offering as in | ||
+ | previous versions. | ||
+ | as to what the new version would include filled up the communication | ||
+ | channels for quite a while. | ||
+ | 9.6 was to be marketed on CARTRIDGE surfaced. | ||
+ | piracy and ease of use in deciding to try the cartridge route. | ||
+ | who asked were told that Novaterm (NovaRom by some accounts) would ONLY | ||
+ | be offered as a cartridge. | ||
+ | |||
+ | Performance Peripherals Inc. (PPI) was chosen to manufacture and | ||
+ | market the new version. | ||
+ | and an option that included PPI's CommPort Swiftlink-compatible | ||
+ | cartridge and a PPI 3 slot cartridge expansion unit. | ||
+ | |||
+ | Since creating a cartridge requires a higher level of code robustness, | ||
+ | delays in the introduction generated reports that Nick was having | ||
+ | trouble getting the code to a ROMable state. | ||
+ | that PPI status as a part time endeavor was the reason for the delays. | ||
+ | |||
+ | Whatever the reason, the following announcement was made by Nick Rossi | ||
+ | concerning Novaterm 9.6 on July 5, 1996. Contrary to earlier reports, | ||
+ | the software will be available on disk format only and will be | ||
+ | initially be marketed directly through Nick Rossi: | ||
+ | |||
+ | | ||
+ | | ||
+ | Bring the telecommunications revolution | ||
+ | to your Commodore 64. | ||
+ | |||
+ | After many delays and headaches, I'm excited to finally announce the | ||
+ | | ||
+ | | ||
+ | | ||
+ | comes with a 90-page user's manual. | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | Send check or money order for US$29.95 to: | ||
+ | |||
+ | Nick Rossi | ||
+ | 10002 Aurora Ave. N. #3353 | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | Check out the Novaterm 9.6 web site for more information: | ||
+ | | ||
+ | |||
+ | My e-mail address is voyager@eskimo.com. | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | * Zmodem upload, download, auto-download, | ||
+ | | ||
+ | * Ymodem-g and Xmodem-1k-g streaming protocols with the buffer. | ||
+ | * Use any RAM expansion device as the buffer: REU, BBGRam, GEORam, | ||
+ | | ||
+ | * " | ||
+ | | ||
+ | or get overwritten. | ||
+ | * Text editor can read and write files directly from the buffer. | ||
+ | * Supports the SwiftLink, CommPort, HART cartridge, and Daniel | ||
+ | | ||
+ | (see http:// | ||
+ | * Supports the C128's fast-mode 80-column screen in terminal mode | ||
+ | (25, 28, 43, and 50 line modes available). | ||
+ | * C64 80-column emulation features " | ||
+ | | ||
+ | have an REU. | ||
+ | * Built-in ASCII translation and UUencode/ | ||
+ | * Built-in 80-column file viewer | ||
+ | * Reads real-time clock devices (BBRTC, CMD drives) for terminal mode | ||
+ | clock display | ||
+ | * Single-menu loading of terminal emulations (finally!) | ||
+ | * A step-by-step user-friendly configuration utility | ||
+ | |||
+ | | ||
+ | |||
+ | * Terminal emulations: ANSI graphics, VT100/102, VT52, Standard, and | ||
+ | | ||
+ | * Protocols: Zmodem, Ymodem batch, Ymodem-g, Xmodem-1k, Xmodem-1k-g, | ||
+ | | ||
+ | * Hardware flow control for high-speed modems | ||
+ | * Script language for automatic operation | ||
+ | * Multiple 19-entry phone books | ||
+ | * 16 user-definable macro keys | ||
+ | * Miniature BBS module / answering service | ||
+ | * Text editor utility with integrated script compiler | ||
+ | * ASCII table editor and Font editor utility | ||
+ | |||
+ | I could keep going, but you get the idea! Novaterm 9.6 supports all | ||
+ | of the standard features from previous versions, but its capabilities | ||
+ | have been greatly expanded. | ||
+ | |||
+ | | ||
+ | made it! | ||
+ | |||
+ | @(A): BBS Magazine dead, Long Live Some Trees | ||
+ | |||
+ | Gaelyne Moranec, writer of articles for magazines such as Commodore | ||
+ | Hacking (Reference: uqwk), Commodore World, and BBS Magazine, reports | ||
+ | that BBS Magazine is no longer. | ||
+ | and users, the magazine contained a monthly series by Moranec on | ||
+ | Commodore BBS users and systems. | ||
+ | Commodore specific to cover Commodore content, its demise is sad indeed. | ||
+ | Evidently, the magazine continued on for one issue as _BBS.NET_ but has | ||
+ | not been published since. | ||
+ | space in a new magazine to take the place of BBS, but the focus will be | ||
+ | on sysops and sysadmins. | ||
+ | to continue to write, but she is somewhat doubtful of the prospect. | ||
+ | |||
+ | @(A): Hide the Wolf PC: Little Red Reader-128 2.5 released! | ||
+ | |||
+ | Craig Bruce has released version 2.5 of Little Red Reader-128, the | ||
+ | popular freeware utility that allows Commodore 128 owners with 1571, | ||
+ | 1581, or CMD FD drives to read IBM PC disks. | ||
+ | new release include: | ||
+ | |||
+ | * miscellaneous bug fixes | ||
+ | * date support for reading and writing files | ||
+ | * counts of bytes of files in a directory | ||
+ | * remove Commodore files | ||
+ | |||
+ | The program is available from the following locations: | ||
+ | |||
+ | | ||
+ | lrr25.doc | ||
+ | lrr25.asm | ||
+ | | ||
+ | |||
+ | @(A): Basement Boys Software Demise | ||
+ | |||
+ | The geoClub UK newsletter reports that Commodore software developer and | ||
+ | distributor Basement Boys Software has ceased operation. | ||
+ | Basement Boys Software completed all paid orders and settled all | ||
+ | reported business before closing its doors. | ||
+ | due to "lack of support", | ||
+ | doing so. | ||
+ | |||
+ | @(A): LOADSTAR LETTER Going Subscription | ||
+ | |||
+ | As reported in " | ||
+ | LETTER will become a subscription based publication. | ||
+ | currently bundled with issues of LOADSTAR and LOADSTAR 128, contained 8 | ||
+ | pages of additional content not found in either LOADSTAR or LOADSTAR | ||
+ | 128. J and F Publishing, which publishes the LOADSTAR line of software | ||
+ | and magazines, cites increasing costs and the need for more editorship | ||
+ | support in deciding to change the magazine' | ||
+ | subscription. | ||
+ | Issue #37. A one year subscription can be purchased for US$12.00 from: | ||
+ | |||
+ | | ||
+ | P.O. Box 30008 | ||
+ | | ||
+ | |||
+ | Starting with Issue #37, Jeff Jones will join with Scott Eggleston and | ||
+ | others to turn the LL into a more hard hitting magazine with fewer ads. | ||
+ | The new magazine will continue to run articles by Jim Brain, Gaelyne | ||
+ | Moranec, and Jeff Jones, among others. | ||
+ | 1000 subscribers in order to keep the subscription rate for future | ||
+ | subscribers at US$12.00. | ||
+ | |||
+ | @(A): The Commodore Cruiser Is on the InfoHighway | ||
+ | |||
+ | John Brown, of Parsec, Inc., has announced the arrival of the Commodore | ||
+ | Cruiser, a subscription based Commodore support BBS system. | ||
+ | via direct phone lines and the Internet, The system is Internet | ||
+ | accessible via a telnet to jbee.com. | ||
+ | each Commodore User Group that requests one. For users, subscription | ||
+ | includes full Internet access, as well as Commodore specific areas and | ||
+ | file transfer areas. For more information, | ||
+ | |||
+ | JBEE | ||
+ | | ||
+ | PO Box 111 | ||
+ | | ||
+ | USA | ||
+ | |||
+ | @(A): Commodore and Amiga Technology Sold (Again!) | ||
+ | |||
+ | By InfoWorld Staff | ||
+ | |||
+ | Posted at 3:45 p.m., PT, April 11 | ||
+ | Financially troubled German PC retailer Escom AG said Thursday that it | ||
+ | will sell its Amiga Technologies GmbH subsidiary to Visual Information | ||
+ | Services Corp. (VIScorp) of Chicago in a $40 million transaction. | ||
+ | SEscom acquired the Commodore and Amiga computer technology, patents, | ||
+ | Sintellectual properties, and brand names in April 1995 for $10 million | ||
+ | Sat a bankruptcy auction for Commodore International, | ||
+ | Sliquidation in 1994. Escom earlier this year itself reported losses of | ||
+ | S$85 million for 1995, prompting founder Manfred Schmitt to resign last | ||
+ | Smonth. Selling Amiga will allow Escom to better concentrate on its core | ||
+ | Sbusiness of PC retailing, Escom said in a statement. VIScorp, which | ||
+ | Smakes set-top boxes, will acquire the Amiga and Commodore technology and | ||
+ | Sintellectual property, but not the Commodore brand names, Escom said. | ||
+ | |||
+ | VIScorp is online at: http:// | ||
+ | |||
+ | @(A): DisC=over a New Commodore Specific Technical Magazine | ||
+ | |||
+ | As reviewed in " | ||
+ | Commodore publication available. | ||
+ | Commodore Enthusiasts", | ||
+ | to that found in the defunct Transactor magazine and Commodore Hacking. | ||
+ | Available only in text format, the magazine is available at: | ||
+ | |||
+ | | ||
+ | |||
+ | Alternately, | ||
+ | |||
+ | | ||
+ | |||
+ | @(A): CMD SuperCPU unveiled | ||
+ | |||
+ | Initial reports of the CMD SuperCPU are overwhelmingly positive. | ||
+ | fact, it is reported that one European publication would not believe a | ||
+ | commissioned review of a beta unit and requested a first hand look at one | ||
+ | before they would print the review. | ||
+ | impressed as well. | ||
+ | |||
+ | For a report that Guenther Bauer wrote on the new accelerator, | ||
+ | out his review at: | ||
+ | |||
+ | | ||
+ | |||
+ | One of the units traveled to Michigan where Maurice Randall (developer | ||
+ | of GeoFAX and owner of Click here Software) debuted it in the US to the | ||
+ | Lansing Area Commodore Club. Tim Lewis, LACC President, reported to | ||
+ | USENET after the debut: | ||
+ | |||
+ | "I am one of the few lucky people who have seen for myself what the | ||
+ | new Super64 CPU can do. It is nothing short of INCREDIBLE!!! | ||
+ | | ||
+ | For all of you serious GEOS users, I can honestly say this: GET IT! | ||
+ | It is money that will not be thrown away! The processing speed is | ||
+ | amazing. If you use the Super64 CPU with a REU, I will guarantee you | ||
+ | that you cannot go wrong! You have to see it to believe it! Club | ||
+ | members that saw Maurice Randall demo this could not believe their | ||
+ | Seyes! I was watching this go thru a directory of files, and it just | ||
+ | Sflew! | ||
+ | |||
+ | Folks, you have to see this to believe it! My hats off to CMD, they | ||
+ | have really outdone themselves! All I can say is: | ||
+ | (sic)COGRATULATIONS!!!" | ||
+ | | ||
+ | For more information on CMD or the SuperCPU, contact CMD or visit | ||
+ | their WWW Site: | ||
+ | |||
+ | | ||
+ | P.O. Box 646 | ||
+ | E. Longmeadow, MA 01028 | ||
+ | (413) 525-0023 | ||
+ | | ||
+ | |||
+ | @(A): Commodore Hacking Contributes to Computer-Mediated Communication | ||
+ | Magazine | ||
+ | | ||
+ | Following a call for articles in alt.zines on hurdles faced by | ||
+ | electronic magazines, Jim Brain contributed an article on the challenges | ||
+ | faced by Commodore Hacking. | ||
+ | the challenges of providing a text version of the magazine for Commodore | ||
+ | owners, while attempting to draw out of the closet Commodore enthusiasts | ||
+ | online with a hypertext version of the publication. | ||
+ | the published article is available at: | ||
+ | |||
+ | | ||
+ | |||
+ | @(A): " | ||
+ | |||
+ | In C=Hacking #12, we noted that Bo Zimmerman had connected his Commodore | ||
+ | 128 to the Internet, albeit through a Linux system. | ||
+ | things must end, Bo has taken down the BBS system due to hardware | ||
+ | overheating problems. | ||
+ | on how the system was set up so that others can configure similar | ||
+ | systems. | ||
+ | |||
+ | @(A): The " | ||
+ | |||
+ | In March, Matt Desmond, creator of the popular 128 terminal emulation | ||
+ | program DesTerm, announced that he is now online at: | ||
+ | |||
+ | | ||
+ | |||
+ | It contains information about Matt, but is more importantly the gateway | ||
+ | to the " | ||
+ | new 3.0 version of DesTerm that Matt is developing. | ||
+ | |||
+ | @(A): Compuserve INformation Service = Compuserve Internet | ||
+ | |||
+ | On May 21, Compuserve (CIS) announced it would phase out its proprietary | ||
+ | software and services in favor of providing service using Internet | ||
+ | standards. | ||
+ | provider by year's end. The new service will be accessible through a | ||
+ | standard World Wide Web browser. | ||
+ | affect Commodore users who rely on Compuserve' | ||
+ | Internet and Compuserve specific access. | ||
+ | |||
+ | @(A): Creative Micro Designs, Inc. New Sponsor of Genie CBM RTC | ||
+ | |||
+ | Creative Micro Designs, Inc., has taken over as the sponsor of the | ||
+ | Commodore RTC area on Genie. | ||
+ | few well utilized places to stay current on Commodore events and | ||
+ | find Commodore information. | ||
+ | quality information for Commodore enthusiasts as a driving reason | ||
+ | behind the decision to sponsor the Genie forum. | ||
+ | |||
+ | @(A): Hail the New Prez | ||
+ | |||
+ | Meeting 64/128 Users Through the Mail, a non-profit organization | ||
+ | designed to allow Commodore users to unite and gather information about | ||
+ | their machines via mail, has announced a change in presidency: | ||
+ | |||
+ | The new president is Tom Adams, and the new address for club | ||
+ | correspondence is as follows: | ||
+ | |||
+ | | ||
+ | c/o Tom Adams, President | ||
+ | | ||
+ | 4427 39th St. | ||
+ | | ||
+ | |||
+ | If you are interested in membership, please contact Tom. The club is | ||
+ | especially useful for those who live in areas with no Commodore support. | ||
+ | |||
+ | @(A): Commodore VIC-20 Newsletter Address Change | ||
+ | |||
+ | For those interested in the Commodore VIC-20, a very useful but under | ||
+ | utilized computer, Jeffrey Daniels publishes a newsletter for the | ||
+ | machine. | ||
+ | | ||
+ | Vic Newsletter | ||
+ | | ||
+ | P.O. Box 477493 | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | A copy can be obtained by writing the above address. | ||
+ | |||
+ | @(A): ESCOM Does a CBM! (Well, Not Really) | ||
+ | |||
+ | Financial Time/ | ||
+ | |||
+ | " | ||
+ | | ||
+ | 11 protection in the U.S.), following significant trading losses, and | ||
+ | | ||
+ | | ||
+ | |||
+ | Since ESCOM had recently sold the rights to the Commodore and Amiga | ||
+ | lines to VISCorp, the filing will have little affect on Commodore 8-bit | ||
+ | owners. | ||
+ | reorganization effort by ESCOM intended to solidify its PC manufacturing | ||
+ | operation. CMD notes that, unlike CBM, ESCOM is NOT liquidating, | ||
+ | merely employing a common US business tactic of filing to shield | ||
+ | themselves from creditors while reorganinzing the business. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== HEAVY MATH - Part 0: History, Arithmetic, and Simple Algorithms ====== | ||
+ | < | ||
+ | by Alan Jones (alan.jones@qcs.org) | ||
+ | |||
+ | Someone on comp.sys.cbm asked if the C64 could do HEAVY MATH, meaning | ||
+ | solve computationally intensive numerical problems. | ||
+ | course, YES! This is the first of a series of articles on numerical | ||
+ | computing for the C64/ | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | The C64 is not the best computer for numerical work. However, it does | ||
+ | quite well within its limitations of speed and memory. | ||
+ | most homework | ||
+ | problems. | ||
+ | watch a movie or sleep. | ||
+ | children to college with a C64 were a joke. Still, it can save you a | ||
+ | long walk to the campus on a miserable night. And you can always use it | ||
+ | as a terminal to check jobs running on the mainframe. | ||
+ | |||
+ | The C64 is also a good computer for developing numerical algorithms and | ||
+ | programs. | ||
+ | home with a C64. When developed to your satisfaction, | ||
+ | programs can be " | ||
+ | problems. | ||
+ | many are not well suited for numerical development work. On larger | ||
+ | computers Fortran and C are popular for numerical work. On a C64, Power | ||
+ | C might be a good choice for some users. | ||
+ | COMAL programs that can help convert source codes from BASIC to COMAL, | ||
+ | and COMAL to Fortran. | ||
+ | |||
+ | Our C64 with its 6502 (6510) and 64K of RAM is a very simple machine. | ||
+ | It is so simple that many contemporary numerical programs are far from | ||
+ | ideal on a C64. So I will start with a bit of numerical computing | ||
+ | history. | ||
+ | are often closer to ideal for the C64 than contemporary PCs. | ||
+ | Researching old numerical algorithms can be useful for the C64; e.g. | ||
+ | Quartersolve in C-Hacking #10. Of course new algorithms are useful also | ||
+ | and sometimes you might want to combine ideas from both sides of the | ||
+ | spectrum. | ||
+ | |||
+ | @(A): History | ||
+ | |||
+ | In the beginning... were fingers. | ||
+ | description. | ||
+ | talk shows. | ||
+ | and slide rules were just the start of computational aids. Eventually, | ||
+ | mechanical adding machines were developed for high precision, error free | ||
+ | (but slow) numerical work. One can still find large desk top Friden and | ||
+ | Monroe mechanical adding machines. | ||
+ | tedious process. | ||
+ | Analyzer was a mechanical computer that could solve IVPs (Initial Value | ||
+ | Problems, integrating differential equations). | ||
+ | early analog electronic computing aids. The first electronic analog | ||
+ | computer was actually developed after electronic digital computers. | ||
+ | (One could argue that many WW II autopilots and automatic control | ||
+ | circuits were electronic analog computers.) | ||
+ | |||
+ | The first digital electronic computers were the ABC, ENIAC, EDVAC, and | ||
+ | UNIBLAB. (UNIBLAB is just for the Jetson' | ||
+ | Atanasoff invented the first digital electronic computer at Iowa State | ||
+ | University. | ||
+ | John. Can he call you back later?" | ||
+ | think.) | ||
+ | the Atanasoff-Berry Computer, or ABC. The Atanasoff story is | ||
+ | fascinating. | ||
+ | Alice R. and Arthur W. Burks, The University of Michigan Press, 1988. | ||
+ | |||
+ | Atanasoff wanted to be able to solve large sets of linear equations. | ||
+ | Even with large mechanical adding machines, solving a 10 by 10 problem | ||
+ | was about the largest size that would be attempted. | ||
+ | several mechanical adding machines were not feasible, and analog devices | ||
+ | were not precise enough. | ||
+ | small grants available to him were a serious constraint. | ||
+ | the ABC over a couple years for less than $7, | ||
+ | cost about $500, | ||
+ | tubes as high speed digital switching devices. | ||
+ | serial arithmetic logic unit, ALU. Vacuum tubes were still too | ||
+ | expensive so he used cheap capacitors for memory. | ||
+ | additional circuitry to refresh the capacitors, | ||
+ | designed a parallel computing machine that could add (and subtract, | ||
+ | shift, NOR,...) 30 50-bit binary numbers using 30 modular ALU units. | ||
+ | This allowed it to solve up to 29 linear equations with one right hand | ||
+ | side vector. | ||
+ | precision. | ||
+ | in man's image? | ||
+ | Mechanical punches, like (then) new accounting machines might use, were | ||
+ | too slow. An electronic spark punch was developed. | ||
+ | material (paper) was placed between electrodes. | ||
+ | voltage would carbonize a dot in the material and actually burn a small | ||
+ | pin hole. A smaller voltage would later test for the mark. This was | ||
+ | actually Berry' | ||
+ | decimal conversion for initial and final I/O, as well as other nice | ||
+ | touches. | ||
+ | |||
+ | Atanasoff also developed a variation of Gaussian elimination for solving | ||
+ | the linear systems of equations with the ABC. The ABC, like our 6502, | ||
+ | has no multiply instruction. | ||
+ | rows of equations. | ||
+ | whole rows were computed in parallel. | ||
+ | with truncation (no rounding) was used. However, it provided 50 binary | ||
+ | bits of precision which was more than the adding machines provided. | ||
+ | used no division. | ||
+ | as two integers that would be divided on a mechanical desk calculator | ||
+ | for each variable. | ||
+ | although I'm sticking with the slower floating point arithmetic. | ||
+ | not a general purpose " | ||
+ | adapted to solve a variety of problems. | ||
+ | |||
+ | The ABC was completed and operational in April or May of 1942 except for | ||
+ | one problem: | ||
+ | have been the dielectric material or choice of paper. | ||
+ | could be reliably solved, but not the larger problems that it was | ||
+ | designed for. The problem could have been fixed. | ||
+ | and Berry were called to other WW II related work and not allowed to | ||
+ | perfect the ABC. The ABC was stored and later dismantled. | ||
+ | the war that built the ENIAC killed the ABC. Of course many of John | ||
+ | Atanasoff' | ||
+ | computers. | ||
+ | |||
+ | The ABC was built into a desk sized wheeled cart and could be | ||
+ | transported to a researcher' | ||
+ | additional units would have been cheaper. | ||
+ | favorite low cost home computer. | ||
+ | ENIAC, cost a fortune, required a team of technicians to operate, and | ||
+ | filled a large room. The ENIAC led to monolithic computing centers. | ||
+ | would be decades before the computer returned to the home. | ||
+ | |||
+ | I'll skip the better known history lessons: transistor > microprocessor | ||
+ | > electronic hand calculators > home computers > C64 > | ||
+ | the electronic computer caused an explosion in the development of | ||
+ | mathematics and numerical algorithms. | ||
+ | |||
+ | @(A): Arithmetic | ||
+ | |||
+ | Arithmetic is the basic building block of numerical algorithms. | ||
+ | are many types of numerical variables and arithmetics. | ||
+ | arithmetic is the most efficient for intensive numerical work. Decimal | ||
+ | arithmetic is best for simple math where conversion to and from binary | ||
+ | would just slow down entering and outputting numbers. | ||
+ | arithmetic is easy to use because it is self scaling and covers a large | ||
+ | dynamic range, but it tends to be slow. Fixed point, e.g. integer, | ||
+ | arithmetic is fast but not as easy to use. Interval arithmetic involves | ||
+ | computing not just a rounded result but an upper and lower bound on the | ||
+ | result to cover the interval of the arguments and the accuracy of the | ||
+ | computation. | ||
+ | Complex, quaternian, and vector arithmetic can also be used. | ||
+ | |||
+ | The C64 built in BASIC provides 5 byte floating point variables and | ||
+ | arithmetic and 2 byte integer variables. | ||
+ | done by converting to floating point. | ||
+ | for the C64 use the same numerical variable types and even the same | ||
+ | arithmetic code. Even in assembly language we often call the same | ||
+ | floating point arithmetic routines. | ||
+ | operations on the C64 have no bugs. However, they appear to be coded | ||
+ | for minimum code size rather than minimum execution time. Every type | ||
+ | of computer arithmetic can be built up from the 6502 instruction set. | ||
+ | Some arithmetics can be coded for specific applications such as | ||
+ | Polygonamy in C-Hacking #12. | ||
+ | |||
+ | My interest is in using the floating point routines with numerical | ||
+ | algorithms and writing programs. | ||
+ | arithmetic routines are built up from smaller arithmetic blocks. | ||
+ | key building block is the multiplication of two positive 8 bit values | ||
+ | into a 16 bit result. | ||
+ | |||
+ | The 6502 CPU was designed to be a low cost 8 bit CPU. It is fairly | ||
+ | cheap to interface to and will quickly access cheap " | ||
+ | is also very quick and responsive to interrupts. | ||
+ | binary and BCD addition with carry. | ||
+ | ultimate 8 bit CPU. It has several 8 bit internal registers which can | ||
+ | be used in 16 bit pairs. | ||
+ | some nibble oriented instructions and a 16 bit add. On average a 1 Mhz | ||
+ | 6502 is about as effective as a 2 Mhz Z80, and Z80s are generally | ||
+ | available in faster speeds. | ||
+ | for numerical work, but it was poorly integrated into the C128 and | ||
+ | offers us no advantage over the 6502 (other than executing CP/M and | ||
+ | other Z80 code). | ||
+ | way to multiply with a Z80 is with the simple binary shift and add | ||
+ | method. | ||
+ | math on a 6502 is by using table look ups. This opens the door for | ||
+ | creative programming solutions. | ||
+ | |||
+ | Tables can use up a lot of memory, especially for a function of two or | ||
+ | more arguments. | ||
+ | 4 bit, or nybble, multiply table would only need 256 bytes, but this | ||
+ | would involve so much additional work to realize the 8 bit multiply | ||
+ | that it is hardly worthwhile. The C64/128 multiplies with the slow | ||
+ | binary shift and add method. | ||
+ | disk or REU memory to speed up such a simple function (a large bank | ||
+ | switched ROM would be much faster). | ||
+ | readily used when multiplying by a constant, such as when calculating | ||
+ | CRCs. Now consider the algebraic identity, | ||
+ | |||
+ | a*b = ((a + b)/2)_2 - ((a - b)/ | ||
+ | |||
+ | With some more work we can do the multiplication using a table of | ||
+ | squares of only about 512 bytes! | ||
+ | but we will immediately shift right one bit (the division by 2) so this | ||
+ | is no problem. | ||
+ | lost. This is easy to test for by doing a Roll Right instead of a shift | ||
+ | and testing the carry bit. One way to compensate is to decrement a by 1 | ||
+ | (a <> 0), multiply as above and add b, a*b = (a-1)*b + b. The decrement | ||
+ | is free, but we pay for the extra add. Using 256K of external memory | ||
+ | you could do a 16 bit multiply this way. | ||
+ | |||
+ | For an example of the shift and add type multiply and divide see, "High- | ||
+ | Speed Integer Multiplies and Divides", | ||
+ | Transactor, Vol. 8 , No. 1, July 1987, pp. 42-43, 45. Note also that | ||
+ | although a*b = b*a, the ordering of the arguments can effect the | ||
+ | multiplication speed depending on the bit patterns. | ||
+ | |||
+ | Perhaps a year ago there was a discussion running in comp.sys.cbm on ML | ||
+ | routines to do fast multiplication. | ||
+ | Performance often depended on where the arguments a and b were and where | ||
+ | the product was to be stored. | ||
+ | blocks can be used to perform multi byte arithmetic. | ||
+ | |||
+ | Division is a more difficult problem. | ||
+ | subtracting, | ||
+ | inverse. | ||
+ | logarithm and exponential functions (and you might want to use base 2) | ||
+ | we can do division with three table look ups and one subtraction. | ||
+ | log and exp functions will have to be tabulated to a greater precision | ||
+ | than the arguments and result, or it will only produce an approximation. | ||
+ | In most cases we will still have to calculate the remainder using | ||
+ | multiplication and subtraction. | ||
+ | can calculate fast approximations to many other functions, including | ||
+ | multiplication. | ||
+ | |||
+ | Stephen Judd used multiplication based on a table of squares and | ||
+ | division based on a table of log and exp in Polygonamy in C-hacking # | ||
+ | He reported that his 9 bit/8 bit divide takes 52 cycles "best case." | ||
+ | However, where numerical algorithms are concerned, only worst case and | ||
+ | average case performance are important. | ||
+ | |||
+ | Double precision, and multiple precision arithmetic routines should be | ||
+ | coded efficiently in assembly language using the fast building blocks | ||
+ | suggested above. | ||
+ | can be built using pairs of ordinary FP variables and arithmetic. | ||
+ | will be slow but it can be effective when used sparingly such as when | ||
+ | testing single precision algorithms or using iterative improvement | ||
+ | techniques. | ||
+ | Issue 20, Feb. 1988, pp. 18-20, and Comal Today, Issue 22, May 1988, pp. | ||
+ | 58-61. | ||
+ | |||
+ | @(A): Numerical Algorithms | ||
+ | |||
+ | An algorithm is a procedure or set of instructions for computing | ||
+ | something. | ||
+ | will present only feather weight numerical algorithms. | ||
+ | |||
+ | Consider the trivial algorithm, | ||
+ | |||
+ | | ||
+ | x := (x + 1/ | ||
+ | until converged | ||
+ | |||
+ | This is a stable quadratically convergent algorithm. | ||
+ | <> 0 it will converge to sign(x), i.e. +1 or -1. Pick a number, say 1.5 | ||
+ | and take a few iterations. | ||
+ | error or distance from 1 keeps getting squared down toward zero. The | ||
+ | number of correct digits in each iteration doubles. | ||
+ | quadratic convergence. | ||
+ | At each iteration the error is cut in half. We take giant strides but | ||
+ | convergence is still painfully slow. This is a linear convergence rate. | ||
+ | This is a typical Newton' | ||
+ | the region of quadratic convergence, | ||
+ | the region convergence is much slower. | ||
+ | convergence may fail altogether or converge to an undesired point. | ||
+ | general an algorithm will converge to a "limit point" and if the | ||
+ | algorithm is numerically stable, the limit point will be very close to | ||
+ | the exact solution intended. | ||
+ | could run forever like an infinite series, in finite precision | ||
+ | arithmetic it always converges in a finite number of iterations, even | ||
+ | from the bad starting points. | ||
+ | applied to a square matrix (with no eigenvalues on the imaginary axis). | ||
+ | It will compute the matrix sign function which can be used to compute | ||
+ | the stable invariant subspace, which can be used to solve the algebraic | ||
+ | matrix Ricatti equation, which can solve two point boundary value | ||
+ | problems, and be used to solve linear optimal control problems. | ||
+ | mention other pseudo random buzz mumble... | ||
+ | |||
+ | @(A): Inverse and Division | ||
+ | |||
+ | The inverse x = 1/b can be iteratively computed from x := x*(2 - b*x). | ||
+ | This is best used as a floating point, or multiple byte algorithm. | ||
+ | is a quadratically convergent algorithm. | ||
+ | should double the number of correct bits in x. You could use an 8 bit | ||
+ | multiply and converge to an 8 bit solution from an initial guess. | ||
+ | better use would be to compute a 32 bit result (our floating point | ||
+ | mantissa). | ||
+ | using look up tables, take an iteration using 16 bit multiplication (or | ||
+ | 16 by 8) to get a 16 bit estimate, and take another iteration using 32 | ||
+ | bit multiplication to get the final 32 bit result. Division can then be | ||
+ | accomplished as a/b := a*(1/ | ||
+ | have fast multiplication. | ||
+ | |||
+ | @(A): Square Roots | ||
+ | |||
+ | BASIC 2.0 calculates square roots from x = exp(0.5*log(a)). | ||
+ | slow since BASIC calculates the log and exp functions, and inaccurate as | ||
+ | well. If you have these functions tabulated you might want to use them | ||
+ | for an initial estimate of x. If you have a table of squares, the | ||
+ | inverse function of the square root, you could use a search routine on | ||
+ | the table. | ||
+ | method algorithm, | ||
+ | |||
+ | x := (x + a/ | ||
+ | |||
+ | One can also compute x = 1/SQR(a) using | ||
+ | |||
+ | x := x*(3-a*x*x)/ | ||
+ | | ||
+ | avoiding the division. | ||
+ | |||
+ | E. J. Schmahl published ML code for computing the square root in " | ||
+ | Square Root For The Commodore 64" in The Transactor, Vol. 8, No. 1, July | ||
+ | 1987, pp. 34-35. | ||
+ | by Newton' | ||
+ | calculations, | ||
+ | suggested for the inverse algorithm. | ||
+ | |||
+ | Another interesting algorithm for the INTEGER square root was recently | ||
+ | published by Peter Heinrich, "Fast Integer Square Root", Dr. Dobb' | ||
+ | Journal, #246, April 1996. This is a fast algorithm that uses no | ||
+ | multiplication or division. | ||
+ | algorithm for the 6502. | ||
+ | |||
+ | @(A): Algebraic Geometric Mean | ||
+ | |||
+ | The AG Mean is our first real numerical algorithm, the others above are | ||
+ | our arithmetic building blocks. | ||
+ | | ||
+ | | ||
+ | a(i+1) := (a(i) + b(i))/ | ||
+ | b(i+1) := SQR(a(i)*b(i)) | ||
+ | until converged | ||
+ | |||
+ | For 0 < a(0) <= 1 and 0 < b(0) <= 1 the sequences converge | ||
+ | quadratically to their common limit point, the AG mean of a(0), b(0). | ||
+ | Note that we need to use full precision from the start and an accurate | ||
+ | square root routine. | ||
+ | This can be used to compute the complete elliptic integral of the first | ||
+ | kind, K(k). With a(0) = 0 ,and b(0) = SQR(1-k_2), K(k) = PI/ | ||
+ | The AG Mean can also be used for some other computations | ||
+ | |||
+ | @(A): A Caution | ||
+ | |||
+ | Many mathematical equations can be found in math books and similar | ||
+ | sources. | ||
+ | further algebraic manipulation. | ||
+ | written. | ||
+ | to compute the roots of a second order polynomial equation. | ||
+ | there is a particular way to code it to avoid overflow, underflow, and | ||
+ | loss of precision. | ||
+ | of third and fourth order polynomial equations. | ||
+ | and higher order polynomials are best solved for using general root | ||
+ | finding techniques. | ||
+ | |||
+ | @(A): Conclusion | ||
+ | |||
+ | This article is long on discussion and short on usable code. Although | ||
+ | it suggests faster ways of performing arithmetic on a C64, the built in | ||
+ | FP +, -, *, and / routines are reliable and can used for serious | ||
+ | computations. | ||
+ | present source code for solving a numerically intensive problem. | ||
+ | 1, I present an introduction to Linear Programming. | ||
+ | topics will be suggested by readers, and possibly articles will even be | ||
+ | written by other users. | ||
+ | numerical methods, or turn this into a simple question and answer | ||
+ | column. | ||
+ | C64/128 programs but have not shared them with the Commodore user | ||
+ | community yet. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== 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...) | ||
+ | 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' | ||
+ | publications available. | ||
+ | send complimentary copies of their publications for review. | ||
+ | |||
+ | @(A): Commodore Gazette | ||
+ | This new introduction is published by Commodore Gazette Publications, | ||
+ | and is NOT related to COMPUTE' | ||
+ | In Volume 1, Number 7, editor Christopher Ryan mentions the above | ||
+ | fact, as it seems some upset COMPUTE' | ||
+ | | ||
+ | | ||
+ | a 128 (I should mention this was the April issue). | ||
+ | | ||
+ | | ||
+ | a bit light, but is pleasing. | ||
+ | |||
+ | @(A): Commodore World (http:// | ||
+ | In the continuing saga of the funky graphics, Jenifer Esile, who made | ||
+ | a good share of them, has resigned from editorship of Commodore World. | ||
+ | We hope it isn't something we said :-). Anyway, CW has hired a new | ||
+ | | ||
+ | |||
+ | Doug Cotton, the editor of CW, mentioned that Issue 13 was a nightmare. | ||
+ | I guess even CMD falls prey to the superstitious number. | ||
+ | For those wanting to learn more about the World Wide Web and HTML, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nick Rossi, the author of Novaterm. | ||
+ | |||
+ | Issue 14 follows up on the HTML tutorial by Katherine Nelson. | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Jim Butterfield shows how to get some input into your ML programs, and | ||
+ | | ||
+ | |||
+ | @(A): DisC=overy (http:// | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Judd on VDC timing, by Nate Dannenburg on constructing an 8-bit | ||
+ | | ||
+ | 128 VDC to 64kB. Other articles include a discussion on George | ||
+ | | ||
+ | at ModPlay 128. Commented source is included for many of the | ||
+ | | ||
+ | | ||
+ | is paid to consistency throughout the issue. | ||
+ | the issue itself, there is a WWW Site devoted to the magazine: | ||
+ | | ||
+ | here at Hacking Headquarters is the publication cycle for this new | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | @(A): Driven (http:// | ||
+ | Issue #13 contains a good review of the 1541-DOS package from | ||
+ | | ||
+ | 1541 to read and write a disk format that can be read on IBM 5.25" | ||
+ | | ||
+ | Tao discusses some ideas to help developers write graphics-format | ||
+ | | ||
+ | read this article and heed its warnings. | ||
+ | PAL machines or vice versa can impact the usefulness of your | ||
+ | | ||
+ | | ||
+ | Chat (IRC), including how to use its features. | ||
+ | |||
+ | | ||
+ | Nate Dannenburg presents information on ModPlayer 128, while Guenther | ||
+ | Bauer reviews the new CMD 20 MHz SuperCPU accelerator. | ||
+ | some of the theory behind creating digital music and how it can be | ||
+ | done using a Commodore 64. Lastly, Issue #14 presents a transcript | ||
+ | of the Genie roundtable discussion on the 64 and its place on the | ||
+ | | ||
+ | |||
+ | @(A): LOADSTAR (http:// | ||
+ | Issue 142 brings us Fender' | ||
+ | good software languishing in the closets of those who have forgotten | ||
+ | it sits there. | ||
+ | | ||
+ | Of special mention on this issue is Terry Flynn' | ||
+ | | ||
+ | For those who have flipped through the 64 PRG enough to wear out the | ||
+ | | ||
+ | |||
+ | In Issue 143, Jeff Jones presents the nuts and bolts behind LOADSTAR' | ||
+ | text packing routines, while CodeQuest '95 silver medal winner Paul | ||
+ | Clark offers a handy LIST wedge that allows forward and backward BASIC | ||
+ | | ||
+ | twist for you BASIC programers. | ||
+ | GEOS but are given graphics in GEOPaint format, Saimak Ansari provides a | ||
+ | | ||
+ | |||
+ | By far the most technical of the 3 reviewed, issue 144 contains a | ||
+ | | ||
+ | | ||
+ | of effort. Jeff Jones, the author, has rolled an extensive list of user | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | @(A): LOADSTAR 128 (http:// | ||
+ | For all the Dave's Term folks, Issue 31 presents the 5th and final | ||
+ | | ||
+ | | ||
+ | | ||
+ | fines to make them smaller. | ||
+ | text screens and other files with repeating symbols. | ||
+ | notes in the introduction that many new 128 titles are arriving for | ||
+ | | ||
+ | of more aspects of this publication. | ||
+ | |||
+ | @(A): LOADSTAR LETTER (http:// | ||
+ | We have decided to break LL out from the LOADSTAR reviews because | ||
+ | J and F Publishing has recently decided to make LL a separate product. | ||
+ | The details are in LL Issue #34. The publication will continue to be | ||
+ | free of charge until #37. | ||
+ | |||
+ | In LL #32, LOADSTAR introduces two more editions in its " | ||
+ | The Compleat Crossword offers what the name inplies, while The | ||
+ | | ||
+ | one compilation. | ||
+ | | ||
+ | the problem. | ||
+ | | ||
+ | | ||
+ | | ||
+ | Brain presents part 5 of the Internet series. | ||
+ | |||
+ | LL #33 showed up with a revamped look. The publication now has a | ||
+ | | ||
+ | | ||
+ | | ||
+ | of BASIC compiler pitfalls and problems follows. | ||
+ | | ||
+ | work on machines with " | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | In LL #34, we learn the new email address for LOADSTAR email: | ||
+ | | ||
+ | | ||
+ | on earth." | ||
+ | | ||
+ | free to subscription based, and some more information on the SuperCPU is | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | some of the 20 most influential ICs in the computer industry. | ||
+ | |||
+ | | ||
+ | user with current events information, | ||
+ | code fragments and technical discussions interspersed with the lighter | ||
+ | | ||
+ | |||
+ | @(A): The Underground | ||
+ | | ||
+ | who donated a subscription so that we can review this magazine for our | ||
+ | | ||
+ | |||
+ | With our first issue, Scott Eggleston has changed the format of the | ||
+ | | ||
+ | | ||
+ | | ||
+ | hard drive purchase, Disk Estel reviews an HD-40. | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Other magazines not covered in this rundown include: | ||
+ | |||
+ | * _64' | ||
+ | * _Atta Bitar_ (_8 bitter_) | ||
+ | + _Bonkers_ | ||
+ | + _Coder' | ||
+ | + _COIN!_ | ||
+ | o _Commodore 64/128 Power User Newsletter (CPU) | ||
+ | o _COMMODORE CEE_ | ||
+ | * _Commodore Network_ | ||
+ | * _Commodore Zone_ | ||
+ | * _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. | ||
+ | |||
+ | ============================================================================ | ||
+ | </ | ||
+ | ====== OS/A65 - a Multitasking/ | ||
+ | < | ||
+ | by Andre Fachat (a.fachat@physik.tu-chemnitz.de) | ||
+ | http:// | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | In 1989, I first thought about building a self-designed computer. | ||
+ | already had some experience with 6502 based computers. A friend of mine | ||
+ | and I had been trying to build a telephone line switch computer based on | ||
+ | the 6502. Although the project never succeeded (well, to a certain extent | ||
+ | it worked, but then we always got new ideas...), the project gave me an | ||
+ | idea of what an OS should be capable of. | ||
+ | |||
+ | With my homebrew computer, I not only wanted to implement one of those | ||
+ | ' | ||
+ | wanted to go a step further and do a real multitasking, | ||
+ | design OS. This constrained the hardware design to allow memory mapping | ||
+ | of key memory locations, including the 6502 zero-page and stack. | ||
+ | |||
+ | @(A): What Should a Real OS Do? | ||
+ | |||
+ | A real operating system has four major parts that handle the | ||
+ | input/ | ||
+ | the very least, a " | ||
+ | |||
+ | Process management forms one block of an OS. A multitasking operating | ||
+ | system requires more administration than a single-tasking OS. A process, | ||
+ | or task, can be seen as a set of allocated resources. | ||
+ | include memory pages, swap pages, open files, and even the CPU, if the | ||
+ | task is active. The CPU is the processing element that executes the given | ||
+ | program using the allocated resources. Therefore, the CPU state has to be | ||
+ | saved if a task is interrupted. This allows undisturbed continuation | ||
+ | after the interruption is handled. For each task, the allocated resources | ||
+ | have to be registered and freed. As the CPU can be allocated to only a | ||
+ | single task at a given time, it must be shared among all the active | ||
+ | processes. | ||
+ | processes at the same time (pseudo-parallelism), | ||
+ | assigned to one task after another, at a speed that achieves this | ||
+ | illusion. | ||
+ | if the speed is too fast, the CPU spends all of its time administering | ||
+ | the tasks and not enough time executing the tasks. | ||
+ | hold true for multiprocessor | ||
+ | achieve parallel operation on as many tasks as there are CPUs in the | ||
+ | system. | ||
+ | |||
+ | A scheduler interrupts the CPU after a certain time to allow the CPU to | ||
+ | be assigned to another task. If the scheduler interrupts the task itself | ||
+ | to schedule a new task, the system is called preemptive. If the task has | ||
+ | to give the CPU back to the system, it is called cooperative | ||
+ | multitasking, | ||
+ | preferred, as cooperative multitasking fails when a single process | ||
+ | forgets or is unable to relinquish control of the CPU. If such a | ||
+ | scenario occurs, the computer is " | ||
+ | |||
+ | As the second part, I/O provides a uniform interface to all peripherals, | ||
+ | including character devices (serial lines, parallel printers), or block | ||
+ | devices (disk drives). These services are normally provided by device | ||
+ | drivers, which, in some operating systems, are even loadable. One problem | ||
+ | is the communication between device interrupt routines and the rest of | ||
+ | the system. Andrew Tanenbaum, in _Operating Systems, Design and | ||
+ | Implementation_, | ||
+ | They should be hidden away, deep in the bowels of the system, so that as | ||
+ | little of the system as possible knows about them." Nevertheless, | ||
+ | interrupts are necessary to handle time critical operations, like | ||
+ | providing new data to serial lines. Provisions must be taken to avoid | ||
+ | data corruption by an interrupt routine and a program (or the kernel) | ||
+ | using the same memory locations at the same time. So, even if you don' | ||
+ | like interrupts, you have to use them. | ||
+ | |||
+ | As the third part, the filesystem provides user-level abstraction of I/O. | ||
+ | Files store information of any kind. It is the most visible part of the | ||
+ | OS. The naming conventions make a big part of the OS view for the normal | ||
+ | user. (Remember the 8+3 character filename length restriction in MS-DOS | ||
+ | filesystems? | ||
+ | user, although the underlying structure (i.e. how files are stored) may | ||
+ | differ on different devices. In UNIX operating systems, even devices can | ||
+ | be used as files and are represented by special entries in the directory | ||
+ | structure (on the newest version of Linux (pre2.0.) even files can be | ||
+ | used as filesystem (that hold files that can be used as filesystem (that | ||
+ | hold files.. Ooops ;-))). I will not go further into this issue, but how | ||
+ | a filesystem is organized can sometimes become a religious war among | ||
+ | their respective followers. Since a filesystem keeps all internal | ||
+ | structures to itself, it is possible to mount differently structured | ||
+ | filesystems in one system. | ||
+ | |||
+ | As the final part, memory management keeps track of which parts of the | ||
+ | memory are in use and which are not. Memory can be allocated when needed | ||
+ | and is freed for other uses when no longer needed. Modern systems use the | ||
+ | concept of virtual memory. Virtual memory specifies a system that uses a | ||
+ | translation table between the CPU and the real memory locations. | ||
+ | the CPU tries to access a certain memory address, the address given in | ||
+ | the opcode does not reflect the real address used to access the memory | ||
+ | chips. | ||
+ | address from the `virtual' | ||
+ | no appropriately sized contiguous memory block available in real memory, | ||
+ | such a block can be built using smaller chunks by setting up the | ||
+ | translation table for the task. The lookup is done by the memory | ||
+ | management unit (MMU). Software called a memory mapper is used to load | ||
+ | and change the table. It loads the table with the values set up for each | ||
+ | task. So the same opcode address in two different tasks accesses very | ||
+ | different memory locations in the RAM. | ||
+ | |||
+ | More sophisticated memory managers even do swapping. The memory manager | ||
+ | allows a task to allocate more memory than actually available. If a | ||
+ | memory location that is not available is accessed, the CPU is trapped | ||
+ | (the ability to do this cleanly was one of the (IMHO very few) additions | ||
+ | from the Motorola 68000 to the 68010 CPU). The memory manager then saves | ||
+ | (swaps out) another memory page to disk and uses the now free memory. The | ||
+ | CPU can then continue. If a swapped out memory address is accessed, the | ||
+ | CPU is halted again and the page is swapped in again - swapping out | ||
+ | another page if necessary. Clearly this slows the whole thing down, but | ||
+ | then virtual addresses are a very nice feature. You can hide the pages | ||
+ | used by other tasks or map the same memory to several tasks, making it | ||
+ | shared memory. | ||
+ | |||
+ | These inclusion of these features implies that all resources can be | ||
+ | assigned equally to each task. As there are problems with this in the | ||
+ | 6502 (think of the stack), another concept should at least be mentioned. | ||
+ | The IBM `Virtual Machine' | ||
+ | entire computer' | ||
+ | doesn' | ||
+ | some I/O registers). | ||
+ | action is taken. This means that the task can behave as if it owns the | ||
+ | entire machine. | ||
+ | and other I/O (the second part of the " | ||
+ | |||
+ | The Commodore PET and its successors, the VIC, C64 and 128, already | ||
+ | contain some functionality of a " | ||
+ | interface allows uniform file access across different devices (tape, | ||
+ | disk, console). All of them are accessed via the standard OPEN / CKOUT / | ||
+ | CHKIN / CLOSE system calls. However, I/O comprises only one part of an | ||
+ | OS, as defined above. | ||
+ | singletasking systems (for exceptions see below). Therefore, no process | ||
+ | management is necessary. In addition, there is no memory management. All | ||
+ | memory is assigned to the single running process. (Although sometimes the | ||
+ | need for multiple $cXXX pages seems pressing.) | ||
+ | important part of an OS, is put into the floppy drive on Commodore 8-bit | ||
+ | computers and is accessed via standard I/O over the IEEE bus. | ||
+ | |||
+ | One interesting exception is the old (IEEE488) Commodore disk drives. | ||
+ | These drives have not one but two processors: one 6502 and a 6504 that | ||
+ | run in parallel and share some memory. The 6504 is used as a floppy drive | ||
+ | controller that handles the low level disk I/O. The 6502 gets the | ||
+ | commands from the bus and processes the `filesystem' | ||
+ | level commands to certain memory locations, it sends commands to the | ||
+ | floppy drive controller (the 6504) that in turn reads and writes the disk | ||
+ | blocks. If you look at the 1541, for example, you can see that this | ||
+ | concept still holds true. However, in the 1541, the interrupt routine | ||
+ | takes the role of the drive controller. Ironically, this reduction in | ||
+ | CPUs was done to save 1541. In its effort to cut costs, Commodore forced | ||
+ | the single CPU of the 1541 to multitask, creating a bare operating system | ||
+ | to support drive operation. | ||
+ | |||
+ | @(A): Modern Kernel Design | ||
+ | |||
+ | Early operating systems started with a monolithic approach. i.e. all the | ||
+ | system functions were provided with one big binary. Modern UNIX systems- | ||
+ | even Linux, which is not derived from the original UNIX source- use this | ||
+ | concept. | ||
+ | |||
+ | A modern kernel instead has a microkernel design. A microkernel only | ||
+ | provides the means of communication between different processes, not | ||
+ | doing much itself. Some implementations even have the scheduler (!) or | ||
+ | memory manager (!) running as a separate task. The kernel calls these | ||
+ | processes to find out about free memory pages and which task to start | ||
+ | next. This reduces the size of the kernel and allows greater flexibility. | ||
+ | On the downside, the microkernel designs forces more messages to be | ||
+ | transferred, | ||
+ | |||
+ | One `famous' | ||
+ | This kernel, and its derivatives, | ||
+ | PowerPC Platform OS/2 is based on a mach derived microkernel, | ||
+ | Linux for PowerPC Macintosh (mklinux). But, these are relatively simple | ||
+ | ports of already existing operating systems. These mach `single servers' | ||
+ | don't allow alternate OS system to run alongside or instead of themselves. | ||
+ | On the other hand, the GNU Hurd operating system exploits the mach design | ||
+ | to allow any server to be replaced by another. | ||
+ | | ||
+ | @(A): The OS/A65 Operating System | ||
+ | |||
+ | Now let's get from the theory to practice... | ||
+ | |||
+ | @(A): The Kernel Implementation | ||
+ | |||
+ | When it comes to hardware design, the 6502 has a big advantage: It is a | ||
+ | very simple CPU. With only a few support ICs, it is possible to build a | ||
+ | fully functional computer (neglecting video and sound capabilities). On | ||
+ | the other hand, the simplicity of the CPU has drawbacks. The 6502 has | ||
+ | only three multi-purpose registers, and all are 8 bits. As such, none | ||
+ | can hold a complete 16 bit 6502 memory location. Even the stack pointer | ||
+ | is 8 bits, restricting the stack to the 256 bytes from $0100 to $01ff. | ||
+ | The stack size and the absolute addresses are a severe limitation if you | ||
+ | intend to develop a multitasking OS on this machine. | ||
+ | |||
+ | Because I was developing a new system, I could do anything I wanted to | ||
+ | get around this problem. I solved the stack problem by using an MMU, a | ||
+ | Memory Management Unit. (Although the used chip, the 74ls610 is stated to | ||
+ | be a `Memory Mapper' | ||
+ | Management Unit' | ||
+ | 16 8-bit registers. (The 74ls610 has 12-bit registers, but only 8 bits | ||
+ | are used, for obvious reasons.) The output of the registers were then | ||
+ | used as the upper 8 address bits, extending the total accessible memory | ||
+ | to 1 MByte. The CPU could switch each 4 kByte page to any of the 256 | ||
+ | pages available by changing the register values in the MMU. Oops - just | ||
+ | introduced virtual addresses to the 6502 ;-) | ||
+ | |||
+ | For each task, new memory is allocated and saved in the task's page | ||
+ | table. When a task is activated, the MMU registers are loaded with these | ||
+ | values, giving each task its own memory environment. In the described OS, | ||
+ | the memory `manager' | ||
+ | part. The virtual addresses in the opcodes are translated to the real | ||
+ | addresses through the contents of the MMU registers. | ||
+ | |||
+ | The tasks are handled by the environment routines. These routines set up | ||
+ | the environment tables used by the scheduler. The (round robin) scheduler | ||
+ | performs the task switching and decides which task to run next. | ||
+ | Preemptive multitasking is achieved by using the interrupt to switch | ||
+ | between different tasks. The most important routines are the two kernel | ||
+ | entry and exit routines. These sub-routines have to switch the pages and | ||
+ | the stack pointer as well as preserve all other register values. | ||
+ | |||
+ | The tasks providing filesystem services register with the filesystem | ||
+ | manager. They are then assigned drive numbers. | ||
+ | are virtual, where a user can reconfigure the system at any time, | ||
+ | developing such a system for the 6502 would overly complicate matters. | ||
+ | Different filesystems can then be used at the same time with different | ||
+ | drive numbers. The drive numbers are translated by the filesystem manager | ||
+ | when passing the message through to the filesystem task. Currently | ||
+ | `fsiec' | ||
+ | `fsibm' | ||
+ | provided. | ||
+ | |||
+ | The interface to the hardware is provided by the devices. Devices are | ||
+ | simply stripped off tasks and are called as subroutines only. A device- | ||
+ | filesystem (`fsdev' | ||
+ | interface, so that any device can be used like a file. The general | ||
+ | structure can be seen in Fig.1. | ||
+ | |||
+ | ---------- --------- --------- ------ ------- | ||
+ | | fsdev | | fsiec | | fsibm | | sh | | mon | tasks... | ||
+ | ---------- --------- --------- ------ ------- | ||
+ | ---------------------------- -------------- ----- ---------- -------- | ||
+ | | | | | fsm | | | | | | | | ||
+ | | | env | -------------- | | | | | | | ||
+ | | | | ||
+ | | | | | | | | | ||
+ | | -------------------------------------- | | | | | ||
+ | | | ||
+ | ------------------------------------------------- ---------- -------- | ||
+ | --------- ------- ----------- ---------- | ||
+ | | video | | par | | spooler | | serial | devices... | ||
+ | --------- ------- ----------- ---------- | ||
+ | |||
+ | Fig.1: General OS structure. The devices and tasks make up the features | ||
+ | of the system, while the kernel provides communications. | ||
+ | (fsm = filesystem manager, env = environment handling, task switcher) | ||
+ | |||
+ | In addition to executing code within the task, tasks also need to | ||
+ | execute to communicate with other tasks or components of the OS. To | ||
+ | communicate between tasks, a send/ | ||
+ | rendezvous technique (the sender blocks till the message can directly be | ||
+ | copied to the receiver and vice versa) the mechanism is kept simple, as | ||
+ | no buffering is involved. Semaphores can be used for synchronization | ||
+ | between different tasks. Data streams are used to pass data between | ||
+ | tasks, and even between tasks and devices. Each task has a standard | ||
+ | input, output, and error streams opened upon creation, analogous to the | ||
+ | stream in UNIX systems. The shell can even redirect or pipe the output. | ||
+ | |||
+ | @(A): Program examples | ||
+ | |||
+ | The shell is a good example to show some of the capabilities of the | ||
+ | system. As already mentioned, each task has three specially assigned | ||
+ | streams. Filesystem tasks don't use them (and have them set to an ignored | ||
+ | stream), but shells normally get started with these streams | ||
+ | connected to a terminal device or a serial line device. The streams are | ||
+ | normally opened by the task that `forks' | ||
+ | contains some hints about which device number to open for a program. When | ||
+ | a new task is started with a shell command, the shell has to open the | ||
+ | devices. | ||
+ | shell itself are registered for the new task. However, if given on the | ||
+ | command line, other files can be opened and the streams for these files | ||
+ | used as stdio streams. | ||
+ | |||
+ | When a file has to be opened, an OPEN message is sent to the filesystem | ||
+ | manager. This part of the kernel translates the drive number and forwards | ||
+ | the message to the filesystem task. The filesystem then tries to open the | ||
+ | file and sends a reply message. The originating task | ||
+ | provides a stream number with its first message. If the filesystem task | ||
+ | succeeds in opening the file, it uses the provided stream to read or | ||
+ | write the data to. If the file ends, the writing task closes the stream, | ||
+ | which is recognized by the other end when there' | ||
+ | This works for read only and write only opens, but not for read/ | ||
+ | opens. | ||
+ | |||
+ | @(A): Problems | ||
+ | |||
+ | Bootstrapping was the first major problem. How do you start a new | ||
+ | computer and debug its OS if don't have an OS on the computer? | ||
+ | earlier systems I already had a small monitor program - directly burned | ||
+ | into an EPROM - able to load binaries through a serial line. Getting the | ||
+ | MMU (74ls610) was the second problem, because it was on the CoCom list, | ||
+ | and it was not allowed to export to eastern countries. (Although I don' | ||
+ | live in an eastern country, this posed some difficulties...) | ||
+ | |||
+ | After defining the necessary interfaces between kernel and tasks and | ||
+ | kernel and devices, the design was quite straightforward, | ||
+ | problem was the small number of registers in the 6502. For some of the | ||
+ | kernel routines, as well as for the send/ | ||
+ | necessary to define a special buffer. This buffer is at an absolute | ||
+ | address at $02XX, which is the same for each task. For systems with an | ||
+ | MMU, this is not a problem after all. But it showed out to be a | ||
+ | significant problem when porting the OS to systems without MMU, like the | ||
+ | C64 (see below). | ||
+ | |||
+ | @(A): Operation without an MMU | ||
+ | |||
+ | After the system worked well with an MMU, I decided to build a stripped | ||
+ | down version for systems without an MMU to better fit some `embedded | ||
+ | applications' | ||
+ | multithreading than a multitasking system. Threads, as opposed to tasks, | ||
+ | share the same memory, thus being able to change variables and data of | ||
+ | other threads. But, on the other hand, two identical programs cannot run | ||
+ | at the same time as with an MMU, unless they know they will together | ||
+ | ahead of time. | ||
+ | |||
+ | The problem lies within the limited stack size of the 6502. Without an | ||
+ | MMU, it is not possible to remap memory pages, especially the page with | ||
+ | the stack in it. So the stack is divided into several parts, limiting the | ||
+ | stack size of each thread, of course. Another problem is global, absolute | ||
+ | addresses - like the send/ | ||
+ | much of a rewrite and memory wastage to give each thread its own buffer, | ||
+ | the send/ | ||
+ | construct that allows exactly one thread to be in a certain routine or | ||
+ | manipulate the protected data at a time. Semaphores originate from the | ||
+ | railways, where it is important not to have two trains on the same rail, | ||
+ | running in opposite directions... | ||
+ | |||
+ | @(A): Port to the C64 | ||
+ | |||
+ | In addition to lacking an MMU, the Commodore 64 posed other porting | ||
+ | problems. Only small changes had to be made to the kernel. | ||
+ | kernel required an interrupt source for task switching. The video device | ||
+ | had to be changed to support the C64 keyboard map and video interface. | ||
+ | The hardware cursor used in my homebrew computer was replaced by a | ||
+ | software cursor. The IEEE488 filesystem was first ported to the IEEE488 | ||
+ | interface for the C64 and then to the C64 serial port. When stress | ||
+ | testing the system I realized that I still hadn't ported the STDIO | ||
+ | library - a few low level subroutines that make life easier. The library | ||
+ | was mapped to most tasks and was called from the task environment, | ||
+ | from inside the kernel. Unfortunately, | ||
+ | broke the library when running on a multithreaded system without an MMU. | ||
+ | Therefore, some routines have been changed, while others can only be | ||
+ | protected by a semaphore. | ||
+ | |||
+ | @(A): Port to the C128? | ||
+ | |||
+ | Well, the C128 has more memory and even the capability of remapping the | ||
+ | stack and zero page to other locations. In a simple expansion of the C64 | ||
+ | version, this could be a way to raise the limited stack size to the full | ||
+ | possible 256 bytes. Then, other ideas come to mind. The original memory | ||
+ | management is made for a system with MMU and is quite useless without an | ||
+ | MMU. What is missing is a call to get a contiguous memory block of more | ||
+ | than a memory page in size. Then such a large block could be allocated | ||
+ | for a new task to load the binary. The binary itself must then be | ||
+ | relocated to fit the new address range. Unfortunately, | ||
+ | the system calls or add relocation capabilities do not exist at this | ||
+ | time. | ||
+ | |||
+ | @(A): Conclusion | ||
+ | |||
+ | The OS/A65 operating system provides multitasking and multithreading | ||
+ | capabilities with a modern kernel design for a 6502 CPU. The OS can be | ||
+ | used from embedded applications to desktop systems. A shell provides | ||
+ | modern I/O redirection and piping capabilities. Filesystems for Commodore | ||
+ | disk drives and PC-style floppies are available. For me, it was a real | ||
+ | adventure to design a completely new computer and operating system the | ||
+ | way I wanted them designed. I also learned a lot about operating system | ||
+ | design - maybe you have learned a bit as well. If you are interested in | ||
+ | it, more information is available at: | ||
+ | |||
+ | http:// | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== UseNuggets ====== | ||
+ | < | ||
+ | | ||
+ | COMP.SYS.CBM: | ||
+ | see what topics are showing up this month: | ||
+ | |||
+ | @(A): Let's Poll Together | ||
+ | |||
+ | Throughout the past few months, Paul Allen Panks has been conducting a | ||
+ | poll on Commodore Business Machines' | ||
+ | momentous flops. Although some biased opinions exist, many have agreed | ||
+ | that the C64 was a success, while the 264 series (Plus/4 and C16) was a | ||
+ | flop. After that, however, and few agree. | ||
+ | |||
+ | @(A): Ymodem vs. FX, Round -1 | ||
+ | |||
+ | The many people who use Craig Bruce' | ||
+ | added support for a special transfer protocol, FX. Proprietary in nature, | ||
+ | FX supports very large buffer sizes and can achieve throughput of 200% | ||
+ | or more over standard protocols like Ymodem or Xmodem. | ||
+ | of FX is the necessity of compiling an FX " | ||
+ | order to utilize the protocol. | ||
+ | |||
+ | While not newsworthy in itself, a discussion about which standard | ||
+ | protocols are fastest kicked up some dust. Many were inquiring about | ||
+ | DesTerm support for Zmodem, causing Ismael Cordeiro to note that the | ||
+ | DesTerm protocol implementors chose to optimize existing protocols | ||
+ | rather than introduce new ones. | ||
+ | |||
+ | A lively debate started, as Craig Bruce noted that even the fastest | ||
+ | implementations of Ymodem were no match for FX. Ismael countered by | ||
+ | calling the comparison unfair. | ||
+ | proprietary and not available for all Commodore users. | ||
+ | |||
+ | Also, Ismael explained the reasons for FX's increase in throughput over | ||
+ | standard protocols. | ||
+ | larger buffer size. However, FX suffers when retransmissions are necessary, | ||
+ | since the time between handshakes (which occur between packets) is much | ||
+ | longer. | ||
+ | competitive. | ||
+ | |||
+ | @(A): Operating System Support | ||
+ | |||
+ | In last issue' | ||
+ | proliferation of operating system ideas on comp.sys.cbm. | ||
+ | Reference: usenet) We noted that many expressed a need for programmers | ||
+ | to support the ACE computing environment, | ||
+ | noticing this, Craig responded: | ||
+ | | ||
+ | " | ||
+ | | ||
+ | using ACE applications with other operating systems. | ||
+ | on the idea of providing a well-defined Application-Program Interface | ||
+ | | ||
+ | a " | ||
+ | | ||
+ | | ||
+ | _I_ use them). | ||
+ | ACE API, since it changed in Release #15, but the basic functionality | ||
+ | will always be the same. | ||
+ | | ||
+ | In addition, I also support the idea of other people using ACE code | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | @(A): The "More Power" Swiftlink (An Update) | ||
+ | |||
+ | As well, Craig followed up to our story last issue on the " | ||
+ | Swiftlink that could do 115,200 bps. (C=H #12, Reference: usenet) | ||
+ | Craig noted that ACE #15 supports the modified Swiftlink and that the | ||
+ | code in ACE handles the new speeds " | ||
+ | |||
+ | @(A): And Speaking of Operating Systems... | ||
+ | |||
+ | Since the last issue of Commodore Hacking, at least two more operating | ||
+ | systems have been announced. | ||
+ | Commodore Hacking (Reference: os). Another, called COMMIX 2, will | ||
+ | encompass an object oriented operating system. | ||
+ | comprised of multiple sub parts, including: | ||
+ | |||
+ | Networked X Input/ | ||
+ | COMMIX Object Format (CXOF), an object and code description format | ||
+ | nXIOtee, the object oriented programming language. | ||
+ | |||
+ | For more information on this networked OS design, check out its WWW site | ||
+ | at: http:// | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Using UQWK with QWKRR128 ====== | ||
+ | < | ||
+ | by Gaelyne R. Moranec (gaelyne@cris.com) | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | One of my first priorities when joining an Internet service was to | ||
+ | find a way to utilize the QWKRR128 offline mail and news reader to read | ||
+ | Internet email and USENET newsgroups. | ||
+ | QWKRR128 is commonly used with Bulletin Board Systems (BBS). | ||
+ | dials into a BBS, selects which groups and what email to download. | ||
+ | BBS program then gathers and compresses the user's requested messages into | ||
+ | a file called a QWK packet. | ||
+ | and then runs QWKR128 or some other QWK reader on the packet. | ||
+ | users can read email and news offline and reduce connect time. Replies | ||
+ | are also handled in much the same way, allowing the user to read and | ||
+ | reply to messages without tying up the phone. | ||
+ | |||
+ | What happens when we replace the BBS with the Internet? | ||
+ | while, making the switch meant shelving QWK offline readers. | ||
+ | as with all problems that occur on the Internet, this deficiency was | ||
+ | soon remedied by Steve Belzack, who wrote the Unix QWK system, called | ||
+ | UQWK. It allows Internet users to package up Internet email and USENET | ||
+ | newsgroups into QWK packets for use with QWK readers like QWKR128. | ||
+ | its BBS counterpart, | ||
+ | reader. | ||
+ | |||
+ | @(A): Finding UQWK | ||
+ | |||
+ | You can find out if your system already has UQWK by typing any of the | ||
+ | following - if one command doesn' | ||
+ | |||
+ | where uqwk | ||
+ | | ||
+ | which uqwk | ||
+ | find uqwk | ||
+ | |||
+ | If your system has UQWK installed, DON'T run the program until after | ||
+ | you've read the manual for it. UQWK requires command line switches to | ||
+ | work and defaults to emptying your mail box, which isn't nice. To read | ||
+ | the manual, type: | ||
+ | |||
+ | man uqwk | ||
+ | |||
+ | It's a good idea to create a text file in your home directory with the | ||
+ | manual so you can download, print, and review it offline. | ||
+ | to do this is: | ||
+ | |||
+ | man uqwk >> uqwk.manual | ||
+ | |||
+ | Then, to read it you type: | ||
+ | |||
+ | more uqwk.manual | ||
+ | |||
+ | To download it with Ymodem, the command is: | ||
+ | |||
+ | sb uqwk.manual | ||
+ | |||
+ | If your system doesn' | ||
+ | get the file and compile it for your personal use. Because there are so | ||
+ | many versions of Unix to deal with, I cannot help you with compiling it | ||
+ | for use on your system. | ||
+ | administrator and ask him or her to install it. | ||
+ | |||
+ | The FTP site is: gte.com | ||
+ | Directory: | ||
+ | |||
+ | Be sure to get both UQWK and the README file. The text file will tell | ||
+ | you step by step how to set it up on your account. | ||
+ | |||
+ | @(A): Using UQWK | ||
+ | |||
+ | I use two Unix script files when I use UQWK, named " | ||
+ | and " | ||
+ | had to change the permissions on them so Unix would see them as | ||
+ | " | ||
+ | |||
+ | chmod +x filename | ||
+ | |||
+ | or | ||
+ | |||
+ | chmod 700 filename | ||
+ | |||
+ | You will need to make changes in the files so that they represent the | ||
+ | BBSID used on your system. For instance, CRISINET is the BBSID on my | ||
+ | system and is used in the examples below. | ||
+ | |||
+ | When you use the getmail.script the first time, just use an arbitrary | ||
+ | name for the name of the .qwk packet, but change your script after you | ||
+ | know the correct BBSID to use. Be sure to use proper upper or lower | ||
+ | case *exactly* as it appears in your control.dat file for any | ||
+ | references to your .REP and .msg files. This may not always work, | ||
+ | however, as it depends on your terminal program. | ||
+ | will maintain the same casing as is used by PETSCII, while others will | ||
+ | convert them to ASCII. If yours changes the filename, be sure to change | ||
+ | the appropriate lines in your script files so UQWK and other utilities | ||
+ | can find it. | ||
+ | |||
+ | |||
+ | @(A): Scripts To Get You Started | ||
+ | |||
+ | # ---------------- | ||
+ | # getmail.script | ||
+ | # | ||
+ | | ||
+ | rm crisinet.qwk | ||
+ | uqwk +r +m +n +e | ||
+ | arc a crisinet.qwk *.dat *.ndx | ||
+ | sb crisinet.qwk | ||
+ | rm messages.dat *.ndx | ||
+ | |||
+ | # ---------------- | ||
+ | |||
+ | Notes: | ||
+ | |||
+ | rm crisinet.qwk | ||
+ | it is in lower case, as since we name this file | ||
+ | ourselves, there' | ||
+ | |||
+ | uqwk +r +m +n +e - The command to tell UQWK what you want it to do. | ||
+ | |||
+ | +r keeps UQWK from deleting your Email and marking | ||
+ | your newsgroup messages as read. | ||
+ | +m process Email. | ||
+ | +n process newsgroups | ||
+ | +e tells it to create a control.dat file listing | ||
+ | ONLY those subscribed newsgroups. | ||
+ | |||
+ | * Also you can use -m or -n so UQWK won't process | ||
+ | * mail or newsgroups. | ||
+ | * Email, but not newsgroups. (+m and -not) | ||
+ | * The +e switch is a must for QWKRR users, as | ||
+ | * this list gets loaded into memory and reduces | ||
+ | * the amount available for reading messages. | ||
+ | | ||
+ | arc a crisinet.qwk *.dat *.ndx - This creates an ARC archive of the | ||
+ | files UQWK has created. QWKRR users | ||
+ | | ||
+ | | ||
+ | those who use other offline mail | ||
+ | | ||
+ | |||
+ | As mentioned previously, although | ||
+ | the BBSID is " | ||
+ | we are creating the archived file, | ||
+ | we can leave it in lower case for | ||
+ | our own convenience. | ||
+ | |||
+ | sb crisinet.qwk - This begins a Ymodem download of your QWK packet. You | ||
+ | have to start the transfer with your terminal | ||
+ | program manually. | ||
+ | |||
+ | rm messages.dat *.ndx - This removes the messages.dat and *.ndx files | ||
+ | from your directory. | ||
+ | Email you don't wish others to view, this | ||
+ | | ||
+ | |||
+ | |||
+ | # ---------------- | ||
+ | # sendmail.script | ||
+ | # | ||
+ | |||
+ | rb | ||
+ | unzip CRISINET.rep | ||
+ | uqwk -m -n -Rcrisinet.msg | ||
+ | rm CRISINET.rep | ||
+ | |||
+ | # ---------------- | ||
+ | |||
+ | Notes: | ||
+ | |||
+ | rb - This begins a Ymodem upload so you can upload your Reply packet. | ||
+ | You have to start the upload with your term program manually. | ||
+ | |||
+ | unzip CRISINET.rep - If you've < | ||
+ | command to unzip it. When QWKRR creates the file, | ||
+ | it honours the case of the BBSID, so the filename | ||
+ | is in upper case. | ||
+ | | ||
+ | uqwk -m -n -Rcrisinet.msg - This is UQWK command to process a reply | ||
+ | | ||
+ | NOT to process your Email or newsgroups into | ||
+ | a new batch of mail to download. This file | ||
+ | | ||
+ | It is lower case. | ||
+ | |||
+ | rm CRISINET.rep - This deletes the .rep file from your directory. | ||
+ | UQWK automatically deletes the *.msg file. | ||
+ | |||
+ | You can also create these scripts with your term program. Either way | ||
+ | works. | ||
+ | |||
+ | When you review the UQWK manual, you'll see the commands and should be | ||
+ | able to follow the script file and make adjustments to suit your needs. | ||
+ | You can have UQWK create QWK packets for Email, newsgroups, or both. | ||
+ | Also, you can have one script file that sends your replies then creates | ||
+ | the next batch of QWK mail for you. | ||
+ | |||
+ | @(A): Safeguarding Your Email | ||
+ | |||
+ | On one system I use UQWK with, I can back up my Email file, something I | ||
+ | recommend especially when you first start using the program. | ||
+ | up my mail file, I copy the mail spool file to a local temp directory. | ||
+ | The actual path string for this varies depending on the type of Unix | ||
+ | system you are using. | ||
+ | |||
+ | cp / | ||
+ | |||
+ | On another system, I can't make a backup of my Email file, as the | ||
+ | system doesn' | ||
+ | use a command for UQWK that tells it not to erase my mail or newsgroup | ||
+ | articles. If you use the read-mode only command, you have to | ||
+ | delete Email manually, and mark newsgroup articles as read. | ||
+ | |||
+ | |||
+ | NOTE WELL: | ||
+ | ---------- | ||
+ | UQWK uses your .newsrc file to find what groups you are subscribed to. | ||
+ | ALWAYS upload and process your current Replies before subscribing or | ||
+ | unsubscribing to newsgroups, or else you will have your replies going to | ||
+ | the wrong newsgroups. | ||
+ | |||
+ | @(A): The Files UQWK Creates | ||
+ | |||
+ | UQWK only creates the base QWK mail files, which are " | ||
+ | " | ||
+ | needed for use with QWKRR). If you want to you can archive the files | ||
+ | QWKRR needs, or you can download the *.dat files uncompressed. The | ||
+ | getmail script file covers creating the arc file and beginning a Ymodem | ||
+ | download. | ||
+ | |||
+ | I compress my mail using arc, as I have a program that will | ||
+ | automatically dissolve my QWK mail and start QWKRR. | ||
+ | called QPE, and can be found in the archive NZP12817.SFX. | ||
+ | your mail packet, you will need an ML program found in the archive | ||
+ | CSX01.SDA. | ||
+ | 2.04g files, and Commodore users don't yet have a program that will | ||
+ | unzip these. | ||
+ | |||
+ | @(A): Replying To Email | ||
+ | |||
+ | By default, QWKRR doesn' | ||
+ | headers. To be able to see the complete Email addresses (a must for | ||
+ | Internet use), first load but don't run QWKRR. Type: | ||
+ | |||
+ | poke 49169,255 | ||
+ | |||
+ | Then save the program using a different name (such as qwkrrinet), just | ||
+ | in case you've made an error when entering the values. | ||
+ | |||
+ | @(A): Long Email Addresses | ||
+ | |||
+ | If the Email address of the recipient doesn' | ||
+ | you must use other addressing methods. Erase the name in QWKRR' | ||
+ | header and substitute the person' | ||
+ | with a space between them. Do NOT have a " | ||
+ | Email address is too long to fit in the field. If you do, UQWK assumes | ||
+ | it's a valid Email address. | ||
+ | one is so the program doesn' | ||
+ | ISP. | ||
+ | |||
+ | On the first line of the message, type: | ||
+ | |||
+ | To: user.name@anywhere.com | ||
+ | |||
+ | Begin your message on the following line. | ||
+ | |||
+ | Hint: Type "To: " on the first line. Quote enough of the message so the | ||
+ | Email address is on the screen, and then move the address so it | ||
+ | is in place after the "To: ". | ||
+ | |||
+ | There is a space between the colon and the Email address. | ||
+ | |||
+ | @(A): Sending Newsgroup Articles | ||
+ | |||
+ | The only thing different from Email you'll need to do is make sure that | ||
+ | your articles have the word " | ||
+ | |||
+ | Messages from almost any QWK offline mail reader do not conform to | ||
+ | Internet standards for newsgroup articles, as QWK was originally | ||
+ | designed for Fidonet only. You can still post articles with these | ||
+ | programs using the above method of placing " | ||
+ | |||
+ | For those who want their articles to conform to the Internet specs, you | ||
+ | can have UQWK look to the body of your message for the header | ||
+ | information by using the +X switch. This will let threaded newsreaders | ||
+ | properly add the article into an existing thread. This is only for those | ||
+ | who are well experienced with RFC-1036, the " | ||
+ | USENET Messages" | ||
+ | These documents can be found on the web at: http:// | ||
+ | In the future, I'll be adding information to QWKRR' | ||
+ | create articles that do conform to this standard. | ||
+ | |||
+ | QWKRR has a known bug when it comes to quoting lines that are over 255 | ||
+ | characters long. This bug often appears when replying to newsgroup | ||
+ | articles, as the " | ||
+ | version of QWKRR will not have this problem. To reply to a newsgroup | ||
+ | article that has a long pathline, export the article as a temporary text | ||
+ | file, then import it into the message. e< | ||
+ | available to registered QWKRR users. | ||
+ | |||
+ | @(A): A known UQWK Quirk for QWKRR users | ||
+ | |||
+ | When importing text that has a " | ||
+ | From, Subject etc.), UQWK makes the assumption that a new message has | ||
+ | started. | ||
+ | To/From info in the imported text about 4 columns. | ||
+ | |||
+ | @(A): Sending Your Replies | ||
+ | | ||
+ | Most Unix systems can unzip reply packets that have been Zipped by | ||
+ | QWKRR. | ||
+ | program. | ||
+ | file within the .REP file. It is possible to choose < | ||
+ | and upload the resulting *.msg file, BUT if you do this, you may have | ||
+ | problems with Xmodem padding (also Ymodem) added to the end of the file | ||
+ | by your term program. This extra padding will cause you to receive an | ||
+ | Email bounce as UQWK tries to interpret the padding as a message. It's | ||
+ | easier to <Z>ip the replies then let your script file unzip them. | ||
+ | |||
+ | @(A): UQWK and Signatures | ||
+ | |||
+ | When posting articles to newsgroups, UQWK will append your .signature, | ||
+ | but if it doesn' | ||
+ | the article. | ||
+ | change the filename from .signature to .sig and use a QWKRR macro for | ||
+ | your signature instead. (Be sure to change your settings for other | ||
+ | programs like Pine so it will look for a file called .sig, though). | ||
+ | |||
+ | @(A): UQWK and Newsgroup Subjects | ||
+ | |||
+ | There is a UQWK version that doesn' | ||
+ | with QWKRR and complains that the subject line is incomplete or | ||
+ | incorrect. | ||
+ | of UQWK that my system has online. | ||
+ | problem, and after checking FTP sites, it appears my current ISP is | ||
+ | using a customized version. If I find others have similar problems and | ||
+ | find a cure, I'll post info regarding it on QWKRR' | ||
+ | http:// | ||
+ | |||
+ | @(A): Conclusion | ||
+ | |||
+ | While reading BBS news and email offline is a blessing, it is almost | ||
+ | a necessity on the Internet, where the level of email and news can | ||
+ | be overwhelming to the online reader. | ||
+ | combinations that help you manage your time effectively yet still enjoy | ||
+ | the pleasures of keeping current on all the Internet has to offer. | ||
+ | |||
+ | ============================================================================ | ||
+ | </ | ||
+ | ====== FIDO's Nuggets ====== | ||
+ | < | ||
+ | by Geoff Sullivan (geoff.sullivan@tbbs.bcs.org) | ||
+ | | ||
+ | The CBM GEOS, CBM, and CBM-128 FIDONet echoes are places where Commodore | ||
+ | users unite. | ||
+ | |||
+ | @(A): GEOCable and Printers | ||
+ | |||
+ | GeoCable was a product originally marketed by Berkely Softworks to | ||
+ | eliminate the need for a serial interface for non-Commodore printers in | ||
+ | the Geos environment. | ||
+ | printer. Well, some users decided to test this speed increase and found | ||
+ | that what was accepted before may not be true in all cases. | ||
+ | scientific, and not so scientific, test results showed that the speed of | ||
+ | printing may have more to do with the type of data being printed and the | ||
+ | buffer size of the printer, than with the actual method used to get the | ||
+ | data to the printer. | ||
+ | |||
+ | Lately more programs outside the Geos operating system are sporting | ||
+ | printer drivers that support the GeoCable. As Phil Heberer aptly puts | ||
+ | it: | ||
+ | |||
+ | " | ||
+ | | ||
+ | | ||
+ | my favorite CBM programs that I currently use besides GEOS (i.e. | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Many users are building their own cables as well. Some users are | ||
+ | discussing the need for drivers that will work with the Hewlett-Packard | ||
+ | PCL language that is becoming more prevalent now that Commodore users | ||
+ | are fooling around with ink-jet and laser printers. | ||
+ | |||
+ | @(A): DESTERM | ||
+ | |||
+ | Matt Desmond has recently posted a message on FIDONet confirming his | ||
+ | work on a version 3.0 of Desterm. | ||
+ | have hardware flow control and enhanced REU support. | ||
+ | support any transfer protocol beginning with the letter Z. | ||
+ | |||
+ | @(A): EZ Loader v3.2 Released | ||
+ | |||
+ | David Schmoll announced the release of an upgraded version of his EZ | ||
+ | Loader program for the 64 or 128. It is designed to help you access your | ||
+ | most used programs on any disk or fixed drive through a single menu. | ||
+ | Although most useful for CMD drive owners, it can be used with any | ||
+ | Commodore drive. It has too many slick features to be mentioned here but | ||
+ | certain ones are disabled on the downloadable version. They can be | ||
+ | activated by registering the program. It is available via FTP from | ||
+ | ccnga.uwaterloo.ca in / | ||
+ | now. | ||
+ | |||
+ | @(A): Alternate Character Set Access | ||
+ | |||
+ | One user was toying with the idea of storing multiple character sets in | ||
+ | the VDC 64K memory of his C128 and swapping between them by simply | ||
+ | changing the register address. His aim is to perfect this for display | ||
+ | applications for various programs such as character set editors. | ||
+ | Gasson suggested an alternate scheme would be to swap the entire stored | ||
+ | character set from the VDC ram into the default page at $2000. He says | ||
+ | that the VDC's block move is very quick and it allows mixing of | ||
+ | characters from more than one set. | ||
+ | | ||
+ | @(A): Internet | ||
+ | |||
+ | Some folks have reported problems downloading binary files via Lynx or | ||
+ | FTP through UNIX servers with their Commodores. Ismael Cordeiro had some | ||
+ | suggestions for these MIME type problems. For those with shell access on | ||
+ | a UNIX system he suggested using FTP with a customized MIME type file: | ||
+ | |||
+ | " | ||
+ | | ||
+ | | ||
+ | application/ | ||
+ | |||
+ | If you don't have shell access and Lynx is the user interface...the only | ||
+ | thing to do is ask the system administrator to include the above line in | ||
+ | the system' | ||
+ | |||
+ | @(A): Miscellaneous | ||
+ | |||
+ | Among the miscellaneous topics being discussed on FIDONet is the use of | ||
+ | a C64/128 for ham radio communications. | ||
+ | for the 64. The program being discussed is Digicom. Many newcomers are | ||
+ | still asking questions of the "old timers" | ||
+ | high speed modems, REU expansion, and off-line mail reading and | ||
+ | replying. | ||
+ | being dragged out of closets, dusted off, and booted up! | ||
+ | | ||
+ | So, that's a glimpse into the world of FIDO, the wonder dog of networks, | ||
+ | for this time. | ||
+ | |||
+ | Here, boy.... | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Brad Templeton: The Programmer' | ||
+ | < | ||
+ | by Jim Lawless (cjbr@gonix.gonix.com) | ||
+ | | ||
+ | The following text is an interview held via e-mail with former C64 | ||
+ | software author Brad Templeton. | ||
+ | assembler and the Power productivity tool. | ||
+ | |||
+ | Mr. Templeton is the founder and current CEO of ClariNet, a networked | ||
+ | newspaper with over a million subscribers. | ||
+ | references at the end of this text for Internet resources detailing his | ||
+ | accomplishments. | ||
+ | |||
+ | Q: Were PAL, Power, and C Power fruits of your imagination, | ||
+ | | ||
+ | |||
+ | A: C Power was a C compiler written by Brian Hilchie, nothing to do with | ||
+ | | ||
+ | |||
+ | But POWER and PAL (Can't recall which I did first, probably PAL, but | ||
+ | POWER was the one sold first.) were done on my own. Professional | ||
+ | | ||
+ | for the C-64. | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | moved it to the Pet so that PAL could assemble itself -- always the | ||
+ | big moment in any language development. | ||
+ | might have started from an Apple based assembler. | ||
+ | cross assembling, one-pass version of Pal, with macros for Unix a few | ||
+ | years later but just used it to develop stuff for the C64. | ||
+ | |||
+ | (Most people are startled to learn that C compilers, even the very | ||
+ | first one, are usually written in C, and so on. You bootstrap by | ||
+ | | ||
+ | and then enhance it.) | ||
+ | |||
+ | Q: PAL was/is one of the most widely used assemblers for the C64 (and I | ||
+ | | ||
+ | you just happen to create a darn good product " | ||
+ | | ||
+ | |||
+ | A: No, I hadn't written any assemblers other than the cross assembler. | ||
+ | | ||
+ | | ||
+ | Atari 800 graphics for Microchess. | ||
+ | |||
+ | Q: In the days of PAL and Power, were you actually making a living | ||
+ | | ||
+ | | ||
+ | |||
+ | A: Well, I was a student at the time. But after graduating, it was | ||
+ | | ||
+ | | ||
+ | in 84. | ||
+ | |||
+ | |||
+ | Q: What were some of the biggest problems marketing your CBM software? | ||
+ | (Was piracy an issue? | ||
+ | |||
+ | A: Piracy was somewhat of an issue. | ||
+ | doing demos at some pet user groups before I was ready to sell it. | ||
+ | Bill Seiler of Commodore saw a demo I did at the silicon valley PUG, | ||
+ | and added some of the best features to Basic-AID, which Commodore | ||
+ | gave out for free. Power was better than Basic AID but a good free | ||
+ | | ||
+ | |||
+ | It was still a hobbyist market, not nearly as big as the computer | ||
+ | | ||
+ | | ||
+ | Q: When and why did you finally abandon development efforts geared | ||
+ | | ||
+ | |||
+ | A: The machines faded away and the IBM based machines clearly took the | ||
+ | lead for more serious applications. | ||
+ | | ||
+ | an alternative. | ||
+ | |||
+ | I did some games for the C64 but never went anywhere with them. | ||
+ | |||
+ | Q: With C64's showing up at garage sales and emulators available on a | ||
+ | wide variety of machines, a renewed interest in that little machine | ||
+ | is experiencing a rebirth. | ||
+ | a new generation of C64 hackers out there? | ||
+ | |||
+ | A: On one hand I am shocked, since vastly more powerful computers are of | ||
+ | | ||
+ | there was a certain excitement to a small computer that one person | ||
+ | could fully understand and work with like the Pet or C-64. If you | ||
+ | view the computer as a hobby or a toy, it doesn' | ||
+ | | ||
+ | |||
+ | I certainly wouldn' | ||
+ | | ||
+ | |||
+ | For more information on Mr. Templeton' | ||
+ | WWW documents may be of interest to you: | ||
+ | |||
+ | An Interview with Brad Templeton | ||
+ | URL: http:// | ||
+ | |||
+ | Brad Templeton' | ||
+ | URL: http:// | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== 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. | ||
+ | started, the number of sites online that catered to Commodore numbered | ||
+ | in the 10' | ||
+ | |||
+ | If you know of a site that is not listed here, please feel free to send | ||
+ | it to the magazine. | ||
+ | recently changed or added to the US Commodore WWW Links Site | ||
+ | (http:// | ||
+ | |||
+ | 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 The Official DesTerm 128 Page | ||
+ | URL: http:// | ||
+ | Here is where you will find the latest scoop on the popular terminal | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | o Keyboard Studio | ||
+ | URL: http:// | ||
+ | | ||
+ | small enough to care." | ||
+ | | ||
+ | | ||
+ | other services are offered. | ||
+ | | ||
+ | |||
+ | o Novaterm 9.6 | ||
+ | URL: http:// | ||
+ | For a guy who just released a new version of his popular C64 terminal | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | links to obtain the 9.5 release. | ||
+ | | ||
+ | order with a credit card, the site refers to a list of authorized | ||
+ | | ||
+ | |||
+ | o Omni 128 BBS Software Home Page | ||
+ | URL: http:// | ||
+ | At this site, Brian Bell presents an overview of his Bulletin Board | ||
+ | | ||
+ | | ||
+ | out how to purchase the software or how much it costs. | ||
+ | |||
+ | @(A): Publications | ||
+ | |||
+ | o DisC=overy Home Page | ||
+ | URL: http:// | ||
+ | | ||
+ | | ||
+ | bare at present, but it does have links to both a text and also a | ||
+ | | ||
+ | much here, but we do hope the publication offers an index or list of | ||
+ | | ||
+ | | ||
+ | o 64'er Online | ||
+ | URL: http:// | ||
+ | This site presents information about the German Commodore publication. | ||
+ | The layout is nicely done. The July issue is currently featured, with | ||
+ | | ||
+ | is for German readers only, but we expected no more. For those who can | ||
+ | read German, ordering information and pointers to other products are | ||
+ | | ||
+ | it slow to load. | ||
+ | |||
+ | o Commodore Online Information Network (COIN!) | ||
+ | URL: http:// | ||
+ | This site offers information on the COIN! disk magazine. | ||
+ | on the magazine is presented, and links to the 2 most recent issues are | ||
+ | | ||
+ | | ||
+ | on a black background takes a bit of time to get used to. However, | ||
+ | text mode users won't notice :-) | ||
+ | |||
+ | @(A): Demo Groups | ||
+ | |||
+ | o Millenium Home Page | ||
+ | URL: http:// | ||
+ | This site shows off screen shots of the demo groups' | ||
+ | site is nicely done, with many screen shots and nice graphics. | ||
+ | | ||
+ | |||
+ | o Demo/ | ||
+ | URL: http:// | ||
+ | Demo groups tend to provide the splashiest sites, and this one is no | ||
+ | | ||
+ | to all text-mode browsers as well. Links to demos are provided, as are | ||
+ | links to other sites of interest. | ||
+ | | ||
+ | | ||
+ | |||
+ | @(A): Reference Works | ||
+ | |||
+ | o The C64 Games WWW Home Page | ||
+ | URL: http:// | ||
+ | | ||
+ | the names reveals detailed information on the games and its gameplay. | ||
+ | Music from many C64 games is present, as are tips and hints for playing | ||
+ | some vintage Commodore games. C=H gripe: The name of the site is a bit | ||
+ | | ||
+ | |||
+ | o Poldi' | ||
+ | URL: http:// | ||
+ | UNIX on a 64. Don't even think that it cannot be done. Daniel | ||
+ | | ||
+ | | ||
+ | | ||
+ | this site. Daniel has developed a fast soft-80 screen driver for the | ||
+ | C64, and the code with detailed information is available here. | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Code and information are linked off the site. Many of the projects | ||
+ | | ||
+ | of some of the projects would help first time surfers. | ||
+ | |||
+ | o OS/A65 Computer and Operating System | ||
+ | URL: http:// | ||
+ | Andre Fachat' | ||
+ | | ||
+ | | ||
+ | the site. The full text is presented on the site, with an indexed | ||
+ | | ||
+ | |||
+ | o Technical SID documentation | ||
+ | URL: http:// | ||
+ | For the SID-savvy of the bunch, this site offers a technical discussion | ||
+ | of the 6581 SID IC and descriptions of the various waveforms with | ||
+ | | ||
+ | |||
+ | o Commodore Product Source List Issue #5, On-line Edition | ||
+ | URL: http:// | ||
+ | Roger Long has placed his Commodore products SourceList Online. | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | o Carrier Detect | ||
+ | URL: http:// | ||
+ | For all the BBS sysops or ex-BBS sysops, this page will certainly bring | ||
+ | back memories. | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | o Bacchus' | ||
+ | URL: http:// | ||
+ | If you regularly use PC or Amiga platforms to develop Commodore | ||
+ | | ||
+ | Amiga utilities to help the cross platform developer. | ||
+ | are available, and they are all sorted into categories based on | ||
+ | | ||
+ | |||
+ | @(A): Individual Commodore Users | ||
+ | |||
+ | o QT's Dream Space | ||
+ | URL: http:// | ||
+ | QT is a demo lover, and it shows. | ||
+ | of new releases, links to demo magazines, and even a tribute to | ||
+ | " | ||
+ | | ||
+ | your computing challenged PC friends. C=H gripe: | ||
+ | JAVA mascot, and has him displayed on the site. It's a bit misleading | ||
+ | for those who expect JAVA information wherever the mascot is displayed. | ||
+ | (He is cute, though). | ||
+ | |||
+ | o Don's and Mex's Game Page | ||
+ | URL: http:// | ||
+ | In a page true to the Commodore, this page's headings are done with | ||
+ | text screen shots from a C64. We are impressed. | ||
+ | | ||
+ | | ||
+ | | ||
+ | At the very least, a warning should be placed on the pages. | ||
+ | |||
+ | o Welcome to the World of Saz | ||
+ | URL: http:// | ||
+ | Sarah Dalrymple has provided the WWW surfer with a plethora of | ||
+ | | ||
+ | are featured, as are some historical facts and links to other VIC-20 | ||
+ | | ||
+ | |||
+ | o Triumph' | ||
+ | URL: http:// | ||
+ | This page show us how one person uses a Commodore system. | ||
+ | this page demonstrates the immense pull CBM machines have on users. | ||
+ | | ||
+ | to the Commodore. | ||
+ | C64 laptop computer under development. | ||
+ | | ||
+ | |||
+ | @(A): Change of Address | ||
+ | |||
+ | o LOADSTAR has moved (AGAIN!) to http:// | ||
+ | |||
+ | o Marc-Jano Knopp' | ||
+ | | ||
+ | |||
+ | o Richard Cunningham' | ||
+ | " | ||
+ | | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Dim4: A Mind Expanding Experience ====== | ||
+ | < | ||
+ | by Stephen L. Judd (sjudd@nwu.edu) | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | "What in the world was I looking at? What the heck is your | ||
+ | code doing? | ||
+ | you do?" | ||
+ | |||
+ | The last question I cannot answer, but this little writeup, | ||
+ | along with some pedantically well-documented code, can clear up the | ||
+ | first two, I think. | ||
+ | Look to the code for more detail, and any equations below can be | ||
+ | skipped without problem. | ||
+ | |||
+ | In case you didn't know, dim4 was my entry into the recently | ||
+ | held 4k demo contest. | ||
+ | other entries (17 entries in all), seek ye the Driven home page at | ||
+ | http:// | ||
+ | |||
+ | First, very briefly, the keypresses have the following actions: | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | R/S -- 3D-mode. | ||
+ | | ||
+ | | ||
+ | |||
+ | The code is 4095 bytes long, and was a royal pain to get working after | ||
+ | compression. | ||
+ | J.S. Bach. I borrowed (and improved) the line drawing routine from the | ||
+ | cube3d programs and stole the patterns out of Polygonamy, otherwise the | ||
+ | code is written from scratch, including the music routine. | ||
+ | third object has fourteen sides in 3D, and the 4D object alone has 32 | ||
+ | points with 96 lines connecting the points, so well over 100 lines are | ||
+ | being drawn at a time. I was sorely tempted to put a docking bay on one | ||
+ | of the sides of the 3D guy (a little " | ||
+ | time and room. After decompression the code expands a little bit, and in | ||
+ | the end it leaves the 8k between $4000-$6000 free, but uses pretty much | ||
+ | everything else. | ||
+ | |||
+ | The first object is a 4D cube, often called a hypercube. | ||
+ | small cube inside of and connected to a larger cube. If you look a | ||
+ | little closer, you may notice that in-between the two cubes are some | ||
+ | more cubes. | ||
+ | When you take a slice of the hypercube, you get a 3D cube). | ||
+ | rotates along its fourth coordinate, the cube folds in upon itself. | ||
+ | way to look at it is that the cubes start to change positions -- after | ||
+ | 180 degrees of rotation the inside cube is on the outside and the | ||
+ | outside cube is on the inside. | ||
+ | inside-out. | ||
+ | |||
+ | The program works fine in PAL and NTSC, although PAL folks will get the | ||
+ | tune playing at the wrong speed and transposed into a different key. | ||
+ | |||
+ | Oh yes, one thing I really like is the background on the second object-- | ||
+ | on my 1084 it looks like rope. This is a consequence of the way VIC | ||
+ | generates colors -- extra colors outside of the normal 16 are being | ||
+ | generated, because two hires colors are being placed next to each other. | ||
+ | If you look at it on a black and white monitor, you will just see thick | ||
+ | diagonal lines. | ||
+ | the March 1985 IEEE Spectrum article for more information on why VIC | ||
+ | behaves this way. | ||
+ | |||
+ | Finally, you may notice some little glitches from time to time | ||
+ | in drawing the 4D objects. | ||
+ | program from literally destroying itself, in sometimes spectacular | ||
+ | fashion. | ||
+ | |||
+ | @(A): A Handy Glossary | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | I do not know how the term " | ||
+ | meaningless, | ||
+ | vector" | ||
+ | talk about filled lines and filled points. | ||
+ | |||
+ | Thus, I plead with the community to not refer to polygons as vectors and | ||
+ | filled polygons as filled vectors. | ||
+ | been discriminated against for too long now. Just one small donation on | ||
+ | your part of a correct mathematical reference can help save the lives of | ||
+ | one, ten, even hundreds of polygons, both abroad and here at home. | ||
+ | Individuals wanting to contribute more may sponsor individual polygons; | ||
+ | a kit will be sent to you containing the name of the polygon and at | ||
+ | regular intervals a picture of the polygon will be sent to you, so you | ||
+ | may monitor the progress of your particular polygon. Some polygons are | ||
+ | created unclosed, and some do not get the necessary ink or programming | ||
+ | skill to properly fill them, but be it a quadrilateral or decagon, | ||
+ | trapezium or parallelogram, | ||
+ | polygons closed and full, for a better, more civilized world. Thank you | ||
+ | for your time, and God bless all the little geometrical constructions, | ||
+ | no matter their dimension or configuration. | ||
+ | |||
+ | @(A): The Idea | ||
+ | |||
+ | This program displays a representation of some four-dimensional objects | ||
+ | -- four 4D objects, as a matter of fact, each one of them a 4D analog of | ||
+ | a three-dimensional object. | ||
+ | 3D objects and one 4D analog of the object, rotated and projected from | ||
+ | 4D into 2D. | ||
+ | |||
+ | To describe the four-dimensional objects is not so tough. The 4D cube | ||
+ | (the hypercube) is the first to be displayed, and it is the starting | ||
+ | point for the later objects. | ||
+ | what is going on with. There is nothing really special about four | ||
+ | dimensions -- with a 3D object each point is defined by three | ||
+ | coordinates, | ||
+ | (w, | ||
+ | |||
+ | | ||
+ | |||
+ | Therefore a very natural extension into four dimensions would be: | ||
+ | |||
+ | | ||
+ | |||
+ | For a total of sixteen vertices. | ||
+ | |||
+ | (1, +/-1, +/-1, +/-1) | ||
+ | | ||
+ | |||
+ | That is, at w=1 we get a cube, and at w=-1 we get another cube. In | ||
+ | fact, if we take a " | ||
+ | to taking a slice of a 3D cube, where you get a square (a 2D cube, if | ||
+ | you will). | ||
+ | |||
+ | This is demonstrated when the code first starts up -- the program | ||
+ | " | ||
+ | is a smaller cube inside of a larger cube, with cubes in-between the | ||
+ | two. (If you are curious as to how I did the " | ||
+ | description below for a few details). | ||
+ | |||
+ | Next, as the cube begins to rotate, it "folds in" on itself (or, if you | ||
+ | like, it unfolds!). | ||
+ | been. To do a 3D rotation, recall that the object is rotated in the x-y | ||
+ | plane, the y-z plane, and the x-z plane. | ||
+ | an angle phi: | ||
+ | |||
+ | xnew = x*cos(phi) - y*sin(phi) | ||
+ | ynew = x*sin(phi) + y*cos(phi) | ||
+ | |||
+ | Well, any two coordinates form a plane, so in four dimensions there are | ||
+ | just twice as many planes to rotate in. In particular, the program does | ||
+ | rotations in the usual planes (x-y, y-z, x-z) and also does a single | ||
+ | rotation in the w-x plane, that is, | ||
+ | |||
+ | wnew = w*cos(phi) - x*sin(phi) | ||
+ | xnew = w*sin(phi) + x*cos(phi) | ||
+ | |||
+ | I didn't feel any great need to rotate through extra planes involving | ||
+ | the w-coordinate (the w-y and w-z planes). | ||
+ | degrees, notice that the coordinates trade places, then go to their | ||
+ | negatives. | ||
+ | and outer cubes are going to change positions, and this then explains | ||
+ | the unfolding that is seen on the screen. | ||
+ | |||
+ | The R/S key goes into 3D mode by zeroing out the angle increment for the | ||
+ | w-x plane. | ||
+ | the x-y, y-z, and x-z angle increments, leaving only the w-x rotation. | ||
+ | F4 followed by R/S will therefore freeze the image completely -- use D | ||
+ | or 4 to get it going again. | ||
+ | |||
+ | There is still the issue of visualizing a 4D object. | ||
+ | surprising -- after all, we have all seen 3D objects drawn on a 2D | ||
+ | computer screen (or a 2D piece of paper). | ||
+ | then we ought to be able to get from 4D to 3D (and from there into 2D). | ||
+ | Recall that a 3D projection draws a light ray from the object, through a | ||
+ | little pinhole located at the origin, and finds the intersection with a | ||
+ | piece of film located at z=d, a constant: | ||
+ | |||
+ | L = t * (x1,y1,z1) is my light ray, so t=d/z1 gives the | ||
+ | intersection with the film of a ray from | ||
+ | the point (x1,y1,z1) passing through the | ||
+ | origin. | ||
+ | |||
+ | So this is very easy to extend into 4D -- simply project from 4D | ||
+ | into 3D through the origin: | ||
+ | |||
+ | L = t * (w1, | ||
+ | |||
+ | -> L3 = (d, d/w1 * x1, d/w1 * y1, d/w1 * z1) | ||
+ | |||
+ | The x,y,z coordinates are then projected from 3D into 2D, again through | ||
+ | the origin. | ||
+ | |||
+ | Now, what is the 4D analog of a tetrahedron, | ||
+ | reasoned them out by trying to think of what 3D objects I could derive | ||
+ | starting from a cube. That is, taking a cube, and cutting away pieces | ||
+ | of it. For instance, to do the 14-sided guy, simply take the midpoint | ||
+ | of each line segment on the cube -- this has the effect of cutting off | ||
+ | the corners of the cube. By defining things in this way, it is fairly | ||
+ | straightforward to extend the objects into four dimensions. | ||
+ | happiest to realize how to do a tetrahedron). See the file objects.s for | ||
+ | more details on the individual objects. Naturally each has some | ||
+ | similarity to the cube: there is an inner object(e.g. a tetrahedron) and | ||
+ | an outer. | ||
+ | another object, so that, for instance, there are tetrahedrons in-between | ||
+ | the inner and outer tetrahedrons. | ||
+ | |||
+ | Finally, to help in visualizing the objects, I stuck a dotted line | ||
+ | capability in. The dotted lines in general connect the " | ||
+ | " | ||
+ | interact. | ||
+ | added these guys! :) | ||
+ | |||
+ | @(A): The Code | ||
+ | |||
+ | Now, it is my considered opinion that the code is awfully well | ||
+ | documented, so there isn't too much to say, but a few general things are | ||
+ | worth mentioning. | ||
+ | |||
+ | " | ||
+ | zero, and gradually increase it out to its final value. | ||
+ | first with the x-coordinates, | ||
+ | cube grows a dimension at each step. I don't do anything fancy with the | ||
+ | other objects -- all coordinates are grown equally, so the objects grow | ||
+ | outwards from the origin (as opposed to some sort of zoom effect). | ||
+ | |||
+ | Each 4D character is a 12x12 character grid, which gives a 96x96 pixel | ||
+ | drawing area, and takes up the first 144 characters. | ||
+ | uses a 5x5 character grid, giving 40x40, and taking up the next 4*25=100 | ||
+ | characters, for a total of 244 so far. In eight of the remaining 12 | ||
+ | characters are four patterns and their EOR #$FF complements, | ||
+ | used in the background tilings and are used indirectly in the pattern | ||
+ | fills. | ||
+ | |||
+ | Since the final x-y coordinates can range from -48..48, this places a | ||
+ | restriction on the initial values for the coordinates. | ||
+ | accuracy and such coordinates must of course be scaled, so that while a | ||
+ | coordinate like (1,1,1,1) is convenient for thinking, a coordinate like | ||
+ | (16, | ||
+ | the original coordinate scaled by a factor of sixteen or so. The table | ||
+ | range restricts this scaling factor: the 4D coordinate with largest | ||
+ | length that I use is (1,1,1,1), which has length 2. Thus, after | ||
+ | rotation, it is possible that it will lie on an axis with coordinate, | ||
+ | say (2, | ||
+ | implementation, | ||
+ | |||
+ | As a practical point, the points never really hit this maximum, so in | ||
+ | principle a larger scaling factor could be used. Alternatively the | ||
+ | projection routine can pick up the slack, which is what dim4 uses. | ||
+ | |||
+ | The first smart thing I did was to ditch the old method of computing | ||
+ | rotations. | ||
+ | some big tables of f_x (s) = x*sin(s), and let the angle s range from | ||
+ | 0..127. | ||
+ | table by copying the first 32 bytes of the table into the 128-159 | ||
+ | positions -- cos(s) is thus sin(s+32). (I take advantage of the fact | ||
+ | that sin(s) and cos(s) are related by a factor of pi/2. Were I smart I | ||
+ | would have taken advantage of the reflection symmetry of sin/cos, and | ||
+ | saved another 64 bytes. | ||
+ | |||
+ | This then leaves 96 bytes for a projection table, which is just what I | ||
+ | need for the 4D object. | ||
+ | and my projection table of f_x(z)=d*(z-z0) * x into a single page. This | ||
+ | page is then extended from $6000 to $C000, i.e. giving 96 tables, for a | ||
+ | total of 24k. Accessing the tables is now trivial: store x+$60 in the | ||
+ | high byte of a zero page pointer, the low byte contains the offset into | ||
+ | the table (0 for the sine table, 32 for the cosine table, and 160 for | ||
+ | the projection table), and do an LDA (ZP),Y to get the right value. | ||
+ | |||
+ | Thus rotations and projections are now very fast and very compact. | ||
+ | that it isn't really necessary to generate a complete table of sines and | ||
+ | cosines. | ||
+ | and the final result simply multiplied by two, or four. Even though the | ||
+ | final coordinates might range from -48..48, calculations don't need to | ||
+ | be done using the full range. | ||
+ | |||
+ | The line routine is the good 'ol chunky line routine from the last | ||
+ | cube3d program. | ||
+ | buffers and such. I removed a bunch of really redundant code that was in | ||
+ | there (REALLY redundant), especially in the actual drawing part (macros | ||
+ | XSTEP and YSTEP -- lines are commented out with a ' | ||
+ | dotted-line capability (it only takes a few extra instructions), | ||
+ | things easier to see. | ||
+ | |||
+ | Only a single 3D object is actually drawn -- the others are generated | ||
+ | via symmetry (reflections through x=0 and y=0). Since the 3D objects | ||
+ | are drawn on a much smaller grid, they need to be scaled down a bit. | ||
+ | Instead of writing separate routines to deal with the 3D and 4D objects, | ||
+ | I simply set the 4D coordinate of each point in the 3D object to some | ||
+ | appropriate number. | ||
+ | from you the object is, the smaller it gets. This is the same idea -- | ||
+ | the object is pushed down the 4D axis, and this has the effect of | ||
+ | shrinking the object upon projection. | ||
+ | |||
+ | You may have noticed that the 3D objects tend to avoid the center of the | ||
+ | screen -- this is a consequence of the random number generator I coded | ||
+ | up (and did not test for spectral properties or anything like that : | ||
+ | Originally I was going to place things in a random row and column, but | ||
+ | then things just clumped along a diagonal line :). I will also say that | ||
+ | the SPLAT routine caused me many days of headaches -- whose idea was it | ||
+ | to put color memory so close to a CIA? :) | ||
+ | |||
+ | One thing I had to prune out was a routine which draws circles as the | ||
+ | sine/cosine tables are being set up. It is kind of neat and gave me | ||
+ | something to watch while the code was setting up, and also was a check | ||
+ | that the trig tables were being set up correctly. | ||
+ | is to draw concentric circles of progressively larger radii, for a sort | ||
+ | of tunnelish-looking thing I suppose. | ||
+ | |||
+ | There is a little " | ||
+ | are out of range (greater than 96 or 40) after projection, they are set | ||
+ | to the origin. | ||
+ | (the octahedron is the main culprit I think), and I think what happens | ||
+ | is that the line routine thinks it needs to draw a lot more points than | ||
+ | it really needs to. So it happily moves along sticking bytes into the | ||
+ | trig/ | ||
+ | CIAs! Once, it actually started pegging the SID volume register or | ||
+ | something, because there would be a periodic loud ticking from the | ||
+ | speaker. | ||
+ | hoses the system -- hence, the failsafe :). | ||
+ | |||
+ | Finally, the very first lines of the code redirect the BASIC vector at | ||
+ | $0302/$0303 and JMPs to the NMI RS/RESTORE routine (although a BRK would | ||
+ | probably have sufficed). | ||
+ | work with the cruncher -- without it, the program goes into "IRQ lock" | ||
+ | Crossbow of Crest suggested that ABCruncher does not put a CLI at the | ||
+ | end of its crunching routine, and that this can cause problems, most | ||
+ | notably with the CIAs. | ||
+ | |||
+ | It took 10-15 hours to get things to crunch and work correctly. In | ||
+ | hindsight, I can think of a bunch of things that could have been easily | ||
+ | done to make it work, but at the time I was sure relieved when it | ||
+ | finally got down to 4095 bytes. | ||
+ | massive time and effort down the road. | ||
+ | |||
+ | @(A): The Music | ||
+ | |||
+ | Finally, a word about the music. | ||
+ | series of chords which I could modulate between in a fairly flexible | ||
+ | way. I was then going to break up the chords in a nice way and move | ||
+ | between them randomly. | ||
+ | piece of music which was a series of broken chords and sounded | ||
+ | infinitely more cool than anything I was going to accidentally write, so | ||
+ | I used it instead. | ||
+ | into four groups of four notes each -- too good to pass up. Notes are | ||
+ | looked up in a frequency table, thus on my PAL 64 the music gets | ||
+ | transposed to a different key (in addition to playing at the wrong speed | ||
+ | :). | ||
+ | |||
+ | I do not necessarily recommend using the routine as a model for doing | ||
+ | IRQ interrupts -- I had many problems with "IRQ lock", where an IRQ is | ||
+ | continuously latched, and consequently is constantly running the | ||
+ | routine. | ||
+ | solution. | ||
+ | |||
+ | @(A): Memory Map | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | @(A): Contents of dim4.lnx | ||
+ | |||
+ | Note: the code is available in this issue of Commodore Hacking | ||
+ | (Reference: code, SubRef: democode), on the Commodore Hacking MAILSERV | ||
+ | server (Reference: code), and at http:// | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | ============================================================================ | ||
+ | </ | ||
+ | ====== Exploiting the 65C816S CPU ====== | ||
+ | < | ||
+ | by Jim Brain (j.brain@ieee.org) | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | For a CPU architecture that can trace its roots to the mid 1970' | ||
+ | 65XX line has proved very successful. | ||
+ | systems such as Commodore, Apple, Atari, and other lesser known units, | ||
+ | the CPU has toiled away for years in the single digit megahertz speeds. | ||
+ | Programmers across the world have analyzed the CPU to death and | ||
+ | documented every last one of its " | ||
+ | and he or she will rattle off the cycles it takes to do an immediate | ||
+ | load or an absolute store. | ||
+ | known. | ||
+ | |||
+ | However, how much do you know about its " | ||
+ | while Commodore was busy tinkering with the NMOS version of the CPU | ||
+ | designed by Chuck Peddle, Bill Mensch, and the ex-Motorola 6800 design | ||
+ | crew, Bill Mensch started a new company, Western Design Center, and | ||
+ | redesigned the 6502 to use the newer and faster CMOS fabrication | ||
+ | process. | ||
+ | compatible 16 bit brother, the 65C816. | ||
+ | Commodore, only the 65C02 was used and only in the never produced CBM | ||
+ | Laptop computer. | ||
+ | Apple II line and placed the 65C816 at the heart of the Apple IIGS | ||
+ | system. | ||
+ | |||
+ | Although Commodore never took advantage of the WDC CPUs, third party | ||
+ | products have offered their speeds to the Commodore community. | ||
+ | models like the TurboMaster and TurboProcess offered 4 MHz speeds to the | ||
+ | Commodore 64 owner, while newer products like the FLASH8 offered 8 MHz | ||
+ | speeds. | ||
+ | speeds of 20 MHz to the Commodore owner. | ||
+ | the FLASH8, and the CMD SuperCPU all use the 16 bit CPU, the ' | ||
+ | |||
+ | Since the 'C816 is available now to the Commodore user, and with the | ||
+ | SuperCPU poised to provide software compatibility never before achieved, | ||
+ | it is likely that more and more Commodore applications will run on ' | ||
+ | equipped machines. | ||
+ | care? Sure, the 65C816 will run 6502 based applications in 6502 | ||
+ | emulation mode at substantial speed increases, so developers can opt to | ||
+ | continue writing 6502 based applications. | ||
+ | to always provide 6502 based versions of applications when possible, | ||
+ | there are useful features available only in the Native mode of the | ||
+ | 65C816. | ||
+ | utilize them. | ||
+ | |||
+ | @(A): Disclaimer | ||
+ | |||
+ | The following information is based on following resources: | ||
+ | |||
+ | o Data Sheets on the 65C816S, Western Design Center | ||
+ | o _Programming the 65816_, by David Eyes and Ron Lichty, 1985, Western | ||
+ | | ||
+ | o A beta version of the SuperCPU 20 MHz accelerator from CMD. | ||
+ | o A beta version of the Super Assembler (SAS) 65C816 Assembler, by Jim | ||
+ | | ||
+ | |||
+ | Most of the following information is system independent, | ||
+ | information specific to the CMD SuperCPU is preliminary and subject to | ||
+ | change. | ||
+ | |||
+ | It is not the intention of this article to detail all the possible | ||
+ | 65C816S opcodes nor their addressing modes. | ||
+ | intention of the article to describe the operation of the SAS assembler. | ||
+ | For more information on both of these products, please consult the | ||
+ | manuals listed above. | ||
+ | |||
+ | @(A): Diving Right In | ||
+ | |||
+ | As this article is geared toward the programmer, we're going to | ||
+ | dive right into the new features. | ||
+ | overview of the CPU for those just arriving on the scene. | ||
+ | know an index register from an accumulator, | ||
+ | |||
+ | @(A): Overview of Registers | ||
+ | |||
+ | One of the features of operating in Native mode of the CPU is the | ||
+ | enhanced set of registers available to the programmer. | ||
+ | key to explaining the other features of the CPU. So, let us go over the | ||
+ | new register set: | ||
+ | |||
+ | 8 bits 8 bits 8 bits | ||
+ | ------------------------------------------------------------------------ | ||
+ | [ Data Bank Register | ||
+ | [ Data Bank Register | ||
+ | [ 00 ][ Stack Register High ][ Stack Register Low* ] | ||
+ | | ||
+ | [ Program Bank Register ][ Program Counter High*][ Program Counter Low*] | ||
+ | [ 00 ][ Direct Register High ][ Direct Register Low ] | ||
+ | ------------------------------------------------------------------------ | ||
+ | |||
+ | * Original NMOS 65XX register set | ||
+ | |||
+ | These registers are referred to in the remainder of the article by their | ||
+ | acronyms, as follows: | ||
+ | |||
+ | Data Bank Register | ||
+ | Program Bank Register (PBR) | ||
+ | X Register High | ||
+ | X Register Low (XL) | ||
+ | Stack Register High | ||
+ | Stack Register Low (SL) | ||
+ | Y Register High | ||
+ | Y Register Low (YL) | ||
+ | Accumulator High (B) | ||
+ | Accumulator Low | ||
+ | Program Counter High (PCH) | ||
+ | Program Counter Low | ||
+ | Direct Register High (DH) | ||
+ | Direct Register Low | ||
+ | |||
+ | In addition, the 16 bit combination of B:A is called C, the 16 bit X and | ||
+ | Y registers are called simply X and Y, the 16 bit Direct Register is | ||
+ | called simply D, and the 16 bit Stack Register is called S. | ||
+ | |||
+ | One more register requires discussion before we can delve into | ||
+ | programming the '816: the Status Register (P) | ||
+ | |||
+ | Bit: | ||
+ | | ||
+ | 7 N flag | ||
+ | 6 V flag | ||
+ | 5 1 in Emulation mode | ||
+ | M flag in Native mode (memory select bit) | ||
+ | 0 = 16 bit accumulator | ||
+ | 1 = 8 bit accumulator | ||
+ | 4 B flag in Emulation mode | ||
+ | X flag in Native mode (Index Register Select) | ||
+ | 0 = 16 bit X and Y registers | ||
+ | 1 = 8 bit X and Y registers | ||
+ | 3 D flag | ||
+ | 2 I Flag | ||
+ | 1 Z flag | ||
+ | 0 C flag | ||
+ | E flag (Emulation flag) (Can not be accessed directly) | ||
+ | 0 = Native mode | ||
+ | 1 = Emulation mode | ||
+ | |||
+ | It is important to note that there are 3 more flags available in the | ||
+ | Native mode version of the status register. | ||
+ | used before, how did WDC squeeze in the extra flags? | ||
+ | cannot be accessed or seen in the status register. | ||
+ | change it is to set up the C flag to the intended stats of the E flag | ||
+ | and issue the eXchange Carry and Emulation flags (XCE) opcode. | ||
+ | flag, M, takes the place of the static 1 state in the old status | ||
+ | register. | ||
+ | X flag, controls the length of both index registers. | ||
+ | flag takes the place of the B flag. Thus, the B flag is unavailable in | ||
+ | Native mode. Since the B flag is used to determine whether a hardware | ||
+ | IRQ or a software BRK opcode caused an IRQ interrupt, the Native mode | ||
+ | provides separate interrupt vectors for BRK and hardware IRQs. | ||
+ | |||
+ | The X and M flags are especially important in Native mode, so much so | ||
+ | that each programmer will become intimately familiar with these flags. | ||
+ | When a register is selected to be 8 bits wide, it emulates the operation | ||
+ | of the register in Emulation mode. However, when the register is | ||
+ | flipped into 16 bit operation, its length doubles everywhere. | ||
+ | instance, a push of the accumulator with the M flag reset causes 2 bytes | ||
+ | to appear on the stack. Likewise, an immediate load of the accumulator | ||
+ | will require a 3 byte instruction: | ||
+ | operand. | ||
+ | we'll detail this later in the article. | ||
+ | |||
+ | @(A): More Memory | ||
+ | |||
+ | As you may be aware, the Native mode of the '816 allows the programmer | ||
+ | contiguous access to up to 16 megabytes of RAM. This access doesn' | ||
+ | involve tricks such as DMA, page flipping, or RAM " | ||
+ | given point in time, an application can access a memory location and | ||
+ | request a memory location more than 64 kB higher in the next | ||
+ | instruction. | ||
+ | 6502 addressing modes, the new DBR and PBR registers have been added. | ||
+ | The PBR serves as the 3rd byte of the PC, allowing code to run at any | ||
+ | location in memory. | ||
+ | memory accesses in addressing modes like absolute mode. Of course, | ||
+ | there are restrictions, | ||
+ | a 64kB boundary, but these restrictions can be overcome, as you'll see | ||
+ | below. | ||
+ | |||
+ | For clarity, we will refer to the 3rd bytes of an address as the " | ||
+ | and refer to the 2 lowest bytes of an address as the offset. | ||
+ | names include " | ||
+ | previously used with the Intel 80X86 CPU line and carries with it many | ||
+ | bad connotations. | ||
+ | |||
+ | Since memory addresses can now be 3 bytes wide and contain 6 hexadecimal | ||
+ | digits, an obvious representation would be $xxxxxx. | ||
+ | references write the address as a two part quantity, with the bank | ||
+ | register and the 16 bit offset separated by a colon, ":" | ||
+ | $xxyyyy and $xx:yyyy are equivalent. | ||
+ | notation is used for emphasis and because ":" | ||
+ | bad connotations from Intel 80X86 CPU line. | ||
+ | |||
+ | @(A): Increased Stack | ||
+ | |||
+ | As the S register is now 16 bits wide, the stack can now reside in all | ||
+ | of bank 0, giving the programmer 64 kB of stack area. As well, the S | ||
+ | register can be set to any location in bank 0. This allows one to start | ||
+ | stack from any non-aligned page in bank 0. | ||
+ | |||
+ | @(A): Enhancements to Old Addressing Modes | ||
+ | |||
+ | Even though the '816 supports the traditional 14 addressing modes of the | ||
+ | 6502, it extends some of them to handle the extra features in the ' | ||
+ | Note that the opcodes and parameters have not changed for these | ||
+ | addressing modes; rather the way the CPU treats them differs slightly. | ||
+ | Of special note is the term " | ||
+ | " | ||
+ | |||
+ | @(A): Absolute Modes | ||
+ | |||
+ | In the 65XX CPU, modes such as absolute and its indexed siblings each | ||
+ | could access a memory location in the 64 kB memory map. In the ' | ||
+ | these modes are now capable of accessing memory above and beyond 64 kB. | ||
+ | When accessing memory, the DBR register is prepended to the address | ||
+ | being accessed, thus forming a 24 bit effective address. | ||
+ | transferring control, the PBR register is prepended. | ||
+ | contains a $05, the following: | ||
+ | |||
+ | af ff ff lda $ffff | ||
+ | |||
+ | would load a value into the .A register from $05ffff. | ||
+ | set to 16 bit mode, the 16 bit value in $05ffff and $060000 will be | ||
+ | loaded. | ||
+ | Notice that this example also shows " | ||
+ | While loading a 16 bit value with the instruction above, the DBR is | ||
+ | " | ||
+ | actual DBR is left unchanged, so the next instruction will find the DBR | ||
+ | back at $05. | ||
+ | |||
+ | You'll rarely see such bank changes when accessing data as above, but it | ||
+ | is common when using indexing modes. | ||
+ | |||
+ | a2 ff ff ldx # | ||
+ | bd ff ff lda $ffff, | ||
+ | |||
+ | will load values from $06fffe and possibly $06ffff, depending on the | ||
+ | size of the accumulator. | ||
+ | |||
+ | When using absolute mode on opcodes like JMP and JSR, the PBR register | ||
+ | is used to form the 24 bit effective address. | ||
+ | does not exhibit " | ||
+ | within the same bank. Keep that in mind. | ||
+ | |||
+ | @(A): Direct Modes | ||
+ | |||
+ | To enhance the capabilities of the '816, the CPU offers Direct Mode, | ||
+ | which is a superset of " | ||
+ | operands are added to the D register to form a 16 bit effective address. | ||
+ | This allows using the entire bank 0 as effective z-page memory. | ||
+ | the D register set to $0200, executing: | ||
+ | |||
+ | a5 10 lda $10 | ||
+ | |||
+ | would load the accumulator from $000210 (and possibly $0211). | ||
+ | mode is not allowed to increment into bank 1. If the above instruction | ||
+ | is executed while D = $ffff, the accumulator would start accessing data | ||
+ | from $000009. | ||
+ | longer is lda $10 guaranteed to access data from $000010. | ||
+ | access data from D + $10. | ||
+ | |||
+ | Indexing changes little with respect to Direct mode. After the D | ||
+ | register is added to the 8-bit offset, the appropriate register is | ||
+ | added, and the effective address is normalized to fall within bank 0. | ||
+ | There is no way to reference outside bank 0 in Direct mode. Even if | ||
+ | index registers are set to 16 bit mode and hold $ffff, the instruction | ||
+ | will access bank 0. | ||
+ | |||
+ | @(A): Direct Indexed Indirect Mode | ||
+ | |||
+ | Most programmers forget, but this mode executes in two parts. | ||
+ | becomes important. | ||
+ | D register and then the X register. | ||
+ | bits, and two values are accessed from bank 0. The second part takes | ||
+ | those two bytes as the effective address, and PREPENDS the DBR register | ||
+ | to form a final address. | ||
+ | bank 0 with this mode, but you must store the address to access in bank | ||
+ | 0. Read that sentence again. | ||
+ | |||
+ | @(A): Direct Indirect Indexed Mode | ||
+ | |||
+ | Like its relation above, this mode work in two parts. | ||
+ | bit offset is added to the D register and normalized to 16 bits. Two | ||
+ | bytes are accessed from bank 0, and then the 16 bit value returned is | ||
+ | appended to the DBR to form a 24 bit effective address. | ||
+ | Y register is added to this effective address to form the final address | ||
+ | for access. | ||
+ | can. | ||
+ | |||
+ | @(A): Stack Mode (Implied) | ||
+ | |||
+ | Usually lumped in with the Implied addressing mode by most 6502 | ||
+ | developers, stack mode has changed to accommodate the new widths of the | ||
+ | registers. | ||
+ | will push and pull either 1 or 2 bytes. | ||
+ | push a 16 bit register and try to pull it off as an 8-bit register. | ||
+ | Caveat Emptor. | ||
+ | |||
+ | @(A): Immediate Mode | ||
+ | |||
+ | In Emulation mode, immediate mode was simple. | ||
+ | immediate value to be loaded into a register. | ||
+ | registers can be 16 bits. Everyone knows the opcode can do an immediate | ||
+ | 8-bit load, but what opcode performs a 16-bit immediate load? Answer: | ||
+ | the same opcode! | ||
+ | the immediate load on that register will pull in 8-bits. | ||
+ | register is set to 16 bits, the instruction will load a 16 bit value. | ||
+ | The effects of this change are monumental. | ||
+ | requires 2 bytes, while a 16 bit load requires 3. | ||
+ | |||
+ | This presents some problems. | ||
+ | differs between the two forms, the assembler cannot tell which form is | ||
+ | required from context. | ||
+ | to use by use of assembler directives. | ||
+ | success. | ||
+ | before executing an immediate load of any register. | ||
+ | will either cause the instruction to pull the next opcode into the high | ||
+ | byte of the register or treat the high byte of the intended register | ||
+ | value to be executed as an opcode. | ||
+ | severely shortsighted. | ||
+ | '816 developers will face. However, simple macros employed in your | ||
+ | assembler can help minimize this problem. | ||
+ | |||
+ | @(A): New Addressing Modes | ||
+ | |||
+ | |||
+ | The 816 can utilize all 14 original addressing modes of the 65XX line, | ||
+ | and adds 10 more for a total of 24. The new addressing modes are as | ||
+ | follows: | ||
+ | |||
+ | * Absolute Long | ||
+ | * Absolute Long Indexed | ||
+ | * Absolute Indirect | ||
+ | * Absolute Indexed Indirect | ||
+ | * Direct Indirect Long [d] | ||
+ | * Direct Indirect Long Indexed | ||
+ | * Stack Relative | ||
+ | * Stack Relative Indirect Indexed | ||
+ | * Relative Long | ||
+ | * Block Move xyc | ||
+ | |||
+ | Let's take each under consideration: | ||
+ | |||
+ | @(A): Absolute Long Mode, Absolute Long Indexed Mode | ||
+ | |||
+ | These modes allow a programmer to access a fully qualified memory | ||
+ | location without using the DBR. The benefits include pulling data from | ||
+ | one bank to store in another without constantly changing the DBR. The | ||
+ | disadvantages include the extra size of the instruction. | ||
+ | of these two absolute modes takes an extra byte in memory and an extra | ||
+ | cycle to load into the CPU. Note that only the X register is supported | ||
+ | as an index register for absolute long indexed mode. | ||
+ | |||
+ | @(A): Absolute Indirect Mode | ||
+ | |||
+ | This mode, denoted as (a), functions similar to (d), but does not | ||
+ | require the D register. | ||
+ | operand in this mode are accessed, and the results form the lower 16 | ||
+ | bits of the effective address. | ||
+ | form a final 24 bit address. | ||
+ | uses this mode. | ||
+ | |||
+ | @(A): Absolute Indexed Indirect Mode | ||
+ | |||
+ | This mode, denoted as (a,x), functions similar to (d,x), but the D | ||
+ | register is not involved. | ||
+ | are to direct modes as absolute long modes are to absolute modes. | ||
+ | |||
+ | @(A): Direct Indirect Long Mode | ||
+ | |||
+ | This mode functions similar to Direct Indirect Mode, except that in part | ||
+ | 2, all three address bytes are pulled from memory. | ||
+ | not involved, but the D register is used. If locations $10 - $12 | ||
+ | contained $10, $11, $12, and the D register contained #08, then: | ||
+ | |||
+ | a7 08 lda [$08] | ||
+ | |||
+ | would load the accumulator with data starting at $121110. | ||
+ | how that works? | ||
+ | accessed to fetch the 24 bit memory address, in low byte order. | ||
+ | |||
+ | @(A): Direct Indirect Long Indexed Mode | ||
+ | |||
+ | As Direct Indirect Indexed Mode extends Direct Indirect Mode, this mode | ||
+ | extends the above mode by adding the Y register to the effective address | ||
+ | pulled from bank 0. Note that even though this mode uses a fully | ||
+ | qualified 24 bit address (no DBR or PBR involved), it can still | ||
+ | increment into the next bank to access memory. | ||
+ | example, and Y = $ffff, executing: | ||
+ | |||
+ | b7 08 lda [$08], | ||
+ | |||
+ | will fetch the accumulator starting at ($121110 + $ffff, or $131109). | ||
+ | |||
+ | @(A): Stack Relative Mode | ||
+ | |||
+ | Denoted as " | ||
+ | starts off the set of modes that work with the S register (Stack | ||
+ | Pointer). | ||
+ | fill all of bank 0. Although 65XX programmers have traditionally used | ||
+ | stack locations only for saving return addresses from JSR and interrupt | ||
+ | sources, the '816 allows one to store data on the stack. | ||
+ | the 8 bit operand is added to the S register and normalized to 16 bits. | ||
+ | Memory in bank zero is accessed starting at this effective address. | ||
+ | Since the S register points to the next location to hold data, | ||
+ | executing: | ||
+ | |||
+ | a3 00 lda $00,s | ||
+ | |||
+ | would prove meaningless, | ||
+ | off the stack. | ||
+ | the stack in the order they would be pulled off. | ||
+ | |||
+ | @(A): Stack Relative Indirect Indexed Mode | ||
+ | |||
+ | By far the most complex Addressing Mode to understand in the '816, this | ||
+ | mode can be used to access data referenced by pointer values on the | ||
+ | stack. | ||
+ | operand and the S register is normalized to 16 bits and 2 bytes are | ||
+ | accessed. | ||
+ | the 24 bit effective address is added to the Y register to form a final | ||
+ | 24 bit memory address. | ||
+ | " | ||
+ | the stack). | ||
+ | |||
+ | @(A): Relative Long | ||
+ | |||
+ | Only one opcode uses this addressing mode, Branch Long (BRL), and it | ||
+ | fulfills the desire of every 65XX programmer to have a relocatable jump | ||
+ | instruction. | ||
+ | However, BRL is constrained to the current bank. It cannot cross banks. | ||
+ | Although viewed as a disadvantage, | ||
+ | If a programmer was at $xxff00 and wanted to jump to $xx0000, he or she | ||
+ | can use BRL, even though the offset appears wider than $32767, the | ||
+ | maximum offset for BRL. In actuality, the assembler computes a branch | ||
+ | to the next bank, which is only 256 bytes away. The CPU negates the | ||
+ | bank increment, thus forcing execution to begin at the current bank. | ||
+ | |||
+ | @(A): Block Move | ||
+ | |||
+ | Along with stack relative indirect indexed mode, this mode is complex. | ||
+ | However, unlike its stack counterpart, | ||
+ | understand. | ||
+ | move areas of memory from one bank to another. | ||
+ | helpful: | ||
+ | |||
+ | a2 00 20 ldx #2000 | ||
+ | a0 00 30 ldy $3000 | ||
+ | a9 ff 0f lda $0fff | ||
+ | 44 02 01 mvn $01, | ||
+ | |||
+ | Basically, we are moving $1000 bytes from $012000 to $123000. | ||
+ | register holds the offset into the source bank; the Y register holds the | ||
+ | offset into the destination bank. The accumulator holds the number of | ||
+ | bytes to move MINUS 1. Remember that. The opcode Move Negative (MVN) | ||
+ | takes the source bank and the destination bank as operands. | ||
+ | opcodes that utilize this mode are MVN and Move Positive (MVP). | ||
+ | assumes the X and Y registers hold the top of the data areas to move, | ||
+ | while MVN assumes the opposite. | ||
+ | |||
+ | @(A): Hints And Tips That Will Decrease Your Stress | ||
+ | |||
+ | Writing Machine language applications on any platform is bound to create | ||
+ | stress in your life, but this section is presented to make the | ||
+ | programmer aware of some " | ||
+ | |||
+ | @(A): Initialization | ||
+ | |||
+ | To switch the processor from emulation mode into native mode, perform | ||
+ | the XCE (eXchange Carry with Emulation) mnemonic with the carry bit | ||
+ | reset: | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | The next thing to do is determine the initial size of your registers. | ||
+ | The 816 can use any register as 8 bits or 16 bits. By default, the | ||
+ | registers are 8 bit, but just to make sure: | ||
+ | |||
+ | c2 30 rep # | ||
+ | |||
+ | By stuffing $30 into the processor status, we are setting both the X and | ||
+ | M flags to 8 bit. | ||
+ | |||
+ | At this point, it should become obvious that if the programmer wishes | ||
+ | to flip between 8 and 16 bit modes many times, macros need be employed | ||
+ | to do this quickly and painlessly. | ||
+ | |||
+ | Now, the development can begin. | ||
+ | |||
+ | @(A): Register Usage | ||
+ | |||
+ | Never underestimate the power of immediate mode to mess your program up. | ||
+ | If at all possible, switch to one size of registers and stay that way. | ||
+ | If that can't be accomplished, | ||
+ | size of either set of registers. | ||
+ | program execution, so don't assume the assembler will fix everything up | ||
+ | for you. On the preliminary version of the SAS assembler, the opcodes | ||
+ | to instruct the assembler to alter immediate mode behavior are: | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | What happens when you change a register' | ||
+ | index registers and the accumulator separately. | ||
+ | 16 bits, the index registers are simply extended by padding with zero. | ||
+ | When the index registers are changed from 16 bit to 8 bit, the high byte | ||
+ | of each index register is lost and forced to zero. On the other hand, | ||
+ | the accumulator is actually made up of two 8 bit registers. | ||
+ | changing from 8 to 16 bit, the accumulator' | ||
+ | in the hidden B register. | ||
+ | of the accumulator is forced to zero, but the B register is left intact. | ||
+ | Thus, changing from 8 to 16 bit and back to 8 bit won't affect the | ||
+ | accumulator, | ||
+ | zero. | ||
+ | |||
+ | When using the MVN and MVP opcodes, the size of the index registers make | ||
+ | a difference. | ||
+ | 0 of any bank. However, unlike the index registers, MVN and MVP treats | ||
+ | the Accumulator as 16 bits wide, regardless of the state of the M flag. | ||
+ | |||
+ | Also, what length the registers are set to determines how many bytes are | ||
+ | pulled or pushed during register to stack operations. | ||
+ | when pushing from one location and pulling in another. | ||
+ | |||
+ | To execute emulation mode code in Native mode, simply set all registers | ||
+ | to 8 bit widths, load the D register with 0, and load the stack with | ||
+ | $01ff. | ||
+ | emulation mode programs, while at the same time using this method. | ||
+ | |||
+ | In the '816, there is no need to use a register to zero out memory. | ||
+ | " | ||
+ | Note that, like " | ||
+ | depending on the state of the M flag. | ||
+ | |||
+ | Remember that, when the accumulator is set to 16 bits, the BIT | ||
+ | instruction no longer copies bits 6 and 7 to flags in the P register, | ||
+ | but bits 15 and 14. | ||
+ | |||
+ | @(A): Timing | ||
+ | |||
+ | Beware of absolute long addressing. | ||
+ | cycle to utilize. | ||
+ | |||
+ | In Native mode, there is no penalty for crossing a page in memory. | ||
+ | should allow some programs to actually run faster in Native mode. | ||
+ | |||
+ | BRL can be used at any location a JMP would be used. The advantages | ||
+ | include self-relocatable code, but the disadvantages include an extra | ||
+ | cycle for execution. | ||
+ | |||
+ | By now, you have noticed that MVN and MVP provide a fast way of moving | ||
+ | data areas. | ||
+ | store the fill pattern into the first address of the memory area, load | ||
+ | the X register with the start of the fill area. Load Y with the start | ||
+ | plus the length of the fill pattern. | ||
+ | area minus the fill pattern size minus 1. Then, do a mvn h,h, where h | ||
+ | is the bank you want to fill. Any size pattern can be used. | ||
+ | |||
+ | @(A): Stack Instructions | ||
+ | |||
+ | Many of the added instructions in the 65816 deal with enhanced stack | ||
+ | operations. | ||
+ | pulls, you can now programmatically push all the registers except PC | ||
+ | onto the stack, and pull all but the PBR and PC register off the stack. | ||
+ | Note that some registers have variable sizes, while others are fixed in | ||
+ | width. | ||
+ | |||
+ | Fixed at 8 bits: DBR, PBR, P | ||
+ | Fixed at 16 bits: D, S, PC | ||
+ | Variable: | ||
+ | |||
+ | In addition to using the stack to save and restore data and registers, | ||
+ | addresses can now be programmatically pushed to and pulled from the | ||
+ | stack. | ||
+ | |||
+ | f4 34 21 pea $1234 ; Push Effective Address 1234 on stack | ||
+ | d4 21 pei ($21) ; Push Effective Indirect Address at D + $21 | ||
+ | ; on stack | ||
+ | 62 e1 7f per DATA ; Push Effective Relative Address on stack | ||
+ | ; when executed, the address PC + $7fe1 will | ||
+ | ; be pushed on the stack. | ||
+ | ; determining data area locations in | ||
+ | ; relocatable code | ||
+ | | ||
+ | @(A): Transfer and Exchange Operations | ||
+ | |||
+ | When using the accumulator as an 8 bit register, the special hidden B | ||
+ | register can be used as a " | ||
+ | the XBA (Exchange B with A) opcode. | ||
+ | transfer. | ||
+ | |||
+ | Transferring between same size registers in unambiguous. | ||
+ | between different size registers is tricky. | ||
+ | to 8 bits, only that much can be transferred in, but all 16 bits will be | ||
+ | transferred out to any 16 bit register, regardless of the state of the M | ||
+ | flag. If an index register is set to 8 bits, only that much will be | ||
+ | transferred in or out. | ||
+ | |||
+ | @(A): Addressing Modes | ||
+ | |||
+ | Beware of Direct Mode. Any address that can be represented | ||
+ | byte will be assembled into Direct Mode. Sometimes, absolute zero page | ||
+ | addresses are desired. | ||
+ | addressing. | ||
+ | |||
+ | Beware of Direct Mode II. Remember that zero-page is no more. If you | ||
+ | intend to use z-page as before, remember to set D to $0000. | ||
+ | |||
+ | @(A): Miscellaneous | ||
+ | |||
+ | This article is presented to new CMD SuperCPU programmers. | ||
+ | write SuperCPU applications in Emulation or Native mode, however, you | ||
+ | will find the following information helpful: | ||
+ | |||
+ | The SuperCPU contains a set of registers to control operation of the | ||
+ | unit programmatically. | ||
+ | locations of the VIC-II (6567/6569) IC. On a stock system, these | ||
+ | locations return $ff when read, and writing these locations does not | ||
+ | affect RAM under the " | ||
+ | locations are considered relatively " | ||
+ | contain these important CMD SuperCPU registers: | ||
+ | |||
+ | Location | ||
+ | --------- | ||
+ | $D074 (1) GEOS Optimization (mirror VIC bank 2, $8000-$BFFF) | ||
+ | $D075 (1) VIC bank 1 Optimization (mirror $4000-$7FFF) | ||
+ | $D076 (1) BASIC Optimization (mirror $0400-$07FF) | ||
+ | $D077 (1) No Optimization (Default; mirror all memory) | ||
+ | |||
+ | $D07A (2) Software Speed Select - Turbo Off (1 MHz) | ||
+ | $D07B (2) Software Speed Select - Turbo On (20 MHz) | ||
+ | |||
+ | $D07E (3) Hardware Register Enable | ||
+ | $D07F (3) Hardware Register Disable | ||
+ | |||
+ | Notes: | ||
+ | (1) Write only, hardware registers must be enabled to access location. | ||
+ | (2) Write only, may be accessed with hardware registers enabled or | ||
+ | disabled, but does not over-ride hardware Speed switch. | ||
+ | (3) Write only. | ||
+ | |||
+ | The first 4 locations specify how much and what areas of RAM will be | ||
+ | synchronized between the SuperCPU and on-board RAM images. | ||
+ | |||
+ | These registers have been created using a " | ||
+ | minimizes irregular operation due to memory fills. | ||
+ | register has a " | ||
+ | itself. | ||
+ | writing to $d07a, but any access to $d079 or $d07b will turn fast mode | ||
+ | back on. This would cause the machine to operate in the wrong state for | ||
+ | at most one instruction period. | ||
+ | documented, as the shadows of each register should not be used for | ||
+ | program development. | ||
+ | |||
+ | To utilize the above registers, the programmer need simply to write a | ||
+ | value into the appropriate location. | ||
+ | relevant what value is stored at a location. | ||
+ | write occurred at that location suffices. | ||
+ | |||
+ | In addition to these outlined registers, there are additional "bit- | ||
+ | mapped" | ||
+ | the SuperCPU hardware and software. | ||
+ | hardware registers are disabled, and read write when the hardware | ||
+ | registers are enabled. | ||
+ | locations will be included in the SuperCPU Developer' | ||
+ | Programmers should use and modify these flags with extreme caution. | ||
+ | |||
+ | In addition to the above registers, there are two pages of RAM present | ||
+ | at $d200 and $d300 on the SuperCPU. | ||
+ | is dedicated for SuperCPU use and should not be otherwise utilized. | ||
+ | |||
+ | @(A): Conclusion | ||
+ | |||
+ | Well, there you have it. I am learning something new about this CPU | ||
+ | every day, and some of these modes still baffle me. However, I hope | ||
+ | that each of you takes an interest in developing '816 applications, | ||
+ | the possibilities are endless. | ||
+ | line all figured out... | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Using HTML on the Commodore, Part 1 ====== | ||
+ | < | ||
+ | by Jim Brain (brain@mail.msen.com) | ||
+ | |||
+ | Note: Due to the recent relocation of myself and my family, I am behind | ||
+ | on the development of the HTML viewer for the Commodore system. | ||
+ | Therefore, this article will not focus on the actual viewer. | ||
+ | development below 50% complete, the modules are subject to change. | ||
+ | Describing them now would only confuse issues. | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | HTML. This simplistic acronym, unknown to most people before 1993, now | ||
+ | forms the heart of discussions. | ||
+ | how much " | ||
+ | A quick tally in any technical magazine reveals hundreds of references | ||
+ | to it, and trips to the bookstore yield mountains of titles referring to | ||
+ | it. | ||
+ | |||
+ | Most Commodore owners have a few questions about this acronym. | ||
+ | what is it? Second, why should I care about it? In this series of | ||
+ | articles, I will try to answer both questions to your satisfaction. | ||
+ | |||
+ | To answer the first question, let's step back to explain the World Wide | ||
+ | Web (WWW). | ||
+ | treatments of the subject. | ||
+ | the CERN laboratory in Switzerland, | ||
+ | hypertext information retrieval system that allowed researchers at the | ||
+ | lab to design informative online " | ||
+ | presentation, | ||
+ | located elsewhere on the lab-wide network of computers. | ||
+ | was " | ||
+ | immediately view the referenced document. Thus, a matrix of related | ||
+ | documents were created to interconnect the researchers' | ||
+ | |||
+ | In an effort to offer the researchers great latitude in presenting their | ||
+ | works while retaining some standard in layout, Berners-Lee found simple | ||
+ | ASCII text an inadequate presentation method. | ||
+ | formatting procedure, or " | ||
+ | Berners-Lee found that popular document markup languages did not support | ||
+ | the concept of referencing, | ||
+ | and non-proprietary way. After looking past popular approaches like | ||
+ | Windows help files, troff, TeX, and Rich Text Format, Berners-Lee found | ||
+ | a standardized markup language that would support links and provide | ||
+ | flexibility in creating documents, yet retain some semblance of | ||
+ | commonality. | ||
+ | (SGML). | ||
+ | |||
+ | SGML in itself was derived from an IBM specific markup language called | ||
+ | Generalized Markup Language (GML). | ||
+ | GML specification became standardized. | ||
+ | than a simple formatting schema. | ||
+ | derived markup languages off the SGML base, and a suitable program can | ||
+ | interpret each derived language independently. | ||
+ | a derivation of SGML. | ||
+ | |||
+ | Berners-Lee created the original specification for HTML while working on | ||
+ | the WWW framework. | ||
+ | viewer arrived from the University of Illinois, the HTML specification | ||
+ | has been revised and updated at least 4 times, but remains an SGML | ||
+ | derived language. | ||
+ | |||
+ | @(A): The Basics of HTML | ||
+ | |||
+ | HTML, like most formatting or document markup languages, allows the | ||
+ | document creator to insert special labels, or " | ||
+ | which the language processor can parse. | ||
+ | converts these tags into the special formatting options they represent. | ||
+ | In a simplistic markup language, one might place an asterisk " | ||
+ | any word to be highlighted. | ||
+ | parse by the language processor, the resulting output would highlight | ||
+ | each word preceded by an asterisk. | ||
+ | stripped from the resulting display, as it does not form part of the | ||
+ | document itself. | ||
+ | HTML tags into the document being formatted. | ||
+ | (commonly called an HTML viewer if the document is local or an HTML | ||
+ | browser if the document can be accessed from a remote location) then | ||
+ | parses the tags and renders the presentation of the document on a | ||
+ | suitable display. | ||
+ | |||
+ | HTML tags come in pairs. | ||
+ | " | ||
+ | less-than "<" | ||
+ | A simple tag is " | ||
+ | follow is marked up in HTML. This tag takes the form: | ||
+ | |||
+ | < | ||
+ | |||
+ | Since tags are not case sensitive, < | ||
+ | is the HTML open tag, and it has a corresponding close tag. In HTML, a | ||
+ | close tag is formed by inserting a slash "/" | ||
+ | than character and before the tag name. Thus, </ | ||
+ | close HTML tag. | ||
+ | |||
+ | Some tags require optional information. | ||
+ | after the tag name and before the greater-than character. | ||
+ | include IMG, which instructs the HTML display system to load and display | ||
+ | a graphics element at the present location. | ||
+ | of the graphics element is needed, it is included as an " | ||
+ | the tag. To display a photo called jim.gif, I would include: | ||
+ | |||
+ | <IMG SRC=jim.gif> | ||
+ | |||
+ | in my document. | ||
+ | name. That space is necessary. | ||
+ | |||
+ | IMG does indeed have a corresponding close tag, but since IMG doesn' | ||
+ | turn something on that must be turned off, the closing tag is seldom | ||
+ | used. That forms the basis for using closing tags. Opening tags that | ||
+ | " | ||
+ | that do not " | ||
+ | Of course, exceptions exist, but you'll rarely go wrong marking up with | ||
+ | this rule in mind. | ||
+ | |||
+ | @(A): The BASIC HTML Tags | ||
+ | |||
+ | The following tags are considered basic since they implement either the | ||
+ | essential or often used formatting options available in HTML. Each | ||
+ | opening tag is listed in its HTML form, and a description of the tag is | ||
+ | given: | ||
+ | |||
+ | Tag | ||
+ | ------------------------------------------------------------------------ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | H1 is largest, while H6 is smallest | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | Remember, this is but a few of the possible tags. | ||
+ | |||
+ | @(A): Creating an HTML Document | ||
+ | |||
+ | In HTML, HTML documents are referred to as " | ||
+ | constructed as a simple ASCII or ISO 8859-1 (superset of ASCII) text | ||
+ | file. No preprocessing is necessary. | ||
+ | easy as editing a text document. | ||
+ | file extension " | ||
+ | shorten this to " | ||
+ | extension is most correct. | ||
+ | exist, most people on all platforms simply create pages using a text | ||
+ | editor. | ||
+ | Commodore enthusiasts can create pages just as easily as anyone. | ||
+ | Additionally, | ||
+ | and break up large documents into linked pages of smaller sizes. | ||
+ | Typically, HTML documents are less than 10 kilobytes in length. | ||
+ | size, even an expanded VIC-20 can create full size HTML pages. | ||
+ | |||
+ | Let's create our first document. | ||
+ | place the following text inside it: | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | This is a paragraph. | ||
+ | < | ||
+ | This is another paragraph. | ||
+ | I want you to see this next sentence. | ||
+ | emphasizing it</ | ||
+ | Now we are back to normal. | ||
+ | This sentence is below the last in the source, but will appear following | ||
+ | it when displayed. | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Notice which tags require closing. | ||
+ | are used in the document. | ||
+ | example. | ||
+ | HTML specifies that all carriage returns will be translated into spaces. | ||
+ | It further specifies that if multiple spaces exist in a file, they will | ||
+ | be reduced to a single space. | ||
+ | will not work in HTML. Likewise, using linefeeds and carriage returns | ||
+ | to specify alignment will also fail. If a new line is necessary, use | ||
+ | <p>, which will leave a blank line, or <br>, which start a new line. | ||
+ | |||
+ | @(A): What's in it for Commodore Enthusiasts? | ||
+ | |||
+ | This is an interesting question, and I hope you agree with my answer. | ||
+ | Many claim that HTML is useless to the Commodore owner since the | ||
+ | Commodore can't display HTML. While I am not even sure that is true, | ||
+ | (I've heard of simple HTML viewer programs for the 128), it doesn' | ||
+ | matter. | ||
+ | can access the World Wide Web via the " | ||
+ | WWW is constructed of HTML pages, those Commodore owners can indeed view | ||
+ | HTML files while online. | ||
+ | information. | ||
+ | makes it widely available to other Commodore and non-Commodore computer | ||
+ | owners. | ||
+ | Commodore owners are coming back into the fold after viewing some | ||
+ | Commodore HTML pages. | ||
+ | memories. | ||
+ | used CBM machine after seeing these pages. | ||
+ | |||
+ | To the naysayers, I submit that there is nothing PC-centric in the HTML | ||
+ | standard. | ||
+ | with the computer system. | ||
+ | operation over many different computer systems and graphics | ||
+ | capabilities, | ||
+ | Commodore, where there are limitations in display size and resolution. | ||
+ | |||
+ | In fact, the Commodore community should embrace HTML as a markup | ||
+ | language, for it represents a standard way to effectively mark up | ||
+ | documentation for viewing on a variety of computer systems. | ||
+ | opens up a whole set of possibilities for easily created, standardized | ||
+ | documentation publication. | ||
+ | |||
+ | Disk magazines, like _LOADSTAR_, _DRIVEN_, _VISION_, and _COMMODORE | ||
+ | CEE_, could produce issues that contain more layout information than now | ||
+ | offered. | ||
+ | could possibly forego the distribution of the viewer software and offer | ||
+ | more content in the extra space on disk. A side benefit is the ability | ||
+ | for Commodore users to read each issue on any platform. | ||
+ | never need to read LOADSTAR 128 Quarterly on an IBM PC, but what about | ||
+ | reading it on a 64, while your sole 128 does something else? Moving to | ||
+ | HTML would shift a disk magazine' | ||
+ | presentation, | ||
+ | Commodore owners read such magazine anyway. | ||
+ | otherwise great information been presented badly in a disk magazine? | ||
+ | Use of HTML could help alleviate that problem. | ||
+ | magazine is time consuming because not only must editors work on the | ||
+ | articles themselves, they must also write the software that presents the | ||
+ | articles to the viewer. | ||
+ | allow editors to spend more time on laying out and editing articles. | ||
+ | |||
+ | Disk magazines aren't the only winners here. Have you ever wanted to | ||
+ | create a small publication? | ||
+ | viewer makes it easy for you to do so. Just like the editors of bigger | ||
+ | publications, | ||
+ | information without worrying about writing the presenter software. | ||
+ | obviously not everyone should publish their own magazine, but how about | ||
+ | help files, information disks, software documentation, | ||
+ | etc.? These publications can all benefit from this technology. | ||
+ | |||
+ | These are but a few of the benefits of switching to HTML for document | ||
+ | layout. | ||
+ | allows the Commodore 128 user to view documents created for the 64 in 80 | ||
+ | columns by 50 rows. C128D owners can take advantage of their 64kB video | ||
+ | RAM even when viewing documents created on 16kB video RAM C128s. | ||
+ | Publishers would no longer be constrained by lowest common denominator | ||
+ | support. | ||
+ | the presentation will look fine on all platforms. | ||
+ | his machine, he or she can immediate utilize those new features without | ||
+ | requesting a new version of the publication. | ||
+ | though the software itself might differ by machine, the online | ||
+ | documentation need be written only once. As well, never forget that | ||
+ | marking up in HTML makes migrating your documents to the Internet and | ||
+ | the WWW a snap! | ||
+ | |||
+ | @(A): Creating an HTML viewer on the Commodore | ||
+ | |||
+ | Obviously, before Commodore users can reap the benefits of HTML, we must | ||
+ | create both a HTML generator and a viewer. | ||
+ | HTML is simply ASCII text files. | ||
+ | implement an HTML viewer. | ||
+ | |||
+ | o ability to utilize all Commodore peripherals within reason | ||
+ | o ability to work on a stock machine | ||
+ | o ability to recognize and display valid HTML 3.0 or lower files | ||
+ | |||
+ | At first, we're going to concentrate on developing our viewer for the | ||
+ | Commodore 64, although we should strive to offer versions for the 128, | ||
+ | C65, Plus/4, C16, B series, PET, and VIC-20. | ||
+ | on all but the last one. | ||
+ | |||
+ | Although we intend to develop a viewer that supports the above, our | ||
+ | initial development will operate on a much smaller scale. The first | ||
+ | revision of this viewer will operate on the stock machine and will | ||
+ | contain support for the basic HTML tags as outlined above. | ||
+ | will allow us to extend the capabilities to encompass our goals. | ||
+ | |||
+ | @(A): The Viewer Execution Flow | ||
+ | |||
+ | I am not very good at drawing execution flows, and the native format of | ||
+ | this magazine doesn' | ||
+ | will simply describe the execution flow. | ||
+ | |||
+ | The viewer will start by asking the user for a document to access. | ||
+ | the file does not exist, an error is printed and the user is asked | ||
+ | again. | ||
+ | is found, the tag should be acted upon. If text is loaded, it should be | ||
+ | displayed on the screen using the current markup controls unless the | ||
+ | control information is incomplete. | ||
+ | stored for later display. | ||
+ | the end is found. | ||
+ | select a link or type in a new document to view. | ||
+ | |||
+ | Most of the time, text can be displayed as soon as it is received. | ||
+ | However, there are exceptions. | ||
+ | creates a table on the screen, require that all the data in the table be | ||
+ | known before the table cell information can be calculated. | ||
+ | like these, we must store the data and wait for the </ | ||
+ | |||
+ | The above flow explanation ignores some subtleties like carriage return | ||
+ | stripping and multiple space reduction. | ||
+ | least one tag, the <PRE> tag (preformatted text) overrides those rules. | ||
+ | <PRE> text is displayed in a monospaced font exactly as it is prepared | ||
+ | in the document. | ||
+ | we will make those formatting options that are normally turned on. | ||
+ | |||
+ | @(A): Conclusion | ||
+ | |||
+ | I regret that we haven' | ||
+ | this installment, | ||
+ | installment. | ||
+ | comments and suggestions. | ||
+ | information? | ||
+ | Do you see limitations in the data structures? Since we haven' | ||
+ | into some of these aspects yet, do you have some ideas of your own? I | ||
+ | can guarantee that I'm ready to discuss them with you; however, I can' | ||
+ | read your mind. I think it's important that this project be completed, | ||
+ | as it forms the core of a successful WWW browser, and I see everyone | ||
+ | wanting to know when one will be available. | ||
+ | name appear on the finished product. | ||
+ | draws on the talent of the entire Commodore community would most likely | ||
+ | exceed the quality a single individual can afford a piece of software. | ||
+ | So, fire up those assemblers and put on those thinking caps. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== Creating 3-D Dungeon Crawls ====== | ||
+ | < | ||
+ | by Todd S. Elliott (telliott@ubmail.ubalt.edu) | ||
+ | http:// | ||
+ | |||
+ | @(A): Introduction | ||
+ | |||
+ | What? Another article in C=Hacking that deals with the subject of 3-D? | ||
+ | Well, not in the same vein as Mr. Judd's study in 3 Dimensions for | ||
+ | rendering shaded 3-D polygons in real time. (See Polygonomy in C=Hacking | ||
+ | 12.) No, this article only deals with the aspect of the 3-D look and | ||
+ | feel in those dungeon crawls you see for the c64. Some titles spring to | ||
+ | mind, like the gold box series by SSI in collaboration with TSR, i.e., | ||
+ | Pool of Radiance, Curse of the Azure Bonds, or other popular titles such | ||
+ | as the Bard's Tale Trilogy. | ||
+ | |||
+ | With the techniques described, the aspiring Dungeon Master (DM) can | ||
+ | create a rich world to torture his players at the local terminal of the | ||
+ | beloved c64! That, and some generous helpings from the local pizza | ||
+ | delivery company. "Hey! Look out for the grease! Arrrgh! Now the `A' key | ||
+ | is stained!" | ||
+ | |||
+ | @(A): Nuts and Bolts | ||
+ | | ||
+ | Let's begin with the 3-D screen. It is comprised of a 12x12 square of | ||
+ | custom characters, which never change position. The 12x12 square looks | ||
+ | like this: | ||
+ | |||
+ | characters 01, | ||
+ | | ||
+ | .. | ||
+ | .. | ||
+ | | ||
+ | |||
+ | The 144 characters are positioned in an unusual way: they flow in two | ||
+ | character columns, run down for 24 characters, then go back up for the | ||
+ | next two-character columns. Think of these two-character columns as | ||
+ | SEAMS in the 3-D window. Right now, there are six such SEAMS in the 3-D | ||
+ | window for the dungeon. Of course, these are not the actual characters | ||
+ | (screen codes), (I forget what they are right now), but they are in a | ||
+ | continuous sequence, i.e., no broken or interrupted series of screen | ||
+ | codes. (If memory serves me correctly, they are the last 144 screen | ||
+ | codes in the 256 screen code table.) The corresponding color codes never | ||
+ | change, for the sake of speed. | ||
+ | |||
+ | Next, we deal with the concept of CELLS in the 3-D window. There are a | ||
+ | total of 13 CELLS which we can utilize individually to show an object, | ||
+ | which in turn, is displayed in the 3-D window in the correct | ||
+ | perspective. By objects, I mean walls or doors. The perspective is from | ||
+ | the user's standpoint. This creates the illusion of the 3-D look and | ||
+ | feel, but does not simulate true 3-D rendering on the fly such as | ||
+ | Polygonamy by Mr. Judd. (See Polygonomy, C=Hacking 12.) Let's take a | ||
+ | look at all 13 cells, to give us an idea of what each one does: | ||
+ | |||
+ | Cell 01 - Farthest left side object. | ||
+ | Cell 02 - Middle left side object. | ||
+ | Cell 03 - Immediate left side object. | ||
+ | Cell 04 - Farthest right side object. | ||
+ | Cell 05 - Middle right side object. | ||
+ | Cell 06 - Immediate right side object. | ||
+ | Cell 07 - Farthest front object. | ||
+ | Cell 08 - Middle front object. | ||
+ | Cell 09 - Immediate front object . (Currently used for backdrop only; | ||
+ | fills the entire 12x12 screen.) | ||
+ | Cell 10 - Farthest left side object situated in front. | ||
+ | Cell 11 - Middle left side object situated in front. | ||
+ | Cell 12 - Farthest right side object situated in front. | ||
+ | Cell 13 - Middle right side object situated in front. | ||
+ | |||
+ | The 3-D engine, before it starts to redraw the 12x12 screen, checks the | ||
+ | user's (you!) orientation. If you are facing north, the engine will know | ||
+ | this and configure the 3-D window accordingly. Let's assume that the | ||
+ | user is facing north, and the 3-D engine now looks in the dungeon map | ||
+ | for relevant objects to place on the screen. The 3-D engine will look | ||
+ | for doors or walls only. In future revisions, this is expected to | ||
+ | change. Currently, the map value for a wall is 128 and for a door is 7. | ||
+ | |||
+ | First of all, the 3-D engine looks in Cell 3. If it finds an object | ||
+ | there, it will paint a wall or door and will skip the search in Cell 11. | ||
+ | The reason why Cell 11 was skipped is because an object was found in | ||
+ | Cell 3, which would overwrite Cell 11. We don't want the 3-D engine | ||
+ | accidentally overwriting Cell 3 with Cell 11 on top. Next, it searches | ||
+ | for an object in Cell 6, and if it finds an object there, it will skip | ||
+ | Cell 13. Last, it will search in Cell 8, and if an object is found, it | ||
+ | will skip all remaining cells except for Cells 10 & 12. This is to | ||
+ | ensure that there are no overlapping cells which result in a less-than | ||
+ | harmonious 3-D look and feel. This hunt and eliminate approach employed | ||
+ | by the 3-D engine can be referred to as a first-last approach. There are | ||
+ | three layers of information for the 3-D engine to process, and it starts | ||
+ | from the 1st layer to the 3rd layer, minimizing conflicts and results in | ||
+ | a natural 3-D look. | ||
+ | |||
+ | Here's the sample code for the direction of north: | ||
+ | |||
+ | ; | ||
+ | ; Note: the .Y register refers to the location in the map for the 3-D | ||
+ | ; engine to search. | ||
+ | ; position the paint location | ||
+ | | ||
+ | lda #101 | ||
+ | sta subtract+1 | ||
+ | sta addition+1 | ||
+ | jsr minus | ||
+ | ; | ||
+ | ldy #100:jsr cell3 | ||
+ | ; | ||
+ | bne +:ldy #74:jsr cell11 | ||
+ | | ||
+ | bne +:ldy #78:jsr cell13 | ||
+ | ; | ||
+ | | ||
+ | ; | ||
+ | ldy #50:jsr cell2 | ||
+ | ; | ||
+ | ldy #52:jsr cell5 | ||
+ | ; | ||
+ | ldy #26:jsr cell7:bne + | ||
+ | ; | ||
+ | ldy #0:jsr cell1 | ||
+ | ; | ||
+ | ldy #2:jsr cell4 | ||
+ | | ||
+ | ldy #28:jsr cell12 | ||
+ | ; | ||
+ | jmp plus | ||
+ | |||
+ | @(A): Drawing the Screen | ||
+ | |||
+ | Now, on to the actual drawing of the 12x12 3-D screen! First, the 3-D | ||
+ | engine immediately draws a backdrop to Cell 9. This is the floor and the | ||
+ | sky you see in the 3-D world. (This step may be unnecessary in the | ||
+ | future.) Then, the 3-D engine takes the object found in a particular | ||
+ | cell and draws the object on the SEAM in the 12x12 window. Remember the | ||
+ | SEAM' | ||
+ | encompass two or more SEAM's in one sitting. First, it takes the pointer | ||
+ | values from the graphic tables, extracts the raw graphics data, and | ||
+ | stashes the same raw data on to the character dot data area. Please note | ||
+ | that the 3-D engine does not stash the data to the screen; only to the | ||
+ | character dot data area. Remember that the 12x12 had a character grid- | ||
+ | the VIC-II chip continuously updates the characters with its | ||
+ | corresponding dot data. Hence the reason why the characters never change | ||
+ | in the 12x12 3-D window. This is needed for two reasons: One, the 12x12 | ||
+ | grid uses only 144 of the 256 available characters, leaving some left | ||
+ | over for regular character. Two, it allows the 3-D engine to `unroll' | ||
+ | the graphics updating loop using self-modifying code , resulting in | ||
+ | speed increases. | ||
+ | |||
+ | Here's a sample code for the grunt screen updating routine: | ||
+ | |||
+ | ;to paint the 3d surroundings | ||
+ | | ||
+ | lda #59:ldy #128; This is the lo-hi byte representation of | ||
+ | ; the character | ||
+ | sta dummy+2:sty dummy+1; dot data area. | ||
+ | lda < | ||
+ | ; can be found. | ||
+ | sta dumb+1:sty dumb+2 | ||
+ | ldx #$03 | ||
+ | | ||
+ | sta disflag,x; this flag is used for hidden objects. | ||
+ | tay | ||
+ | | ||
+ | | ||
+ | ; backdrop. | ||
+ | | ||
+ | bne dumb | ||
+ | inc dummy+2 | ||
+ | inc dumb+2 | ||
+ | dex | ||
+ | bpl - | ||
+ | ldy #127 | ||
+ | | ||
+ | sta 16256,y; The remaining part of the backdrop is drawn. | ||
+ | dey | ||
+ | bpl - | ||
+ | jmp direction | ||
+ | |||
+ | ; routine for printing two char wide column on the dungeon window | ||
+ | | ||
+ | lda cassette,y; retrieves the pointer values from a table. | ||
+ | sta twain+1; The table is stored in the cassette buffer at | ||
+ | ; 820. | ||
+ | iny | ||
+ | lda cassette,y | ||
+ | sta twain+2 | ||
+ | lda chartable,x | ||
+ | sta seam+1; This retrieves the pointer values from a table | ||
+ | ; for | ||
+ | | ||
+ | lda chartable,x | ||
+ | sta seam+2 | ||
+ | ldy #192; to output enough bytes to fill 24 characters. | ||
+ | twain lda $ffff,y; Self-modifying code used here to draw the | ||
+ | ; 3-D screen. | ||
+ | | ||
+ | dey | ||
+ | bne twain | ||
+ | dey | ||
+ | rts | ||
+ | |||
+ | @(A): Conclusions | ||
+ | |||
+ | Whew! The 3-D engine has finally done its work and waits for the user to | ||
+ | press a key for a new facing. The 3-D engine by itself is quite small | ||
+ | and flexible enough to handle as much as the programmer wants to throw | ||
+ | at it! The power is in the tables and the 3-D hunt/ | ||
+ | |||
+ | The 3-D Dungeon Demo can be found in this issue of Commodore Hacking | ||
+ | (Reference: code, SubRef: gfxcode), on the Commodore Hacking MAILSERV | ||
+ | server (Reference: code), at http:// | ||
+ | or in the file DUNGEON.SDA available at my site. There may be a c128 | ||
+ | version in the offing, but in 40 col. mode. Of course, there are no | ||
+ | planned versions for the c65. ;) Please note that it does not contain | ||
+ | the source code. However, upon request, I will be happy to send you the | ||
+ | source code in Buddy format. (Right now, I'm trying to make the source | ||
+ | code assembler neutral to work in either ACEsembler or the Buddy assembler. | ||
+ | | ||
+ | Right now, I have already done work in producing a Dungeon Master' | ||
+ | environment- with a 12x12 screen grabber routine and a Retouch Studio. | ||
+ | The 3-D engine will be overhauled completely to create a 3-D environment | ||
+ | in the hi-res multi-color screen, as opposed to using custom characters. | ||
+ | In the future, I hope to have a complete environment, | ||
+ | design dungeons, comment them, add a bestiary, add custom doors and | ||
+ | walls, and map editors for the purpose of playing pen & paper dungeon | ||
+ | games. This way, the program only shows the visual aspects of the pen & | ||
+ | paper genre; it will not have combat or character interaction. I expect | ||
+ | a version to be ready by the end of summer '96. I'm not sure how I will | ||
+ | release the software, but I will choose an appropriate medium for mass | ||
+ | distribution that is accessible to C= users. | ||
+ | |||
+ | That's it! Feel free to drop me a line regarding this article. I'd be | ||
+ | happy and will try my best to answer any questions or comments about | ||
+ | this article. Until then, Happy 8-Bit computing! | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== 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. | ||
+ | those who can received the newest editions of trivia to enter the contest. | ||
+ | |||
+ | This article contains the questions and answers for trivia editions #27-28, | ||
+ | with questions for edition #29 and the current contest, #30. Why two sets | ||
+ | of questions? | ||
+ | has put me behind in posting answers. | ||
+ | are still packed in storage, so I can't finish the answers. | ||
+ | | ||
+ | If you wish, you can subscribe to the trivia mailing list and receive the | ||
+ | newest editions of the trivia via Internet email. | ||
+ | list, please mail a message: | ||
+ | |||
+ | To: brain@mail.msen.com | ||
+ | Subject: MAILSERV | ||
+ | Body: | ||
+ | subscribe trivia Firstname Lastname | ||
+ | help | ||
+ | quit | ||
+ | |||
+ | @(A): Trivia Questions | ||
+ | |||
+ | Q $1A0) Commodore produced an assembler for the 128 called HCD65. | ||
+ | does HCD stand for? | ||
+ | | ||
+ | A $1A0) Hedly C. Davis, the writer of the assembler. | ||
+ | |||
+ | Q $1A1) Who wrote most of RAM DOS? | ||
+ | |||
+ | A $1A1) Although many assume Fred Bowen wrote RAMDOS, Hedly Davis actually | ||
+ | wrote the bulk of it. | ||
+ | |||
+ | Q $1A2) What is the name of the first C64 disk copy program? | ||
+ | sported a "gas gauge" | ||
+ | |||
+ | A $1A2) 1541 Backup. | ||
+ | |||
+ | Q $1A3) What was the case color of the original Commodore 64s? | ||
+ | |||
+ | A $1A3) Ivory, just like the case color of the VIC-20. | ||
+ | cases WERE VIC-20 cases. | ||
+ | |||
+ | Q $1A4) There are at least two ways to enter 64 mode from 128 mode on a C128: | ||
+ | go 64 and sys 65357. | ||
+ | they differ in at least one noticeable way. How? | ||
+ | |||
+ | A $1A4) sys 65357 doesn' | ||
+ | |||
+ | Q $1A5) What CPU powers the B-128 computer system? | ||
+ | |||
+ | A $1A5) The 6509 CPU. | ||
+ | |||
+ | Q $1A6) What type of drive mechanisms are in the D series hard drives from | ||
+ | Commodore? | ||
+ | |||
+ | A $1A6) The D9060 and D9090 drives used " | ||
+ | |||
+ | Q $1A7) Commodore produced a 16kB RAM expander for the Commodore VIC-20. | ||
+ | What is its model number? | ||
+ | |||
+ | A $1A7) The VIC-1111. | ||
+ | |||
+ | Q $1A8) Commodore produced at least one disk drive with an optical track | ||
+ | one sensor. | ||
+ | |||
+ | A $1A8) Certain early versions of the 1541C drive had a functional track | ||
+ | 1 sensor. | ||
+ | and then later, the sensor was removed from the mechanism. | ||
+ | addition, 1571 drives and 1581 units have optical track sensors. | ||
+ | |||
+ | Q $1A9) The Commodore PET series used the IEEE bus to communicate with | ||
+ | peripherals. | ||
+ | are supported by the PET? | ||
+ | |||
+ | A $1A9) IDs 4-15 are supported, although you cannot connect all 12 devices | ||
+ | up at one time. | ||
+ | |||
+ | Q $1AA) Many people have developed Commodore software with the PAL assembler. | ||
+ | What does PAL stand for? | ||
+ | |||
+ | A $1AA) Personal Assembly Language (PAL). | ||
+ | |||
+ | Q $1AB) Many people remember Compute' | ||
+ | for the word processor program it shared with thousands of | ||
+ | subscribers. | ||
+ | |||
+ | A $1AB) SpeedScript. | ||
+ | |||
+ | Q $1AC) In some 6502 assemblers, the opcode " | ||
+ | for " | ||
+ | is this opcode referring to? | ||
+ | |||
+ | A $1AC) bcs (Branch Carry Set) | ||
+ | |||
+ | Q $1AD) If I wanted to do a " | ||
+ | opcode would I use? | ||
+ | |||
+ | A $1AD) bcc (Branch Carry Clear) | ||
+ | |||
+ | Q $1AE) Each Commodore peripheral has a device number, which is associated | ||
+ | with a type of device. | ||
+ | printer. | ||
+ | However, one peripheral in the PET was phased out and its device | ||
+ | number was reused. | ||
+ | |||
+ | A $1AE) Device #2. The PET systems used #2 as a second tape drive, but in | ||
+ | the newer computers, #2 refers to the RS-232 port. | ||
+ | |||
+ | Q $1AF) What is the maximum amount of general purpose RAM can one utilize | ||
+ | in a stock C64? (I need an exact number here) | ||
+ | |||
+ | A $1AF) In the Ultimax memory configuration, | ||
+ | can occur, one can utilize all but the first two memory locations | ||
+ | for general purpose RAM, giving 65534 bytes of RAM. If you can't | ||
+ | guarantee you'll never receive an NMI, you lose 2 more bytes for that | ||
+ | vector, giving 65532 bytes available. | ||
+ | |||
+ | Q $1B0) What was COMPUTE!' | ||
+ | |||
+ | A $1B0) "The Journal for Progressive Computing" | ||
+ | |||
+ | Q $1B1) After COMPUTE! was absorbed by General Media, how did the name | ||
+ | change? | ||
+ | |||
+ | A $1B0) The name, having gained an exclamation point and lost a period many | ||
+ | years before, reverted back to the period as the ending punctuation. | ||
+ | |||
+ | Q $1B2) What Commodore content magazine was named after a nautical term? | ||
+ | |||
+ | A $1B0) " | ||
+ | |||
+ | Q $1B3) What Commodore content magazine was named after a BASIC keyword? | ||
+ | |||
+ | A $1B0) " | ||
+ | |||
+ | Q $1B4) What CPU gets control first when a Commodore 128 is booted? | ||
+ | |||
+ | A $1B0) The Z80 CPU has control first. | ||
+ | |||
+ | Q $1B5) What CPU powered the Commodore C900? | ||
+ | |||
+ | A $1B0) The Zilog Z8000, from the company who brought us the popular Z80. | ||
+ | |||
+ | Q $1B6) How large is the monitor installed in the SX64? | ||
+ | |||
+ | A $1B0) 5" diagonal. | ||
+ | |||
+ | Q $1B7) What color scheme does the SX64 boot up into? | ||
+ | |||
+ | A $1B0) White screen with cyan border and blue text. | ||
+ | |||
+ | Q $1B8) What is printed as the stock SX64 boot up screen? | ||
+ | |||
+ | A $1B0) ***** SX-64 BASIC V2.0 ***** | ||
+ | 64K RAM SYSTEM | ||
+ | |||
+ | READY. | ||
+ | _ | ||
+ | |||
+ | Q $1B9) The SX64 has a reset switch behind the door that holds the | ||
+ | monitor controls. | ||
+ | |||
+ | A $1B0) The reset switch only resets the disk drive. | ||
+ | resets the entire computer system. | ||
+ | |||
+ | Q $1BA) What common port is not included on the SX64? | ||
+ | |||
+ | A $1B0) The Cassette Port. | ||
+ | |||
+ | Q $1BB) In the mid 1980' | ||
+ | a graphical user environment for the Commodore 64. What was it | ||
+ | called? | ||
+ | |||
+ | A $1B0) Graphical Environment Operating System (GEOS). | ||
+ | |||
+ | Q $1BC) Berkeley Softworks eventually changed their name to what? | ||
+ | |||
+ | A $1B0) GEOWorks. | ||
+ | Assistants (PDA). | ||
+ | |||
+ | Q $1BD) Most everyone is familiar with MSD disk drives. | ||
+ | stand for? | ||
+ | |||
+ | A $1B0) Micro Systems Development, | ||
+ | |||
+ | Q $1BE) On the NMOS 6502, what two addressing modes have but one opcode | ||
+ | each that can operate in that mode? | ||
+ | |||
+ | A $1B0) Actually, there is only one such mode, indirect. | ||
+ | the only opcode that can utilize that addressing mode. | ||
+ | |||
+ | Q $1BF) How many transfer register opcodes are there on the NMOS 6502? | ||
+ | | ||
+ | A $1B0) 6 (TAX, TAY, TSX, TXA, TXS, TYA). | ||
+ | |||
+ | 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? | ||
+ | |||
+ | Q $1C1) What is the first thing that the C64 (and VIC) KERNAL does upon | ||
+ | powerup? | ||
+ | |||
+ | Q $1C2) What KERNAL routine is used to set a DOS channel to input? | ||
+ | |||
+ | Q $1C3) What KERNAL routine is used to set a DOS channel to output? | ||
+ | |||
+ | Q $1C4) Before calling the routines in $1C2 and $1C3, what register must | ||
+ | you load? | ||
+ | |||
+ | Q $1C5) What 3 devices can the KERNAL NOT load from? | ||
+ | |||
+ | Q $1C6) In the Commodore KERNAL, there are " | ||
+ | To which class of routines does " | ||
+ | |||
+ | Q $1C7) If a programmer calls the KERNAL routine " | ||
+ | key is NOT pressed, what is returned in the .A register? | ||
+ | |||
+ | 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? | ||
+ | |||
+ | 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? | ||
+ | |||
+ | Q $1CA) If a call to READST is made, and a $40 is returned in .A, what | ||
+ | does this indicate? | ||
+ | |||
+ | Q $1CB) What routine can be called to determine the physical format of the | ||
+ | Commodore 64 screen in characters? | ||
+ | |||
+ | Q $1CC) The Commodore 64 starts a non-destructive RAM test at what location? | ||
+ | |||
+ | Q $1CD) Which way does the RAM test proceed: up or down? | ||
+ | |||
+ | Q $1CE) Which KERNAL routine is used ONLY in conjunction with a Commodore | ||
+ | IEEE card? | ||
+ | |||
+ | Q $1CF) Many hybrid BASIC/ML programs use SYS to transfer control from BASIC | ||
+ | to ML. However, a few use USR(X). | ||
+ | where does BASIC fetch the ML routine' | ||
+ | |||
+ | 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. | ||
+ | |||
+ | Q $1D1) If I issue the BASIC statement OPEN " | ||
+ | am I opening? | ||
+ | |||
+ | Q $1D2) Is BASIC in the Commodore computer systems an " | ||
+ | " | ||
+ | |||
+ | Q $1D3) What type of variable is A%? | ||
+ | |||
+ | Q $1D4) If I issue the BASIC line PRINT:PRINT " | ||
+ | the " | ||
+ | |||
+ | Q $1D5) What column does " | ||
+ | a VIC-20? | ||
+ | |||
+ | Q $1D6) Alphabetically, | ||
+ | abbreviation? | ||
+ | |||
+ | Q $1D7) How many times does the statement FOR T=1TO0 execute? | ||
+ | |||
+ | Q $1D8) What base does the BASIC LOG command use for its logarithm | ||
+ | function? | ||
+ | |||
+ | Q $1D9) A = NOT B can be written as which expression: | ||
+ | |||
+ | a) A = -B | ||
+ | b) A = -(B+1) | ||
+ | | ||
+ | Q $1DA) What does INT(-15.43) return? | ||
+ | |||
+ | Q $1DB) What does ASC$(" | ||
+ | | ||
+ | Q $1DC) What is the abbreviation for GET#? | ||
+ | |||
+ | Q $1DD) What is the largest integer value that Commodore BASIC can handle? | ||
+ | |||
+ | Q $1DE) What is the ONLY Commodore Editor key not affected by "quote mode" | ||
+ | | ||
+ | Q $1DF) What is the range of RND? | ||
+ | | ||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== ? DS, DS$: rem The Error Channel ====== | ||
+ | < | ||
+ | We here at Hacking Headquarters are actually perfect, but the online | ||
+ | networks occasionally globally alter the issue after it leaves our hands. | ||
+ | The printed version is similarly changed by the print shop. We think | ||
+ | it's an attempt to discredit us, but we will thwart them again by simply | ||
+ | printing the corrections to the mistakes THEY introduced below. | ||
+ | | ||
+ | @(e)dbldma: Speed up RAMLink transfers with the Double-DMA Technique | ||
+ | |||
+ | Brett Tabke wrote in to correct some misinformation contained in this | ||
+ | article in Issue #11. In the article' | ||
+ | written that " | ||
+ | memory" | ||
+ | extensively, | ||
+ | code in to initiate the transfer, but the bulk of transfers are handled | ||
+ | by the 256 byte interface that remains in memory at all times. | ||
+ | |||
+ | @(e)mags: Hacking the Mags | ||
+ | |||
+ | We reprinted Jeff Jones' electronic mail address as printed in LOADSTAR | ||
+ | LETTER #31, but Jeff sent us a note mentioning the address had changed, | ||
+ | and the correct email address is jeff@loadstar.com. | ||
+ | |||
+ | @(e)cmdcpu: Underneath the Hood of the SuperCPU | ||
+ | |||
+ | In this article in version 1.0 of Issue #12, there were two references to | ||
+ | " | ||
+ | reasons. | ||
+ | this issue (Reference: cpu). | ||
+ | |||
+ | @(e)gfx: Taking to TED: The MOS 7360/8360 Display ICs | ||
+ | |||
+ | In early versions of Issue #12, the TED IC article was incorrectly | ||
+ | attributed to Harsfalvi Levente. | ||
+ | the last name first, opposite English notation (implying that the other | ||
+ | way must be Hungarian notation :-). The article should be attributed to | ||
+ | Levente Harsfalvi. | ||
+ | |||
+ | @(e)polygon: | ||
+ | |||
+ | After the publication of this article in Issue 12, Stephen Judd noted that | ||
+ | the following information was not included in the article: | ||
+ | |||
+ | Memory map: | ||
+ | |||
+ | $0800-$1BFF | ||
+ | $1C00-$1FFF | ||
+ | $2000-$3FFF | ||
+ | $4000-$58FF | ||
+ | $5900-$5BFF | ||
+ | $5C00-$5FFF | ||
+ | $6000-$7FFF | ||
+ | $8000-$A6FF | ||
+ | $A700-$BFFF | ||
+ | $C000-$C5FF | ||
+ | $C600-$C6FF | ||
+ | $C700-$C7FF | ||
+ | $C800-$CDFF | ||
+ | |||
+ | The fill pattern table may be broken down further. | ||
+ | is eight bytes, so to get the address in the fill table multiply the | ||
+ | pattern number by eight: | ||
+ | |||
+ | 0 - Empty (clear) | ||
+ | 1 - $FF (solid) | ||
+ | 2 - Brick | ||
+ | 3 - CrossSmall | ||
+ | 4 - Inverse of 3 | ||
+ | 5 - Dither 1 | ||
+ | 6 - Dither 2 (inverse of 5) | ||
+ | 7 - Zigs | ||
+ | 8 - Zags | ||
+ | 9 - Zigzag | ||
+ | 10- Holes | ||
+ | 11- Smiley | ||
+ | 12-15 Not used | ||
+ | 16-23 Shockwave | ||
+ | 24-31 Squaredance | ||
+ | |||
+ | If you have a freezer cartridge you might want to try changing the | ||
+ | patterns. | ||
+ | to see what a multicolor Polygonamy might look like, and change the | ||
+ | patterns (not to mention the color info) to be more multicolor-friendly. | ||
+ | |||
+ | @(e)trivia: Commodore Trivia | ||
+ | |||
+ | In early versions of Issue 12, question $186 in the Commodore Trivia | ||
+ | article was incorrect. | ||
+ | |||
+ | |||
+ | Q $186) What is the maximum size of RAM available for use for program | ||
+ | storage on an expanded VIC-20 | ||
+ | |||
+ | A $186) If you discount the screen area (512 bytes) and Color RAM | ||
+ | (512 bytes), up to 28159 bytes can used for BASIC programs | ||
+ | and variables (original 3583 bytes and 3 banks of 8192 bytes each), | ||
+ | and up to 40448 bytes can be used for ML programs. | ||
+ | 512 bytes for screen and 40960-49151). | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== The Next Hack ====== | ||
+ | < | ||
+ | | ||
+ | Hacking Headquarters> | ||
+ | |||
+ | You are in a room where editors and authors are busily preparing issue | ||
+ | #14. You scan along the room and note the following paragraphs hastily | ||
+ | left on the various desks: | ||
+ | | ||
+ | o In part 2 of "Using HTML on the Commodore", | ||
+ | more deeply into HTML parsing engine design and relate some of the | ||
+ | | ||
+ | | ||
+ | o In another part 2, Alan Jones continues on in his discussion of | ||
+ | | ||
+ | Alan will jump into Linear Programming. | ||
+ | will be presented, as well as sample code implementations. | ||
+ | |||
+ | o Attention all VIC-20 enthusiasts! | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | o In a new column, " | ||
+ | | ||
+ | how he created his "Tower of Power" | ||
+ | |||
+ | o Although we didn't have room this time, Commodore Hacking will | ||
+ | begin reviewing new software titles, starting with the recently | ||
+ | | ||
+ | | ||
+ | |||
+ | o And, of course, C=Hacking' | ||
+ | |||
+ | So, fire up that label program and print off one for your copy of | ||
+ | Commodore Hacking #14. | ||
+ | |||
+ | ========================================================================= | ||
+ | </ | ||
+ | ====== 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. | ||
+ | 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. | ||
+ | uudecode on the ACE OS for the 64 and 128, and uudecode on most UNIX OS | ||
+ | machines. | ||
+ | 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. | ||
+ | access, the files are available at http:// | ||
+ | To retrieve " | ||
+ | |||
+ | http:// | ||
+ | |||
+ | For those with electronic mail access only, the Commodore Hacking | ||
+ | MAILSERV server also contains a copy of these files. | ||
+ | copy of " | ||
+ | |||
+ | 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. | ||
+ | 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. | ||
+ | of these above methods is foolproof, the added redundancy helps overcome | ||
+ | any shortcomings. | ||
+ | |||
+ | WARNING: | ||
+ | PETSCII. | ||
+ | section to a PETSCII mode computer system, or download this section without | ||
+ | translation to PETSCII. | ||
+ | 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)democode: | ||
+ | |||
+ | begin 600 dim4.lnx | ||
+ | M`0A;" | ||
+ | M$1$B.IDB(" | ||
+ | M, | ||
+ | MH*" | ||
+ | M(# | ||
+ | MH*" | ||
+ | M, | ||
+ | MH*" | ||
+ | M(`T````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M``````````````````$(# | ||
+ | M]TQ``Q8\" | ||
+ | M& | ||
+ | M: | ||
+ | M=28B\2DM%4G+E)& | ||
+ | M2' | ||
+ | M^RI", | ||
+ | M2A5AO_@4RP" | ||
+ | M# | ||
+ | M#, | ||
+ | MS]`1)QNB-+1M.I94U``U4F" | ||
+ | MK%+^8IN54L$W& | ||
+ | M2+$@`& | ||
+ | MF)@RWY" | ||
+ | M7ZQ2UNNTT" | ||
+ | MV%2$; | ||
+ | M*., | ||
+ | MS_; | ||
+ | M< | ||
+ | MIPZ^, | ||
+ | MH& | ||
+ | ME? | ||
+ | MK6XH4\KJAIJJ$V0, | ||
+ | M0, | ||
+ | MM+B, | ||
+ | MQ@`O)K@8`ZB8,&,, | ||
+ | M08*@@8D61%`H$B3DH5ES`]4< | ||
+ | M& | ||
+ | M$D; | ||
+ | M2@LH1" | ||
+ | MC=+P$_$%21.AU=> | ||
+ | MZKYU1Y3Z1^G, | ||
+ | M@H_K$-`0R\\@%00J6R\-CBA& | ||
+ | MM@AP8LR`RODMB()); | ||
+ | M+EL<? | ||
+ | MN=WM4C-R-' | ||
+ | M.H82MT5XMPS$.<: | ||
+ | MAZ35: | ||
+ | M56021VXD& | ||
+ | MS107T`TQ_YM4H`$1IY(Q, | ||
+ | M0O2ES25D7^*< | ||
+ | M2(]GM)I2(K6: | ||
+ | MHG:, | ||
+ | MUIR(; | ||
+ | MNR< | ||
+ | M`3`Y`3`(`3`.`3`D`3`& | ||
+ | M`V^C(,: | ||
+ | M(W+7\Y-XCW<? | ||
+ | M$; | ||
+ | M(BKB$5K1,? | ||
+ | MI, | ||
+ | MH!D@`S`[607W_' | ||
+ | M*# | ||
+ | M: | ||
+ | M_@`< | ||
+ | M@2/ | ||
+ | M$8)A(B)%\: | ||
+ | M-_[C/ | ||
+ | M)F< | ||
+ | M8T.U`4-+" | ||
+ | M96PJ9> | ||
+ | MX? | ||
+ | MJ+1Z8" | ||
+ | M" | ||
+ | M+N!P7%RBA50N+55HQ*!& | ||
+ | M4V: | ||
+ | MM%< | ||
+ | MPDP(B& | ||
+ | M(2(2FDBH(J2+$$, | ||
+ | MI@3U*-(, | ||
+ | MUWVYI$13R9" | ||
+ | MK?? | ||
+ | MB(8P]MX4(I)LSBD1& | ||
+ | M1M6LP, | ||
+ | M0=: | ||
+ | M4RSL?& | ||
+ | M< | ||
+ | M-2(9)282X5H8`HK, | ||
+ | M1, | ||
+ | MAH(+`RV2XDJQ, | ||
+ | M()Z; | ||
+ | M(!P$H@2(A/ | ||
+ | MA? | ||
+ | ML? | ||
+ | M!PZ*!R; | ||
+ | M# | ||
+ | M``$" | ||
+ | M````!`4'" | ||
+ | M@(:, | ||
+ | MM: | ||
+ | M< | ||
+ | MKX# | ||
+ | M>; | ||
+ | M.EIMU7E.UK3Z]MU55.TE.II\^NTOJW*? | ||
+ | M4]94I+ZM2^O4ZJJ5]94[JEVUWR53ZI4V^]E4V^\E4]94E/> | ||
+ | M7DZ5> | ||
+ | M7E.ZI4V^56^E*4H!"" | ||
+ | M, | ||
+ | M+9XJ1" | ||
+ | M$2`> | ||
+ | M`-@(*`" | ||
+ | M52(`!@DR`)DBGR`@2%144# | ||
+ | M1" | ||
+ | M05E3(@!C" | ||
+ | M3D< | ||
+ | M2$5312`25$]0(%-%0U)%5)(@2T594SHB`-$)9`" | ||
+ | M(%M$72`@6RY=(" | ||
+ | M241.)U0@2$5!4B!!0D]55" | ||
+ | M`)DBFR`@(%M$72`%*$9/ | ||
+ | M`& | ||
+ | M`)D*: | ||
+ | M(@# | ||
+ | M4B$I(@#?" | ||
+ | M(# | ||
+ | M3U(B`%`+.@*9(E-51T=%4U1)3D< | ||
+ | M2$E3(@!]" | ||
+ | M(# | ||
+ | MD@4@1D]2(@# | ||
+ | M159%3B(`_PMB`IDB5$A/ | ||
+ | M+PQL`IDB$5=!5$-(($9/ | ||
+ | M1R(`60QV`IDB0T]-4$Q%5$4@4T]54D-%($%.1" | ||
+ | M``"< | ||
+ | M^WRE5\W]4^2I)> | ||
+ | M4E*[56DM4K.926N27J? | ||
+ | M3MRE*4I*U> | ||
+ | M=', | ||
+ | M12!33U520T4@04Y$($1/ | ||
+ | MDIRW> | ||
+ | MFY[G)DJ29]FY_ISEF2G9< | ||
+ | M? | ||
+ | MFKR5*4H`<" | ||
+ | M04E.-" | ||
+ | M1D]2H%1(1: | ||
+ | MH%9!4DE/ | ||
+ | MH$%3H%=%3$R@05.@5$A%H%)/ | ||
+ | M3D53+@TJ# | ||
+ | M0: | ||
+ | MH$9/ | ||
+ | M1$%94Z!/ | ||
+ | M>' | ||
+ | M; | ||
+ | M3Z!, | ||
+ | M3E1/ | ||
+ | M)#, | ||
+ | M14-/ | ||
+ | M3T: | ||
+ | M04), | ||
+ | M8S$P," | ||
+ | M(& | ||
+ | M4T53H" | ||
+ | MH$]" | ||
+ | M)&, | ||
+ | M5*!/ | ||
+ | M, | ||
+ | M)&, | ||
+ | M.3`P(# | ||
+ | M5$6@3T9& | ||
+ | M259%3J!# | ||
+ | M.W53142@0EF@4UE-34544EF@4D]55$E.10UC; | ||
+ | M.V9)4E-4H%!/ | ||
+ | M)& | ||
+ | M; | ||
+ | M86< | ||
+ | M549&# | ||
+ | M0T%4140_# | ||
+ | M, | ||
+ | M: | ||
+ | M)& | ||
+ | M87)S(& | ||
+ | M5$A%H$U54TE# | ||
+ | MH%-)3D6@04Y$H$-/ | ||
+ | M< | ||
+ | M5$^@4%)/ | ||
+ | M3U> | ||
+ | M)# | ||
+ | M(" | ||
+ | M< | ||
+ | M< | ||
+ | MH%)/ | ||
+ | M1: | ||
+ | M24Y415*@55-%1*!" | ||
+ | M4$])3E1%4J!)3E1/ | ||
+ | M3Z!35$]21: | ||
+ | M2$%24Z!015*@4TE$1: | ||
+ | M5$52H%1/ | ||
+ | MH$]& | ||
+ | M(& | ||
+ | M970@97%U(" | ||
+ | M.W1/ | ||
+ | M8: | ||
+ | M4Z!72$E# | ||
+ | M142@0EF@9V5T< | ||
+ | M=# | ||
+ | M: | ||
+ | MH$9/ | ||
+ | M4D%7H$]2H$Y/ | ||
+ | M< | ||
+ | M15)/ | ||
+ | MH%=)5$B@8F%S: | ||
+ | M(" | ||
+ | MH%=)5$B@6# | ||
+ | M=& | ||
+ | M54-(+@UA8V, | ||
+ | M=2`D, | ||
+ | M+2TM+2TM# | ||
+ | M+W)E< | ||
+ | M2$E3H%!!4E2@5$A%4D5& | ||
+ | M3U*@5$^@5$A%H%!23T=204V@04Y$H$-!3$Q3H%1(1: | ||
+ | M# | ||
+ | M, | ||
+ | M=" | ||
+ | M(" | ||
+ | M,# | ||
+ | M# | ||
+ | M5$A!5*!35T%0H$)51D9%4E, | ||
+ | MH%))1TA4# | ||
+ | M82!V; | ||
+ | M(& | ||
+ | M152@55" | ||
+ | M9F5R# | ||
+ | MH& | ||
+ | M, | ||
+ | M*J!B; | ||
+ | M< | ||
+ | MH%1(24Y' | ||
+ | M8G5F9@T-# | ||
+ | M=&& | ||
+ | M96UP(# | ||
+ | M(", | ||
+ | M, | ||
+ | M=&& | ||
+ | M8: | ||
+ | MH", | ||
+ | MH# | ||
+ | M+2TM+2TM+2TM+2TM+2TM# | ||
+ | M04V@15A014-44Z!!H%-)3D=, | ||
+ | M1BA8*3TV-" | ||
+ | M3$6@25.@15A414Y$142@0EF@, | ||
+ | M35!, | ||
+ | M4D]-H%1(25.@5$%" | ||
+ | M# | ||
+ | MH*!' | ||
+ | M14-424].H%1!0DQ%H$]& | ||
+ | M24Z@5$A%H%-!346@, | ||
+ | M8FET< | ||
+ | M*J!L9' | ||
+ | M4RR@:: | ||
+ | M# | ||
+ | M; | ||
+ | M87=T86(-.FQO; | ||
+ | M," | ||
+ | M(& | ||
+ | M*EB@1$E6H# | ||
+ | M86-C# | ||
+ | M1Z!404), | ||
+ | M>' | ||
+ | M;" | ||
+ | M(S$R." | ||
+ | M82`C)# | ||
+ | M34]61: | ||
+ | M# | ||
+ | M<# | ||
+ | M3U*@0T].5$%)3E.@2$DLH& | ||
+ | MH$)9H# | ||
+ | M4U5" | ||
+ | M4J!)3J!43U" | ||
+ | M< | ||
+ | M8FYE(# | ||
+ | M*@TJH' | ||
+ | M3U54H%1/ | ||
+ | M# | ||
+ | M(' | ||
+ | M;& | ||
+ | M3U, | ||
+ | M=& | ||
+ | M(' | ||
+ | M82!B=69F97(K, | ||
+ | M82`H< | ||
+ | M*E-)3BA4*0T@;& | ||
+ | M96]R(& | ||
+ | M9' | ||
+ | M/ | ||
+ | MH$Y%6%2@4$%' | ||
+ | M(# | ||
+ | M; | ||
+ | M4E5.0TB@5TE, | ||
+ | M: | ||
+ | M1: | ||
+ | M0DE4H%!/ | ||
+ | M5*!42%)/ | ||
+ | M3U9%# | ||
+ | M;' | ||
+ | M> | ||
+ | M4J!$051!# | ||
+ | M9& | ||
+ | M55-43TT-(' | ||
+ | M*V)U9F8Q+' | ||
+ | M9F8R+' | ||
+ | M# | ||
+ | M4@TJ# | ||
+ | M# | ||
+ | M# | ||
+ | M=# | ||
+ | M8@TJH' | ||
+ | M86UB; | ||
+ | M*V)U9F8Q+' | ||
+ | M< | ||
+ | M24Q, | ||
+ | M,# | ||
+ | M.TU/ | ||
+ | M; | ||
+ | M(& | ||
+ | M.F-O; | ||
+ | M, | ||
+ | M, | ||
+ | M, | ||
+ | M, | ||
+ | M: | ||
+ | M9F8Q+' | ||
+ | M(' | ||
+ | M2$%2# | ||
+ | M2$6@3T)*14-4H$Q)4U13+@TJ# | ||
+ | M: | ||
+ | M8V]L# | ||
+ | M3D53# | ||
+ | M5*!424U%# | ||
+ | M65!215-315.@0EF@04-# | ||
+ | M+2TM+2TM+2TM+0TJH& | ||
+ | MH' | ||
+ | M82`D8V(-(& | ||
+ | M9C0-(& | ||
+ | M.F8T(& | ||
+ | M(# | ||
+ | M< | ||
+ | M3D]234%, | ||
+ | M9' | ||
+ | M.F1O=" | ||
+ | M15, | ||
+ | M86< | ||
+ | M; | ||
+ | M4Z!43Z!& | ||
+ | M# | ||
+ | M0DI%0U0-(& | ||
+ | M# | ||
+ | M651%# | ||
+ | M87< | ||
+ | MH& | ||
+ | M: | ||
+ | M# | ||
+ | M04Y' | ||
+ | M)# | ||
+ | M-V8-(' | ||
+ | M9@T@< | ||
+ | M# | ||
+ | M4U!, | ||
+ | M3$%4H$%.H$]" | ||
+ | M< | ||
+ | M86YD(# | ||
+ | M(# | ||
+ | M82!C; | ||
+ | M(", | ||
+ | M; | ||
+ | M=& | ||
+ | M; | ||
+ | MH%=%)U)%H$1/ | ||
+ | MH$9/ | ||
+ | M3T]+4Z!" | ||
+ | M8R!C; | ||
+ | M(& | ||
+ | M# | ||
+ | M3*!3152@55`-(& | ||
+ | M0U13# | ||
+ | M051%H$%.1*!04D]*14-4H%!/ | ||
+ | M3$].1Z!, | ||
+ | M5$^@4D]4051%H$]" | ||
+ | M5$^@0D6@0T%214953" | ||
+ | M3$R@3D5%1*!!H%!/ | ||
+ | MH$)9H%1(1: | ||
+ | M3J!)3D1%6*!43Z!42$6@3$E35*!/ | ||
+ | M04Y$H%1(10TJH$-/ | ||
+ | MH%)/ | ||
+ | M0Z!72$E# | ||
+ | MH" | ||
+ | M4$])3E13(2D-# | ||
+ | M5%.@24Z@4%))34%260T@< | ||
+ | M< | ||
+ | M0D52H$]& | ||
+ | M(", | ||
+ | M5$%424].4PT@<& | ||
+ | M: | ||
+ | M< | ||
+ | M9FQA9RQX(# | ||
+ | M=& | ||
+ | M0EE415.@4$52H$-/ | ||
+ | MH$%3H$9/ | ||
+ | M3J!, | ||
+ | MH%5.5$E, | ||
+ | M# | ||
+ | M5T6@05)%H$1/ | ||
+ | M142@5$^@4T5%H$E& | ||
+ | M2$5.H$E4H%-+25!3H%1/ | ||
+ | M5*!$3T53H%1(1: | ||
+ | M3TY.14-424].H$E3H$1205=.H$& | ||
+ | M4T54H$E.H$& | ||
+ | M0T].3D5# | ||
+ | MH$Y/ | ||
+ | M# | ||
+ | M9& | ||
+ | M; | ||
+ | MH$9, | ||
+ | M< | ||
+ | M+' | ||
+ | M; | ||
+ | M(& | ||
+ | M4U2@4$])3E2@5$^@0T].3D5# | ||
+ | M, | ||
+ | M5*!43Z!# | ||
+ | M# | ||
+ | M86< | ||
+ | M(# | ||
+ | M=R!L9' | ||
+ | M6D523Z!)3J!# | ||
+ | M1J!# | ||
+ | M-# | ||
+ | M9F9S970-# | ||
+ | M4DU!3`T@8F5Q(# | ||
+ | M87@-(& | ||
+ | M# | ||
+ | M(# | ||
+ | M=V-O; | ||
+ | M: | ||
+ | M.F%L;& | ||
+ | M5`T@.T%4H& | ||
+ | M64U-151262U214Q!5$5$H$]" | ||
+ | M4U1%4J!2149215-(# | ||
+ | M*BJ@< | ||
+ | M.W!215146: | ||
+ | M(' | ||
+ | M(# | ||
+ | M05)/ | ||
+ | M+2TM+0TJ*J!R3U1!5$4LH%!23TI%0U0LH$%.1*!35$]21: | ||
+ | M# | ||
+ | M+*!23U1!5$E.1Z!!3D0-*J!04D]*14-424Y' | ||
+ | MH' | ||
+ | M25-4H$]& | ||
+ | M; | ||
+ | M0U13# | ||
+ | M15)%3E2@3T)*14-44PTJH$U!6: | ||
+ | M62X-*@TJH& | ||
+ | M+*!42$5.H%@M62R@5$A%3@TJH%DM6BR@04Y$H$9)3D%, | ||
+ | MH%1(14Z@4%)/ | ||
+ | MH%1(10TJH$A94$524$Q!3D6@5SU# | ||
+ | M1: | ||
+ | MH%@M6: | ||
+ | M25-4H$]& | ||
+ | M3*!# | ||
+ | M1$].)U2@5T]24EF@04)/ | ||
+ | M24Y' | ||
+ | M551)3TXN# | ||
+ | M< | ||
+ | M.J!43Z!3059%H%-/ | ||
+ | M4U5" | ||
+ | M*J!R; | ||
+ | M82!O8FQI< | ||
+ | M5$5-4#& | ||
+ | M60T@;& | ||
+ | M> | ||
+ | M> | ||
+ | M=' | ||
+ | M4D1)3D%415.@1$^@3D]4H$-/ | ||
+ | M3U> | ||
+ | M.VY/ | ||
+ | M>" | ||
+ | M3TXG5*!& | ||
+ | M25)35*!)3E1/ | ||
+ | M; | ||
+ | M;& | ||
+ | M9& | ||
+ | M;&, | ||
+ | M8BDL> | ||
+ | M3E1/ | ||
+ | M# | ||
+ | M9G-E=`T@8G!L(# | ||
+ | M2$E.1Z!-14T-(& | ||
+ | M.F]K, | ||
+ | M< | ||
+ | M861C(& | ||
+ | M2$6@3U))1TE.# | ||
+ | M; | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0TJH' | ||
+ | M# | ||
+ | M3D2@83U8, | ||
+ | M0D6@4T54H%50H$E.H' | ||
+ | M4U1/ | ||
+ | M# | ||
+ | M< | ||
+ | M82!S: | ||
+ | M*& | ||
+ | M< | ||
+ | M0E)/ | ||
+ | MH$]& | ||
+ | M2$6@34E$1$Q%# | ||
+ | M05))3D> | ||
+ | MH$-/ | ||
+ | M(' | ||
+ | M, | ||
+ | M, | ||
+ | M(# | ||
+ | M0T]/ | ||
+ | M> | ||
+ | M< | ||
+ | M< | ||
+ | M4TY!6EI9H$Y%5Z!23U5424Y%# | ||
+ | M0TA!4E.@4$52H%-)1$4-*J!L9&& | ||
+ | M82!S=& | ||
+ | M;& | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM# | ||
+ | M-J!" | ||
+ | M0U5-54Q!5$]27: | ||
+ | M3E.@54Y# | ||
+ | M; | ||
+ | M=" | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2T-*@TJH& | ||
+ | MH$& | ||
+ | M# | ||
+ | MH*" | ||
+ | M, | ||
+ | MH%1/ | ||
+ | M*2I-+@TJ# | ||
+ | MH$%21: | ||
+ | M1D]2H$E.4U1!3D-%H$E.H%1(25.@4%)/ | ||
+ | M3$R@24Y414=%4E.@*# | ||
+ | M# | ||
+ | M; | ||
+ | M;& | ||
+ | M(' | ||
+ | M; | ||
+ | M, | ||
+ | M(' | ||
+ | M; | ||
+ | M# | ||
+ | M*J!715)%H%-43TQ%3J!& | ||
+ | M< | ||
+ | M86$U-6%A-34-> | ||
+ | M-V)B9& | ||
+ | M+@TJ# | ||
+ | M9& | ||
+ | M; | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0TJ# | ||
+ | M=$A)4Z!)4Z!!H%-%5*!/ | ||
+ | M1D]2H%5310TJH%=)5$B@; | ||
+ | M3E1, | ||
+ | M10TJH$9)3$R@4D]55$E.12R@04Y$H$& | ||
+ | M2U.@3T8-*J!' | ||
+ | M*J!H25-43U)9.@TJH*!S;& | ||
+ | M0T%404), | ||
+ | M14Y4142@34]$249)142@1DE, | ||
+ | MH" | ||
+ | MH*`M< | ||
+ | M*J" | ||
+ | M2$6@55-%4PTJH*" | ||
+ | M# | ||
+ | M< | ||
+ | M872@5$^@2T5%4*!& | ||
+ | M, | ||
+ | M4$A)0U, | ||
+ | M*J!C3TY35$%.5%, | ||
+ | M05=)3D> | ||
+ | M9C$K)# | ||
+ | M(& | ||
+ | MH$9)3$R@4$%45$523@UP871T97)N, | ||
+ | M0T%, | ||
+ | M4J!, | ||
+ | M+S@-:& | ||
+ | M15(-;& | ||
+ | M=2`D8V$X, | ||
+ | M6`T-< | ||
+ | M5$5$/ | ||
+ | MH& | ||
+ | M, | ||
+ | M, | ||
+ | M24Y44Z!)3J!, | ||
+ | M# | ||
+ | M5$5$*0T-<& | ||
+ | M; | ||
+ | M4T-2145.H%!, | ||
+ | M3TQ/ | ||
+ | M3U*@< | ||
+ | M1J!3455!4D4-# | ||
+ | M5$^@4D]4051%H$E.H' | ||
+ | MH%1/ | ||
+ | M5TE.1Z!!H$Q)3D4-> | ||
+ | M4U-%4PUX, | ||
+ | M(& | ||
+ | M-PUD> | ||
+ | M0T].1DQ)0U2@5TE42*!8, | ||
+ | M24%" | ||
+ | M9$].)U2@5$]50T@N# | ||
+ | M10UA=7@@97%U(" | ||
+ | M+2TM+2TM+2TM+2TM+2T-*@TJH' | ||
+ | M4D]55$E.1: | ||
+ | M051)3D< | ||
+ | M5$A%H%-%0T].1$%26: | ||
+ | M0DI%0U13+@T-< | ||
+ | M; | ||
+ | M.V9)4E-4H$& | ||
+ | M> | ||
+ | M(' | ||
+ | M," | ||
+ | M9F5R, | ||
+ | M# | ||
+ | M97(Q*S$R," | ||
+ | M(' | ||
+ | M-C`L> | ||
+ | M-C`L> | ||
+ | M149, | ||
+ | M# | ||
+ | M-38P+' | ||
+ | M# | ||
+ | M9F5R, | ||
+ | M82!R979L: | ||
+ | M> | ||
+ | M(' | ||
+ | M-C`L> | ||
+ | M, | ||
+ | M3U> | ||
+ | M+' | ||
+ | M,: | ||
+ | M979L: | ||
+ | M, | ||
+ | M# | ||
+ | M97(Q*S, | ||
+ | M# | ||
+ | M, | ||
+ | M9F9E< | ||
+ | M(' | ||
+ | M9F9E< | ||
+ | M9@T@; | ||
+ | M9F5R, | ||
+ | M=& | ||
+ | M< | ||
+ | M82!B=69F97(R*S$R," | ||
+ | M9@T@; | ||
+ | M9F5R, | ||
+ | M9F5R, | ||
+ | M5Z!$3Z!2149, | ||
+ | M> | ||
+ | M9F9E< | ||
+ | M, | ||
+ | M=& | ||
+ | M87@-(& | ||
+ | M, | ||
+ | M> | ||
+ | M9F5R, | ||
+ | M871T97)N, | ||
+ | M," | ||
+ | M979L: | ||
+ | M8T], | ||
+ | M(& | ||
+ | M, | ||
+ | M;& | ||
+ | M82!B=69F97(R*S, | ||
+ | M97)N, | ||
+ | M.S6@+3Z@, | ||
+ | M< | ||
+ | M.F1O; | ||
+ | M# | ||
+ | M0U545$52+*!34$E& | ||
+ | M0T6@252@25.@3TY, | ||
+ | M9FEL;& | ||
+ | M2$%61: | ||
+ | M;& | ||
+ | MH& | ||
+ | M1$2@)# | ||
+ | M1`T@;& | ||
+ | M=$A%H$], | ||
+ | M35.@5$^@0D6@0: | ||
+ | M=69F97(I+' | ||
+ | M051415).4Z!, | ||
+ | M8R`C-# | ||
+ | M;&, | ||
+ | M:& | ||
+ | MH%1(1: | ||
+ | M82`H8G5F9F5R*2QY# | ||
+ | M5T%21%, | ||
+ | M)# | ||
+ | M82!B=69F97(K, | ||
+ | M92`Z9& | ||
+ | M(' | ||
+ | M9F9E< | ||
+ | M15(-(& | ||
+ | M9' | ||
+ | M.FPR# | ||
+ | M*2QY# | ||
+ | M24R@>: | ||
+ | M0E54H$U!64)%H$Y/ | ||
+ | MH$Q)4U2@5D525$E# | ||
+ | M3TQ534XM041$4RZ@H' | ||
+ | M25-/ | ||
+ | M12Y' | ||
+ | M1T])3D< | ||
+ | M4Z!005)4# | ||
+ | M9&& | ||
+ | M.VY/ | ||
+ | M1DE, | ||
+ | M=69F97(I+' | ||
+ | M# | ||
+ | MH& | ||
+ | M97(K, | ||
+ | M4PTJ.FQO; | ||
+ | M*J`[159%4EE/ | ||
+ | M4E0-*CIL; | ||
+ | M.V9, | ||
+ | MH& | ||
+ | MH*`C,# | ||
+ | MH' | ||
+ | M*CIS: | ||
+ | M1DE.25-(H$5!4DQ9# | ||
+ | M=&& | ||
+ | M1T]%4RX-*J!B8W.@.FQO; | ||
+ | M, | ||
+ | M+2TM# | ||
+ | MH%5314953*!-04-23U, | ||
+ | M6D6@5$A%H$-/ | ||
+ | M=$A%H$18+S*@34%+15.@0: | ||
+ | M0U)/ | ||
+ | M54U" | ||
+ | M;' | ||
+ | M8V, | ||
+ | M< | ||
+ | M04M%H%-54D6@5$^@1T54H$%4H$Q%05-4H#& | ||
+ | M; | ||
+ | M< | ||
+ | M1: | ||
+ | M(& | ||
+ | M(& | ||
+ | M;' | ||
+ | M;& | ||
+ | M: | ||
+ | M> | ||
+ | MH& | ||
+ | M; | ||
+ | M< | ||
+ | M: | ||
+ | M(# | ||
+ | M3Z!84U1%4`T-*BHJ*BJ@=$%+1: | ||
+ | M9' | ||
+ | M1J!$63TPH$E4)U.@2E535*!!H%!/ | ||
+ | M;& | ||
+ | M9" | ||
+ | M(# | ||
+ | M82`H8G5F9F5R*2QY# | ||
+ | M+%TQ# | ||
+ | M; | ||
+ | M+' | ||
+ | M> | ||
+ | M*J!D97@-*J!B; | ||
+ | M;& | ||
+ | M(& | ||
+ | M<& | ||
+ | M9& | ||
+ | M3Z!94U1%4`T-*BHJ*J!I3DE424%, | ||
+ | M+: | ||
+ | M*J!L; | ||
+ | M, | ||
+ | M97*@+2V@> | ||
+ | M; | ||
+ | M=& | ||
+ | M1T5.5$Q9*0T-9' | ||
+ | M6# | ||
+ | M+*!35T%0H' | ||
+ | M(' | ||
+ | M5Z!A/ | ||
+ | M3U> | ||
+ | M5$A%H$9)4E-4H$-/ | ||
+ | M2$6@1%)!5TE.1Z!" | ||
+ | M: | ||
+ | M(", | ||
+ | M# | ||
+ | M1: | ||
+ | M; | ||
+ | M3T: | ||
+ | M=& | ||
+ | M> | ||
+ | M1: | ||
+ | M8V]N=# | ||
+ | M# | ||
+ | M=& | ||
+ | M.V1/ | ||
+ | M(& | ||
+ | M345-# | ||
+ | M(& | ||
+ | M4D13H$]2H$)!0TM705)$4Z!)3J!Y/ | ||
+ | M>& | ||
+ | M4U-5346@9& | ||
+ | M82!O;& | ||
+ | M.W-/ | ||
+ | M8W, | ||
+ | M<" | ||
+ | M2$E3H%)/ | ||
+ | M04-415)3# | ||
+ | M4U1/ | ||
+ | M4EDN# | ||
+ | MH$-(05)!0U1%4@TJH*" | ||
+ | MH$]& | ||
+ | MH*" | ||
+ | M;& | ||
+ | M-# | ||
+ | M<# | ||
+ | M965N<" | ||
+ | M96UP, | ||
+ | M(& | ||
+ | M*S$-(& | ||
+ | M3U< | ||
+ | M; | ||
+ | M=& | ||
+ | M<" | ||
+ | M> | ||
+ | M04Q, | ||
+ | M;&, | ||
+ | M; | ||
+ | M; | ||
+ | M.F-O; | ||
+ | M3$%35*!23U< | ||
+ | M4DE424Y' | ||
+ | M< | ||
+ | MW; | ||
+ | MS; | ||
+ | M[[=O.V; | ||
+ | MTW+< | ||
+ | M2@!P*BTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T-*@TJH$]" | ||
+ | M5%, | ||
+ | M5$A%H$]" | ||
+ | M5T%94Z!!4U-5345$H%1(052@5$A%# | ||
+ | M25)35*!03TE.5*!/ | ||
+ | MH$].1: | ||
+ | M5TE, | ||
+ | M# | ||
+ | M3D53*2X-*@TJH' | ||
+ | M3%F@4U1!4E2@0: | ||
+ | MH%)!35" | ||
+ | M+SDV# | ||
+ | M2D5# | ||
+ | M+S(QH" | ||
+ | MH$%, | ||
+ | M3$E462Z@H' | ||
+ | M4%)%2$5.4TE" | ||
+ | MH*" | ||
+ | M2*!7/ | ||
+ | MH$1205=.H$1/ | ||
+ | M149)3DE424].H$Q)4U2@1D]2H$U/ | ||
+ | M841$142@5$A%H%)%34%)3DE.1Z!/ | ||
+ | M(' | ||
+ | M4D%# | ||
+ | M4T54# | ||
+ | M< | ||
+ | M8FQI< | ||
+ | M;& | ||
+ | M(" | ||
+ | M14-4142@4$])3E13# | ||
+ | M, | ||
+ | M1D]2H$Q)3D6@4D]55$E.10UL; | ||
+ | M*E@O.`UH: | ||
+ | M1D9%4@UL; | ||
+ | M97%U(" | ||
+ | MH%)/ | ||
+ | M3TY.14-424].H$Q)4U0-8V]N;& | ||
+ | M3E2@24Z@0T].3D5# | ||
+ | MH$]& | ||
+ | M1U.@5$^@2T5%4*!& | ||
+ | M, | ||
+ | M4DE!0DQ%4PT-8V]L< | ||
+ | MH%!%4J!# | ||
+ | M-30-> | ||
+ | M-" | ||
+ | M=' | ||
+ | M24Y44Z!)3J!/ | ||
+ | M83< | ||
+ | M(" | ||
+ | MH$Y534)%4J!/ | ||
+ | MH$]" | ||
+ | M24Y%H$%.1*!# | ||
+ | M(" | ||
+ | MH%!23TI%0U1)3TZ@5$%" | ||
+ | MH%!/ | ||
+ | M3E1%4J!54T5$H$)9H%-# | ||
+ | M3TE.5$52H$E.5$^@0T], | ||
+ | MH%-43U)%H$E.H$-/ | ||
+ | M4E.@4$52H%-)1$6@3T: | ||
+ | M15*@3T: | ||
+ | M(" | ||
+ | M3TE.5%.@1D]2H$1205=)3D> | ||
+ | M4D^@4$%' | ||
+ | M5TE42*!B87-I8PUY, | ||
+ | M)& | ||
+ | M3U524T4LH$-/ | ||
+ | M=$5-4$]205)9H%9!4DE!0DQ%4PUZ=& | ||
+ | M549& | ||
+ | M6: | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM# | ||
+ | M2$E3H%!23T-%1%521: | ||
+ | M4%544SH-*J" | ||
+ | M3TY.14-424].4PTJH*" | ||
+ | M3J!, | ||
+ | M3D]234%, | ||
+ | M3%F@25.@1D%35$52H$%.1*!32$]25$52H%1/ | ||
+ | M5%, | ||
+ | M; | ||
+ | MH$-/ | ||
+ | MH%!/ | ||
+ | M0T].1*!03TE.5`T@< | ||
+ | M8V]N< | ||
+ | M9DE.04Q, | ||
+ | M,# | ||
+ | M*0T@< | ||
+ | M-& | ||
+ | M55" | ||
+ | M# | ||
+ | M4Z!)3J!42$6@3$E35`T@8FYE(# | ||
+ | M+2TM+2TM+2TM+2TM+2TM+0TJ# | ||
+ | MH" | ||
+ | M1%.@1E)/ | ||
+ | MH%!/ | ||
+ | M+@TJ# | ||
+ | M5%.@5$^@1U)/ | ||
+ | M4$])3E1%4J!43Z!42$6@4$])3E2@3$E35" | ||
+ | MH$U!4TLN# | ||
+ | M2$521: | ||
+ | M0TB@5D525$58+*!!3D2@14%# | ||
+ | MH# | ||
+ | M3D%410TJH$)9H%173Z!" | ||
+ | M1: | ||
+ | M,# | ||
+ | MH# | ||
+ | M15B@052@*%< | ||
+ | M1: | ||
+ | M4U1/ | ||
+ | M544NH*!I1@TJH$& | ||
+ | M3TY$24Y' | ||
+ | M=RR@151# | ||
+ | M4Z`M, | ||
+ | M5*!)4Z!)1TY/ | ||
+ | MH$U!6: | ||
+ | M4TE.1Z!42$6@34%32Z!)5*!)4PTJH%!/ | ||
+ | M3TY, | ||
+ | M3U)$24Y!5$53+@TJ# | ||
+ | M;& | ||
+ | M; | ||
+ | M# | ||
+ | M: | ||
+ | M=' | ||
+ | M(& | ||
+ | M8FQI< | ||
+ | M(& | ||
+ | M96, | ||
+ | M(& | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0TJ# | ||
+ | M2D5# | ||
+ | M24-!3*!04D]# | ||
+ | M0: | ||
+ | M4D]724Y' | ||
+ | M4%))051%3%DNH*!W2$5.H$1/ | ||
+ | M3E0-*J!, | ||
+ | M; | ||
+ | M=$]404R@3E5-0D52H$]& | ||
+ | M< | ||
+ | M:& | ||
+ | M(& | ||
+ | MH& | ||
+ | M.FEN: | ||
+ | M34%, | ||
+ | M5*!23U5424Y%H$].0T4-# | ||
+ | M; | ||
+ | M3D1!4EF@*# | ||
+ | M-*!# | ||
+ | M5$A%H# | ||
+ | M4TY%04M9+*!%2" | ||
+ | M, | ||
+ | M;& | ||
+ | M(& | ||
+ | M82!O8C-C; | ||
+ | M4T^@5T6@0T]06: | ||
+ | M3DLLH$))1Z!72$]/ | ||
+ | M*@TJH& | ||
+ | MH$-!3$Q)3D> | ||
+ | M3U)-04Q3# | ||
+ | M0U5" | ||
+ | M-BTR-`T@< | ||
+ | M: | ||
+ | M(SYV97)T, | ||
+ | M3E13H%1/ | ||
+ | M# | ||
+ | M(& | ||
+ | M< | ||
+ | M(# | ||
+ | M(& | ||
+ | M(& | ||
+ | M14-4H$& | ||
+ | M,# | ||
+ | M(", | ||
+ | M(# | ||
+ | M8PT@: | ||
+ | M9W)O=PT-*@TJH' | ||
+ | M4T-224)%1*!)3J!G< | ||
+ | MH" | ||
+ | M,# | ||
+ | M(& | ||
+ | M(& | ||
+ | M)3$Q,# | ||
+ | M)3$Q, | ||
+ | M)3$Q, | ||
+ | M9& | ||
+ | M, | ||
+ | M, | ||
+ | M, | ||
+ | M=$A%4T6@05)%H%1(1: | ||
+ | M< | ||
+ | M9: | ||
+ | MH' | ||
+ | MH%=(24-(H$U!60TJH$)%H$%# | ||
+ | M4D]55$E.12Z@H' | ||
+ | M14E2H$]73J!, | ||
+ | M3TY.14-424].H$Q)4U0NH*!T2$6@3D]234%, | ||
+ | M3TQ, | ||
+ | M1$E214-43%F@24Y43Z!42$4-*J!04DE-05)9H$]" | ||
+ | M4Z`M+: | ||
+ | M3D2@5$A)4Z!!3$Q/ | ||
+ | M5$Q9H$A!3D1, | ||
+ | M10TJH$5!0TB@1D%# | ||
+ | MH%-!344Z# | ||
+ | MH$Y/ | ||
+ | M3D> | ||
+ | MH$-/ | ||
+ | MH%1(10TJH$9!0T6@5TA)0TB@0D5, | ||
+ | M4Z!# | ||
+ | M04Y$H$9/ | ||
+ | M3TQ%H%1(24Y' | ||
+ | M# | ||
+ | MH$-/ | ||
+ | M54-# | ||
+ | M3Z!)4Z!(250NH*!T2$6@3D585*!03TE.5*!)4Z!42$5.# | ||
+ | M4Z!!H$Y/ | ||
+ | M# | ||
+ | MH%1(1: | ||
+ | MH%1/ | ||
+ | M4D%724Y' | ||
+ | MH$1205=.H$& | ||
+ | M24Q!4J!# | ||
+ | M*J!32$%2142@0D545T5%3J!625-)0DQ%H$9!0T53H$1/ | ||
+ | MH$)%H$1205=.H%1724-%+@TJ# | ||
+ | M24].4Z!-05F@0D6@1%)!5TZ@55-)3D> | ||
+ | M5$5$H$Q)3D53+J" | ||
+ | M252@2$5, | ||
+ | M3D53H$-/ | ||
+ | M5TE42*!$3U14142@3$E.15, | ||
+ | MH%=(14Z@5$A%6: | ||
+ | M2$5210TJH$%21: | ||
+ | M14-424].4RR@5$A%H$A)1T@-*J!" | ||
+ | M15B@4T525D53H$%3H$& | ||
+ | M2*!" | ||
+ | M14-424Y'# | ||
+ | M3U5424Y%H$].3%F@3D5%1%.@5$\-*J!35%))4*!/ | ||
+ | MH%-%5*!42$6@1DQ!1Z!D; | ||
+ | M(# | ||
+ | M, | ||
+ | M+3: | ||
+ | M,# | ||
+ | M97@@,# | ||
+ | M,# | ||
+ | M8J`Y+60-(& | ||
+ | M+48-(& | ||
+ | M,& | ||
+ | M, | ||
+ | M(& | ||
+ | MH*" | ||
+ | M, | ||
+ | M, | ||
+ | M5*!/ | ||
+ | M0D52H$E3H$Y534)%4J!/ | ||
+ | M15*@25.@3E5-0D52H$]& | ||
+ | M,# | ||
+ | M+3$W# | ||
+ | M+3$Y# | ||
+ | M+3(Q# | ||
+ | M+3(S# | ||
+ | M, | ||
+ | M, | ||
+ | M; | ||
+ | M, | ||
+ | M-@T@9& | ||
+ | M# | ||
+ | MH" | ||
+ | M25.@3TY%H$]& | ||
+ | M*J!615)424-%4RX-*@TJH' | ||
+ | M4D]-H$5!0TB@3U1(15*@3TZ@5$A%H$-50D4N# | ||
+ | MH# | ||
+ | MH" | ||
+ | M*J!& | ||
+ | M24Y' | ||
+ | M25I)3D> | ||
+ | MH%1(1: | ||
+ | M3D2@24Z@-*!# | ||
+ | M, | ||
+ | M0RX-*J!!3D2@5$A%H$9/ | ||
+ | M+@TJ# | ||
+ | M2Z!42$E3H$9/ | ||
+ | M05))04Y4H%5.1$52H%1(1: | ||
+ | M34544EF@1U)/ | ||
+ | M34544EF@3U!%4D%43U*@1T5.15)!5$53H$%.3U1(15*@4$])3E2@24Z@5$A% | ||
+ | MH%-%5" | ||
+ | M052@:: | ||
+ | M14XG5*!!1$I!0T5.5*!43Z!%04-(H$]42$52+@TJ# | ||
+ | M4DU!3%.@0T]24D534$].1*!%6$%# | ||
+ | M=$A!5*!)4RR@3T: | ||
+ | M5$A%H$9/ | ||
+ | M1: | ||
+ | M# | ||
+ | M=& | ||
+ | M0T4-# | ||
+ | MH& | ||
+ | M=& | ||
+ | M, | ||
+ | M(", | ||
+ | M;# | ||
+ | M1: | ||
+ | M14-424].4Z`H, | ||
+ | M4%13H%1/ | ||
+ | M< | ||
+ | M(& | ||
+ | M0U1)3TY3H%=)3$R@55-%H$1/ | ||
+ | M13J@," | ||
+ | MH*" | ||
+ | M8V]N," | ||
+ | M=V-O; | ||
+ | M(' | ||
+ | M; | ||
+ | MH$%, | ||
+ | M15)415B@3$E35`TJ# | ||
+ | M8B`E,# | ||
+ | M8B`E, | ||
+ | M8B`E, | ||
+ | M(& | ||
+ | M.S$RH%!/ | ||
+ | M, | ||
+ | M4DU!3%, | ||
+ | M+3& | ||
+ | M, | ||
+ | M-R`[, | ||
+ | MH#, | ||
+ | M-R`[-& | ||
+ | M.# | ||
+ | M9*!# | ||
+ | M0T].3D5# | ||
+ | M0T].3D5# | ||
+ | M4Z!7251(H%< | ||
+ | M34%, | ||
+ | M4J!/ | ||
+ | MH$)%3$]7# | ||
+ | M(& | ||
+ | M97@@,# | ||
+ | M, | ||
+ | M9F(@, | ||
+ | M, | ||
+ | M, | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2T-*@TJH& | ||
+ | M2D5# | ||
+ | MH$E3H%1(1: | ||
+ | M1: | ||
+ | M2$5$4D].# | ||
+ | M*: | ||
+ | M5$A)4Z!)4Z!!3J!/ | ||
+ | M+# | ||
+ | M3D0LH%1(1: | ||
+ | M2$6@0U5" | ||
+ | M*J!/ | ||
+ | M5: | ||
+ | M2$E3H$E.5$^@-& | ||
+ | M, | ||
+ | M5%.@3$E+1: | ||
+ | M*@TJH' | ||
+ | M5$A%H$-%3E1%4J!/ | ||
+ | M-& | ||
+ | M05.@4U1!5$5$+*!*3TE.24Y' | ||
+ | M4D]34RU314-424].H" | ||
+ | M2$6@0T5.5$524PTJH$]& | ||
+ | M4T4_H*!T2$6@4T5# | ||
+ | M*J!7251(H# | ||
+ | M0T%.H%-%1: | ||
+ | M5D6@1%)!5TZ@0: | ||
+ | MH$%, | ||
+ | M1T@-*J!)5*!214%, | ||
+ | M25-504Q)6D4LH$E4H%-%14U3# | ||
+ | M1: | ||
+ | M4U!%0TE!3$Q9H$].H$I54U2@0: | ||
+ | M5$5$H$Q)3D53+@TJH& | ||
+ | MH%=/ | ||
+ | MH$& | ||
+ | MH$I54U2@55-%H%1(1: | ||
+ | M# | ||
+ | M2Z!!0D]55" | ||
+ | MH%1/ | ||
+ | M-J`S9*`KH# | ||
+ | MH%)53J!42$6@24Y)5*!23U5424Y%H$].0T4-# | ||
+ | M(S@-(' | ||
+ | M; | ||
+ | M< | ||
+ | M-B`[; | ||
+ | M;& | ||
+ | M24].H$Q)4U13# | ||
+ | M, | ||
+ | M3`T@;& | ||
+ | M='< | ||
+ | M; | ||
+ | M24Q, | ||
+ | M3DY%0U1)3D> | ||
+ | M15)/ | ||
+ | MH%1(1: | ||
+ | M< | ||
+ | M;& | ||
+ | M; | ||
+ | M+3$-(& | ||
+ | M; | ||
+ | M2$6@3U1(15)3+`TJH%-/ | ||
+ | M2*!/ | ||
+ | MH$1/ | ||
+ | M; | ||
+ | M(& | ||
+ | M> | ||
+ | M8G!L(# | ||
+ | M*@UV97)T, | ||
+ | M,# | ||
+ | M,# | ||
+ | M24-%4PT@9& | ||
+ | M,# | ||
+ | M,# | ||
+ | M,# | ||
+ | M,# | ||
+ | M,# | ||
+ | MH%1/ | ||
+ | M,# | ||
+ | M, | ||
+ | M>" | ||
+ | M(# | ||
+ | M3U1!3" | ||
+ | M,: | ||
+ | M,& | ||
+ | M5$%, | ||
+ | M4PT@9& | ||
+ | M; | ||
+ | M3D1%6*`Q-*`]H# | ||
+ | M(& | ||
+ | M, | ||
+ | M, | ||
+ | M9& | ||
+ | M(#, | ||
+ | M, | ||
+ | M5%.@24Z@3$E35`T-*BTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T- | ||
+ | M*@TJH& | ||
+ | M241%1*!42$E.1PTJ# | ||
+ | M4Z!!3D2@.3: | ||
+ | M+J" | ||
+ | M6: | ||
+ | M345.5*!/ | ||
+ | M3TY%H$]& | ||
+ | M4D\L# | ||
+ | M2*!& | ||
+ | MH$%21: | ||
+ | M*@TJH& | ||
+ | M3T: | ||
+ | M0T]54E-%H$Y/ | ||
+ | M1T].*2R@3$5!5DE.1Z!$24%-3TY$4Z!72$521: | ||
+ | MH%53142@5$^@0D6@04Y$H%1224%.1TQ%4Z!72$521: | ||
+ | M4T5$# | ||
+ | M15(BH$%.1*`B3U5415(BH# | ||
+ | M15.@05)%H$%, | ||
+ | M5*!)3BU" | ||
+ | M1: | ||
+ | MH$& | ||
+ | M14Z@1D%# | ||
+ | M5*!/ | ||
+ | MH%!!4E1)0U5, | ||
+ | M0U1/ | ||
+ | M," | ||
+ | M4J!42$6@15@M0U5" | ||
+ | M04R@5D5# | ||
+ | M24M%H" | ||
+ | M4T5$# | ||
+ | M259%4Z`R+*!!H$1)1D9%4D5.5`TJH$-/ | ||
+ | M55`LH%1(1: | ||
+ | MH$E.4U1%042@3T: | ||
+ | M*2X-*J!N3U> | ||
+ | M3TXG5*!.145$H%1/# | ||
+ | M3$=/ | ||
+ | M, | ||
+ | M4E5.H%1(1: | ||
+ | M, | ||
+ | M82!N=6UO8C$R(# | ||
+ | M# | ||
+ | M(", | ||
+ | M82!O8FQI< | ||
+ | M3DY%0U1)3TZ@3$E35%, | ||
+ | M24].4Z`H, | ||
+ | M4Z!43U1!3`T@;& | ||
+ | M='< | ||
+ | M," | ||
+ | M24-(H$-/ | ||
+ | M25.@0T%312R@3$E.15.@0T].3D5# | ||
+ | M4J!03TE.5*!7251(H$Y/ | ||
+ | M(# | ||
+ | M+' | ||
+ | M92`Z;# | ||
+ | M3Z!31513H$]& | ||
+ | M*J!43Z!42$6@5D525$E# | ||
+ | M04Y$H%1(10TJH%-%0T].1*!3152@3$E%H$].H%1(1: | ||
+ | M15, | ||
+ | M;& | ||
+ | MH$-/ | ||
+ | M4D534$].1*!43Z!# | ||
+ | M5*!!5*`R-`T@8F-C(# | ||
+ | M# | ||
+ | M24Y4H# | ||
+ | M8V]N=# | ||
+ | M8V, | ||
+ | M8G!L(# | ||
+ | M: | ||
+ | M82!O8FQI< | ||
+ | M=' | ||
+ | M82!O8FQI< | ||
+ | M=& | ||
+ | M(# | ||
+ | M9U)/ | ||
+ | M2$6@5D525$58H$Q)4U0-*@UV97)T, | ||
+ | M, | ||
+ | M.R@Q+# | ||
+ | M)3`Q,# | ||
+ | M(" | ||
+ | M9& | ||
+ | M9& | ||
+ | M9& | ||
+ | M, | ||
+ | M,# | ||
+ | M,# | ||
+ | M,# | ||
+ | M, | ||
+ | MH$]& | ||
+ | M9& | ||
+ | M9& | ||
+ | M, | ||
+ | M,# | ||
+ | M04Q3H%-%5*!54*!" | ||
+ | M*@UO8C%C; | ||
+ | M+3< | ||
+ | M97@@,# | ||
+ | M>" | ||
+ | M-S!A,#< | ||
+ | M.S`M, | ||
+ | M,# | ||
+ | M241$3$6@1U594Z!!4D4-(& | ||
+ | M3TY3# | ||
+ | M(# | ||
+ | M,& | ||
+ | M# | ||
+ | M-" | ||
+ | M, | ||
+ | M, | ||
+ | M9" | ||
+ | M:& | ||
+ | M0T].4PT@:& | ||
+ | M93$R# | ||
+ | M, | ||
+ | M5$A%H$Q!4U2@, | ||
+ | M9*!# | ||
+ | M-#" | ||
+ | M, | ||
+ | M, | ||
+ | M8@T@:& | ||
+ | M:& | ||
+ | M34]21: | ||
+ | M3D5# | ||
+ | M.VY/ | ||
+ | M54U" | ||
+ | M24Y44Z!" | ||
+ | M-*`]H# | ||
+ | M.`T@9& | ||
+ | M# | ||
+ | M8B`Q, | ||
+ | M-0T@9& | ||
+ | M8B`Y.0T@:& | ||
+ | M# | ||
+ | M>" | ||
+ | M, | ||
+ | M, | ||
+ | M9F(@, | ||
+ | M# | ||
+ | M(# | ||
+ | M# | ||
+ | M4U2@3TY%(0T@9& | ||
+ | M:& | ||
+ | MDJ: | ||
+ | M5V2K)L^Z9*FJ: | ||
+ | MM+-5*4H`<" | ||
+ | M55-)0RY3# | ||
+ | MH$923TV@=$A%H' | ||
+ | M04-(+@TJ# | ||
+ | M2$6@-$N@1$5-3RX-*J!T2$6@355324.@25.@1%))5D5.H$)9H$%.H$E.5$52 | ||
+ | M4E505*!' | ||
+ | M5$E-15*@25.@1$5# | ||
+ | MH$%4H%=(24-(H%!/ | ||
+ | M1*!)1J!.14-%4U-!4EF@5$A%H$Y%6%2@3D]410TJH" | ||
+ | MH%)%042@24XNH*!F3U*@34]21: | ||
+ | M*@TJH' | ||
+ | M2$6@5TE212R@14@_*0TJ# | ||
+ | M0DQ%4PTJ# | ||
+ | M9& | ||
+ | M# | ||
+ | M10UN=6UN; | ||
+ | M5*!!H%1)344-; | ||
+ | M55-)0Z!$051!# | ||
+ | M3D]410UV; | ||
+ | MH%1/ | ||
+ | M04U%H$9/ | ||
+ | MH#, | ||
+ | M, | ||
+ | M(& | ||
+ | M97%U(" | ||
+ | M0UF@5$%" | ||
+ | MH$Y/ | ||
+ | M2$6@5D])0T4I# | ||
+ | M0: | ||
+ | M=' | ||
+ | M(# | ||
+ | M24-%+3& | ||
+ | M, | ||
+ | M0: | ||
+ | M3J!P4D535$^@4T5# | ||
+ | M841!1TE/ | ||
+ | M3U)46D%.1$\B# | ||
+ | M04Y/# | ||
+ | M5%, | ||
+ | M, | ||
+ | M97%U(" | ||
+ | M+2TM+2TM+2TM+2TM+2TM# | ||
+ | M/ | ||
+ | M: | ||
+ | M4U2@24: | ||
+ | M4E)%0U1, | ||
+ | M# | ||
+ | M/ | ||
+ | M251)04Q)6D6@24Y415)255!4H%)/ | ||
+ | M24Y' | ||
+ | M< | ||
+ | M14Y# | ||
+ | M5D52651(24Y' | ||
+ | M2$521: | ||
+ | M+*!)1J!93U6@3$E+12R@252@4T]53D13H$)%5%1%4@T@.T%.H$]# | ||
+ | M3U=%4J!7251(H%1(25.@24Y35%)5345.5`TZ;# | ||
+ | M< | ||
+ | M82!L; | ||
+ | M# | ||
+ | M: | ||
+ | M152@3T-4059%4PT@< | ||
+ | M< | ||
+ | M1$^@250A# | ||
+ | M; | ||
+ | M(& | ||
+ | MH%1)344-(# | ||
+ | M;' | ||
+ | M, | ||
+ | M/ | ||
+ | M14U" | ||
+ | M*S0-(& | ||
+ | M# | ||
+ | M=C$K, | ||
+ | M92`Z;# | ||
+ | M9& | ||
+ | M/ | ||
+ | M; | ||
+ | M80T@< | ||
+ | M< | ||
+ | M(" | ||
+ | M55!4# | ||
+ | M82`D9# | ||
+ | M< | ||
+ | M55!4H$%4# | ||
+ | M, | ||
+ | M(' | ||
+ | M346@24Y)5$E!3$E: | ||
+ | M14Y# | ||
+ | M*@US: | ||
+ | M3$^@4$A)H$=!5$6@04134@T@:& | ||
+ | M# | ||
+ | M15%514Y# | ||
+ | M3$4NH*!E455!3*!414U015)%1*!)4Z!!H$1204> | ||
+ | MH%=/ | ||
+ | M, | ||
+ | M+# | ||
+ | M+2TM+2TM+2TM+2TM+2TM+2TM+2TM# | ||
+ | M15*@4D]55$E.12X-*@T-*@TJH& | ||
+ | MH$U!0U)/ | ||
+ | M146@5D%224%" | ||
+ | M: | ||
+ | MH%1/ | ||
+ | M2*!!4D6@5$A%H$%04%)/ | ||
+ | M4U151D8N# | ||
+ | M3E1)04Q, | ||
+ | M3U1%+@T-<& | ||
+ | M5$%)3E.@24Y$15B@24Y43PT@=& | ||
+ | M;& | ||
+ | M97%H: | ||
+ | M5$4O54Y' | ||
+ | M4J!43Z!0552@5$A%H$5.1*!!5*!42$6@0D5' | ||
+ | M(' | ||
+ | M(' | ||
+ | M10TJ# | ||
+ | M4E)54%2@1DQ!1PT@;& | ||
+ | M(& | ||
+ | M5*!# | ||
+ | M0T53H$%21: | ||
+ | M5# | ||
+ | M, | ||
+ | M93(-<& | ||
+ | M;' | ||
+ | M, | ||
+ | MH& | ||
+ | M545.0UF@5$%" | ||
+ | M3*!# | ||
+ | M24=(H$))5*!3152@04Y$H$A!5D6@5$A%H$9/ | ||
+ | M*J" | ||
+ | M5$A)4Z!(05.@1%52051)3TZ@6%@-*J" | ||
+ | M*J" | ||
+ | M*0TJH*" | ||
+ | M3D2@, | ||
+ | M4D]-H$Y/ | ||
+ | M3*!# | ||
+ | M15.@05)%H%)%042@24XNH*!T2$531: | ||
+ | M142@24Y43Z!S: | ||
+ | M(", | ||
+ | M2*!" | ||
+ | M; | ||
+ | MH%1!0DQ%4PT@;& | ||
+ | M< | ||
+ | M=' | ||
+ | M9' | ||
+ | MH%9/ | ||
+ | M;& | ||
+ | M<" | ||
+ | M(' | ||
+ | M0E)!3D-(15, | ||
+ | M.W-%5*!" | ||
+ | M< | ||
+ | M159%3@T@< | ||
+ | M: | ||
+ | M1: | ||
+ | M1E5.+BXN# | ||
+ | M=& | ||
+ | M(S$V# | ||
+ | M0: | ||
+ | M96%D, | ||
+ | MH$U%04Z@54Y' | ||
+ | M=C(-.G8Q(' | ||
+ | M871E, | ||
+ | MH$E./ | ||
+ | MH#, | ||
+ | M3D]410T@8VUP(" | ||
+ | M)& | ||
+ | M9& | ||
+ | M.W)%042@24Z@5D])0T6@, | ||
+ | M82`H; | ||
+ | M93, | ||
+ | M(' | ||
+ | M; | ||
+ | M> | ||
+ | M# | ||
+ | M(& | ||
+ | M2$6@2$5# | ||
+ | M3E-)4U13H$]& | ||
+ | M4U.@1D]54J!31513H$]& | ||
+ | M145.H$Y/ | ||
+ | M55-4H$9/ | ||
+ | M4PTJH%1(25.@0T%312X-*@UR96%D, | ||
+ | M5$6@3T: | ||
+ | M(" | ||
+ | M(' | ||
+ | M# | ||
+ | M=' | ||
+ | M, | ||
+ | M(" | ||
+ | M(' | ||
+ | M# | ||
+ | M=' | ||
+ | MH# | ||
+ | M> | ||
+ | M; | ||
+ | M4E0-# | ||
+ | M1DE.04Q, | ||
+ | M5DE$140-*J!)3E1/ | ||
+ | M0TE!3*!!0U1)3TY3+@TJH& | ||
+ | M5T6@54Y$15)404M%H$& | ||
+ | M1: | ||
+ | MH$E.5$^@0: | ||
+ | MH%1(1: | ||
+ | M3TY3H$%21: | ||
+ | M551)3D4LH$%.1*!!4D6@5$A)3D=3H$Q)2T6@0TA!3D=%H%9/ | ||
+ | M051)3TXLH$540RX-*J!T2$6@0D%324.@4E5, | ||
+ | M0U1)3TY3H" | ||
+ | M04-%H$E.H$& | ||
+ | M3U)215-03TY$24Y' | ||
+ | MH$)%1D]21: | ||
+ | M14Y424%, | ||
+ | MH$9)4E-4H# | ||
+ | M3J!)3E1/# | ||
+ | MH$E.5$^@5%=/ | ||
+ | M1: | ||
+ | MH# | ||
+ | M# | ||
+ | MH$%21: | ||
+ | M3U1%4Z!& | ||
+ | M4Z!& | ||
+ | M=D])0T53H#& | ||
+ | M1%52051)3TX-(& | ||
+ | M1: | ||
+ | M(& | ||
+ | M9& | ||
+ | M94(-# | ||
+ | M9F(@-# | ||
+ | M+# | ||
+ | M9@T-(& | ||
+ | M-2`[8Z!E0J!DH&< | ||
+ | M.V5" | ||
+ | M(' | ||
+ | M9& | ||
+ | M8B`W-" | ||
+ | M8D*@8: | ||
+ | M, | ||
+ | M8B!S971V; | ||
+ | M-38L-34L-3, | ||
+ | M0J!D# | ||
+ | M+3$@.W-405)4H$1%0U)%4T-%3D1/# | ||
+ | M9J!E0@T@9& | ||
+ | M9BTR# | ||
+ | M+# | ||
+ | M8B`V." | ||
+ | M9J!E0J!A0@T-(& | ||
+ | M+# | ||
+ | M# | ||
+ | M.V5" | ||
+ | M9J!DH& | ||
+ | M=F]L+' | ||
+ | M-3(L-38@.V.@9J!EH& | ||
+ | M.2PU-2`[94*@8Z!BH&< | ||
+ | M9F(@< | ||
+ | M-" | ||
+ | M8J!E0@T@9& | ||
+ | M9BLQ# | ||
+ | M-3, | ||
+ | M(# | ||
+ | M-C< | ||
+ | MH& | ||
+ | M-3, | ||
+ | MH$923TV@3D]7H$].# | ||
+ | M(& | ||
+ | M5$E/ | ||
+ | M971V, | ||
+ | M# | ||
+ | M# | ||
+ | M9& | ||
+ | M:' | ||
+ | M-0T@9& | ||
+ | M-BPU-0T@9& | ||
+ | M=7(L96EG:' | ||
+ | M8B`U, | ||
+ | M8B`V, | ||
+ | M4E1)4U-)34\A# | ||
+ | M3D4-(& | ||
+ | M8B`W-" | ||
+ | M(& | ||
+ | M=D])0T6@, | ||
+ | M, | ||
+ | M-RPU.2`[9RQB# | ||
+ | M9& | ||
+ | M8BQD# | ||
+ | M+# | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M.W!215-43Z`K-@T@9& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M(& | ||
+ | M< | ||
+ | M25143$6@4T]& | ||
+ | M97-T# | ||
+ | M< | ||
+ | M5%1, | ||
+ | MH%1(1: | ||
+ | M-C`L-C(L-C0-(& | ||
+ | M8B`V-2PV-RPV." | ||
+ | M(& | ||
+ | M9F(@< | ||
+ | M< | ||
+ | M-@T@9& | ||
+ | M, | ||
+ | M=& | ||
+ | M-" | ||
+ | MH$Y/ | ||
+ | M9' | ||
+ | M< | ||
+ | M(& | ||
+ | M(& | ||
+ | M-BPU-2PU, | ||
+ | M(& | ||
+ | M9F(@-3@L-34L-C`L-38L-3, | ||
+ | M+# | ||
+ | M-# | ||
+ | M3E1/# | ||
+ | M< | ||
+ | M+# | ||
+ | M(& | ||
+ | M:" | ||
+ | M4DE405)$# | ||
+ | M-2PV, | ||
+ | M< | ||
+ | M(& | ||
+ | M< | ||
+ | ML^V; | ||
+ | MNZ]K5LV3; | ||
+ | MDV; | ||
+ | MM: | ||
+ | MF^; | ||
+ | M# | ||
+ | M1$E.1R# | ||
+ | M1`T````@(" | ||
+ | M`, | ||
+ | M# | ||
+ | M5$A%($A%0TL@25, | ||
+ | M34%25" | ||
+ | M1$\_(@T`U$A%($Q!4U0@455%4U1)3TX@R2!# | ||
+ | M5$A)4R!, | ||
+ | M04Q, | ||
+ | M25)35" | ||
+ | M3E-%(%=2251%55`L($A/ | ||
+ | M12!$151!24PL($%.1" | ||
+ | M4$5$(%=)5$A/ | ||
+ | M+" | ||
+ | M($1%34\@0T].5$535" | ||
+ | M($%3(%=%3$P@05, | ||
+ | M04Q, | ||
+ | M4T](3RY)3U, | ||
+ | M3%DL(%1(12!+15E04D534T53($A!5D4@5$A%($9/ | ||
+ | M.@T-`# | ||
+ | M(" | ||
+ | M(# | ||
+ | M(" | ||
+ | M+B`@(" | ||
+ | M5$A%($Y%6%0@3T)*14-4+@T-`-1(12!# | ||
+ | M1RP@04Y$(%=!4R!!(%)/ | ||
+ | M0T]-4%)%4U-)3TXN("# | ||
+ | M12# | ||
+ | M4D]7140@*$%.1" | ||
+ | M($923TT@5$A%($-50D4S1" | ||
+ | M4DY3($]55`U/ | ||
+ | M5U))5%1%3B!& | ||
+ | M5$E.12X@(-1(050@0U)!6ED@5$A)4D0@3T)*14-4($A!4R!& | ||
+ | M241%4R!)3B`SQ" | ||
+ | M24Y44R!7251((# | ||
+ | M5T5, | ||
+ | M+B`@R2!705, | ||
+ | M3TX@3TY%($]& | ||
+ | MQ4Q)5$4B($A534]2(%1(15)%*2!" | ||
+ | M3T]-+@W!1E1%4B!$14-/ | ||
+ | M25143$4@0DE4+" | ||
+ | M5%=%14X@)# | ||
+ | M159%4EE42$E.1PU%3%-%+@T`U$A%($9)4E-4($]" | ||
+ | M0D4L($]& | ||
+ | M4TU!3$P@0U5" | ||
+ | M4B!# | ||
+ | M($Y/ | ||
+ | M12!-3U)%($-50D53+B`@*-=(14X@64]5(%-, | ||
+ | M($=%5" | ||
+ | M(%-, | ||
+ | M(, | ||
+ | M2$4@0U5" | ||
+ | M2R!!5" | ||
+ | M251)3TY3(" | ||
+ | M3E-)1$4@0U5" | ||
+ | M0U5" | ||
+ | M15)!3$Q9(%154DY%1" | ||
+ | M1DE.12!)3B# | ||
+ | M($=%5" | ||
+ | M5%)!3E-03U-%1" | ||
+ | M(%1(24Y' | ||
+ | M(%-%0T].1`U/ | ||
+ | M4$4N("# | ||
+ | M15)!5$53($-/ | ||
+ | M3D]234%, | ||
+ | M4D53($-/ | ||
+ | M4BX@(, | ||
+ | M3DE43U(L(%E/ | ||
+ | M+B`@U$A)4R!615)9($U50T@@4U524%))4T5$($U%(%=(14X@R2!& | ||
+ | M05< | ||
+ | M24-, | ||
+ | M5$A)4R!705DN# | ||
+ | M12!' | ||
+ | MQ" | ||
+ | M(%1(12!04D]' | ||
+ | M+" | ||
+ | M# | ||
+ | M(, | ||
+ | M0D52($]& | ||
+ | M24Y%(%-%1TU%3E0@2$%624Y' | ||
+ | M(" | ||
+ | M24Q, | ||
+ | M24Y' | ||
+ | M5" | ||
+ | M3TE.5%, | ||
+ | M14Q, | ||
+ | M+@T-`-1(55, | ||
+ | M149%4B!43R!03TQ91T].4R!!4PU614-43U)3($%.1" | ||
+ | M3E, | ||
+ | M4" | ||
+ | M3R!, | ||
+ | M4$%25" | ||
+ | M2$5, | ||
+ | M4R!/ | ||
+ | M(, | ||
+ | M4$].4T]2# | ||
+ | M5" | ||
+ | M3D0@050@4D5' | ||
+ | M1T].(%=)3$P@0D4-4T5.5" | ||
+ | M2$4@4%)/ | ||
+ | M4$], | ||
+ | M5" | ||
+ | M5$\@4%)/ | ||
+ | M4D%,# | ||
+ | M251((%E/ | ||
+ | M1T].4R!# | ||
+ | M3$E: | ||
+ | M($), | ||
+ | M3E, | ||
+ | M3BX-(`T@# | ||
+ | M05E3($$@4D504D5314Y4051)3TX@3T8@4T]-12!& | ||
+ | M# | ||
+ | M04-4+" | ||
+ | M1$E-14Y324].04P@3T)*14-4+B`@Q4%# | ||
+ | M4@U364U-151262U214Q!5$5$(#/ | ||
+ | M3T< | ||
+ | M-, | ||
+ | M3" | ||
+ | M65!%4D-50D4I($E3(%1(12!& | ||
+ | M5" | ||
+ | M+" | ||
+ | M2$%4($E3($=/ | ||
+ | M62!34$5# | ||
+ | M3T)*14-4($5!0T@@4$])3E0@25, | ||
+ | M051%4RP@4T%9(" | ||
+ | M24Y!5$53+" | ||
+ | M(%9%4E1)0T53($%4# | ||
+ | M02!615)9($Y!5%5204P@15A414Y324].($E.5$\@1D]54B!$24U%3E-)3TY3 | ||
+ | M(%=/ | ||
+ | M3U1!3" | ||
+ | M2$52(%=!63H-# | ||
+ | M+RTQ+" | ||
+ | M1" | ||
+ | M12!404M%($$@(E-, | ||
+ | MQ" | ||
+ | M0D4L(%=(15)%(%E/ | ||
+ | M(%=)3$PI+@T`U$A)4R!)4R!$14U/ | ||
+ | M25)35" | ||
+ | M1E)/ | ||
+ | M5$%' | ||
+ | M15(@0U5" | ||
+ | M64]5($%212!# | ||
+ | M+" | ||
+ | M5$%)3%, | ||
+ | M250@(D9/ | ||
+ | M54Y& | ||
+ | M2$59($A!5D4@04Q705E3($)%14XN("# | ||
+ | M14-!3$P@5$A!5" | ||
+ | M3$%.12P@5$A%(%DM6B!03$%.12P@04Y$(%1(12!8+5H@4$Q!3D4N("# | ||
+ | M3U1!5$4-24X@5$A%(%@M62!03$%.12!" | ||
+ | M5R`](%@J0T]3*%!(22D@+2!9*E-)3BA02$DI# | ||
+ | M*2`K(%DJ0T]3*%!(22D-# | ||
+ | M32!!(%!, | ||
+ | M4U0@5%=)0T4@05, | ||
+ | M5$E# | ||
+ | M54%, | ||
+ | M3D=, | ||
+ | M15< | ||
+ | M22D@*R!8*D-/ | ||
+ | M(%1/ | ||
+ | M(%< | ||
+ | M(%!(23TY," | ||
+ | M5$A%($-/ | ||
+ | M4B!.14=!5$E615, | ||
+ | M05-%1" | ||
+ | M12!' | ||
+ | M4$Q!24Y3(%1(12!53D9/ | ||
+ | M14XN# | ||
+ | M($]55" | ||
+ | MR4X@149& | ||
+ | M2T59(%I%4D]3($]55" | ||
+ | M4D5-14Y44RP@3$5!5DE.1PU/ | ||
+ | M3TQ, | ||
+ | M12!# | ||
+ | M04E.+@T`U$A%4D4@25, | ||
+ | M($$@-, | ||
+ | M+2T@049415(@04Q, | ||
+ | M5TX@3TX@02`RQ" | ||
+ | M4$%015(I+B`@R48@5T4@0T%.# | ||
+ | M3U5' | ||
+ | M3TT@5$A%4D4@24Y43R`RQ" | ||
+ | M3TX@1%)!5U, | ||
+ | M($$@3$E45$Q%(%!)3DA/ | ||
+ | M1DE.1%, | ||
+ | M3T-!5$5$($%4(%H]1" | ||
+ | M, | ||
+ | M($E.5$524T5# | ||
+ | M(" | ||
+ | M```@(" | ||
+ | M24Y43R`TQ" | ||
+ | M4D]51T@@5$A%($]224=)3CH-# | ||
+ | M5" | ||
+ | M1" | ||
+ | M3TI%0U1%1" | ||
+ | M24=)3BX@(-1(25, | ||
+ | M(# | ||
+ | M5$544D%(14123TXL($]2($%.($]# | ||
+ | M32!/ | ||
+ | M($-/ | ||
+ | M(%1!2TE.1R!!($-50D4L($%.1" | ||
+ | M+B`@QD]2($E.4U1!3D-%+" | ||
+ | M3%D-5$%+12!42$4@34E$4$])3E0@3T8@14%# | ||
+ | M5$A%($-50D4@+2T@5$A)4R!(05, | ||
+ | M1B!42$4@0T]23D524R!/ | ||
+ | M4R!)3B!42$E3(%=!62P@250@25, | ||
+ | M3R!%6%1%3D0@5$A%($]" | ||
+ | MR2!705, | ||
+ | M1%)/ | ||
+ | M4R!/ | ||
+ | M05, | ||
+ | M3DY%4B!/ | ||
+ | M+B`@U$A%(%173R!!4D4@0T].3D5# | ||
+ | M3D5# | ||
+ | M3E-404Y# | ||
+ | M12!)3DY%4B!!3D0@3U5415(@5$544D%(14123TY3+@T`QDE.04Q, | ||
+ | M2$5, | ||
+ | M5$5$# | ||
+ | M1T5.15)!3" | ||
+ | M2D5# | ||
+ | M2$4-5%=/ | ||
+ | M05, | ||
+ | M2$5312!' | ||
+ | M4R!-62!# | ||
+ | M3$Q9# | ||
+ | M5$\@4T%9+" | ||
+ | M3E1)3TY)3D< | ||
+ | M62`M+2!324U03%D@4U1!4E0-14%# | ||
+ | M1" | ||
+ | M12X@(, | ||
+ | M4RP@5$A%3B!42$4@62U# | ||
+ | M12!' | ||
+ | M($%.651(24Y' | ||
+ | M($-/ | ||
+ | M4R!' | ||
+ | M3R!33TU%(%-/ | ||
+ | M15(@25, | ||
+ | M-E@Y-@U025A%3" | ||
+ | M4U0@, | ||
+ | M-5@U($-(05)!0U1%4B!' | ||
+ | M55`@5$A%($Y%6%0@-" | ||
+ | M3T8@, | ||
+ | M0TA!4D%# | ||
+ | MQL8@0T]-4$Q%345.5%, | ||
+ | M54Y$(%1)3$E.1U, | ||
+ | M5%1%4DX@1DE, | ||
+ | M($-!3B!204Y' | ||
+ | M0U1)3TX@3TX@5$A%($E.251)04P@5D%, | ||
+ | M15, | ||
+ | M3D%415, | ||
+ | M($$@0T]/ | ||
+ | M4B!42$E.2TE.1RP-02!# | ||
+ | M4R!-54-(($)%5%1%4B!354E4140@5$\@5$A%# | ||
+ | M(%1(050@25, | ||
+ | M($9!0U1/ | ||
+ | M4U1224-44R!42$E3(%-# | ||
+ | M12!7251(($Q!4D=%4U0@3$5.1U1((%1(050@R2!54T4@25, | ||
+ | M+" | ||
+ | M250@25, | ||
+ | M5$@@0T]/ | ||
+ | M5$53($U54U0-3D]4($580T5%1" | ||
+ | M(%1(25, | ||
+ | M4%)!0U1)0T%, | ||
+ | M5$A)4PU-05A)355-+" | ||
+ | M1R!& | ||
+ | M2D5# | ||
+ | M25, | ||
+ | M240@5T%3(%1/ | ||
+ | M3U1!5$E/ | ||
+ | M24].# | ||
+ | M6" | ||
+ | M4D]-(# | ||
+ | M60U015))3T1)0T%, | ||
+ | M3D< | ||
+ | M, | ||
+ | M# | ||
+ | M1" | ||
+ | M4D4@R2!334%25"# | ||
+ | M10U2149, | ||
+ | M3D]42$52(# | ||
+ | M(# | ||
+ | M4U0@5TA!5"# | ||
+ | M($U!4T@@5$%" | ||
+ | M3TI%0U1)3TX@5$%" | ||
+ | M4TE.1TQ%(%!!1T4N("# | ||
+ | M(" | ||
+ | M(%1/ | ||
+ | M4DE624%, | ||
+ | M3R!004=%(%!/ | ||
+ | M4T54($E.5$\@5$A%(%1!0DQ%(" | ||
+ | M1D]2(%1(12!# | ||
+ | M24].(%1!0DQ%*2P@04Y$# | ||
+ | M24=(5" | ||
+ | M4D4@3D]7(%9%4ED@1D%35" | ||
+ | M($E4($E33B=4(%)%04Q, | ||
+ | M3$5410U404), | ||
+ | M12P@, | ||
+ | M(%53140L($%.1" | ||
+ | M($)9# | ||
+ | M1$E.051%4R!-24=(5" | ||
+ | M4R!$3TXG5" | ||
+ | M# | ||
+ | M12!23U5424Y%($923TT-5$A%($Q!4U0@0U5" | ||
+ | M1B!# | ||
+ | M5%=/ | ||
+ | M1B!214%, | ||
+ | MP< | ||
+ | M5TE.1R!005)4(" | ||
+ | M12!# | ||
+ | M3U14140M3$E.12!# | ||
+ | M5%)!# | ||
+ | M144N# | ||
+ | M3B`M+2!42$4@3U1(15)3# | ||
+ | M149, | ||
+ | MQ" | ||
+ | M2$59($Y%140@5$\@0D4@4T-!3$5$# | ||
+ | M(%=2251)3D< | ||
+ | MQ`U!3D0@-, | ||
+ | M051%($]& | ||
+ | M4%)/ | ||
+ | M5$E/ | ||
+ | M(%1(12!334%, | ||
+ | M+2T@5$A%($]" | ||
+ | M(%1(25, | ||
+ | M55!/ | ||
+ | M2$4@, | ||
+ | M(%-# | ||
+ | M32!.54U" | ||
+ | M4U0@1D]2(%-014-44D%, | ||
+ | M2$%4(# | ||
+ | M1U, | ||
+ | M4R!*55-4($-, | ||
+ | M24Q, | ||
+ | M($U!3ED@1$%94R!/ | ||
+ | M5$\@4%54($-/ | ||
+ | M12!42$E.1R# | ||
+ | M2" | ||
+ | M($)%24Y' | ||
+ | M151(24Y' | ||
+ | M+" | ||
+ | M15)%($)%24Y'# | ||
+ | M1$]%4R!)4R!43R!$4D%7($-/ | ||
+ | M4TE614Q9($Q!4D=%4B!2041)22P@1D]2($$@4T]25" | ||
+ | M3$]/ | ||
+ | M1D%)3%-!1D4B($E.(%1(12!04D]*14-424].(%)/ | ||
+ | M1$E.051%4R!!4D4@3U54($]& | ||
+ | M-# | ||
+ | M1TE.+B`@P50@3$5!4U0@3TY%($]& | ||
+ | M4D]-(%1)344@5$\@5$E-12`H5$A%($]# | ||
+ | M0U5, | ||
+ | M(%1(050@5$A%($Q)3D4@4D]55$E.12!42$E.2U, | ||
+ | M5PU!($Q/ | ||
+ | M(--/ | ||
+ | M3R!42$4@5%))1R]04D]*14-424].(%1!0DQ%4RP@04Y$($5614X@34%+15, | ||
+ | M2513# | ||
+ | M($%# | ||
+ | M4U1%4B!/ | ||
+ | M15))3T1)0PU, | ||
+ | M54%, | ||
+ | M0T]-4$Q%5$5, | ||
+ | M3%-!1D4@.BDN# | ||
+ | M2$4@0T]$12!2141)4D5# | ||
+ | M, | ||
+ | M3%1(3U5' | ||
+ | M(-1(25, | ||
+ | M(%=/ | ||
+ | M3T=204T@1T]%4R!)3E1/ | ||
+ | M5" | ||
+ | MR2!!5" | ||
+ | M050@5$A)4R!# | ||
+ | M(%1(12## | ||
+ | M(%1/ | ||
+ | M($-!3B!42$E.2R!/ | ||
+ | M5D4@0D5%3@U%05-)3%D@1$].12!43R!-04M%($E4(%=/ | ||
+ | M2$4@5$E-12# | ||
+ | M3U0@1$]73B!43R`T,# | ||
+ | M24Y' | ||
+ | M5TX@5$A%(%)/ | ||
+ | M($$@5T]21" | ||
+ | M24Y' | ||
+ | M3U5, | ||
+ | M62X@(, | ||
+ | M3B!!($Y)0T4@5T%9($%.1" | ||
+ | M(, | ||
+ | M5R!!(%!)14-%($]& | ||
+ | M14X@0TA/ | ||
+ | M04X@04Y95$A)3D< | ||
+ | M+" | ||
+ | M12!& | ||
+ | M($]& | ||
+ | MSD]415, | ||
+ | M4R!/ | ||
+ | M($1)1D9%4D5.5`U+15D@*$E.($%$1$E424].(%1/ | ||
+ | M(%=23TY' | ||
+ | M14Y$(%5324Y' | ||
+ | MT2!)3E1%4E)54%13(" | ||
+ | M($Q/ | ||
+ | M($%.1" | ||
+ | M3U5424Y%+" | ||
+ | M($A!4%!%3DE.1RP-3D]2($1/ | ||
+ | M(, | ||
+ | M3TI%0U1)3TX@5$%" | ||
+ | M`, | ||
+ | M(%!23TI%0U1)3TX@5$%" | ||
+ | M15, | ||
+ | M`$1)330``--50DU)5%1%1" | ||
+ | M24TT+E1%6%0`U$A)4R!& | ||
+ | M041-12U254Y-12#/ | ||
+ | M3$4@5$\@55-%(%=)5$@@S4523$E.(# | ||
+ | M12!& | ||
+ | M0DI%0U13# | ||
+ | M*$Q)3D53+" | ||
+ | 2R=+1($U54TE# | ||
+ | ` | ||
+ | end | ||
+ | |||
+ | @(A)gfxcode: | ||
+ | | ||
+ | begin 644 dungeon.sda | ||
+ | M`0@-" | ||
+ | MJ?& | ||
+ | M3$@((, | ||
+ | MS74# | ||
+ | MI*(OJ0" | ||
+ | M('< | ||
+ | MO" | ||
+ | MNH2Y($(, | ||
+ | M`)B9`, | ||
+ | M&; | ||
+ | M(.X)Z-" | ||
+ | MCA0*H`" | ||
+ | M`, | ||
+ | M`< | ||
+ | M0\@@9`X-54XM`*``KFP# | ||
+ | M24Y' | ||
+ | M!.`# | ||
+ | M@P-@KF\# | ||
+ | MC74# | ||
+ | M" | ||
+ | MK8<# | ||
+ | MBP, | ||
+ | M`, | ||
+ | M3, | ||
+ | MH`", | ||
+ | M(+P-(*4-(# | ||
+ | M`^UE`ZU=`XUB`^UF`Y`GK6`# | ||
+ | MC6$# | ||
+ | M`Z45*0\)X(45(" | ||
+ | M7@.-: | ||
+ | M`XC0]*U< | ||
+ | M#" | ||
+ | MR0/ | ||
+ | M`(UC`XQD`ZD)C6@# | ||
+ | M: | ||
+ | M"?" | ||
+ | M`]`, | ||
+ | M[G`.T`/ | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````" | ||
+ | M`-8? | ||
+ | M@(`E.< | ||
+ | MP)X22> | ||
+ | M285\5\Y<&' | ||
+ | MXP\LVF`@$!" | ||
+ | M3Z0^V`````(# | ||
+ | M@" | ||
+ | MCSH=@O``+!T6$Q: | ||
+ | M2K4KQZA71A& | ||
+ | M@T(C^U-I2!%4!$K`(G# | ||
+ | M(XH(303KP2($, | ||
+ | MT)`15ITZ?: | ||
+ | MP# | ||
+ | M8< | ||
+ | MUE$`9LRQ^@0DE3`12T9< | ||
+ | M5& | ||
+ | M< | ||
+ | MN5-093[E%EAKI8514$91Q91< | ||
+ | M" | ||
+ | M.1; | ||
+ | M8V)``2`4`8(, | ||
+ | M/, | ||
+ | M0, | ||
+ | MAZT# | ||
+ | M4UP\.U27G7C@(F!A0.T2+`!.P:& | ||
+ | MP& | ||
+ | MT[QVP, | ||
+ | M7$N@`IWXQS\R@T=VO., | ||
+ | M`", | ||
+ | MH931T60446``C*C#, | ||
+ | M' | ||
+ | ML+!`!610Y=6D(R*9I$(G' | ||
+ | M", | ||
+ | M" | ||
+ | M(, | ||
+ | M" | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M``(#< | ||
+ | MZ+1@T85+QHS]P4`0DQ-G4: | ||
+ | MQXG)C; | ||
+ | M> | ||
+ | M^O# | ||
+ | M`? | ||
+ | M`P8!$!)`P%" | ||
+ | M7T# | ||
+ | M7A@8PQ9QH)$&' | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````" | ||
+ | M+(# | ||
+ | MXE09@H< | ||
+ | MA7*5: | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M``````````````````````````````````````````````````````````(# | ||
+ | MG/ | ||
+ | M5[), | ||
+ | MTC=\^9)%RI0IP[]Q? | ||
+ | M7Z$`.?' | ||
+ | MW+E3S_YAEI-IQ# | ||
+ | MSGPBSV[-" | ||
+ | MP[E!^89]" | ||
+ | M`1X@\P$XYH)QFO+CDXVZ, | ||
+ | M*T(D`_I9*RV/? | ||
+ | M2, | ||
+ | MP0`&, | ||
+ | M@I&'< | ||
+ | M8819/ | ||
+ | M<" | ||
+ | M]U]P6J4!`# | ||
+ | ML,' | ||
+ | M3(-# | ||
+ | MK0@/? | ||
+ | M4HFJ6OSRQBI65" | ||
+ | MG, | ||
+ | M`< | ||
+ | M48XFMAQF; | ||
+ | M0AITX8]7K& | ||
+ | M75C]"# | ||
+ | M# | ||
+ | MX0KW> | ||
+ | M!DUH)QFE*(TK%.,> | ||
+ | M4H# | ||
+ | M^`L`ZMB$%JI@E9;, | ||
+ | MIB%-,'> | ||
+ | M, | ||
+ | MEE# | ||
+ | M,, | ||
+ | M8G]=: | ||
+ | M? | ||
+ | M_IJ): | ||
+ | M: | ||
+ | MT+K6MWP0K6I-ZSK9QFZWI6TM: | ||
+ | MZJX.> | ||
+ | M`(^7> | ||
+ | MSW#: | ||
+ | M+/, | ||
+ | MF%' | ||
+ | MRX9^, | ||
+ | MCU9T8+(!@& | ||
+ | M/> | ||
+ | MWN" | ||
+ | M4Y/ | ||
+ | M=H0< | ||
+ | M(JQCU;> | ||
+ | MET/ | ||
+ | M+3=@[V(N(%R'?: | ||
+ | MX5=7\#, | ||
+ | MOK(!*VA*.O`' | ||
+ | MJ); | ||
+ | M*J0; | ||
+ | M21@C' | ||
+ | M.NR# | ||
+ | MKS%IDI0*-VCQ1-3PN=B+$/ | ||
+ | M=_3: | ||
+ | M; | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```" | ||
+ | M? | ||
+ | M# | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | M``````````````````````````````````````````(# | ||
+ | M05!35$]26? | ||
+ | M6,'# | ||
+ | MT/ | ||
+ | MW``0((```B`X*``A@T70' | ||
+ | MH)`@3P*' | ||
+ | M@(!W2T(!8@T8" | ||
+ | M\)# | ||
+ | MJ!Z`ZA^@FP## | ||
+ | MD\LZ`QB5R_9$8H)KD$$`NBL@@P(, | ||
+ | M9L)F`).: | ||
+ | M?& | ||
+ | M"' | ||
+ | MO(DFEPF%7=" | ||
+ | M0%/ | ||
+ | M7, | ||
+ | M```````````````````````````````````````````````````````````` | ||
+ | < | ||
+ | ` | ||
+ | end | ||
+ | |||
+ | ========================================================================= | ||
+ | </ |
magazines/chacking13.txt · Last modified: 2015-04-17 04:34 by 127.0.0.1