home *** CD-ROM | disk | FTP | other *** search
Text File | 2019-04-13 | 206.5 KB | 5,683 lines |
-
- ########
- ##################
- ###### ######
- #####
- ##### #### #### ## ##### #### #### #### #### #### #####
- ##### ## ## #### ## ## ## ### ## #### ## ## ##
- ##### ######## ## ## ## ##### ## ## ## ## ##
- ##### ## ## ######## ## ## ## ### ## ## #### ## ##
- ##### #### #### #### #### ##### #### #### #### #### #### ######
- ##### ##
- ###### ###### ╔SSUE #10
- ################## ╩UNE 30, 1995
- ########
-
- ---------------------------------------------------------------------(V1.5)---
- ┼DITOR'S ╬OTES
- BY ├RAIG ╘AYLOR
-
- ╘HIS IS MY LAST ISSUE OF ├OMMODORE ╚ACKING (HAVING FINALLY GOTTEN OUT THE
- DOOR, BUT ╔ COULDN'T BREAK TRADITION AND GET IT OUT ON TIME :-) ). ╔'M HAVING
- TO GIVE IT UP BECAUSE ╔'VE GRADUALLY LOST INTEREST IN ├OMMODORE COMPUTERS OVER
- THE YEARS AND WITH THE SEARCH FOR A JOB (ANYONE WANNA HIRE A CSC GRADUATE?)
- AND AS ╔ GET OLDER ╔ SEEM TO HAVE LESS AND LESS TIME.
-
- ╔'M GONNA BE HANDING THE REIGNS OF ├OMMODORE ╚ACKING OVER TO ╩IM ┬RAIN, WHO IS
- A VERY ACTIVE MEMBER OF THE ├OMMODORE ╔NTERNET COMMUNITY. ╚E WILL ALSO BE
- RUNNING A MAILSERVER THAT WILL TAKE THE PLACE OF MINE (═INE WILL BECOME
- UNAVAILABLE AFTER ╩ULY 1ST AND WILL SEND POINTERS TO ╩IM ┬RAIN'S MAILSERVER).
-
- ╔T'S BEEN INTERESTING TO WATCH THE ├OMMODORE COMPUTERS EVOLVE, TAKE OFF LIKE A
- ROCKET AND THEN HAVE ├OMMODORE GO INTO LIQUIDATION. ├OMMODORE COMPUTERS HAVE
- BEEN AND STILL ARE, (WITH SOME EXCEPTIONS - 1541 HEAD-BANGING COMES TO MIND),
- TECHNOLOGICALLY SOUND. ╞OR A "HACKING" MACHINE THEY'RE WONDERFUL.
-
- ═Y EMAIL ADDRESS HAS CHANGED TO DUCK@NANDO.NET. ╔ PERIODICALLY STILL CHECK
- MAIL AT DUCK@PEMBVAX1.PEMBROKE.EDU BUT ONLY EVERY 2 WEEKS OR SO. ╔ AM STILL
- GOING TO TRY TO BE IN THE ├OMMODORE COMMUNITY BUT TIME WILL GOVERN MY ABILITY
- TO DO THAT. ╔'M GOING TO MISS EDITING THIS RAG....
-
- ┴ND HERE IS ╩IM ┬RAIN:
-
- ═AIL ╙ERVER ├HANGES:
-
- ╫ITH ╔SSUE 10, THE ADDRESS FOR THE ├OMMODORE ╚ACKING MAIL SERVER HAS CHANGED.
- ╘HE NEW ADDRESS IS BRAIN@MAIL.MSEN.COM ╘HE COMMANDS ARE THE SAME AS BEFORE.
- ╬OT ALL OF THE FILES HAVE BEEN MOVED YET, SO PLEASE EMAIL THE ADMINISTRATOR
- (╩IM ┬RAIN, BRAIN@MAIL.MSEN.COM) IF A FILE YOU NEED IS NOT ON THE NEW SITE.
-
- ╚OWDY:
- ╚OWDY, MY NAME IS ╩IM ┬RAIN, AND ╔ WILL BE TAKING OVER THE POSITION OF
- EDITOR FOR ├OMMODORE ╚ACKING STARTING WITH ╔SSUE 11. ╙OME OF YOU MAY KNOW
- ME AS THE ├OMMODORE ╘RIVIA ├ONTEST ADMINISTRATOR, THE ╒╙┼╬┼╘ NEWSGROUP
- COMP.SYS.CBM ╞┴╤ ═ANITAINER, OR THE KEEPER OF A ├OMMODORE ╔NFORMATION
- ╫╫╫ ╙ITE AT HTTP://WWW.MSEN.COM/▐BRAIN/CBMHOME.HTML. ╫HEREVER YOU HAVE
- HEARD OF ME FROM, OR EVEN IF YOU HAVEN'T, ╔ WILL STATE THAT ╔ PLAN ON
- HANDLING ├OMMODORE ╚ACKING IN THE FOLLOWING WAY. ╘HE NEXT ISSUE WILL
- POSSIBLY LOOK DIFFERENT COSMETICALLY, AS ╔ EDIT SOMEWHAT DIFFERENTLY THAN
- ├RAIG, BUT THE CONTENT AND BASIC LAYOUT WILL REMAIN THE SAME. ╘HE TYPES
- OF MATERIAL WILL NOT CHANGE, AND THE STRUCTURE FOR SUBMITTING ARTICLES WILL
- CHANGE ONLY IN THE ADDRESS TO MAIL THEM TO: BRAIN@MAIL.MSEN.COM. ╚OWEVER,
- ╔ DO HAVE A FEW CHANGES IN MIND:
-
- 1) ╘RY TO STABILIZE THE ISSUE GENERATION SO THAT ├OMMODORE ╚ACKING WILL
- BECOME A QUARTERLY PUBLICATION.
-
- 2) ┴TTEMPT A FULLY "╚╘═╠"IZED VERSION OF THE MAGAZINE, WHILE STILL PROVIDING A
- TEXT VERSION.
-
- 3) ╨URSUE THE POSSIBILITY OF PROVIDING A PRINTED VERSION OF THESE ISSUES
- FOR THOSE WHO HAVE NO ONLINE ACCESS TO THEM.
-
- 4) ┼NCOURAGE ╒SER ╟ROUPS AND OTHER ├┬═ RELATED ORGANIZATIONS TO CARRY THIS
- MAGAZINE FOR THEIR MEMBERS.
-
- ╙O, AGAIN ╔ SAY HOWDY. ┴S ALWAYS, ├OMMODORE ╚ACKING WILL ACCEPT YOUR
- ARTICLES AT ANY TIME, SO PLEASE HELP US KEEP THIS QUALITY MAGAZINE RUNNING.
- ╔F YOU HAVE ANY QUESTIONS OR COMMENTS ABOUT THE CHANGE IN EDITORSHIP, THE
- POSSIBLE CHANGES, OR OTHER MATTERS, PLEASE FEEL FREE TO DROP ME A NOTE.
- ╔ LOOK FORWARD TO HEARING FROM YOU AND PUBLISHING YOUR ARTICLES.
-
- ╩IM ┬RAIN
- BRAIN@MAIL.MSEN.COM
- ===========================================================================
- ╠EGAL ═UMBO-╩UMBO
-
- ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN WHOLE,
- FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL AUTHORS FOR
- PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPARATELY. ┴ CHARGE OF NO
- GREATER THAN 5 ╒╙ DOLLARS OR EQUIVLENT MAY BE CHARGED FOR LIBRARY SERVICE /
- DISKETTTE COSTS FOR THIS "NET-MAGAZINE".
-
- -------------------------------------------------------------------------------
-
- ╨LEASE NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS ╞╘╨
- FROM CCNGA.UWATERLOO.CA (AMONG OTHERS) UNDER /PUB/CBM/HACKING.MAG AND VIA A
- MAILSERVER WHICH DOCUMENTATION CAN BE OBTAINED BY SENDING MAIL TO
- "BRAIN@MAIL.MSEN.COM" WITH A SUBJECT LINE OF "MAILSERVER" AND THE
- LINES OF "HELP" AND "CATALOG" IN THE BODY OF THE MESSAGE.
-
- -------------------------------------------------------------------------------
- ╔N ╘HIS ╔SSUE:
-
- ├OMMODORE ╘RIVIA
-
- ╘RIVIA ┼DITION #13-18 ARE IN THIS ARTICLE. ┴S YOU MAY KNOW, THESE QUESTIONS
- FORM PART OF A CONTEST IN WHICH THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY
- VARIOUS PRIZE DONATORS). ╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE
- ENJOY. ╘RY YOUR HAND AT ├OMMODORE TRIVIA!!
-
- ┬╞╠╔ - ╬EW GRAPHICS MODES 2
-
- ╞╠╔ GAVE US MORE COLOR TO THE SCREEN, ┴╞╠╔ INCREASED THE HORIZONTAL
- RESOLUTION AND COLOR SELECTION BY USING THE HIRES MODE. ┬╞╠╔ STANDS
- FOR '┬IG ╞╠╔' AND GIVES US 400 LINES INSTEAD OF THE USUAL TWO
- HUNDRED. ┴╞╠╔ AND ┬╞╠╔ CAN BE COMBINED, BUT WE ARE NOT GOING INTO
- THAT.
-
- ═AKING STABLE RASTER ROUTINES (├64 AND ╓╔├-20)
-
- ╔N THIS ARTICLE, ╔ DOCUMENT TWO METHODS OF CREATING STABLE RASTER
- ROUTINES ON ├OMMODORE COMPUTERS. ╘HE PRINCIPLES APPLY FOR MOST 8-BIT
- COMPUTERS, NOT ONLY ├OMMODORES, BUT RASTER EFFECTS ARE VERY RARELY
- SEEN ON OTHER COMPUTERS.
-
- ┴ ─IFFERANT ╨ERSPECTIVE - ╨ART ╔╔╔.
-
- ┘ES!!! ╔T'S YET ANOTHER ARTICLE ON 3─ GRAPHICS! ┼VEN IF YOU
- HAVEN'T BEEN FOLLOWING THIS SERIES, YOU CAN USE THIS PROGRAM. ╘HIS
- TIME AROUND WE WILL WRITE A COMPLETELY GENERAL POLYGON PLOTTER --
- IF YOU CAN TYPE BASIC DATA STATEMENTS, YOU CAN CREATE A THREE-DIMENSIONAL
- OBJECT OUT OF POLYGONS AND ROTATE AND PROJECT IT TO YOUR HEART'S CONTENT.
- ╞OR THE MORE TECHNICALLY INCLINED WE WILL LOOK AT OPTIMIZATIONS TO THE
- LINE ROUTINE, ┼╧╥-BUFFER FILLING, AND MORE! ┘OW!
-
- ╙ECOND ╙╔─ ├HIP ╔NSTALLATION
-
- ╘HIS ARTICLE DESCRIBES HOW TO ADD A SECOND SID CHIP FOR USE IN ╙ID╨LAYER AND
- OTHER PROGRAMS. ┴S ALWAYS, BE EXTRA CAREFUL WHEN MAKING MODIFICATIONS TO YOUR
- COMPUTER.
-
- ╙OLVING ╠ARGE ╙YSTEMS OF ╠INEAR ┼QUATIONS ON A ├64 ╫ITHOUT ═EMORY
-
- ╧╦, NOW THAT ╔ HAVE YOUR ATTENTION, ╔ LIED. ┘OU CAN'T SOLVE DENSE
- LINEAR SYSTEMS OF EQUATIONS BY DIRECT METHODS WITHOUT USING MEMORY TO
- STORE THE PROBLEM DATA. ╚OWEVER, ╔'LL COME BACK TO THIS MEMORY FREE
- ASSERTION LATER. ╘HE MAIN PURPOSE OF THIS ARTICLE IS TO RESCUE A
- USEFULL NUMERICAL ALGORITHM, "╤UARTERSOLVE", AND ALSO TO PROVIDE A BRIEF
- LOOK AT THE ├╧═┴╠ PROGRAMMING LANGUAGE AND ┬╠┴╙ ROUTINES.
-
- ╘HE ╫ORLD OF ╔╥├ - ┴ ╬EW ╠IFE FOR THE ├64/128
-
- ╔'VE HEARD PEOPLE TALKING ABOUT ╔╥├. ╫HAT IS IT? ╫HY IS IT USEFUL TO ME AS A
- ├OMMODORE USER? ┬ILL "├OOLHAND" ╠UECK EXPLAINS THE HOWS AND WHYS IN THIS
- ARTICLE.
-
- ╙WIFT╠INK-232 ┴PPLICATION ╬OTES (VERSION 1.0B)
-
- ╘HIS INFORMATION IS MADE AVAILABLE FROM A PAPER DOCUMENT PUBLISHED BY ├═─,
- WITH ├═─'S PERMISSION.
-
- ─ESIGN AND ╔MPLEMENTATION OF A ╙IMPLE/┼FFICIENT ╒PLOAD/─OWNLOAD ╨ROTOCOL
-
- ╘HIS ARTICLE DETAILS HOW TO IMPLEMENT A CUSTOM UPLOAD/DOWNLOAD PROTOCOL THAT
- IS FASTER THAN MOST OF THE ONES COMMON TO THE ├64/128 COMPUTERS.
-
- ─ESIGN AND ╔MPLEMENTATION OF A '╥EAL' ╧PERATING ╙YSTEM FOR THE 128: ╨ART ╔╔
-
- ╘HERE HAS BEEN A SLIGHT CHANGE IN PLANS. ╔ ORIGINALLY INTENDED THIS
- ARTICLE TO GIVE THE DESIGN OF A THEORETICAL DISTRIBUTED MULTITASKING
- MICROKERNEL OPERATING SYSTEMFOR THE ├128. ╔ HAVE DECIDED TO GO A
- DIFFERENT ROUTE: TO TAKE OUT THE DISTRIBUTED COMPONENT FOR NOW AND IMPLEMENT
- A REAL MULTITASKING MICROKERNEL ╧╙ FOR A SINGLE MACHINE AND EXTEND THE SYSTEM
- TO BE DISTRIBUTED LATER. ╘HE IMPLEMENTATION SO FAR IS, OF COURSE, ONLY IN
- THE PROTOTYPE STAGE AND THE APPLICATION FOR IT IS ONLY A DEMO. ╨ART ╔╔╔ OF
- THIS SERIES WILL EXTEND THIS DEMO SYSTEM INTO, PERHAPS, A USABLE DISTRIBUTED
- OPERATING SYSTEM.
- ========================================================================
- ╘RIVIA
- BY ╩IM ┬RAIN (BRAIN@MAIL.MSEN.COM)
-
- ╫ELL, SUMMER IS UPON THE ┬RAIN HOUSEHOLD, AND THINGS ARE MOVING AT A FAST
- CLIP AT THE HOUSE. ╚OWEVER, THE TRIVIA STILL KEEPS COMING. ╔ APPRECIATE
- ALL THE PEOPLE WHO CONTRIBUTE TO THE TRIVIA AND ALL THE PEOPLE WHO TAKE
- PART IN THE MONTHLY CONTEST. ╔ HAVE COLLECTED ╘RIVIA ┼DITION #13-18 IN THIS
- ARTICLE. ┴S YOU MAY KNOW, THESE QUESTIONS FORM PART OF A CONTEST IN WHICH
- THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY VARIOUS PRIZE DONATORS).
- ╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE ENJOY.
-
- ┴S THE SUMMER MONTHS START UP, NEWS ON THE TRIVIA INCLUDES:
-
- 1) ╔ NOW HAVE ACCESS TO SOME MORE ORPHAN MACHINES (├65, ├116), SO EXPECT
- SOME TRIVIA QUESTIONS ON THOSE MODELS.
-
- 2) ╘HE NEW HOME NOW HAS A NUMBER OF MACHINES SET UP, SO TESTING ANSWERS TO
- THE TRIVIA IS EVEN EASIER. ╔ AM STILL TRYING TO GET THE OLD ╨┼╘
- MACHINES IN HOUSE, BUT THE OTHERS ARE HERE.
-
- 3) ╘HE ├OMMODORE ╫ORLD ╫IDE ╫EB ╨AGES (HTTP://WWW.MSEN.COM/▐BRAIN/CBMHOME.HTML)
- THAT ╔ MAINTAIN AND PLACE THE TRIVIA ON CAUGHT THE EYE OF ╒╙┴ ╘ODAY AND
- THE ╨HEONIX ╟AZETTE. ╔ WAS INTERVIEWED FOR BOTH ARTICLES. ╠OOK IN THE
- ╩UNE 20TH EDITION OF ╒╙┴ ╘ODAY FOR THE SEGMENT, AND POSSIBLY A PICTURE OF
- ╩IM ┬RAIN AND THE MACHINES HE USES TO CREATE THE TRIVIA.
-
- ┴S ALWAYS, ╔ WELCOME ANY QUESTIONS (WITH ANSWERS), AND ENCOURAGE PEOPLE
- TO ENTER THEIR RESPONSES TO THE TRIVIA, NOW AT #18.
-
-
- ╩IM.
-
-
- ╘HE FOLLOWING ARTICLE CONTAINS THE ANSWERS TO THE ─ECEMBER EDITION OF TRIVIA
- ($0├0 - $0├╞), THE QUESTIONS AND ANSWERS FOR ╩ANUARY ($0─0 - $0─╞),
- ╞EBRUARY ($0┼0 - $0┼╞), ═ARCH ($0╞0 - $0╞╞), ┴PRIL ($100 - $10╞), AND THE
- QUESTIONS FOR THE ═AY EDITION ($110 - $11╞). ┼NJOY THEM!
-
-
- ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #13 FOR ─ECEMBER, 1994
-
- ╤ $0├0) ╘HE EARLY 1541 DRIVES USED A MECHANISM DEVELOPED BY ______. ╬AME
- THE COMPANY.
-
- ┴ $0├0) ┴LPS.
-
- ╤ $0├1) ╧N LATER MODELS, ├OMMODORE SUBSEQUENTLY CHANGED MANUFACTURERS
- FOR THE 1541 DRIVE MECHANISM. ╬AME THE NEW MANUFACTURER.
-
- ┴ $0├1) ╬EWTRONICS.
-
- ╤ $0├2) ╫HAT IS THE MOST OBVIOUS DIFFERENCE(S). (╧NLY ONE DIFFERENCE IS
- NECESSARY)
-
- ┴ $0├2) ┴LPS: PUSH-TYPE LATCH, ROUND ╠┼─.
- ╬EWTRONICS: LEVER-TYPE LATCH, RECTANGULAR ╠┼─.
-
- ╤ $0├3) ╧N ├OMMODORE ┬┴╙╔├ ╓2.0, WHAT ANSWER DOES THE FOLLOWING GIVE:
- ╨╥╔╬╘ (╙╤╥(9)=3)
-
- ┴ $0├3) 0. ┴CCORDING TO ├OMMODORE ┬┴╙╔├, THE ANSWER SHOULD BBY -1, WHICH
- IS THE ┬┴╙╔├ VALUE OF ╘╥╒┼. ╚OWEVER, THE ABOVE EQUATION IS ╬╧╘
- TRUE. ─OING ╨╥╔╬╘ ╙╤╥(9) YIELDS 3, BUT DOING ╨╥╔╬╘ (╙╤╥(9)-3)
- YIELDS 9.31322575┼-10 (├64). ╘HIS ANOMALY CAN BE ATTRIBUTED TO
- ROUNDOFF ERRORS IN THE FLOATING POINT MATH ROUTINES IN ├OMMODORE ┬┴╙╔├.
-
- ╤ $0├4) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION) WHAT DOES ┬ EQUAL AFTER THE FOLLOWING
- RUNS: ├=0:┬=├=0
-
- ┴ $0├4) ┬ = -1. ╘HE SECOND STATEMENT IS THE ONE TO LOOK AT. ╘HE SECOND
- EQUALS SIGN IS TREATED AS A COMPARISON, WHILE THE FIRST IS TREATED
- AS A ASSIGNMENT. ┬ GETS SET TO THE OUTCOME OF THE COMPARISON, WHICH
- IS ╘╥╒┼ (-1).
-
- ╤ $0├5) ╘HE FIRST ╨┼╘ CASSETTE DECKS WERE ACTUALLY _______ BRAND CASSETTE
- PLAYERS, MODIFIED FOR THE ╨┼╘ COMPUTERS. ╬AME THE COMAPNY.
-
- ┴ $0├5) ╙ANYO. ╙PECIFICALLY, ═ODEL ═1540┴. ╫HAT A MODEL NUMBER!
-
- ╤ $0├6) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION), WHAT HAPPENS IF THE FOLLOWING
- PROGRAM IS RUN:
-
- 10 ╩=0
- 20 ╔╞ ╩=0 ╟╧ ╘╧ 40
- 30 ╨╥╔╬╘ "╩<>0"
- 40 ╨╥╔╬╘ "╩=0"
-
- ┴ $0├6) ╧N ┬┴╙╔├ 2.0 OR GREATER:
-
- ?╙┘╬╘┴╪ ┼╥╥╧╥ ╔╬ 20
- ╥┼┴─┘.
-
- ╧N ┬┴╙╔├ 1.0: (FOUND ON THE ╨┼╘ 2001 SERIES)
-
- ╩=0
- ╥┼┴─┘.
-
- ┬┴╙╔├ 1.0 TOTALLY IGNORED SPACES, SO LINE 20 BECAME "╔╞╩=0╟╧╘╧40".
- ╘HAT STATEMENT WOULD BE CORRECTLY PARSED, SICNE IT CONTAINS THE "╟╧╘╧"
- KEYWORD.
-
- ╚OWEVER, ON ┬┴╙╔├ 2.0 OR GREATER, SPACES WEREN'T IGNORED SO
- COMPLETELY, AND THE "╘╧" IN "╟╧ ╘╧" WOULD BE TOKENIZED SEPARATELY, SO
- SOME CODE WAS ADDED TO ┬┴╙╔├ TO CHECK TO "╟╧". ┴S THE CODE THAT
- ACCEPTS ╟╧╘╧ AS A SPECIAL CASE FOR ╘╚┼╬ AFTER AN ╔╞ STATEMENT WASN'T
- PATCHED THIS WAY, THE ABOVE FAILS, BECAUSE ╟╧ IS NOT A VALID KEYWORD
- AFTER ╔╞. ╘HE STATEMENT ╙╚╧╒╠─ WORK CORRECTLY, BUT DOES NOT BECAUSE
- OF THIS FAILURE TO FIX THE ╔╞ COMMAND PARSING.
-
- ╧N ┬┴╙╔├ 2.0 OR GREATER, SUBSTITUTING THE FOLLOWING LINE FOR LINE 20
- WILL CAUSE THE PROGRAM TO WORK:
-
- 20 ╔╞ ╩=0 ╘╚┼╬ ╟╧ ╘╧ 40
-
- ╤ $0├7) ╔N QUESTION $068, WE LEARNED HOW ╩ACK ╘RAMIEL FIRST HAPPENED UPON THE
- NAME "├╧══╧─╧╥┼". ┴CCORDING TO THE STORY, THOUGH, IN WHAT COUNTRY
- WAS HE IN WHEN HE FIRST SAW IT?
-
- ┴ $0├7) ╟ERMANY.
-
- ╤ $0├8) ╧N THE ├OMMODORE USER PORT CONNECTOR, HOW MANY EDGE CONTACTS ARE
- THERE?
-
- ┴ $0├8) 24. ╘WO ROWS OF 12 CONTACTS EACH.
-
- ╤ $0├9) ╧N MOST ├OMMODORE COMPUTERS, A LOGICAL ┬┴╙╔├ SCREEN LINE CAN CONTAIN
- UP TO 80 CHARACTERS. ╧N WHAT ├OMMODORE COMPUTER(S) IS THIS NOT TRUE?
-
- ┴ $0├9) ┴CCORDING TO ├OMMODORE DOCUMENTATION, A _PHYSICAL_ SCREEN LINE IS
- DEFINED AS ONE SCREEN LINE OF CHARACTERS. ┴ _LOGICAL_ SCREEN LINE IS
- DEFINED AS HOW MANY _PHYSICAL_ LINES CAN BE CHAINED TOGETHER TO
- CREATE A VALID ┬┴╙╔├ PROGRAM LINE.
-
- ╫ITH THAT IN MIND, MOST ├OMMODORE COMPUTERS CHOSE A _LOGICAL_
- SCREEN LINE THAT WAS A MULTIPLE OF THE SCREEN WIDTH. ╘HIS WORKS FINE
- FOR 40 AND 80 COLUMN SCREENS, BUT WHAT DO WE DO WITH THE ╓╔├-20, WITH
- ITS 22 COLUMN SCREEN. ╙OLUTION: MAKE THE _LOGICAL_ LINE LENGTH EQUAL
- TO 4 _PHYSICAL_ LINES, OR 88 COLUMNS.
-
- ╫HEN THE ├OMMDORE 128 WAS INTRODUCED, THE NUMBER ROSE TO 160
- CHARACTERS, WHICH IS 4 _PHYSICAL_ LINES IN 40 COLUMN MODE, OR
- 2 _PHYSICAL_ LINES IN 80 COLUMN MODE. ╚OWEVER, YOU CAN ONLY TAKE
- ADVANTAGE OF THIS IN 128 MODE. 64 MODE IS LIMITED TO 80 CHARACTERS.
-
- ╘O ADD TO ALL THIS CONFUSION, A VALID ┬┴╙╔├ PROGRAM LINE (IN MEMORY)
- CAN ACTUALLY BE 255 (TOKENIZED) CHARACTERS LONG, BUT CREATING SUCH
- A LONG LINE CANNOT BE DONE FROM THE BUILT-IN EDITOR IN DIRECT MODE.
-
- ╘HE ┴MIGA┬┴╙╔├, AVAILABLE ON THE ┴MIGA, ALSO DOES NOT HAVE THE 80
- COLUMN LINE LIMIT. ╚OWEVER, THAT ┬┴╙╔├ IS ╙╧╧╧ MUCH DIFFERENT THAT
- ╔ AM NOT SURPRISED. ╘HE OLDER ├┬═ ┬┴╙╔├S, ON THE OTHER HAND, WERE
- ALL DERIVATIVES OF THE ORIGINAL ╠EVEL 1 ┬┴╙╔├ FOR THE ╨┼╘.
-
- ╤ $0├┴) ╔F A FILE IS SAVED TO A ├OMMODORE ─ISK ─RIVE WITH THE FOLLOWING
- CHARACTERS: CHR$(65);CHR$(160);CHR$(66), WHAT WILL THE DIRECTORY
- ENTRY LOOK LIKE?
-
- ┴ $0├┴) ╘HE FILENAME WILL SHOW UP AS "┴"┬, WITH THE '┬' SHOWING UP TO THE
- RIGHT OF THE '"' MARK. ╘HIS COULD BE USED TO MAKE PROGRAM LOADING
- EASIER. ┴ FILE THAT SHOWED UP AS "FILENAME",8,1 COULD BE LOADED
- BY SIMPLY HITTING SHIFT-RUN/STOP ON THAT LINE.
-
- ╤ $0├┬) ╫HAT IS THE MAXIMUM LENGTH (IN CHARACTERS) OF A ├┬═ DATASETTE
- FILENAME?
-
- ┴ $0├┬) ╥EFERENCES ╔ HAVE ON HAND SAY 128 CHARACTERS. ╚OWEVER, THE ACTUAL
- CODE ON THE 8032 AND THE ├64 ACTS AS THOUGH 187 CHARACTERS CAN
- ACTUALLY BE SENT (TAPE BUFFER-5 CONTROL BYTES = 192-5=187). ╘HE
- REFERENCES THAT CLAIM 128 CHARACTERS ARE ╬ICK ╚AMPSHIRE'S
- _╘HE ╓╔├ ╥EVEALED_ AND _╘HE ╨┼╘ ╥EVEALED_. ┴╬YONE CARE TO LAY
- THIS ONE TO REST?
-
- ╤ $0├├) ╚OW MANY KEYS ARE ON A STOCK ├OMMODORE 64 KEYBOARD?
-
- ┴ $0├├) 66 KEYS. ╘HIS IS THE SAME NUMBER AS FOUND ON THE ╓╔├-20 AND THE
- ├OMMODORE 16.
-
- ╤ $0├─) ├OMMODORE ┬┴╙╔├ USES KEYWORD "TOKENS" TO SAVE PROGRAM SPACE. ╘OKEN
- 129 BECOMES "╞╧╥". ╫HAT TWO TOKENS EXPAND TO INCLUDE A LEFT
- PARENTHESIS AS WELL AS A ┬┴╙╔├ KEYWORD?
-
- ┴ $0├─) ╘┴┬( (163) AND ╙╨├( (166).
-
- ╤ $0├┼) ╘HERE ARE 6 WIRES IN THE ├OMMODORE SERIAL BUS. ╬AME THE 6 WIRES.
-
- ┴ $0├┼) 1) ╙ERIAL /╙╥╤╔╬
- 2) ╟╬─
- 3) ╙ERIAL ┴╘╬ ╔╬/╧╒╘
- 4) ╙ERIAL ├╠╦ ╔╬/╧╒╘
- 5) ╙ERIAL ─┴╘┴ ╔╬/╧╒╘
- 6) /╥┼╙┼╘
-
- ╤ $0├╞) ╧N THE ├OMMODORE DATASETTE CONNECTOR, HOW MANY LOGICAL CONNECTIONS ARE
- THERE?
-
- ┴ $0├╞) 6. ╧PPOSING PINS ON THE CONNECTOR ARE HOOKED TOGETHER ELECTRICALLY.
-
-
- ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #14 FOR ╩ANUARY, 1995
-
- ╤ $0─0) ╚OW MANY KEYS WERE THERE ON THE "ORIGINAL" ╨┼╘ AND WHAT WAS SPECIAL
- ABOUT THEM?
-
- ┴ $0─0) THE ORIGINAL ╨┼╘ HAD 73 CALCULATOR-STYLE KEYS THAT WERE LAID OUT
- IN A RECTANGULAR MATRIX, NOT TYPEWRITER-STYLE.
-
- ╤ $0─1) ╚OW DO YOU PRODUCE THE "HIDDEN" MESSAGE(S) ON THE ├OMMODORE 128?
-
- ┴ $0─1) ╙┘╙ 32800,123,45,6. ╘HE SCREEN WILL CLEAR, AND THE SOFTWARE
- AND HARDWARE DEVELOPERS ON THE 128 PROJECT WILL BE NAMED.
-
- ╘HE EXACT TEXT IS AS FOLLOWS:
-
- [╥╓╙] ┬ROUGHT TO YOU BY...
-
- ╙OFTWARE:
- ╞RED ┬OWEN
- ╘ERRY ╥YAN
- ╓ON ┼RTWINE
-
- ╚ERDWARE:
- ┬IL ╚ERD
- ─AVE ╚AYNIE
- ╞RANK ╨ALAIA
-
- [╥╓╙]╠INK ARMS,DON'T MAKE THEM.
-
- ╤ $0─2) ╚OW MUCH MEMORY DID THE "ORIGINAL" ╨┼╘ SHOW ON BOOTUP?
-
- ┴ $0─2) ╘HE "ORIGINAL" ╨┼╘ CAME IN TWO CONFIGURATIONS, 4╦ AND 8╦, SO:
-
- ╘HE ╨┼╘ 2001-4 HAD 3071 BYTES.
- ╘HE ╨┼╘ 2001-8 HAD 7167 BYTES.
-
- ╤ $0─3) ╫E ALL KNOW THE "REBOOT" SYS FOR THE 64 IS SYS 64738, BUT WHO KNOWS
- THE SAME SYS LOCATION TO REBOOT THE ├┬═ 8032?
-
- ┴ $0─3) SYS 64790
-
- ╤ $0─4) ╫HICH COMPUTER(S) BEEPED AT BOOTUP? (═AY BE MORE THAN ONE, BUT ONLY
- ONE REQUIRED)
-
- ┴ $0─4) ╔ KNOW SOME OF THESE ARE CORECT, BUT THE SHEER SIZE OF THE
- LIST PREVENTS ME FROM CHECKING THEM ┴╠╠ OUT.
-
- ╞┴╘ 40╪╪ SERIES
- 80╪╪ SERIES
- ╨├-10 (╔ SUSPECT A NUMBER OF ╔┬═ CLONES DID, AND THESE THINGS HAVE
- NO CONSISTENT NAMING CONVENTION ACROSS COUNTRY BOUNDARIES.)
- ╨├-20
- ┴MIGA 1000
- ╙╨9000 (╙UPER╨┼╘)
-
- ╤ $0─5) ╚OW MUCH MEMORY DID THE ├┬═ 8032 SHOW ON BOOTUP?
-
- ┴ $0─5) 31743 BYTES.
-
- ╤ $0─6) ├ERTAIN ├OMMODORE COMPUTERS PROVIDED EMTPY ┼╨╥╧═ SOCKETS ON THE
- MOTHERBOARD. ╟IVE ME THE NUMBER OF EMPTY SOCKETS ON THE FOLLOWING
- MACHINES:
-
- A) ├┬═ 30╪╪.
- B) ├┬═ 8╪╪╪.
- C) ├┬═ ├128.
- D) ╨LUS/4.
-
- ┴ $0─6) A) 3 SOCKETS.
- B) 2 SOCKETS.
- C) 1 SOCKET.
- D) 1 SOCKET.
-
- ╤ $0─7) ╔N ╟ERMANY, THE ├┬═ 8032 CAME WITH A 4K┬ ┼╨╥╧═ FOR THE ┼╪╪╪ AREA,
- WHILE THE ╒╙ VERSION ONLY HAD A 2K┬ ┼╨╥╧═. ╫HY?
-
- ┴ $0─7) ╘HE ╟ERMAN VERSION HAD ADDITIONAL KEYBAORD DRIVERS FOR UMLAUT
- CHARACTERS AND DEAD KEYS.
-
- ╤ $0─8) ╫HO PUBLISHED THE FIRST ╨┼╘ MEMORY MAP IN THE "╨┼╘ ╟AZETTE"?
-
- ┴ $0─8) ╬ONE OTHER THAN THE INFAMOUS ╩IM ┬UTTERFIELD.
-
- ╤ $0─9) ╫HICH IS FASTER TO MOVE THE SURSOR ON A ╨┼╘/├┬═ OR ├64: ╙┘╙ OR
- ╨╥╔╬╘?
-
- ┴ $0─9) ╨╥╔╬╘ IS FASTER, SINCE THE SYS APPROACH MUST PROCESS THE POKES
- BEFORE THE SYS, WHICH ARE VERY SLOW.
-
- ╤ $0─┴) ╧N THE ┴MIGA 1000, WHERE ARE THE SIGNATURES OF THE FIRST ┴MIGA
- DEVELOPERS LOCATED?
-
- ┴ $0─┴) ╔NSIDE THE TOP CASE OF THE ┴MIGA (1000).
-
- ╘HERE IS AN INTERESTING FOOTNOTE TO THIS QUESTION. ╔T SEEMS
- THAT AT LEAST SOME ORIGINAL ┴MIGA MACHINES WERE LABELED AS
- ┴MIGA (WITH NU NUMBER). ╘HEN, AT SOME LATER POINT, THE NUMBER WAS
- ADDED. ╔N ADDITION, ├OMMODORE PRODUCED SOME ┴MIGA 1000 MACHINES
- WITHOUT THE SIGNATURES, BUT MOST HAD THE TELLTALE HANDWRITING ON
- THE INSIDE OF THE CASE.
-
- ╤ $0─┬) ╧N THE 6502, WHAT DOES THE ACCUMULATOR CONTAIN AFTER THE FOLLOWING
- IS EXECUTED:
-
- LDA #$AA
- SED
- ADC #01
-
- ┴ $0─┬) ┴SSUME CARRY WAS CLEAR. ╔F SO, THEN $11 IS THE CORRECT ANSWER.
-
- ╤ $0─├) ╫HAT IS THE MODEL NUMBER OF THE ╒╙ ╬╘╙├ ╓╔├-╔╔ CHIP?
-
- ┴ $0─├) ╔TS FIRST NUMBER WAS 6567, AND THAT IS THE NUMBER MOST PEOPLE KNOW
- IT BY, BUT ├OMMODORE PRODUCED A ╓╔├-╔╔ USING A NEW MANUFACTURING
- PROCESS THAT WAS NUMBERED THE 8562.
-
- ╤ $0──) ╫HAT IS THE ┼UROPEAN ╨┴╠ ╓╔├-╔╔ CHIP'S MODEL NUMBER?
- (╬OT SURE IF THAT'S ITS RIGHTFUL TERM, BUT ╔ HOPE YOU UNDERSTAND).
-
- ┴ $0──) ╙AME HERE. ╘HE PART NUMBER 6569 IS THE MOST REMEMBERED NUMBER, BUT
- AN 8565 WILL WORK AS WELL.
-
- ╤ $0─┼) ┴SSUME YOU HAVE TWO COMPUTERS, ONE WITH EACH OF THE ABOVE CHIPS INSIDE.
- ╫HICH CHIP DRAWS MORE PIXELS ON THE SCREEN PER SECOND?
-
- ┴ $0─┼) ╬OTE, FOR THE PURPOSES OF THE CALCULATION ╔ AM PERFORMING, "PIXELS"
- REFERS TO PICTURE ELEMENTS THAT CAN BE ADDDRESS AND MODIFIED USING
- NORMAL ╓╔├ MODES, SO THERE ARE 320*200 "PIXELS" ON BOTH THE ╨┴╠
- AND ╬╘╙├ SCREENS. (╔ PROBABLY SHOULD HAVE STATED THIS, BUT IT IS
- TOO LATE NOW.) ┴LSO, THE SCREEN REFRESH RATES USED IN THE
- CALCULATIONS ARE THOSE DEFINED BY THE RESPECTIVE TELEVISION
- STANDARDS (60╚Z ╒.╙., 50╚Z ┼UROPEAN), EVEN THOUGH THE ACTUAL
- FREQUENCIES ARE OFF BY A SMALL PERCENTAGE. (FOR EXAMPLE, THE ACTUAL
- 50╚Z REFRESH RATE ON ┼UROPEAN ╓╔├-╔╔ CHIPS WAS CALCULATES AS
- 50.124567╚Z BY ┴NDREAS ┬OOSE)
-
- ╙O, THE ╨┴╠ DRAWS 320*200*50 PIXELS PER SECOND = 3200000 PIXELS/S
- ╬╘╙├ DRAWS 320*200*60 PIXELS PER SECOND = 3840000 PIXLES/S
-
- ╬OW, SOME PEOPLE THOUGHT ╔ MEANT THE WHOLE SCREEN, NOT JUST THE
- DISPLAY AREA PROVIDED BY THE ╓╔├-╔╔ CHIP. ╫ELL, ╔ AM NOT SURE
- EXACTLY YOU CALCULATE PIXELS ON A SCREEN, SINCE THE NUMBERS COULD
- VARY FROM DISPLAY TO DISPLAY, BUT IF WE MEASURE IN SCANLINES:
-
- ╨┴╠ = 312 SCANLINES * 50 = 15600 SCANLINES/S
- ╬╘╙├ = 262 SCANLINES * 60 = 15720 SCANLINES/S
-
- ╘HE ╬╘╙├ MACHINES WINS BOTH WAYS.
-
- ╤ $0─╞) ╔N ├OMMODORE ┬┴╙╔├, WHICH STATEMENT EXECUTES FASTER:
-
- A = 2--2
-
- OR
-
- A = 2+2
-
- ┴ $0─╞) B IS THE CORRECT ANSWER, AND THERE ARE A COUPLE OF REASONS WHY:
-
- 1) 2--2 TAKES LONGER TO PARSE IN THE ┬┴╙╔├ INTERPRETER.
- 2) ├OMMODORE ┬┴╙╔├ SUBTRACTS BY COMPLEMENTING THE SIGN OF THE
- SECOND NUMBER AND ADDING. ╘HIS INCURS EXTRA TIME.
-
- ╘HERE ARE EVEN MORE SUBTLE ONES, BUT ╔ LEAVE THEM AS AN
- EXERCISE FOR THE READER. ╙END ME YOUR REASON WHY.
-
-
- ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #15 FOR ╞EBRUARY, 1995
-
- ╤ $0┼0) ╫HAT IS THE DIFFERENCE(S) BETWEEN THE ╬EWTRONICS 1541 AND THE 1541├?
- (ONLY ONE DIFFERENCE IS NEEDED)
-
- ┴ $0┼0) (╟EORGE ╨AGE, A NOTED AUTHORITY ON ├┬═ ─RIVES, INDICATED THAT ├OMMODORE
- MADE THIS A TOUGH QUESTION TO ANSWER.) ┬Y THE TIME THE 1541├ WAS
- INTRODUCED, ├OMMODORE THREW A NUMBER OF DRIVES TOGETHER AND CALLED
- THEM 1541├S. ╘HE THEORETICAL 1541├ EXHIBITED THE FOLLOWING
- FEATURES:
-
- ╬O HEAD BANGING, AND OTHER PROBLEMS FIXED BY MODIFIED ╥╧═S.
- ├ASE COLOR MATCHES ├64├ AND ├128 COMPUTERS.
-
- ╤ $0┼1) ╫HAT HAPPENS WHEN YOU TYPE 35072121 IN DIRECT MODE ON THE ├64 AND
- HIT RETURN?
-
- ┴ $0┼1) ╙IMPLE ANSWER: ═OST LIKELY, THE SCREEN CLEARS AND THE WORD ╥┼┴─┘.
- IS PRINTED AT SCREEN TOP. ╘HIS IS THE BEHAVIOR SEEN WHEN PRESSING
- ╥╒╬-╙╘╧╨/╥┼╙╘╧╥┼. ┴LTERNATELY, NOTHING COULD HAPPEN, OR THE COMPUTER
- COULD LOCK UP.
-
- ╔NVOLVED ANSWER: ╘HERE IS A BUG IN ┬┴╙╔├ 2.0. ┼ASILY FIXED, BUT
- DESTINED TO LIVE LIFE IMMORTAL. (LONG)
-
- ╘HE BUG IS IN THE ╨┼╘╙├╔╔ NUMBER TO BINARY CONVERSION ROUTINE AT
- $A69B (╠╔╬╟┼╘). ╘HE ROUTINE BASICALLY READS IN A CHARACTER FROM THE
- LINE, MULTIPLIES A PARTIAL RESULT BY 10 AND ADDS THE NEW CHARACTER
- TO THE PARTIAL RESULT. ╚ERE IS A CODE SNIPPET:
-
- A96A RTS
- A96B LDX #$00 ; ZERO OUT PARTIAL RESULT
- A96D STX $14
- A96F STX $15
- A971 BCS $A96A ; NOT A NUMBER, RETURN
- A973 SBC #$2F ; ╨┼╘╙├╔╔ TO BINARY
- A975 STA $07
- A977 LDA $15 ; GET HI BYTE OR PARTIAL RESULT
- A979 STA $22
- A97B CMP #$19 ; PARTIAL > 6399
- A97D BCS $A953 ; YES, GOTO ERROR
- A97F LDA $14 ; LOAD LO BYTE OF RESULT
- A981 ASL ; LO*2
- A982 ROL $22 ; HI*2 + C
- A984 ASL ; LO*2
- A985 ROL $22 ; HI*2 + C
- A987 ADC $14 ; COMPLETE LO*5
- A989 STA $14
- A98B LDA $22
- A98D ADC $15 ; COMPLETE HI*5
- A98F STA $15
- A991 ASL $14 ; LO*2 COMPLETE LO*10
- A993 ROL $15 ; HI*2 COMPLETE HI*10
- A995 LDA $14
- A997 ADC $07 ; ADD NEW CHAR
- A999 STA $14
- A99B BCC $A99F ; DID LO OVERFLOW?
- A99D INC $15 ; YES, INC HI
- A99F JSR $0073 ; GET NEXT CHAR
- A9A2 JMP $A971 ; GO THROUGH IT AGAIN.
-
- ╘HE PROBLEM IS AT $A97D. WHEN THE PARTIAL RESULT IS GREATER THAN 6399,
- (IF PARTIAL > 6399, THEN NEW PARTIAL RESULT WILL BE OVER 63999)
- THE ROUTINE NEEDS TO GET TO $AF08 TO PRINT AN ERROR, BUT CAN'T DUE TO
- BRANCH RESTRICTIONS. ╚OWEVER, A BRANCH THAT WILL GET THERE IS IN THE
- PRECEDING FUNCTION, WHICH HANDLES THE ╧╬ ╟╧╘╧/╟╧╙╒┬ KEYWORDS ($A94B,
- ╧╬╟╧╘╧).
-
- ╙O, THE ┬┴╙╔├ WRITERS JUST BRANCHED TO THE CODE IN ╧╬╟╧╘╧; SPECIFICALLY
- $A953:
-
- A94B JSR $B79E
- A94E PHA
- A94F CMP #$8D ; IS THE KEYWORD ╟╧╙╒┬ ($8D)
- A951 BEQ $A957 ; YES
- A953 CMP #$89 ; IS THE KEYWORD ╟╧╘╧ ($89)
- A955 BNE $A8E8 ; NO, PRINT ╙┘╬╘┴╪ ┼╥╥╧╥.
- A957 ... ; HANDLE ╧╬ ╟╧╘╧/╟╧╙╒┬
-
- ╘HIS CODE IS CHECKING TO MAKE SURE THE ╧╬ (VAR) IS FOLLOWED WITH A
- ╟╧╘╧ OR ╟╧╙╒┬ KEYWORD.
-
- ╘HE ╠╔╬╟┼╘ ERROR HANDLER BRANCHES TO $A953, WHICH COMPARES
- .┴ (WHICH HOLDS HI BYTE OF PARTIAL RESULT) TO $89. ╬ORMALLY, THIS
- FAILS, AND THE NORMAL ╙┘╬╘┴╪ ┼╥╥╧╥ CODE IS REACHED THROUGH THE BRANCH
- TO $A8E8. ╚OWEVER, FOR PARTIAL RESULTS OF THE FORM $89╪╪, THE CHECK
- SUCCEEDS, AND ┬┴╙╔├ TRIES TO EXECUTE AN ╧╬ ╟╧╘╧/╟╧╙╒┬ CALL.
-
- ┬Y THE WAY, IT IS NO COINCIDENCE THAT THIS ERROR OCCURS ON 35072121,
- SINCE ONE OF THE PARTIAL RESULTS IS $8900 (HI BYTE IS $89). ╔N FACT,
- 350721 WILL ACHIEVE THE SAME RESULT.
-
- ╔F THE CHECK SUCCEEDS, THE CODE LIMPS ALONG UNTIL $A96A:
-
- A969 PLA ; COMPLEMENT TO $A94E
- A96A RTS ; RETURN
-
- ┬UT WE NEVER EXECUTED $A94E, THE PUSH, SO THE STACK IS NOW
- MESSED UP. ╙INCE THE STACK HELD $9E, $79, $A5 BEFORE THE ╨╠┴,
- (╘HE STACK COULD HOLD OTHER VALUES, BUT ╔ ALWAYS SAW THESE)
- THE ╥╘╙ GETS ADDRESS $A579 TO RETURN TO, WHICH USUALLY HOLDS A ┬╥╦
- OPCODE. ╘HE BREAK HANDLER IS INVOKED, AND THE SCREEN CLEARS WITH THE
- ╥┼┴─┘. AT THE TOP.
-
- ╬OW, THE ┬┴╙╔├ 2.0 AUTHORS WERE JUSTIFIED IN REUSING THE ERROR
- HANDLER CODE IN ╧╬╟╧╘╧ FOR ╠╔╬╟┼╘, BUT THEY CALCULATED THE BRANCH
- OFFSET WRONG, ACCORDING TO MY TESTS. ╔F YOU HAVE THE ╠╔╬╟┼╘ ERROR
- HANDLER BRANCH TO $A955, ALL THESE TROUBLES DISAPPEAR. ┘OU CAN
- VERIFY THIS PROCEDURE WITH THE FOLLOWING ┬┴╙╔├ PROGRAM ON A 64:
-
- 10 FOR T=57344 TO 65535:POKE T,PEEK(T):NEXT
- 20 FOR T=40960 TO 49151:POKE T,PEEK(T):NEXT
- 30 POKE 43390, 214
- 40 POKE 1, PEEK(1) AND 254
-
- ╩UST TO BE COMPLETE, THIS ERROR OCCURS WHEN A 6 DIGIT OR GREATER LINE
- NUMBER IS ENTERED AND THE FIRST 6 DIGITS INDICATE A NUMBER IN THE
- RANGE 35072-35327 ($8900-$89FF). ┴LSO, IT APPEARS THE ERROR OCCURS
- ON THE ╓╔├-20, BUT ╔ DIDN'T COMPLETELY VERIFY IT. ╔T WOULD BE
- INTERESTING TO NOTE IF THE ERROR IS FOUND ON ALL VERSION OF ├┬═ ┬┴╙╔├.
-
- ╫HEW, WHAT A MOUTHFUL.
-
- ╤ $0┼2) ╔F A ╙╔─ CHIP IS PRODUCING A "SAWTOOTH WAVEFORM", DOES THE WAVEFORM LOOK
-
- LIKE:
-
- A) "/▄/▄/▄/▄" OR
- B) "▄\▄\▄\▄\" ?
-
- ┴ $0┼2) A IS THE CORRECT ANSWER.
-
- ╤ $0┼3) ╧N ┬┴╙╔├ 2.0, WHAT SPECIAL PRECAUTION(S) MUST ONE TAKE WHEN WORKING WITH
-
- RELATIVE FILES? (ONLY ONE IS NEEDED)
-
- ┴ $0┼3) ┬ECAUSE ┬┴╙╔├ 2.0 DOESN'T HANDLE POSITIONING IN RELATIVE FILES QUITE
- RIGHT, ONE MUST POSITION THE RELATIVE FILE POINTER BEFORE ┴╬─ ┴╞╘┼╥
- A READ OR WRITE TO A RELATIVE FILE.
-
- ╤ $0┼4) ╫HAT INCOMPATIBILITY EXISTED BETWEEN ├128 ╥EV. 0 ╥╧═╙ AND THE ╥┼╒?
-
- ┴ $0┼4) ╧╦, ╔ ADMIT IT. ╔ PLACED THIS ANSWER AND ITS DISCUSSION SOMEWHERE
- IN MY STORE OF INFORMATION, AND IT MUST HAVE FALLEN BEHIND THE
- CABINET, BECAUSE ╔ CANNOT FIND IT. ╔ WILL POST AN ANSWER TO THIS
- AS SOON AS ╔ CAN FIND IT, BUT THE ANSWERS REALLY MUST GO OUT, AS
- THEY HAVE BEEN HELD UP LONG ENOUGH.
-
- ╤ $0┼5) ╫HAT CAN TRIGGER AN ╬═╔ INTERRUPT? (COUNT ALL SOURCES ON ONE CHIP AS
- ONE)
-
- ┴ $0┼5) ╘HE FOLLOWING SOURCES CAN TRIGGER AN ╬═╔ INTERRUPT:
-
- 1) ╘HE EXPANSION PORT.
- 2) ├╔┴ #2.
- 3) ╘HE ╥┼╙╘╧╥┼ KEY.
-
- ╤ $0┼6) ╫HAT CAN TRIGGER AN ╔╥╤ INTERRUPT? (COUNT ALL SOURCES ON ONE CHIP AS
- ONE)
-
- ┴ $0┼6) ╘HE FOLLOWING SOURCES CAN TRIGGER AN ╔╥╤ INTERRUPT:
-
- 1) ╘HE ╓╔├-╔╔ CHIP.
- 2) ├╔┴ #1.
- 3) ╘HE EXPANSION PORT.
-
- ╤ $0┼7) ╫HERE IS THE ╥╧═ IN A 1541 LOCATED IN THE 64╦ MEMORY MAP?
-
- ┴ $0┼7) ╘HE ╥╧═ IS LOCATED FROM $├000 TO $╞╞╞╞, YET THE ╥╧═ CODE DOES NOT
- BEGIN UNTIL $├100.
-
- ╤ $0┼8) ╫HICH ╓╔┴ ON THE 1541 IS HOOKED TO THE READ/WRITE HEAD?
-
- ┴ $0┼8) ╓╔┴ #2, LOCATED IN MEMORY FROM $1├00 TO $1├0┼.
-
- ╤ $0┼9) ╔N THE ├OMMODORE ─╧╙, WHAT BIT IN THE FILE TYPE BYTE DENOTES A "LOCKED"
- FILE?
-
- ┴ $0┼9) BIT 6.
-
- ╤ $0┼┴) ╔F FILES ARE "LOCKED" UNDER ├OMMODORE ─╧╙, UNDER WHAT CONDITION(S) MAY
- THE FILE BE CHANGED?
-
- ┴ $0┼┴) ─EPENDING ON THE FILE, THE FOLLOWING OPERATIONS CAN BE DONE ON A
- LOCKED FILE:
-
- 1) ╥ENAME WILL CHANGE FILE NAME, ALTHOUGH NOT CONTENTS OF FILE.
- 2) ╥ANDOM ACCESS CAN BE USED TO ALTER FILE.
- 3) ╞ORMATTING THE DISK WILL ALTER THE FILE. (DUH!)
- 4) ╙AVE-WITH-REPLACE (@0:) WILL REPLACE FILE AND UNLOCK IT.
- 5) ╧PENING FILE IN APPEND MODE WILL ALLOW IT TO BE CHANGED, AND
- UNLOCK IT.
- 6) ╧PENING A RELATIVE FILE AND ADDING OR CHANGING A RECORD WILL
- SUCCEED AND UNLOCK FILE.
-
- ╤ $0┼┬) ╚OW BIG CAN A PROGRAM FILE BE ON A 1541 OR SIMILAR?
-
- ┴ $0┼┬) ╘HE FILE CAN BE AS LARGE AS A SEQUENTIAL FILE, SINCE BOTH ARE STORED
- IN THE SAME WAY: 168656 BYTES. ╚OWEVER, SINCE A PROGRAM CONTAINS ITS
- LOAD ADDRESS AS BYTES 0 AND 1, THE LARGEST PROGRAM SIZE IS 168654
- BYTES.
-
- ╤ $0┼├) ╒NDER ┬┴╙╔├ 2.0, HOW DOES ONE OPEN A RANDOM ACCESS FILE ON A DISK
- DRIVE?
-
- ┴ $0┼├) ╥ANDOM ACCESS (OR DIRECT ACCESS) FILES ARE A MISNOMER. ╫HAT YOU
- REALLY DOING IS OPENING THE DISK FOR READING AND WRITING. ┘OU NEED
- TWO OPEN COMMAND TO ACCESS A RANDOM FILE: (ASSUME DRIVE 8)
-
- OPEN 15,8,15 AND
-
- OPEN 1,8,4,"#1" WILL OPEN A RANDOM ACCESS FILE USING BUFFER 1.
- OPEN 1,8,4,"#" WILL OPEN A RANDOM ACCESS FILE USING THE FIRST
- AVAILABLE BUFFER
-
- ╬OW, BY USING ┬-╥, ┬-╫, ┬-┴ OR THEIR REPLACEMENTS, YOU CAN WRITE
- DATA TO SECTORS ON THE DISK.
-
- ╬OTE THAT ╥ANDOM ACCESS FILES ARE DIFFERENT FROM RELATIVE FILES.
-
- ╤ $0┼─) ┴ FILE THAT HAS A '*' IMMEDIATELY BEFORE THE FILETYPE IS CALLED
- A _________ FILE.
-
- ┴ $0┼─) A SPLAT FILE. ╘HIS IS ITS CORRECT TERM, BELIEVE IT OR NOT.
-
- ╤ $0┼┼) ╫E KNOW THE 1541 AND SIMILAR DRIVES HAVE 5 INTERNAL BUFFER AREAS, BUT
- HOW MANY DOES AN 8050 DRIVE HAVE?
-
- ┴ $0┼┼) ╙INCE THE 8050 HAS TWICE THE ON-BOARD ╥┴═ (4K┬), IT HAS 16 BUFFERS, BUT
- ONLY 13 ARE AVAILABLE. (┴LL ├┬═ DRIVES USE ONE BUFFER FOR ZERO-PAGE
- MEMORY, ONE FOR STACK MEMORY, AND ONE FOR TEMPORARY VARIABLES.)
-
- ╤ $0┼╞) ╧N A "SAVE-WITH-REPLACE", WHERE IS THE LOCATION OF THE FIRST TRACK AND
- SECTOR OF THE NEW COPY OF THE PROGRAM SAVED IN THE DIRECTORY ENTRY FOR
- THE OLD COPY?
-
- ┴ $0┼╞) ╘HE NEW FIRST TRACK IS STORED AT LOCATION 26, AND THE NEW FIRST SECTOR
- IS STORED AT LOCATION 27. ╘HESE VALUES ARE COPIED TO THEIR
- CORRECT LOCATIONS AFTER THE SAVE IS COMPLETED.
-
-
- ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #16 FOR ═ARCH, 1995
-
- ╤ $0╞0) ╫HAT SIZE MATRIX OF PIXELS COMPRISES A CHARACTER ON A ╨┼╘ 2001
- COMPUTER?
-
- ┴ $0╞0) ╘HE MATRIX WAS 8 BY 8.
-
- ╤ $0╞1) ╚OW MANY BYTES DID THE OPENING SCREEN ON A ├┬═ 4016 SHOW AS
- AVAILABLE FOR USE BY ┬┴╙╔├?
-
- ┴ $0╞1) 15359 BYTES FREE.
-
- ╤ $0╞2) ╘HE CHARACTER SET THAT PRODUCES UPPERCASE LETTERS ON UNSHIFTED KEYS
- IS THE ________________ CHARACTER SET.
-
- ┴ $0╞2) "STANDARD MODE".
-
- ╤ $0╞3) ╘HE CHARACTER SET THAT PRODUCES LOWERCASE LETTERS ON UNSHIFTED KEYS
- IS THE ________________ CHARACTER SET.
-
- ┴ $0╞3) "ALTERNATE MODE"
-
- ╤ $0╞4) ╘O GET TO THE SET MENTIONED IN $╞2, WHAT CHARACTER CODE WOULD BE
- PRINTED TO THE SCREEN?
-
- ┴ $0╞4) CHR$(142)
-
- ╤ $0╞5) ╫HAT CHARACTER CODE WOULD ONE PRINT TO THE SCREEN TO INVOKE THE
- CHARARACTER SET IN $╞3?
-
- ┴ $0╞5) CHR$(14)
-
- ╤ $0╞6) ╔F ONE DOES ╠╔╙╘ 60-100, WILL LINE 100 GET "LISTED"?
-
- ┴ $0╞6) ┘ES. ╘HE ABOVE TRANSLATES AS: ╠╔╙╘ 60 THROUGH TO AND INCLUDING 100.
-
- ╤ $0╞7) ╘HE ABBREVIATION FOR THE ┬┴╙╔├ 4.0 COMMAND "├╧╠╠┼├╘" IS ________.
-
- ┴ $0╞7) CO╠. "├" "╧" "╙╚╔╞╘-╠". ╞OR THOSE WHO ARE INTERESTED, THE
- ├╧╠╠┼├╘ COMMAND IS ANALOGOUS TO THE ╓┴╠╔─┴╘┼ OPERATION.
-
- ╤ $0╞8) ╫HEN YOU USE A SUBSCRIPTED VARIABLE IN ┬┴╙╔├, HOW MANY ELEMENTS
- ARE CREATED BY DEFAULT IF NO ─╔═ STATEMENT IS ISSUED?
-
- ┴ $0╞8) 11 ELEMENTS. ┴(0) - ┴(10). ┴LMOST EVERYONE WHO HAS EVER PROGRAMMED
- IN ├OMMODORE ┬┴╙╔├ HAS SEEN THE "┬┴─ ╙╒┬╙├╥╔╨╘" ERROR WHEN THEY TRY
- TO USE THE 12TH ELEMENT IN A UN-─╔═ENSIONED ARRAY.
-
- ╤ $0╞9) ╚OW LARGE IS THE KEYBOARD BUFFER IN ├┬═ COMPUTERS?
-
- ┴ $0╞9) 10 BYTES. ╙INCE THIS AREA COULD BE ╨╧╦┼D TO, MANY BOOT PROGRAMS
- WOULD POKE CHARACTERS INTO THIS BUFFER TO SIMULATE KEYPRESSES.
-
- ╤ $0╞┴) ╧N THE ├OMMODORE 1581, HOW LARGE IS A PHYSICAL SECTOR IN BYTES?
-
- ┴ $0╞┴) ┴ PHYSICAL SECTOR IS 512 BYTES IN LENGTH. ╔NTERNALLY, THE 1581
- CREATES 2 256 "LOGICAL" SECTORS IN A PHYSICAL SECTOR, TO MAINTAIN
- COMPATIBILITY WITH OLDER ├OMMODORE DRIVES.
-
- ╤ $0╞┬) ┘OU'LL FIND ┬┴╙╔├ 3.5 ON THE _____________ LINE OF ├┬═ COMPUTERS.
-
- ┴ $0╞┬) ╘HE ╪64 SERIES. ╘HAT INCLUDES THE ├OMMODORE 16, THE ├OMMODORE 116,
- AND THE ├OMMODORE ╨LUS/4.
-
- ╤ $0╞├) ╧N THE ├OMMODORE 1351 MOUSE, WHAT REGISTERS IN THE ├OMMODORE
- COMPUTER WOULD THE ╪ AND ┘ PROPORTIONAL INFORMATION BE READ
- FROM?
-
- ┴ $0╞├) ┼VEN THOUGH YOU ARE LOOKING FOR DIGITAL INFORMATION (HOW FAR THE
- MOUSE HAS TRAVELED SINCE THE LAST MOVEMENT IN A PARTICULAR AXIS),
- THE INFORMATION IS READ FROM THE "PADDLE" OR POTENTIOMETER (╨╧╘)
- REGISTERS. ╧N THE ├64, THE ╨╧╘ REGISTERS ARE PART OF THE ╙╔─
- CHIP, AND ARE AT 54297 ($─419) FOR ╨╧╘╪, AND 54298 ($─41┴) FOR
- ╨╧╘┘.
-
- ╤ $0╞─) ╫HAT IS THE MAXIMUM SIZE OF A SEQUENTIAL FILE ON A 1581 DRIVE?
-
- ┴ $0╞─) 802640 BYTES.
-
- ╤ $0╞┼) ╫HAT FLAW EXISTS IN THE EARLY ├OMMODORE 1670 MODEMS?
-
- ┴ $0╞┼) ╫HEN THE 1670 MODEM WAS FIRST INTRODUCED, IT POWERED UP IN AUTO-
- ANSWER MODE, WHICH MEANS IT WOULD ANSWER INCOMING CALLS AFTER
- THE PHONG RANG. ┘OU COULD TURN THIS FEATURE OFF THROUGH SOFTWARE
- CONTROL, BUT IF THE POWER WAS RESET, THE MODEM WOULD ANSWER THE
- PHONE. ╙O MANY PEOPLE COMPLAINED TO ├OMMODORE THAT ├┬═ REVISED
- THE 1670 TO INCLUDE AN EXTRA ─╔╨ SWITCH THAT TURNED THIS FEATURE
- OFF.
-
- ╤ $0╞╞) ╫HAT IS THE MODEL NUMBER OF THE FIRST MODEM FOR THE ╓╔├ AND ├64?
-
- ┴ $0╞╞) ╘HE 1600 MANUAL DIAL/MANUAL ANSWER 0-300 BPS MODEM. ╘HE AUTHOR
- OWNS ONE, AND USED IT FOR MANY YEARS. ╘O OPERATE, YOU MUST USE
- A PHONE WITH A DETACHABLE HANDSET CORD. ┘OU DIALED THE NUMBER
- ON THE PHONE, WAITED FOR THE ANSWER, UNPLUGGED THE HANDSET, AND
- PLUGGED THE CORD INTO THE 1600. ┴ SWITCH TOGGLED BETWEEN USING
- ORIGINATE OR ANSWER FREQUENCIES. ╘HE 1600 WAS MANUFACTURED BY
- ┴NCHOR ┴UTOMATION FOR ├OMMODORE. (┴S AN ASIDE, THIS UNIT CLAIMED
- 300 BPS, BUT ╔ NEVER COULD GET 300 TO WORK WELL. ═OST OF MY
- TELECOMMUNICATIONS HAPPENED AT 150 BPS.)
-
-
- -------├OMMODORE ╘RIVIA ┼DITION #17 ╤UESTIONS AND ┴NSWERS (┬┼╟╔╬)--------
-
- ╤ $100) ╧N THE ═╧╙ ╘ECHNOLOGY'S ╦╔═-1, HOW MANY KEYS WERE ON THE KEYPAD?
-
- ┴ $100) 23 KEYS. ╘HE KEYPAD HAS ROOM FOR 24, BUT ONE SPOT IS TAKEN BY
- A SWITCH THAT PUTS THE SYSTEM INTO SINGLE-STEP MODE. ╔NTERESTINGLY,
- SOME PICTURES HAVE THE SWITCH ON THE UPPER LEFT, SOME ON THE UPPER
- RIGHT.
-
- ╤ $101) ╘HE ╦╔═-1 KEYPAD HAD THE COMMON 0-9┴-╞ KEYS ON THE KEYPAD, BUT
- ALSO HAD SOME SPECIAL KEYS. ╬AME THEM.
-
- ┴ $101) ╟╧ (╟O) ┼XECUTES AN INSTRUCTION AND DISPLAYS THE ADDRESS OF NEXT,
- ╙╘ (╙TOP) ╙TOPS EXECUTION OF PROGRAM AND RETURN CONTROL TO MONITOR,
- ╥╙ (╥ESET),
- ┴─ (┴DDRESS) ┴DDRESS ENTRY MODE,
- ─┴ (─ATA) ─ATA ENTRY MODE,
- ╨├ (╨ROGRAM ├OUNTER) ─ISPLAYS AND RESTORES PROGRAM COUNTER TO VALUES
- IN ╨├╠ AND ╨├╚,
- + (╔NCREMENT) ╔NCREMENTS THE ADDRESS WITHOUT CHANGING THE ENTRY MODE.
-
- ╤ $102) ╘HE ╦╔═-1 WAS A SET OF MODULES THAT COULD BE PLUGGED TOGETHER TO
- EXPAND THE SYSTEM. ┼ACH MODULE HAD A MODEL NUMBER. ╫HAT WAS THE
- MODEL NUMBER OF THE ╦╔═-1 MOTHERBOARD?
-
- ┴ $102) ╘HE ╦╔═-4.
-
- ╤ $103) ╧N THE 1525 LINE OF PRINTERS, IF YOU WANTED TO CREATE THE FOLLOWING
- GRAPHIC, WHAT BYTES WOULD YOU SEND TO THE PRINTER AFTER TURNING ON
- GRAPHICS MODE?
-
- ****
- * *
- * *
- * *
- * *
- * *
- ****
-
- ┴ $103) ╔ GUESS ╔ SHOULD HAVE STIPULATED THAT THIS IS A BITMAP. ┴╙├╔╔ JUST
- HAS A FEW LIMITATIONS. ┴NYWAY, THE CORRECT BYTES TO SEND ARE:
- 255, 193, 193, 255. ┘OU GOT THESE BY ASSIGNING EACH BIT IN A COLUMN
- A VALUE, AND ADDING 128 TO THE RESULT FOR EACH COLUMN.
-
- ╤ $104) ╫HAT IS THE HORIZONTAL RESOLUTION OF THE 1525 LINE OF PRINTERS?
-
- ┴ $104) ├HARACTER RESOLUTION: 80 CHARS, OR 10 CHARS/INCH (CPI).
- ╟RAPHICS RESOLUTION: 480 DOTS, OR 60 DOTS/INCH (DPI).
-
- ╤ $105) ╧N ├OMMODORE DRIVES, EXPLAIN THE DIFFERENCE BETWEEN THE ┬-╥ COMMAND
- AND THE ╒1 COMMAND.
-
- ┴ $105) ╘HE TWO COMMANDS READ IN DATA FROM A DISK SECTOR. ╚OWEVER, THE
- ╒1 COMMAND ALWAYS READS A FULL SECTOR (255 BYTES). ╘HE ┬-╥
- COMMAND READS THE NUMBER OF BYTES SPECIFIED IN THE FIRST BYTE OF
- THE SECTOR. ╔F THE FIRST BYTE IS A 15, ┬-╥ WILL READ 15 BYTES
- FROM THE SECTOR. (╞ROM THE 1581 MANUAL)
-
- ╤ $106) ╧N THE ├OMMODORE 1541 DRIVE, WHAT DOES THE ╒: COMMAND DO?
-
- ┴ $106) ╘HIS COMMAND HAS BEEN TRADITIONALLY USED TO RESET ├OMMODORE DRIVES,
- INCLUDING THE ├┬═ 1541. ╚OWEVER, SOME EARLY VERSIONS OF THE ─RIVE
- ─╧╙ DID NOT CORRECTLY HANDLE THIS COMMAND. ╔N THESE VERSIONS, THE
- DRIVE AND COMPUTER FAILED TO COMPLETE THE COMMAND TRANSACTION
- SUCCESSFULLY, AND WHAT LOOKED LIKE A HUNG MACHINE RESULTED.
- ├OMMODORE LATER FIXED THIS PROBLEM. ╔F ╒: SEEMS TO NOT WORK ON
- YOUR DRIVE, TRY ╒; INSTEAD.
-
- ╤ $107) ╫HAT DOES THE FIRST ROUTINE IN THE 1541 DRIVE ╥╧═ ACTUALLY DO?
-
- ┴ $107) ╘HE FUNCTION, CALLED ╙┼╘╠─┴ AND RESIDING AT $├100, TURNS ON THE
- DRIVE ACTIVE ╠┼─ FOR THE CURRENT DRIVE. ╘HE ROUTINE LOADS THE
- CURRENT DRIVE FROM $7╞ AND SETS BIT 3 OF ─╙╦├╬╘ ($1├00).
-
- ╤ $108) ╚OW MANY FILES WILL A 1581 DISK DRIVE HOLD?
-
- ┴ $108) 296 FILES. ╬OTE THAT IT IS NOT A MULTIPLE OF 144.
-
- ╤ $109) ├OMMODORE 1581 DRIVES HAVE A SPECIAL "AUTOBOOT" FEATURE THAT ENABLES
- THE DRIVE TO LOAD AND RUN A PROGRAM OFF A DISK UPON DRIVE BOOTUP.
- ╫HAT IS THE REQUIRED NAME OF THE FILE?
-
- ┴ $109) ├╧╨┘╥╔╟╚╘ ├┬═ 86
-
- ╤ $10┴) ╫HAT FILETYPE MUST THE FILE MENTIONED IN $109 BE?
-
- ┴ $10┴) ╒╙╥.
-
- ╤ $10┬) ╘O POWER UP A 1351 MOUSE IN "JOYSTICK MODE", WHAT MUST THE USER DO?
-
- ┴ $10┬) ╔F ONE DEPRESSES THE RIGHT MOUSE BUTTON DURING POWER-UP, THE 1351
- WILL BEHAVE JUST LIKE A JOYSTICK.
-
- ╤ $10├) ─ESCRIBE THE CONTENTS OF THE ╨╧╘╪ OR ╨╧╘┘ REGISTERS WHEN USING A
- 1351 MOUSE.
-
- ┴ $10├) ┼ACH REGISTER HOLDS THE SAME TYPE OF INFORMATION, JUST FOR A
- SEPARATE AXIS, SO WE WILL DESCRIBE JUST ONE REGISTER:
-
- ┬IT: ╞UNCTION
-
- 7 ─ON'T CARE
- 6-1 ═OUSE AXIS POSITION MOD 64.
- 0 ╬OISE ┬IT. (CHECK THIS BIT TO SEE WHETHER MOUSE HAS MOVED)
-
- ╤ $10─) ├OMMODORE COMPUTERS TYPICALLY USE MOST OF ZERO PAGE FOR TEMPORARY
- VARIABLES AND OTHER ITEMS. ╚OWEVER, BOTH THE ╓╔├-20 AND THE 64
- RESERVE 4 BYTES FOR USER PROGRAMS THAT NEED ZERO PAGE MEMORY. ╫HERE
- ARE THESE LOCATIONS?
-
- ┴ $10─) $╞┬-$╞┼ (251-254). ╔ AM NOT SURE THESE WERE "RESERVED" FOR
- PROGRAMMERS AS MUCH AS THEY WERE JUST NOT UTILIZED BY THE
- ├┬═ PROGRAMMERS.
-
- ╤ $10┼) ╬AME THE 16 COLORS AVAILABLE ON THE 64.
-
- ┴ $10┼) ┬LACK
- ╫HITE
- ╥ED
- ├YAN (╠IGHT ┬LUE-╟REEN)
- ╨URPLE
- ╟REEN
- ┬LUE
- ┘ELLOW
- ╧RANGE
- ┬ROWN
- ╠IGHT ╥ED
- ─ARK ╟RAY (╟RAY 1)
- ═EDIUM ╟REY (╟RAY 2)
- ╠IGHT ╟REEN
- ╠IGHT ┬LUE
- ╠IGHT ╟RAY (╟RAY 3)
-
- ╤ $10╞) ┬OTH THE ╓╔├-20 AND THE ├64 EMULATE THE OPERATION OF THE 6551 ╒┴╥╘.
- ╚OW MANY "MOCK 6551" REGISTERS ARE MAPPED INTO THE MEMORY MAP?
-
- ┴ $10╞) 5, FROM $293-$297 (659-663). ╘HE REGISTER CONTENTS:
-
- $293 6551 ├ONTROL ╥EGISTER
- $294 6551 ├OMMAND ╥EGISTER
- $295-6 6551 ╒SER ─EFINED ┬AUD ╥ATE VALUE.
- $297 6551 ╙TATUS ╥EGISTER
-
-
- ------------├OMMODORE ╘RIVIA ┼DITION #18 ╤UESTIONS (┬┼╟╔╬)--------------
-
- ╤ $110) ╫HAT IS THE NAME OF THE COMPANY THAT RECENTLY PURCHASED THE
- LIQUIDATED ├OMMODORE ASSETS?
-
- ╤ $111) ┴T ONE TIME, ├OMMODORE ATTEMPTED TO MANUFACTURE A DUAL DRIVE
- VERSION OF THE 1571 CALLED THE 1572. ╞OR WHAT TECHNICAL REASON
- DID IT UTIMATELY FAIL?
-
- ╤ $112) ╧VER WHAT COMPUTER SYSTEM DID A ╒SER ╟ROUP SUE ├OMMODORE AND WIN?
-
- ╤ $113) ╔N $103, THE QUESTION ASKED HOW TO CREATE A GRAPHIC OF A SMALL BOX
- ON THE 1525. ╔N THIS QUESRTION, WE HAVE MADE A DIFFERENT DESIGN.
- ╔F YOU WANTED TO CREATE THE FOLLOWING GRAPHIC USING INDIVIDUAL
- DOTS ON THE PRINTER, WHAT BYTES WOULD YOU SEND TO THE PRINTER AFTER
- TURNING ON GRAPHICS MODE?
-
- ** * *
- * ***
- * ** ***
- * * * * *
- ** ** * *
- * *
- **
-
- ╤ $114) (╙OME ├65 QUESTIONS) ╚OW MANY ╙╔─ CHIPS DOES THE THE DEVELOPMENT
- ├OMMODORE 65 MACHINE CONTAIN?
-
- ╤ $115) ╫HAT ├╨╒ DOES THE ├OMMODORE 65 USE?
-
- ╤ $116) ╫HAT IS THE ALTERNATE NAME FOR THE ├OMMODORE 65?
-
- ╤ $117) ╚OW MANY PROCESSORS DOES THE INTERNAL 1581-COMPATIBLE DRIVE
- ON THE ├65 CONTAIN?
-
- ╤ $118) ╔N THE TRADITION OF NAMING CERTIAN ╔├S AFTER FAMOUS CARTOON
- CHARACTERS, ONE OF THE ╔├S IN THE ├65 IS NAMED AFTER A ╫ARNER
- ┬ROTHERS CARTOON CHARACTER. ╫HICH ONE?
-
- ╤ $119) ╫HAT VERSION OF ┬┴╙╔├ IS INCLUDED ON THE ├OMMODORE 65 IN ├65 MODE?
-
- ╤ $11┴) ╚OW MANY ╔/╧ PORTS DOES A ├OMMODORE 65 CONTAIN?
-
- ╤ $11┬) ╫HAT COMMON ├OMMODORE 64 ╔/╧ PORT DOES THE ├65 ╬╧╘ HAVE?
-
- ╤ $11├) ╚OW MANY FUNCTION KEYS ARE ON A ├OMMODORE 65?
-
- ╤ $11─) ╫HAT ├┬═ DISK DRIVE ─╧╙ WAS USED AS THE TEMPLATE FOR THE INTERNAL
- ├65 DRIVE ─╧╙?
-
- ╤ $11┼) ╫HAT RESOLUTION OF TEXT SCREEN DOES THE ├65 POWER UP IN? (╨LEASE
- GIVE ANSWERS IN CHARACTERS).
-
- ╤ $11╞) ╫HAT DISTINGUISHING NON-TEXTUAL CHARACTERISTIC IN THE ├65 IS NOT
- PRESENT IN OTHE ├OMMODORE 8-BIT COMPUTERS?
-
- ╘HE INFORMATION IN THIS BETWEEN THE LINES MARKED BY (┬┼╟╔╬) AND (┼╬─)
- IS COPYRIGHT 1995 BY ╩IM ┬RAIN. ╨ROVIDED THAT THE INFORMATION
- BETWEEN THE (┬┼╟╔╬) AND (┼╬─) LINES IS NOT CHANGED EXCEPT TO CORRECT
- TYPOGRAPHICAL ERRORS, THE SO MARKED COPYRIGHTED INFORMATION MAY BE
- REPRODUCED IN ITS ENTIRETY ON OTHER NETWORKS OR IN OTHER MEDIUMS. ╞OR
- MORE INFORMATION ABOUT USING THIS FILE, PLEASE CONTACT THE ADDRESS
- SHOWN BELOW.
-
- ╩IM ┬RAIN
- BRAIN@MAIL.MSEN.COM
- 602 ╬ORTH ╠EMEN
- ╞ENTON, ═╔ 48430
- (810) 737-7300 X8528
-
- ╙OME ARE EASY, SOME ARE HARD, TRY YOUR HAND AT:
- ├OMMODORE ╘RIVIA #18!
- ========================================================================
- ┬╞╠╔ - ╬EW GRAPHICS MODES 2
- BY ╨ASI '┴LBERT' ╧JALA <ALBERT@CS.TUT.FI>
-
- ╧NE DAY ╔ WAS WATCHING SOME DEMOS THAT USED LINECRUNCH ROUTINES FOR
- WHOLE-SCREEN MULTICOLOR-GRAPHICS UPSCROLLERS. ╔ ALREADY HAD MY
- THEORIES ABOUT HOW AND WHY LINECRUNCH WORKED, BUT BECAUSE ╔ HAD NOT
- USED IT ANYWHERE, THE DETAILS WERE A BIT VAGUE. ╔N FACT, ╔ HAVE
- MANY TIMES ACCIDENTALLY CREATED LINECRUNCH EFFECTS WHEN TRYING TO DO
- SOMETHING ELSE WITH $─011. ╨ROBABLY EVERY DEMO CODER HAS.
-
- ┬UT YOU LEARN BY DOING. ╔ HAD THE IDEA OF USING LINECRUNCH FOR ╞╠╔
- INSTEAD OF A SIMPLE MULTICOLOR PICTURE AS IT ALWAYS SEEMED TO BE
- USED. ╚OWEVER, THIS HAS PROBABLY BEEN DONE BEFORE AND BECAUSE ╔
- DON'T LIKE TO DO THINGS THAT HAVE BEEN DONE BEFORE, ╔ DECIDED TO USE
- LINECRUNCH TO SHOW A TWO-SCREEN-TALL ╞╠╔ PICTURE.
-
-
- _╠INECRUNCH ┬ASICS_
-
- ╞OR THOSE NOT FAMILIAR WITH LINECRUNCH ROUTINES: LINECRUNCH IS USED
- TO SCROLL THE SCREEN ╒╨╫┴╥─╙ BY CONVINCING ╓╔├-╔╔ THAT IT HAS
- ALREADY SHOWED MORE CHARACTER ROWS THAN IT IN REALITY HAS SHOWN.
- ╙URPRISINGLY (OR THEN, MAYBE NOT :) THIS CONSISTS OF FIDDLING WITH
- $─011. ╘HE TIMING IS CRITICAL AS ALWAYS.
-
- ╠INECRUNCH WORKS BY SETTING $─011 EQUAL THE LINE BEFORE THE CURRENT
- LINE AND ╓╔├-╔╔ WILL HAPPILY THINK THAT IT IS TIME TO MOVE ON TO THE
- NEXT CHARACTER ROW - ADD 40 TO THE VIDEO MATRIX COUNTER, 320 TO THE
- GRAPHICS MEMORY COUNTER AND BE READY TO START A BAD LINE. ╧R, MAYBE
- '╬╧╘ TO GO BACK TO THE CURRENT ROW' WOULD BE A MORE SUITABLE
- DESCRIPTION. (╨ROGRAMMING ╓╔├-╔╔ IS SLOWLY BECOMING A SCIENCE.)
-
- ╘HE REQUIRED TIMING ALSO DOES NOT CAUSE BAD LINES SO THAT YOU CAN
- SKIP ANOTHER LINE IMMEDIATELY ON THE SUCCESSIVE LINE. ╔N ADDITION,
- LINES CAN BE SKIPPED ONLY AFTER THE FIRST CHARACTER ROW AND HALF OF
- THE SECOND CHARACTER ROW HAVE BEEN DISPLAYED. ╘HIS HAS SOMETHING TO
- DO WITH THE WAY ╓╔├-╔╔ DECIDES WHEN THERE IS A BAD LINE.
-
- ┬ECAUSE LINECRUNCH CAUSES ╓╔├-╔╔ TO SKIP ROWS, IT WILL RUN OUT OF
- VIDEO MATRIX AND COLOR MEMORY (AND GRAPHICS MEMORY) BEFORE REACHING
- THE END OF THE SCREEN. ╚OWEVER, ╓╔├-╔╔ DOES NOT STOP DISPLAYING THE
- GRAPHICS NOR DOES IT RESET THE INTERNAL COUNTERS. ╘HE COUNTERS KEEP
- ON RUNNING AND WRAP AROUND INSTEAD.
-
- ╬ORMALLY, WHEN ╓╔├-╔╔ IS DISPLAYING THE LAST CHARACTER ROW, IT IS
- SHOWING THE MEMORY FROM OFFSETS $3C0 TO $3E7. ╔F ╓╔├-╔╔ HAS SKIPPED
- ONE CHARACTER ROW, IT IS DISPLAYING FROM $3E8 TO $40F INSTEAD. ┬UT,
- THERE ARE ONLY 10 BITS FOR THE VIDEO MATRIX COUNTER (0..1023), SO IT
- WRAPS AROUND TO ZERO AFTER $3FF. ╘HIS MEANS THAT THE BEGINNING OF
- THE VIDEO MATRIX IS DISPLAYED AT THE BOTTOM OF THE SCREEN. ╘HE
- CHARACTER ROWS BECOME SHIFTED BY 24 CHARACTER POSITIONS TO THE RIGHT
- BECAUSE THERE WERE ORIGINALLY 24 UNUSED MEMORY LOCATIONS AT THE END
- OF THE MEMORY (1000..1023). (╘O BE HONEST, SPRITE IMAGE POINTERS
- ARE NOT UNUSED MEMORY, BUT THEY ARE NOT USED WITH NORMAL ╞╠╔.)
-
- ____________________ ____________________
- ▄ABCDEFGHIJKLMNOPQRST▄ ▄ABCDEFGHIJKLMNOPQRST▄
- ▄ ▄ ▄--------------------▄ <- ╙KIPPED ROW
- : : : :
- : : : :
- : : : :
- ▄ ▄ ▄NORMALLY LAST LINE ▄
- ▄NORMALLY LAST LINE ▄ ▄╪╪╪╪╪╪╪╪┌┌┌┌ABCDEFGH▄
- └--------------------' └--------------------'
- ╪ = UNUSED MEM (1000..1015)
- ┌ = SPRITE POINTERS (1016..1023)
-
- ╞IGURE 1: ╠INECRUNCH
-
-
- ╘HE SAME THING HAPPENS FOR COLOR MEMORY BECAUSE IT USES THE SAME
- COUNTER FOR ADDRESSING THE MEMORY (IN FACT, COLOR MEMORY ACCESS AND
- CHARACTER DATA ACCESS ARE PERFORMED SIMULTANEOSLY, 12 BITS AT A
- TIME). ╘HE GRAPHICS MEMORY BEHAVES THE SAME WAY, EXCEPT THAT THE
- COUNTER HAS THREE BITS MORE AND IT COUNTS AT EIGHT TIMES THE SPEED,
- SO THAT IT WRAPS AT THE EXACT SAME TIME AS THE OTHER COUNTER.
-
- ╘HE FIRST CHARACTER ROW CAN'T BE USED FOR LINECRUNCH AND THE SECOND
- ONE IS ALSO LOST IN THE PROCESS. ╘HE FIRST USABLE LINE TO DISPLAY
- IS THE THIRD CHARACTER ROW. ╚OWEVER, THOSE TWO LOST ROWS CAN STILL
- BE USED AS AN EXTENSION AT THE END OF THE FIRST SCREEN. ┘OU MUST
- NOTICE, HOWEVER, THAT THE ALIGNMENT HAS BEEN CHANGED. ┴FTER THESE
- TWO ROWS HAVE BEEN DISPLAYED, THE VIDEO BANK IS SWITCHED TO GET NEW
- FRESH DATA ON THE SCREEN.
-
-
- _┬ACK TO ┬╞╠╔_
-
- ╫RAPPED DATA IS NOTHING DIFFICULT TO WORK WITH. ╔T IS JUST THE
- MATTER OF WRITING THE RIGHT CONVERSION PROGRAM. ┴LSO, THE NORMAL
- ╞╠╔ ROUTINE CAN BE USED, WE JUST HAVE TO MAKE SURE ╓╔├ ALWAYS HAS
- THE RIGHT BANK VISIBLE - SIMPLE ╠─┴ BANK,X:STA $──00 CAN ACCOMPLISH
- THAT. ╘HE MORE DIFFICULT ASPECT IS TO MAKE THE DISPLAY FREELY
- LOCATABLE. ╫E HAVE 32 KILOBYTES OF GRAPHICS DATA, THIS IS THE MAIN
- REASON WE CAN'T EVEN THINK ABOUT USING COPYING. ╠INECRUNCH COMBINED
- WITH THE BAD LINE DELAYING TECHNIQUE WILL DO THE JOB MUCH MORE
- NICELY.
-
- ╞IGURE 2 SHOWS THE PRINCIPLES. ╘O MAKE THINGS SIMPLER ╔ HAVE CHOSEN
- LOCATION 0 TO MEAN THAT THE TOP OF THE PICTURE IS VISIBLE, 1 MEANS
- THAT THE PICTURE IS SCROLLED ONE LINE UPWARDS AND SO ON. ╫E CAN SEE
- THAT LINECRUNCH IS NOT USED AT ALL FOR THE LOCATION 0. ╘O MAKE THE
- PICTURE START AT THE SAME POINT WHETHER LINECRUNCH HAS CRUNCHED
- LINES OR NOT WE COMPENSATE THE NON-LOST RASTER LINES BY DELAYING THE
- NEXT BAD LINE. ╫HEN THE LOCATION IS N*8 (N=0,1,2..), THE SUM OF THE
- LINECRUNCHED AND DELAYED LINES IS CONSTANT - THE GRAPHICS DISPLAY
- ALWAYS STARTS AT THE SAME POINT.
-
- ╘HEN HOW DO WE DEAL WITH THE LOCATION VALUES THAT ARE NOT EVENLY
- DIVIDABLE BY EIGHT ? ╬OW, LETS ASSUME THAT THE LOCATION IS ╠, AND
- WE HAVE ├, WHICH IS THE LOCATION DIVIDED BY EIGHT (├ = ╠/8), AND ╥,
- WHICH IS THE REMAINDER (╥ = ╠%8). ╘O MAKE THE PICTURE SCROLL TO THE
- RIGHT POSITION, WE NEED TO DELAY THE BAD LINE LESS THAN BEFORE - ╥
- LINES LESS FOR LOCATION ╠ THAN FOR LOCATION ├*8. ┼.G. FOR LOCATION
- 2 WE DELAY THE BAD LINE TWO LINES LESS THAN FOR LOCATION 0. ╘HIS
- ALSO SHOWS THAT WE NEED 7 LINES MORE THAN IS NEEDED FOR TO
- COMPENSATE FOR THE LINECRUNCH.
-
- ─ETERMINING THE NUMBER OF LINECRUNCH LINES IS A RECURSIVE PROCESS,
- BECAUSE WHEN YOU USE MORE LINECRUNCH LINES, THAT DECREASES THE
- NUMBER OF LINES YOU HAVE AVAILABLE FOR THE DISPLAY AND YOU NEED
- BIGGER RANGE FOR THE LOCATION VALUE. ╘HE LINECRUNCH CAN BE STARTED
- AFTER 12 LINES, AND WE NEED AT LEAST 7 LINES TO USE THE SOFT
- Y-SCROLL. ╘HIS MAKES 181 LINES AVAILABLE FOR THE DISPLAY
- ORIGINALLY.
-
- ┬ECAUSE WE NEED TO SHOW 400 LINES OF GRAPHICS, WE WOULD NEED
- (400-181)/8=28 LINECRUNCH LINES. ╚OWEVER, THIS IN TURN REDUCES THE
- NUMBER OF LINES WE HAVE FOR GRAPHICS TO 181-28=153 AND WE NEED
- (400-153)/8=31 LINECRUNCH LINES. ┴GAIN, 181-31 IS 150. ╫E GET
- (400-150)/8=32 AND THERE IT FINALLY CONVERGES AND WE HAVE 149 LINES
- FOR GRAPHICS, WHICH MAKES LOCATION VALUES 0..251 VALID.
-
-
- ╠OCATION 0 1 2 .. 8 9 .. 251
-
- ___________________.. ___________.. ________
- ___________________.. ___________.. ________
- ╠INECRUNCH -------------------.. ___________..
- ^ ^ ^
- ▄ ▄ ▄ ^ ^
- ▄ ▄ ▄ ▄ ▄
- ┬AD LINE DELAYED▄ ▄ ▄ ▄ ▄
- ▄ ▄ ▄ ▄ ▄ ========
- ▄ ▄ V ▄ ▄ 244
- ▄ V ___.. ▄ V :
- V ________0 V ___.. :
- ╟FX ┼NABLED ________0_______1__.. ________8__.. 250_____
- 0 1 2 8 9 251
- 1 2 3 9 10 252
- 2 3 4 10 11 253
- 3 4 5 11 12 254
- 4 5 6 12 13 255
- 5 6 7 13 14 256
- 6 7 8 14 15 257
- 7 8 9 15 16 258
- : : : : : :
- : : : : : :
- 148 149 150.. 156 157.. 399
-
- ╞IGURE 2: ╠INECRUNCH AND ─═┴ DELAY IN ┬╞╠╔
- (╟RAPHICS LINES NOT IN SCALE)
-
-
- _├LIPPING ADDED_
-
- ╬OW WE CAN SCROLL THE PICTURE TO ANY LOCATION WE WANT, BUT THE TOP
- OF THE PICTURE IS NOT CLIPPED AND IT IS VERY ANNOYING TO WATCH. ╫E
- NEED TO ENABLE THE GRAPHICS AT THE SAME POINT REGARDLESS OF THE
- Y-SCROLL VALUE. ╘HE ANSWER IS IN THE EXTENDED COLOR MODE (┼├═).
-
- ╫HEN BOTH ┼├═ AND MULTICOLOR MODE (═├═) ARE SELECTED, ╓╔├-╔╔ WILL
- TURN THE DISPLAY TO BLACK. ╘HIS IS BECAUSE THERE IS A CONFLICTING
- SITUATION AND IT JUST CAN'T DECIDE WHICH COLOR SCHEME TO USE. ╘HE
- VIDEO ACCESSES WILL CONTINUE TO HAPPEN JUST LIKE BEFORE, THE DATA IS
- JUST NOT DISPLAYED. ╫HEN THE ┼├═ BIT IS CLEARED AGAIN, THE NORMAL
- MULTICOLOR GRAPHICS IS SHOWN.
-
- ╙O, WE SET THE ┼├═ BIT AND START TO DISPLAY THE FIRST EIGHT LINES OF
- THE ╞╠╔. ┬ECAUSE THE ╞╠╔ ROUTINE ALREADY WRITES TO $─011, WE JUST
- MAKE SURE THE ┼├═ BIT IS SET IN THE FIRST ╥ NUMBER OF WRITES TO
- $─011 AND ZERO IN ALL OTHER.
-
- ╘HE VIEWER IS NOW 'COMPLETE'. ┘OU CAN TAKE A LOOK AT THE CODE BELOW
- OR YOU CAN GET ├64╟FX1_4.LHA AND SEE IT IN ACTION YOURSELF AND NOT
- JUST RELY ON MY WORD. ╘HE PACKAGE INCLUDES CONVERTER PROGRAMS FOR
- ┬╞╠╔, ╞╠╔ AND ╦OALA (┴╬╙╔-├), COUPLE OF EXAMPLE PICTURES AND VIEWERS
- FOR ╨┴╠ AND ╬╘╙├ MACHINES.
-
- -╨ASI '┴LBERT' ╧JALA ALBERT@CS.TUT.FI
-
- --------------------------------------------------------------------------
-
- ┬╞╠╔ VIEWER PROGRAM FOR ╨┴╠ MACHINES
-
- ╒╨╧╙ = $├00 ; TEMPORARY AREA FOR TABLES
- ┬┴╬╦ = $─00 ; ╒╨╧╙ FOR LINECRUNCH, ┬┴╬╦ FOR ╞╠╔ BANK SELECT
- ╥┴╙╘┼╥ = 29 ; WHERE TO POSITION THE SPRITE -> ╔╥╤ 20 LINES LATER
- ─╒══┘ = $╞╞╞ ; DUMMY LOCATION FOR TIMING PURPOSES
- ╞╠╔╙┌ = 19-1 ; VISIBLE ╞╠╔ SIZE IN CHARACTER ROWS - 1
-
- *= $810
- ╙┼╔
- ╠─┴ #$7╞:╙╘┴ $─├0─ ; ╔╥╤ SETUP
- ╠─┴ #1:╙╘┴ $─01┴
- ╙╘┴ $─015:╙╘┴ ╦┼┘╫+1
- ╠─┴ #<╔╥╤:╙╘┴ $314
- ╠─┴ #>╔╥╤:╙╘┴ $315
- ╠─┴ #╥┴╙╘┼╥:╙╘┴ $─001:├╠├:┴─├ #20:╙╘┴ $─012
- ╠─┴ #0:╙╘┴ $─017
- ╠─┴ #0:╙╘┴ 2
- ╩╙╥ ╬┼╫╨╧╙ ; ╔NIT THE ╞╠╔ ROUTINES
- ╠─┴ #$┴:╙╘┴ $─011 ; ┬LANK SCREEN
- ╠─╪ #23 ; ╔NIT TABLES
- ┬╠╧╧╨ ╠─┴ #$94:╙╘┴ ┬┴╬╦,╪
- ╠─┴ #$96:╙╘┴ ┬┴╬╦+24,╪
- ─┼╪:┬╨╠ ┬╠╧╧╨
- ╠─╪ #15
- ╠╧╧╨0 ╠─┴ ┘╔╬╔╘,╪:┴╬─ #$77 ; ├HANGE TO $37 TO BETTER SEE THE
- ╙╘┴ ╒╨╧╙,╪ ; WORKINGS OF THE ROUTINES
- ╙╘┴ ╒╨╧╙+16,╪
- ╙╘┴ ╒╨╧╙+32,╪
- ─┼╪:┬╨╠ ╠╧╧╨0
-
- ╠─┴ #$34:╙╘┴ 1 ; ├OPY TO THE LAST VIDEO BANK
- ╠─┴ #$80:╙╘┴ ╙╥├+2 ; FROM $8000-$┬╞╞╞ TO $├000-$╞╞╞╞
- ╠─┴ #$├0:╙╘┴ ─╙╘+2
- ╠─╪ #0:╠─┘ #$40
- ╙╥├ ╠─┴ $8000,╪
- ─╙╘ ╙╘┴ $├000,╪
- ╔╬╪:┬╬┼ ╙╥├
- ╔╬├ ╙╥├+2:╔╬├ ─╙╘+2
- ─┼┘:┬╬┼ ╙╥├
- ╠─┴ #$37:╙╘┴ 1
-
- ╠─╪ #0 ; ╔NIT COLOR MEMORY
- ╠╨ ╠─┴ $3├00,╪:╙╘┴ $─800,╪ ; ┴LL 1024 BYTES ARE USED
- ╠─┴ $3─00,╪:╙╘┴ $─900,╪ ; - SOME EVEN TWICE!
- ╠─┴ $3┼00,╪:╙╘┴ $─┴00,╪
- ╠─┴ $3╞00,╪:╙╘┴ $─┬00,╪
- ╔╬╪:┬╬┼ ╠╨
- ╠─┴ $─├0─:├╠╔
-
- ╦┼┘╫ ╠─╪ #0:┬╬┼ ╦┼┘╫ ; ╫AIT FOR SPACE TO BE PRESSED
- ╙┼╔ ; ╙YSTEM TO NORMAL
- ╠─┴ #$37:╙╘┴ 1
- ╩╙╥ $╞─┴3
- ╠─┴ #$97:╙╘┴ $──00
- ╩╙╥ $┼5┴0
- ╠─┘ #3
- ╔╥╤╠ ╠─┴ $╞─30,┘:╙╘┴ $314,┘
- ─┼┘:┬╨╠ ╔╥╤╠
-
- ╠─╪ #0:╠─┴ #1 ; ├LEAR COLOR MEMORY
- ├╠╠ ╙╘┴ $─800,╪:╙╘┴ $─900,╪
- ╙╘┴ $─┴00,╪:╙╘┴ $─┬00,╪
- ╔╬╪:┬╬┼ ├╠╠
- ├╠╔:╥╘╙
-
- ┘╔╬╔╘ ┬┘╘ $78,$79,$7┴,$7┬,$7├,$7─,$7┼,$7╞
- ┬┘╘ $78,$79,$7┴,$7┬,$7├,$7─,$7┼,$7╞
-
- *=*-<*+256
-
- ╔╥╤ ╠─┴ #$18:╙╘┴ $─016:╠─╪ #0:╠─┴ #$5┴
- ╔╬├ ─╒══┘:─┼├ ─╒══┘ ; ╙YNCHRONIZATION
- ╙╘╪ $─020:╙╘╪ $─021:╙╘┴ $─011
-
- ╠─┴ #$15:╙╘┴ $─018
- ╠─┴ #$97:╙╘┴ $──00
- ╠─╪ #44 ; ╫AIT FOR THE 4TH LINE
- ╠╠ ─┼╪:┬╨╠ ╠╠:╬╧╨
- ╠─╪ #0
-
- ╠╧╧╨3 ╬╧╨ ; ╠INECRUNCH-PART ROUTINE
- ╠─┴ ╒╨╧╙+6,╪:╔╬├ ─╒══┘:╙╘┴ $─011
- ╬╧╨:╬╧╨:╔╬├ ─╒══┘
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╔╬╪
- ┼1 ├╨╪ #$10:┬╬┼ ╠╧╧╨3 ; ╙KIP THAT MANY CHARACTER ROWS-4
- ┬╔╘ $┼┴
- ╠╧╧╨4 ╠─┴ ╒╨╧╙,╪:╔╬├ ─╒══┘:╙╘┴ $─011
- ╬╧╨:╬╧╨:╬╧╨:╔╬├ ─╒══┘
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╠─┴ #0
- ╔╬╪
- ┼2 ├╨╪ #$1╞:┬╬┼ ╠╧╧╨4 ; ─ELAY ─═┴ UNTIL WE ARE AT THE
- ; 'SAME PLACE' EACH TIME
-
- ╠─┴ #0:╙╘┴ $─020 ; ╬OW WAIT FOR THE BAD LINE AND START ╞╠╔
- ┬╔╘ $┼┴:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ╬╧╨:╬╧╨:╬╧╨:╬╧╨
- ┬0 ╠─┴ #$92:╙╘┴ $──00:╬╧╨ ; ╘HE RIGHT VIDEO BANK
-
- ; ╫AIT FOR 0-7 LINES TO SET THE ┼├═ MODE OFF
- ; (MAKES THE GRAPHICS VISIBLE)
-
- ╞0 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$08:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞1 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$18:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞2 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$28:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞3 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$38:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞4 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$48:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞5 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$58:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞6 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$68:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞7 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$78:╙╘┴ $─018
- ╠─╪ #╞╠╔╙┌:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
-
- ; ─O ╞╠╔ 18 MORE CHARACTER ROWS
-
- ╞8 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$08:╙╘┴ $─018
- ┬1 ╠─┴ ┬┴╬╦,╪:╙╘┴ $──00:┬╔╘ $┼┴
- ╞9 ╠─┴ #0:╙╘┴ $─011:╠─┴ #$18:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞┴ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$28:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞┬ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$38:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞├ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$48:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞─ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$58:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞┼ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$68:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
- ╞╞ ╠─┴ #0:╙╘┴ $─011:╠─┴ #$78:╙╘┴ $─018:╬╧╨:╬╧╨:─┼╪:┬═╔ ┼╞╠╔:╩═╨ ╞8
- ┼╞╠╔ ╬╧╨
- ╠─┴ #$╞├
- ╫╠ ├═╨ $─012:┬╬┼ ╫╠
- ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘
- ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘
- ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╙╘┴ $─020
-
- ╩╙╥ ╬┼╫╨╧╙ ; ╒PDATE THE LOCATION
- ╩╙╥ ├╚╨╧╙ ; ├HANGE TO A NEW LOCATION
- ╠─┴ $─├01:┴╬─ #$10:┬╬┼ ╧╓3 ; ├HECK FOR THE SPACE BAR
- ╠─┴ #0:╙╘┴ ╦┼┘╫+1
- ╧╓3 ╠─╪ #$53:╙╘╪ $─011:╔╬├ $─019:╩═╨ $┼┴81
-
- ╬┼╫╨╧╙ ╠─┴ #0 ; ╔NIT THE ╔╥╤ ROUTINE FOR THIS POSITION
- ╠╙╥:╠╙╥:╠╙╥:├╠├:┴─├ #4:╙╘┴ ┼1+1
- ╠─┴ #7:╙┼├:╙┬├ ╬┼╫╨╧╙+1:┴╬─ #7:╘┴╪:╘┴┘:├╠├:┴─├ #35:╙╘┴ ┼2+1
- ╠─┴ ╒╨╧╙+3+7,┘:─┼╪:┬═╔ ╩0:┴╬─ #$3╞
- ╩0 ╙╘┴ ╞7+1:┴╬─ #$3╞:╙╘┴ ╞╞+1
- ╠─┴ ╒╨╧╙+3+6,┘:─┼╪:┬═╔ ╩1:┴╬─ #$3╞
- ╩1 ╙╘┴ ╞6+1:┴╬─ #$3╞:╙╘┴ ╞┼+1
- ╠─┴ ╒╨╧╙+3+5,┘:─┼╪:┬═╔ ╩2:┴╬─ #$3╞
- ╩2 ╙╘┴ ╞5+1:┴╬─ #$3╞:╙╘┴ ╞─+1
- ╠─┴ ╒╨╧╙+3+4,┘:─┼╪:┬═╔ ╩3:┴╬─ #$3╞
- ╩3 ╙╘┴ ╞4+1:┴╬─ #$3╞:╙╘┴ ╞├+1
- ╠─┴ ╒╨╧╙+3+3,┘:─┼╪:┬═╔ ╩4:┴╬─ #$3╞
- ╩4 ╙╘┴ ╞3+1:┴╬─ #$3╞:╙╘┴ ╞┬+1
- ╠─┴ ╒╨╧╙+3+2,┘:─┼╪:┬═╔ ╩5:┴╬─ #$3╞
- ╩5 ╙╘┴ ╞2+1:┴╬─ #$3╞:╙╘┴ ╞┴+1
- ╠─┴ ╒╨╧╙+3+1,┘:─┼╪:┬═╔ ╩6:┴╬─ #$3╞
- ╩6 ╙╘┴ ╞1+1:┴╬─ #$3╞:╙╘┴ ╞9+1
- ╠─┴ ╒╨╧╙+3+0,┘:─┼╪:┬═╔ ╩7:┴╬─ #$3╞
- ╩7 ╙╘┴ ╞0+1:┴╬─ #$3╞:╙╘┴ ╞8+1
- ╠─┴ #$96:╙╘┴ ┬0+1:╠─┴ #199:╙┼├:╙┬├ ╬┼╫╨╧╙+1:┬├├ ╧╓2
- ╠╙╥:╠╙╥:╠╙╥:├╠├:┴─├ #5:╙╘┴ ┬1+1
- ╥╘╙
- ╧╓2 ╠─┴ #0:╙╘┴ ┬1+1:╠─╪ #$94:╙╘╪ ┬0+1:╥╘╙
-
- ├╚╨╧╙ ╠─╪ ╬┼╫╨╧╙+1
- ╠─┴ $─├00:╘┴┘ ; ╟ET JOYSTICK
- ┴╬─ #$10:┬╬┼ ─╔╥ ; ╔F NO BUTTON PRESSED
- ╘┘┴:┴╬─ #1:┬┼╤ ╒╨ ; ╔F JOY UP
- ╘┘┴:┴╬─ #2:┬┼╤ ─╧╫╬ ; ╔F JOY DOWN
- ╥╘╙
- ─╔╥ ╠─┴ #0:┬┼╤ ╒╨
- ─╧╫╬ ─┼╪:├╨╪ #$╞╞:┬╬┼ ─╧╦
- ╠─╪ #0:╙╘╪ ─╔╥+1 ; ├HANGE DIRECTION
- ─╧╦ ╙╘╪ ╬┼╫╨╧╙+1:╥╘╙
- ╒╨ ╔╬╪:├╨╪ #$╞─:┬├├ ╒╧╦ ; 251(LOCATIONS)+149(VISIBLE)=400
- ╠─╪ #$╞├:╙╘╪ ─╔╥+1 ; ├HANGE DIRECTION
- ╒╧╦ ╙╘╪ ╬┼╫╨╧╙+1:╥╘╙
-
-
- --------------------------------------------------------------------------
-
- ╘HE ┬╞╠╔ FILE FORMAT:
-
- ╞ILE ┬╞╠╔ ─ISPLAY
- ╠INES ╧FFSET ╧FFSET ╠INES ╙IZE
- ├OLORS 0-1.3 0..55 944..999 22.7-24 56
- ╔ 1.3-2 56..79 - 24
- 2-24 80..999 0..919 0-22 920
- 24-24.7 1000..1023 920..943 22-22.7 24
-
- ╔╔ 0-1.3 0..55 1968..2024 49.3-50.6 56
- 1.3-24.7 56..1023 1000..1967 24-49.3 968
-
-
- ╟FX 0-1.3 0..447 7552..7999 22.7-24 448
- ╔ 1.3-2 448..639 - 192
- 2-24 640..7999 0..7359 0-22 7360
- 24-24.7 8000..8191 7360..7551 22-22.7 192
-
- ╔╔ 0-1.3 0..447 15744..16192 49.3-50.6 448
- 1.3-24.7 448..8191 8000..15743 24-49.3 7744
-
- ========================================================================
- ═AKING STABLE RASTER ROUTINES (├64 AND ╓╔├-20)
- BY ═ARKO ═AKELA (═ARKO.═AKELA@╚╒╘.╞╔)
-
- ╨REFACE
-
- ╘OO MANY GRAPHICAL EFFECTS, ALSO CALLED RASTER EFFECTS, HAVE BEEN
- CODED IN A VERY SLOPPY WAY. ╞OR INSTANCE, IF THERE ARE ANY COLOR BARS
- ON THE SCREEN IN A GAME OR DEMO, THE COLORS OFTEN JITTER A BIT,
- E.G. THEY ARE NOT STABLE. ┴ND ALSO, IT IS FAR TOO EASY TO MAKE
- VIRTUALLY ANY DEMO CRASH BY HITTING THE ╥ESTORE KEY, OR AT LEAST CAUSE
- VISUAL DISTORTIONS ON THE SCREEN.
-
- ┴S LATE AS A YEAR AGO ╔ STILL HADN'T CODED A STABLE RASTER INTERRUPT
- ROUTINE MYSELF. ┬UT THEN ╔ HAD TO DO IT, SINCE ╔ WAS RESEARCHING THE
- VIDEO CHIP TIMING DETAILS TOGETHER WITH MY ╟ERMAN FRIEND ┴NDREAS
- ┬OOSE. ╔T WAS ASHAMING THAT WE HAD THE SAME LEVEL OF KNOWLEDGE WHEN
- IT CAME TO THE HARDWARE, BUT HE WAS THE ONLY OF US WHO HAD WRITTEN A
- STABLE RASTER ROUTINE. ╫ELL, FINALLY ╔ MADE ME TO START CODING. ╔
- USED THE SAME DOUBLE-INTERRUPT IDEA AS ┴NDREAS USED IN HIS ROUTINE.
-
- ┴FTER A COUPLE OF ERRORS MY ROUTINE WORKED, AND ╔ UNDERSTOOD HOW IT
- WORKS EXACTLY. (╘HIS IS SOMETHING THAT SEPARATES US NORMAL CODERS
- FROM DEMO PEOPLE: ╘HEY OFTEN CODE BY INSTINCT; BY PATCHING THE ROUTINE
- UNTIL IT WORKS, WITHOUT KNOWING EXACTLY WHAT IS HAPPENING. ╘HAT'S WHY
- DEMOS OFTEN RELY ON WEIRD THINGS, LIKE CRASH IF THE MEMORY IS NOT
- INITIALIZED PROPERLY.)
-
- ╔N THIS ARTICLE, ╔ DOCUMENT TWO METHODS OF CREATING STABLE RASTER
- ROUTINES ON ├OMMODORE COMPUTERS. ╘HE PRINCIPLES APPLY FOR MOST 8-BIT
- COMPUTERS, NOT ONLY ├OMMODORES, BUT RASTER EFFECTS ARE VERY RARELY
- SEEN ON OTHER COMPUTERS.
-
-
- ┬ACKGROUND
-
- ╫HAT ARE RASTER EFFECTS? ╘HEY ARE EFFECTS, WHERE YOU CHANGE THE
- SCREEN APPEARANCE WHILE IT IS BEING DRAWN. ╞OR INSTANCE, YOU CAN SET
- THE SCREEN COLOR TO WHITE IN THE TOP OF THE SCREEN, AND TO BLACK IN
- THE MIDDLE OF THE SCREEN. ╔N THAT WAY, YOU WILL GET A PICTURE WHOSE
- TOP HALF IS WHITE AND BOTTOM HALF BLACK. ╬ORMALLY SUCH EFFECTS ARE
- IMPLEMENTED WITH INTERRUPT ROUTINES THAT ARE EXECUTED SYNCHRONIZED
- WITH THE SCREEN REFRESH.
-
- ╘HE VIDEO CHIP ON THE ├OMMODORE 64 AND MANY OTHER VIDEOCHIPS HAVE A
- SPECIAL INTERRUPT FEATURE CALLED THE ╥ASTER INTERRUPT. ╔T WILL
- GENERATE AN ╔╥╤ IN THE BEGINNING OF A SPECIFIED RASTER LINE. ╧N OTHER
- COMPUTERS, LIKE THE ╓╔├-20, THERE IS NO ╥ASTER INTERRUPT, BUT YOU CAN
- GENERATE THE INTERRUPTS WITH A TIMER, PROVIDED THAT THE TIMER AND THE
- VIDEOCHIP ARE CLOCKED FROM THE SAME SOURCE.
-
- ┼VEN IF THE PROCESSOR GETS AN INTERRUPT SIGNAL AT THE SAME POSITION ON
- EACH VIDEO FRAME, IT WON'T ALWAYS BE EXECUTING THE FIRST INSTRUCTION
- OF THE INTERRUPT ROUTINE AT THE SAME SCREEN POSITION. ╘HE ╬═╧╙ 6502
- MACHINE INSTRUCTIONS CAN TAKE 2 TO 9 MACHINE CYCLES TO EXECUTE, AND IF
- THE MAIN PROGRAM CONTAINS INSTRUCTIONS OF VERY VARYING LENGTHS, THE
- BEGINNING POSITION OF THE INTERRUPT CAN JUMP BETWEEN 7 DIFFERENT
- POSITIONS. ╘HIS IS WHY YOU NEED TO SYNCHRONIZE THE RASTER ROUTINE
- WHEN DOING SERIOUS EFFECTS.
-
- ┴LSO, EXECUTING THE INTERRUPT SEQUENCE WILL TAKE 7 ADDITIONAL CYCLES,
- AND THE INTERRUPT SEQUENCE WILL ONLY START AFTER THE CURRENT
- INSTRUCTION IF THE INTERRUPT ARRIVED AT LEAST TWO CYCLES BEFORE THE
- END OF THE CURRENT INSTRUCTION. ╔T IS EVEN POSSIBLE THAT AN INTERRUPT
- ARRIVES WHILE INTERRUPTS ARE DISABLED AND THE PROCESSOR IS JUST
- STARTING TO EXECUTE A ├╠╔ INSTRUCTION. ┴LAS, THE PROCESSOR WILL NOT
- JUMP TO THE INTERRUPT RIGHT AFTER THE ├╠╔, BUT IT WILL EXECUTE THE
- NEXT INSTRUCTION BEFORE JUMPING TO IT. ╘HIS IS NATURAL, SINCE THE ├╠╔
- TAKES ONLY TWO CYCLES. ┬UT ANYWAY, THIS IS ONLY A CONSTANT IN OUR
- EQUATION, AND ACTUALLY OUT OF THE SCOPE OF THIS ARTICLE.
-
- ╚OW TO SYNCHRONIZE A RASTER INTERRUPT ROUTINE? ╘HE ONLY WAY IS TO
- CHECK THE CURRENT SCREEN POSITION AND DELAY APPROPRIATELY MANY CYCLES.
- ╘HERE ARE SEVERAL WAYS OF DOING THIS, SOME OF WHICH ARE VERY AWFUL AND
- INEFFICIENT. ╘HE UGLIEST WAYS OF DOING THIS ON THE ├OMMODORE 64 ╔
- KNOW ARE BUSY-WAITING SEVERAL RASTER LINES AND POLLING THE RASTER LINE
- VALUE, OR USING THE ╠IGHT PEN FEATURE, WHICH WILL FAIL IF THE USER
- PRESSES THE FIRE BUTTON ON ╩OYSTICK PORT 1. ╚ERE ╔ WILL PRESENT TWO
- WAYS, BOTH VERY ELEGANT IN MY OPINION.
-
-
- ╒SING AN AUXILIARY TIMER
-
- ╧N THE ╓╔├-20, THERE IS NO ╥ASTER INTERRUPT FEATURE IN THE VIDEO CHIP.
- ┴LL YOU CAN DO IS TO USE A TIMER FOR GENERATING RASTER INTERRUPTS.
- ┴ND IF YOU USE TWO TIMERS RUNNING AT A CONSTANT PHASE DIFFERENCE, YOU
- CAN GET FULL SYNCHRONIZATION. ╘HE FIRST TIMER GENERATES THE RASTER
- INTERRUPT, AND THE SECOND TIMER, THE AUXILIARY TIMER, TELLS THE RASTER
- ROUTINE WHERE IT IS RUNNING. ┴CTUALLY YOU COULD EVEN USE THE FIRST
- TIMER ALSO FOR THE CHECKING, BUT THE CODE WILL LOOK NICER IN THE WAY ╔
- WILL BE PRESENTING NOW. ┬ESIDES, YOU CAN USE THE AUXILIARY TIMER IDEA
- EVEN WHEN REAL RASTER INTERRUPTS ARE AVAILABLE.
-
- ╘HE MAJOR DRAWBACK OF USING AN AUXILIARY TIMER IS INITIALIZING IT.
- ╘HE INITIALIZATION ROUTINE MUST SYNCHRONIZE WITH THE SCREEN, THAT IS,
- WAIT FOR THE BEGINNING OF THE WANTED RASTER LINE. ╘O ACCOMPLISH THIS,
- THE ROUTINE MUST FIRST WAIT FOR A RASTER LINE THAT OCCURS A BIT
- EARLIER. ┴BOUT THE ONLY WAY TO DO THIS IS WITH A LOOP LIKE
-
- ╠─┴ #VALUE
- LOOP ├═╨ RASTER
- ┬╬┼ LOOP
-
- ╧NE ROUND OF THIS LOOP WILL TAKE 4+3=7 CYCLES TO EXECUTE, ASSUMING
- THAT ABSOLUTE ADDRESSING IS BEING USED. ╘HE LOOP WILL BE FINISHED IF
- THE RASTER REGISTER CONTAINS THE WANTED VALUE WHILE THE PROCESSOR
- READS IT ON THE LAST CYCLE OF THE ├═╨ INSTRUCTION. ╘HE RASTER
- REGISTER CAN ACTUALLY HAVE CHANGED ALREADY ON THE FIRST CYCLE OF THE
- ┬╬┼ INSTRUCTION ON THE PREVIOUS RUN OF THE LOOP, THAT IS 7 CYCLES
- EARLIER!
-
- ┬ECAUSE OF THIS, THE ROUTINE MUST POLL THE RASTER REGISTER FOR SEVERAL
- RASTER LINES, ALWAYS CONSUMING ONE CYCLE MORE IF THE RASTER REGISTER
- CHANGED TOO EARLY. ┴S THE SYNCHRONIZATION CAN BE OFF AT MOST BY 7
- CYCLES, A LOOP OF 7 RASTER REGISTER VALUE CHANGES WOULD DO, BUT ╔ MADE
- THE LOOP A BIT LONGER IN MY ╓╔├-20 ROUTINE. (╫ELL, ╔ HAVE TO ADMIT IT,
- ╔ WAS TOO LAZY TO MAKE IT WORK ONLY WITH 7 ROUNDS.)
-
- ┴FTER THE INITIALIZATION ROUTINE IS FULLY SYNCHRONIZED THE SCREEN, IT
- CAN SET UP THE TIMER(S) AND INTERRUPTS AND EXIT. ╘HE AUXILIARY TIMER
- IN MY ╓╔├-20 DEMO ROUTINE IS SEVERAL DOZENS OF CYCLES AFTER THE
- PRIMARY TIMER, SEE THE SOURCE CODE FOR COMMENTS. ╔T IS ARRANGED SO
- THAT THE AUXILIARY TIMER WILL BE AT LEAST 0 WHEN IT IS BEING READ IN
- THE RASTER ROUTINE. ╘HE RASTER ROUTINE WILL WAIT AS MANY EXTRA CYCLES
- AS THE AUXILIARY TIMER READS, HOWEVER AT MOST 15 CYCLES.
-
-
- ╒SING DOUBLE RASTER INTERRUPT
-
- ╧N THE ├OMMODORE 64, ╔ HAVE NEVER SEEN THE AUXILIARY TIMER SCHEME
- BEING USED. ┴CTUALLY ╔ HAVEN'T SEEN IT BEING USED ANYWHERE, ╔ WAS
- PROBABLY THE FIRST ONE WHO MADE A STABLE RASTER INTERRUPT ROUTINE ON
- THE ╓╔├-20. ╔NSTEAD, THE DOUBLE INTERRUPT METHOD IS BECOMING THE
- STANDARD ON THE ├64 SIDE.
-
- ╘HE DOUBLE INTERRUPT METHOD IS BASED ENTIRELY ON THE ╥ASTER INTERRUPT
- FEATURE OF THE VIDEO CHIP. ╔N THE FIRST RASTER INTERRUPT ROUTINE, THE
- PROGRAM SETS UP ANOTHER RASTER INTERRUPT ON A FURTHER LINE, CHANGES
- THE INTERRUPT VECTOR AND ENABLES INTERRUPTS.
-
- ╔N THE PLACE WHERE THE SECOND RASTER INTERRUPT WILL OCCUR, THERE WILL
- BE 2-BYTE INSTRUCTIONS IN THE FIRST INTERRUPT ROUTINE. ╔N THIS WAY,
- THE BEGINNING OF THE NEXT RASTER INTERRUPT WILL BE OFF AT MOST BY ONE
- CYCLE. ╙OME CODERS MIGHT NOT CARE ABOUT THIS ONE CYCLE, BUT IF YOU
- CAN DO IT RIGHT, WHY WOULDN'T YOU DO IT RIGHT UNTIL THE END?
-
- ┴T THE BEGINNING OF THE SECOND RASTER INTERRUPT ROUTINE, YOU WILL READ
- THE RASTER LINE COUNTER REGISTER AT THE POINT WHERE IT IS ABOUT TO
- CHANGE. ╫HEN THE RASTER ROUTINE IS BEING EXECUTED, THERE ARE TWO
- POSSIBILITIES: ┼ITHER THE RASTER COUNTER HAS JUST CHANGED, OR IT WILL
- CHANGE ON THE NEXT CYCLE. ╙O, YOU JUST NEED TO COMPARE IF THE
- REGISTER CHANGED ONE CYCLE TOO EARLY OR NOT, AND DELAY A CYCLE WHEN
- NEEDED. ╘HIS IS EASILY ACCOMPLISHED WITH A BRANCH TO THE NEXT ADDRESS.
-
- ╧F COURSE, SOMEWHERE IN YOUR SECOND RASTER INTERRUPT ROUTINE YOU MUST
- RESTORE THE ORIGINAL RASTER INTERRUPT POSITION AND SET THE INTERRUPT
- VECTOR TO POINT TO THE FIRST INTERRUPT ROUTINE.
-
-
- ┴PPLYING IN PRACTICE
-
- ╔ ALMOST FORGOT MY COMPLAINTS ABOUT DEMOS CRASHING WHEN YOU ACTIVELY
- HIT THE ╥ESTORE KEY. ╧N THE ╓╔├-20, YOU CAN DISABLE ╬═╔ INTERRUPTS
- GENERATED BY THE ╥ESTORE KEY, AND ON THE ├64, YOU CAN GENERATE AN ╬═╔
- INTERRUPT WITH THE ├╔┴2 TIMER AND LEAVE THE ╬═╔-LINE LOW, SO THAT NO
- FURTHER HIGH-TO-LOW TRANSITIONS WILL BE RECOGNIZED ON THE LINE. ╘HE
- EXAMPLE PROGRAMS DEMONSTRATE HOW TO DO THIS.
-
- ╙O FAR, THIS ARTICLE HAS BEEN PRETTY THEORETICAL. ╘O APPLY THESE
- RESULTS IN PRACTICE, YOU MUST DEFINITELY KNOW HOW MANY ├╨╒ CLOCK
- CYCLES THE VIDEO CHIP CONSUMES WHILE DRAWING A SCAN LINE. ╘HIS IS
- FAIRLY EASY TO MEASURE WITH A TIMER INTERRUPT, IF YOU PATCH THE
- INTERRUPT HANDLER SO THAT IT CHANGES THE SCREEN COLOR ON EACH RUN.
- ╙ET THE TIMER INTERVAL TO ╠╔╬┼╙*├╧╠╒═╬╙ CYCLES, WHERE ╠╔╬┼╙ IS THE
- AMOUNT OF RASTER LINES AND ├╧╠╒═╬╙ IS YOUR GUESS FOR THE AMOUNT OF
- CLOCK CYCLES SPENT IN A RASTER LINE.
-
- ╔F YOUR GUESS IS RIGHT, THE COLOR WILL ALWAYS BE CHANGED IN THE SAME
- SCREEN POSITION (NEGLECTING THE 7-CYCLE JITTER). ╫HEN ADJUSTING THE
- TIMER, REMEMBER THAT THE TIMERS ON THE 6522 ╓╔┴ REQUIRE 2 CYCLES FOR
- RE-LOADING, AND THE ONES ON THE 6526 ├╔┴ NEED ONE EXTRA CYCLE. ╦EEP
- TRYING DIFFERENT TIMER VALUES UNTIL YOU THE SCREEN COLOR CHANGES AT
- ONE FIXED POSITION.
-
- ├OMMODORE USED SEVERAL DIFFERENT VALUES FOR ╠╔╬┼╙ AND ├╧╠╒═╬╙ ON ITS
- VIDEOCHIPS. ╘HEY NEVER MANAGED TO MAKE THE SCREEN REFRESH RATE
- EXACTLY 50 OR 60 ╚ERTZ, BUT THEY DIDN'T HESITATE TO CLAIM THAT THEIR
- COMPUTERS COMPLY WITH THE ╨┴╠-┬ OR ╬╘╙├-═ STANDARDS. ╔N THE FOLLOWING
- TABLES ╔ HAVE GATHERED SOME INFORMATION OF SOME ├OMMODORE VIDEO CHIPS.
-
-
- ╬╘╙├-═ SYSTEMS:
-
- ├HIP ├RYSTAL ─OT ╨ROCESSOR ├YCLES/ ╠INES/
- ╚OST ╔─ FREQ/╚Z CLOCK/╚Z CLOCK/╚Z LINE FRAME
- ------ -------- -------- -------- --------- ------- ------
- ╓╔├-20 6560-101 14318181 4090909 1022727 65 261
- ├64 6567╥56┴ 14318181 8181818 1022727 64 262
- ├64 6567╥8 14318181 8181818 1022727 65 263
-
- ╠ATER ╬╘╙├-═ VIDEO CHIPS WERE MOST PROBABLY LIKE THE 6567╥8. ╬OTE
- THAT THE PROCESSOR CLOCK IS A 14TH OF THE CRYSTAL FREQUENCY ON ALL
- ╬╘╙├-═ SYSTEMS.
-
- ╨┴╠-┬ SYSTEMS:
-
- ├HIP ├RYSTAL ─OT ╨ROCESSOR ├YCLES/ ╠INES/
- ╚OST ╔─ FREQ/╚Z CLOCK/╚Z CLOCK/╚Z LINE FRAME
- ------ -------- -------- -------- --------- ------- ------
- ╓╔├-20 6561-101 4433618 4433618 1108405 71 312
- ├64 6569 17734472 7881988 985248 63 312
-
- ╧N THE ╨┴╠-┬ ╓╔├-20, THE CRYSTAL FREQUENCY IS SIMULTANEOUSLY THE DOT
- CLOCK, WHICH IS ┬╘╫ A 4TH OF THE CRYSTAL FREQUENCY USED ON THE ├64.
- ╧N THE ├64, THE CRYSTAL FREQUENCY IS DIVIDED BY 18 TO GENERATE THE
- PROCESSOR CLOCK, WHICH IN TURN IS MULTIPLIED BY 8 TO GENERATE THE
- DOT CLOCK.
-
- ╘HE BASIC TIMINGS ARE THE SAME ON ALL 6569 REVISIONS, AND ALSO ON
- ANY LATER ├64 AND ├128 VIDEO CHIPS. ╔F ╔ REMEMBER CORRECTLY, THESE
- VALUES WERE THE SAME ON THE ├16 VIDEOCHIP ╘┼─ AS WELL.
-
- ╬OTE THAT THE DOT CLOCK IS 4 TIMES THE PROCESSOR CLOCK ON THE ╓╔├-20,
- AND 8 TIMES THAT ON THE ├64. ╘HAT IS, ONE PROCESSOR CYCLE IS HALF A
- CHARACTER WIDE ON THE ╓╔├-20, AND A FULL CHARACTER ON A ├64. ╔ DON'T
- HAVE EXACT MEASUREMENTS OF THE ╓╔├-20 TIMING, BUT IT SEEMS THAT WHILE
- THE ╓╔├-20 VIDEOCHIPS DRAW THE CHARACTERS ON THE SCREEN, IT FIRST
- READS THE CHARACTER CODE, AND THEN, ON THE FOLLOWING VIDEO CYCLE, THE
- APPEARANCE ON THE CURRENT CHARACTER LINE. ╘HERE ARE NO BAD LINES,
- LIKE ON THE ├64, WHERE THE CHARACTER CODES (AND COLORS) ARE FETCHED ON
- EVERY 8TH RASTER LINE.
-
- ╘HOSE ONES WHO GOT UPSET WHEN ╔ SAID THAT ├OMMODORE HAS NEVER MANAGED
- TO MAKE A FULLY ╨┴╠-┬ OR ╬╘╙├-═ COMPLIANT 8-BIT COMPUTER SHOULD TAKE A
- CLOSER LOOK AT THE "╠INES/FRAME" COLUMNS. ╔F THAT DOES NOT CONVINCE
- YOU, CALCULATE THE RASTER LINE RATE AND THE SCREEN REFRESH RATE FROM
- THE VALUES IN THE TABLE AND SEE THAT THEY DON'T COMPLY WITH THE
- STANDARDS. ╘O CALCULATE THE LINE RATE, DIVIDE THE PROCESSOR CLOCK
- FREQUENCY BY THE AMOUNT OF CYCLES PER LINE. ╘O GET THE SCREEN REFRESH
- RATE, DIVIDE THAT FREQUENCY BY THE AMOUNT OF RASTER LINES.
-
-
- ╘HE ├ODE
-
- ╧╦, ENOUGH THEORY AND BACKGROUND. ╚ERE ARE THE TWO EXAMPLE PROGRAMS,
- ONE FOR THE ╓╔├-20 AND ONE FOR THE ├64. ╔N ORDER TO FULLY UNDERSTAND
- THEM, YOU NEED TO KNOW THE EXACT EXECUTION TIMES OF ╬═╧╙ 6502
- INSTRUCTIONS. (┴LL 8-BIT ├OMMODORE COMPUTERS USE THE ╬═╧╙ 6502
- PROCESSOR CORE, EXCEPT THE ├65 PROTOTYPE, WHICH USED A INFERIOR ├═╧╙
- VERSION WITH ALL NICE POORLY-DOCUMENTED FEATURES REMOVED.) ┘OU SHOULD
- CHECK THE 64DOC DOCUMENT, AVAILABLE ON MY ╫╫╫ PAGES AT
- HTTP://WWW.HUT.FI/▐MSMAKELA/CBM/EMUL/X64/64DOC.HTML, OR VIA ╞╘╨ AT
- FTP.FUNET.FI:/PUB/CBM/DOCUMENTS/64DOC. ╔ CAN ALSO E-MAIL IT TO YOU ON
- REQUEST.
-
- ┴LSO, ╔ HAVE WRITTEN A COMPLETE DESCRIPTION OF THE VIDEO TIMING ON THE
- 6567╥56┴, 6567╥8 AND 6569 VIDEO CHIPS, WHICH COULD MAYBE BE TURNED
- INTO ANOTHER ├=╚ACKING ARTICLE. ╘HE DOCUMENT IS CURRENTLY PARTIALLY
- IN ┼NGLISH AND PARTIALLY IN ╟ERMAN. ╘HE ┼NGLISH PART IS AVAILABLE
- FROM FTP.FUNET.FI AS /PUB/CBM/DOCUMENTS/PAL.TIMING, AND ╔ CAN SEND
- COPIES OF THE ╟ERMAN PART (SCREEN RESOLUTION, SPRITE DISTURBANCE
- MEASUREMENTS, AND MORE PRECISE TIMING INFORMATION) VIA E-MAIL.
-
- ╘HE CODE IS WRITTEN FOR THE ─┴╙═ ASSEMBLER, OR MORE PRECISELY FOR A
- EXTENDED ┴╬╙╔ ├ PORT OF IT MADE BY ╧LAF ╙EIBERT. ╘HIS EXCELLENT
- CROSS-ASSEMBLER IS AVAILABLE AT FTP.FUNET.FI IN /PUB/CBM/PROGRAMMING.
-
- ╞IRST THE RASTER DEMO FOR THE ╓╔├-20. ╬OTE THAT ON THE ╓╔├-20, THE
- $9004 REGISTER CONTAINS THE UPPER 8 BITS OF THE RASTER COUNTER. ╙O,
- THIS REGISTER CHANGES ONLY ON EVERY SECOND LINE. ╔ HAVE TESTED THE
- PROGRAM ON MY 6561-101-BASED ╓╔├-20, BUT NOT ON AN ╬╘╙├-═ SYSTEM.
-
- ╔T WAS HARD TO GET IN CONTACT WITH ╬╘╙├-═ ╓╔├-20 OWNERS. ─ANIEL
- ─ALLMANN, WHO HAS A ╬╘╙├-═ ╓╔├-20, ALTHOUGH HE LIVES IN ╟ERMANY, RAN
- MY TEST TO DETERMINE THE AMOUNT OF CYCLES PER LINE AND LINES PER FRAME
- ON THE 6560-101. ╒NFORTUNATELY, THE SECOND ╓╔┴ OF HIS ╓╔├-20 IS
- PARTIALLY BROKEN, AND BECAUSE OF THIS, THIS PROGRAM DID NOT WORK ON
- HIS COMPUTER. ├RAIG ┬RUCE RAN THE PROGRAM ONCE, AND HE REPORTED THAT
- IT ALMOST WORKED. ╔ CORRECTED A LITTLE BUG IN THE CODE, SO THAT NOW
- THE DISPLAY SHOULD BE STABLE ON AN ╬╘╙├-═ SYSTEM, TOO. ┬UT THE ACTUAL
- RASTER EFFECT, SIX 16*16-PIXEL BOXES CENTERED AT THE TOP BORDER, ARE
- VERY LIKELY TO BE OFF THEIR POSITION.
-
-
- PROCESSOR 6502
-
- ╬╘╙├ = 1
- ╨┴╠ = 2
-
- ;╙┘╙╘┼═ = ╬╘╙├ ; 6560-101: 65 CYCLES PER RASTER LINE, 261 LINES
- ╙┘╙╘┼═ = ╨┴╠ ; 6561-101: 71 CYCLES PER RASTER LINE, 312 LINES
-
- #IF ╙┘╙╘┼═ & ╨┴╠
- ╠╔╬┼╙ = 312
- ├┘├╠┼╙_╨┼╥_╠╔╬┼ = 71
- #ENDIF
- #IF ╙┘╙╘┼═ & ╬╘╙├
- ╠╔╬┼╙ = 261
- ├┘├╠┼╙_╨┼╥_╠╔╬┼ = 65
- #ENDIF
- ╘╔═┼╥_╓┴╠╒┼ = ╠╔╬┼╙ * ├┘├╠┼╙_╨┼╥_╠╔╬┼ - 2
-
- .ORG $1001 ; FOR THE UNEXPANDED ╓IC-20
-
- ; ╘HE ┬┴╙╔├ LINE
-
- BASIC:
- .WORD 0$ ; LINK TO NEXT LINE
- .WORD 1995 ; LINE NUMBER
- .BYTE $9┼ ; ╙┘╙ TOKEN
-
- ; ╙┘╙ DIGITS
-
- .IF (* + 8) / 10000
- .BYTE $30 + (* + 8) / 10000
- .ENDIF
- .IF (* + 7) / 1000
- .BYTE $30 + (* + 7) % 10000 / 1000
- .ENDIF
- .IF (* + 6) / 100
- .BYTE $30 + (* + 6) % 1000 / 100
- .ENDIF
- .IF (* + 5) / 10
- .BYTE $30 + (* + 5) % 100 / 10
- .ENDIF
- .BYTE $30 + (* + 4) % 10
- 0$:
- .BYTE 0,0,0 ; END OF ┬┴╙╔├ PROGRAM
-
- START:
- LDA #$7F
- STA $912E ; DISABLE AND ACKNOWLEDGE INTERRUPTS
- STA $912D
- STA $911E ; DISABLE ╬═╔S (╥ESTORE KEY)
-
- ;SYNCHRONIZE WITH THE SCREEN
- SYNC:
- LDX #28 ; WAIT FOR THIS RASTER LINE (TIMES 2)
- 0$:
- CPX $9004
- BNE 0$ ; AT THIS STAGE, THE INACCURACY IS 7 CLOCK CYCLES
- ; THE PROCESSOR IS IN THIS PLACE 2 TO 9 CYCLES
- ; AFTER $9004 HAS CHANGED
- LDY #9
- BIT $24
- 1$:
- LDX $9004
- TXA
- BIT $24
- #IF ╙┘╙╘┼═ & ╨┴╠
- LDX #24
- #ENDIF
- #IF ╙┘╙╘┼═ & ╬╘╙├
- BIT $24
- LDX #21
- #ENDIF
- DEX
- BNE *-1 ; FIRST SPEND SOME TIME (SO THAT THE WHOLE
- CMP $9004 ; LOOP WILL BE 2 RASTER LINES)
- BCS *+2 ; SAVE ONE CYCLE IF $9004 CHANGED TOO LATE
- DEY
- BNE 1$
- ; NOW IT IS FULLY SYNCHRONIZED
- ; 6 CYCLES HAVE PASSED SINCE LAST $9004 CHANGE
- ; AND WE ARE ON LINE 2(28+9)=74
-
- ;INITIALIZE THE TIMERS
- TIMERS:
- LDA #$40 ; ENABLE ╘IMER ┴ FREE RUN OF BOTH ╓╔┴S
- STA $911B
- STA $912B
-
- LDA #<╘╔═┼╥_╓┴╠╒┼
- LDX #>╘╔═┼╥_╓┴╠╒┼
- STA $9116 ; LOAD THE TIMER LOW BYTE LATCHES
- STA $9126
-
- #IF ╙┘╙╘┼═ & ╨┴╠
- LDY #7 ; MAKE A LITTLE DELAY TO GET THE RASTER EFFECT TO THE
- DEY ; RIGHT PLACE
- BNE *-1
- NOP
- NOP
- #ENDIF
- #IF ╙┘╙╘┼═ & ╬╘╙├
- LDY #6
- DEY
- BNE *-1
- BIT $24
- #ENDIF
-
- STX $9125 ; START THE ╔╥╤ TIMER ┴
- ; 6560-101: 65 CYCLES FROM $9004 CHANGE
- ; 6561-101: 77 CYCLES FROM $9004 CHANGE
- LDY #10 ; SPEND SOME TIME (1+5*9+4=55 CYCLES)
- DEY ; BEFORE STARTING THE REFERENCE TIMER
- BNE *-1
- STX $9115 ; START THE REFERENCE TIMER
-
- POINTERS:
- LDA #<IRQ ; SET THE RASTER ╔╥╤ ROUTINE POINTER
- STA $314
- LDA #>IRQ
- STA $315
- LDA #$C0
- STA $912E ; ENABLE ╘IMER ┴ UNDERFLOW INTERRUPTS
- RTS ; RETURN
-
- IRQ:
- ; IRQ (EVENT) ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
- ; PHA ; 3
- ; TXA ; 2
- ; PHA ; 3
- ; TYA ; 2
- ; PHA ; 3
- ; TSX ; 2
- ; LDA $0104,X ; 4
- ; AND #XX ; 2
- ; BEQ ; 3
- ; JMP ($314) ; 5
- ; ---
- ; 38 TO 45 CYCLES DELAY AT THIS STAGE
-
- LDA $9114 ; GET THE ╬═╔ TIMER ┴ VALUE
- ; (42 TO 49 CYCLES DELAY AT THIS STAGE)
- ; STA $1E00 ; UNCOMMENT THESE IF YOU WANT TO MONITOR
- ; LDY $9115 ; THE REFERENCE TIMER ON THE SCREEN
- ; STY $1E01
- CMP #8 ; ARE WE MORE THAN 7 CYCLES AHEAD OF TIME?
- BCC 0$
- PHA ; YES, SPEND 8 EXTRA CYCLES
- PLA
- AND #7 ; AND RESET THE HIGH BIT
- 0$:
- CMP #4
- BCC 1$
- BIT $24 ; WASTE 4 CYCLES
- AND #3
- 1$:
- CMP #2 ; SPEND THE REST OF THE CYCLES
- BCS *+2
- BCS *+2
- LSR
- BCS *+2 ; NOW IT HAS TAKEN 82 CYCLES FROM THE BEGINNING OF THE ╔╥╤
-
- EFFECT:
- LDY #16 ; PERFORM AMAZING VIDEO EFFECT
- LDA $900F
- TAX
- EOR #$F7
- 0$:
- STA $900F
- STX $900F
- STA $900F
- STX $900F
- STA $900F
- STX $900F
- STA $900F
- STX $900F
- STA $900F
- STX $900F
- STA $900F
- STX $900F
- PHA
- PLA
- #IF ╙┘╙╘┼═ & ╨┴╠
- PHA
- PLA
- NOP
- #ENDIF
- #IF ╙┘╙╘┼═ & ╬╘╙├
- BIT $24
- #ENDIF
- NOP
- DEY
- BNE 0$ ; END OF AMAZING VIDEO EFFECT
-
- JMP $EABF ; RETURN TO NORMAL ╔╥╤
-
-
- ┴ND AFTER YOU HAVE RECOVERED FROM THE SCHOCK OF SEEING A ╓╔├-20
- PROGRAM, HERE IS AN EXAMPLE FOR THE ├64. ╔T DOES ALSO SOMETHING
- NOTEWORTHY; IT REMOVES THE SIDE BORDERS ON A NORMAL SCREEN WHILE
- DISPLAYING ALL EIGHT SPRITES. ╫ELL, IT CANNOT REMOVE THE BORDERS ON
- BAD LINES, AND THE BAD LINES LOOK PRETTY BAD. ┬UT ╔ COULD USE THE
- PROGRAM FOR WHAT ╔ WANTED: ╔ MEASURED THE SPRITE DISTORTIONS ON ALL
- VIDEOCHIP TYPES ╔ HAD AT HAND. (╞┘╔: THE SPRITES 0-2 GET DISTORTED AT
- THE VERY RIGHT OF THE SCREEN, AND THE SPRITES 6 AND 7 ARE INVISIBLE AT
- THE VERY LEFT OF THE SCREEN. ┘OU WILL NEED A MONITOR WITH HORIZONTAL
- SIZE CONTROLS TO WITNESS THESE EFFECTS.)
-
- ╘HIS PROGRAM IS REALLY ROBUST, IT INSTALLS ITSELF NICELY TO THE
- INTERRUPT ROUTINE CHAIN. ╔T EVEN HAS AN ENTRY POINT FOR DEINSTALLING
- ITSELF. ┬UT IN ITS ROBUSTNESS IT USES SELF-MODIFYING CODE TO STORE
- THE ORIGINAL INTERRUPT ROUTINE ADDRESS. :-)
-
- ╘HE CODE ALSO RELIES ON THE PAGE BOUNDARIES IN BEING WHERE THEY ARE.
- ╘HE CYCLES ARE COUNTED SO THAT THE BRANCHES "IRQLOOP" MUST TAKE 4
- CYCLES. ╔F THE "IRQLOOP" COMES TO THE SAME ├╨╒ PAGE WITH THE BRANCH
- INSTRUCTIONS, YOU MUST ADD ONE CYCLE TO THE LOOP IN A WAY OR ANOTHER.
- ╫HEN CODING THE ROUTINE, ╔ NOTICED AGAIN HOW STUPID ASSEMBLY CODING
- CAN BE, ESPECIALLY CONDITIONAL ASSEMBLING. ╔N A MACHINE LANGUAGE
- MONITOR YOU HAVE FAR BETTER CONTROL ON PAGE BOUNDARIES. ┬╘╫, YOU
- MIGHT WONDER WHY ╔ DISABLE THE ╥ESTORE KEY IN A SUBROUTINE AT THE END
- AND NOT IN THE BEGINNING OF THE PROGRAM. ╫ELL, THE ROUTINE WAS SO
- LONG THAT IT WOULD HAVE AFFECTED THE "IRQLOOP" PAGE BOUNDARIES. ┴ND ╔
- DIDN'T WANT TO RISK THE MODIFIED PROGRAMS WORKING ON ALL THREE
- DIFFERENT VIDEOCHIP TYPES ON THE FIRST TRY.
-
-
- ╔N THE CODE, THERE ARE SOME COMMENTS THAT DOCUMENT THE VIDEO TIMING,
- LIKE THIS ONE:
-
- ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
- ;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
- ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
- ; ^ NOW WE ARE HERE
-
- ╘HE TWO VERTICAL BARS "▄" DENOTE OPTIONAL CYCLES. ╧N ╨┴╠-┬ SYSTEMS
- (63 CYCLES PER LINE), THEY ARE NOT PRESENT. ╧N 6567╥56┴, WHICH HAS 64
- CYCLES PER LINE, THERE IS ONE ADDITIONAL CYCLE ON THIS POSITION, AND
- THE 6567╥8 HAS TWO ADDITIONAL CYCLES THERE.
-
- ╘HE NUMBERS 0 THROUGH 7 ARE SPRITE POINTER FETCHES (FROM THE END OF
- THE CHARACTER MATRIX, E.G. THE TEXT SCREEN), THE "S" CHARACTERS DENOTE
- SPRITE IMAGE FETCHES, THE "R"S ARE MEMORY REFRESH, AND THE "G" ARE
- GRAPHICS FETCHES. ╘HE TWO IDLE VIDEO CHIP CYCLES ARE MARKED WITH "-".
- ╧N THE PROCESSOR TIMING LINE, THE "=" SIGNS SHOW HALTED ├╨╒, "X" MEANS
- FREE BUS, AND "╪" MEANS THAT THE PROCESSOR WILL BE HALTED AT ONCE,
- UNLESS IT IS PERFORMING WRITE CYCLES.
-
- PROCESSOR 6502
-
- ; ╙ELECT THE VIDEO TIMING (PROCESSOR CLOCK CYCLES PER RASTER LINE)
- ├┘├╠┼╙ = 65 ; 6567╥8 AND ABOVE, ╬╘╙├-═
- ;├┘├╠┼╙ = 64 ; 6567╥5 6┴, ╬╘╙├-═
- ;├┘├╠┼╙ = 63 ; 6569 (ALL REVISIONS), ╨┴╠-┬
-
- CINV = $314
- CNMI = $318
- RASTER = 52 ; START OF RASTER INTERRUPT
- M = $FB ; ZERO PAGE VARIABLE
-
- .ORG $801
- BASIC:
- .WORD 0$ ; LINK TO NEXT LINE
- .WORD 1995 ; LINE NUMBER
- .BYTE $9┼ ; ╙┘╙ TOKEN
-
- ; ╙┘╙ DIGITS
-
- .IF (* + 8) / 10000
- .BYTE $30 + (* + 8) / 10000
- .ENDIF
- .IF (* + 7) / 1000
- .BYTE $30 + (* + 7) % 10000 / 1000
- .ENDIF
- .IF (* + 6) / 100
- .BYTE $30 + (* + 6) % 1000 / 100
- .ENDIF
- .IF (* + 5) / 10
- .BYTE $30 + (* + 5) % 100 / 10
- .ENDIF
- .BYTE $30 + (* + 4) % 10
-
- 0$:
- .BYTE 0,0,0 ; END OF ┬┴╙╔├ PROGRAM
-
- START:
- JMP INSTALL
- JMP DEINSTALL
-
- INSTALL: ; INSTALL THE RASTER ROUTINE
- JSR RESTORE ; ─ISABLE THE ╥ESTORE KEY (DISABLE ╬═╔ INTERRUPTS)
- CHECKIRQ:
- LDA CINV ; CHECK THE ORIGINAL ╔╥╤ VECTOR
- LDX CINV+1 ; (TO AVOID MULTIPLE INSTALLATION)
- CMP #<IRQ1
- BNE IRQINIT
- CPX #>IRQ1
- BEQ SKIPINIT
- IRQINIT:
- SEI
- STA OLDIRQ ; STORE THE OLD ╔╥╤ VECTOR
- STX OLDIRQ+1
- LDA #<IRQ1
- LDX #>IRQ1
- STA CINV ; SET THE NEW INTERRUPT VECTOR
- STX CINV+1
- SKIPINIT:
- LDA #$1B
- STA $D011 ; SET THE RASTER INTERRUPT LOCATION
- LDA #RASTER
- STA $D012
- LDX #$E
- CLC
- ADC #3
- TAY
- LDA #0
- STA M
- 0$:
- LDA M
- STA $D000,X ; SET THE SPRITE ╪
- ADC #24
- STA M
- TYA
- STA $D001,X ; AND ┘ COORDINATES
- DEX
- DEX
- BPL 0$
- LDA #$7F
- STA $DC0D ; DISABLE TIMER INTERRUPTS
- STA $DD0D
- LDX #1
- STX $D01A ; ENABLE RASTER INTERRUPT
- LDA $DC0D ; ACKNOWLEDGE ├╔┴ INTERRUPTS
- LSR $D019 ; AND VIDEO INTERRUPTS
- LDY #$FF
- STY $D015 ; TURN ON ALL SPRITES
- CLI
- RTS
-
- DEINSTALL:
- SEI ; DISABLE INTERRUPTS
- LDA #$1B
- STA $D011 ; RESTORE TEXT SCREEN MODE
- LDA #$81
- STA $DC0D ; ENABLE ╘IMER ┴ INTERRUPTS ON ├╔┴ 1
- LDA #0
- STA $D01A ; DISABLE VIDEO INTERRUPTS
- LDA OLDIRQ
- STA CINV ; RESTORE OLD ╔╥╤ VECTOR
- LDA OLDIRQ+1
- STA CINV+1
- BIT $DD0D ; RE-ENABLE ╬═╔ INTERRUPTS
- CLI
- RTS
-
- ; ┴UXILIARY RASTER INTERRUPT (FOR SYNCRONIZATION)
- IRQ1:
- ; IRQ (EVENT) ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
- ; PHA ; 3
- ; TXA ; 2
- ; PHA ; 3
- ; TYA ; 2
- ; PHA ; 3
- ; TSX ; 2
- ; LDA $0104,X ; 4
- ; AND #XX ; 2
- ; BEQ ; 3
- ; JMP ($314) ; 5
- ; ---
- ; 38 TO 45 CYCLES DELAY AT THIS STAGE
- LDA #<IRQ2
- STA CINV
- LDA #>IRQ2
- STA CINV+1
- NOP ; WASTE AT LEAST 12 CYCLES
- NOP ; (UP TO 64 CYCLES DELAY ALLOWED HERE)
- NOP
- NOP
- NOP
- NOP
- INC $D012 ; ┴T THIS STAGE, $D012 HAS ALREADY BEEN INCREMENTED BY ONE.
- LDA #1
- STA $D019 ; ACKNOWLEDGE THE FIRST RASTER INTERRUPT
- CLI ; ENABLE INTERRUPTS (THE SECOND INTERRUPT CAN NOW OCCUR)
- LDY #9
- DEY
- BNE *-1 ; DELAY
- NOP ; ╘HE SECOND INTERRUPT WILL OCCUR WHILE EXECUTING THESE
- NOP ; TWO-CYCLE INSTRUCTIONS.
- NOP
- NOP
- NOP
- OLDIRQ = * + 1 ; ╨LACEHOLDER FOR SELF-MODIFYING CODE
- JMP * ; ╥ETURN TO THE ORIGINAL INTERRUPT
-
- ; ═AIN RASTER INTERRUPT
- IRQ2:
- ; IRQ (EVENT) ; 7 + 2 OR 3 CYCLES OF LAST INSTRUCTION (9 OR 10 TOTAL)
- ; PHA ; 3
- ; TXA ; 2
- ; PHA ; 3
- ; TYA ; 2
- ; PHA ; 3
- ; TSX ; 2
- ; LDA $0104,X ; 4
- ; AND #XX ; 2
- ; BEQ ; 3
- ; JMP (CINV) ; 5
- ; ---
- ; 38 OR 39 CYCLES DELAY AT THIS STAGE
- LDA #<IRQ1
- STA CINV
- LDA #>IRQ1
- STA CINV+1
- LDX $D012
- NOP
- #IF ├┘├╠┼╙ - 63
- #IF ├┘├╠┼╙ - 64
- NOP ; 6567╥8, 65 CYCLES/LINE
- BIT $24
- #ELSE
- NOP ; 6567╥56┴, 64 CYCLES/LINE
- NOP
- #ENDIF
- #ELSE
- BIT $24 ; 6569, 63 CYCLES/LINE
- #ENDIF
- CPX $D012 ; ╘HE COMPARISON CYCLE IS EXECUTED ├┘├╠┼╙ OR ├┘├╠┼╙+1 CYCLES
- ; AFTER THE INTERRUPT HAS OCCURRED.
- BEQ *+2 ; ─ELAY BY ONE CYCLE IF $D012 HADN'T CHANGED.
- ; ╬OW EXACTLY ├┘├╠┼╙+3 CYCLES HAVE PASSED SINCE THE INTERRUPT.
- DEX
- DEX
- STX $D012 ; RESTORE ORIGINAL RASTER INTERRUPT POSITION
- LDX #1
- STX $D019 ; ACKNOWLEDGE THE RASTER INTERRUPT
- LDX #2
- DEX
- BNE *-1
- NOP
- NOP
- LDA #20 ; SET THE AMOUNT OF RASTER LINES-1 FOR THE LOOP
- STA M
- LDX #$C8
- IRQLOOP:
- LDY #2
- DEY
- BNE *-1 ; DELAY
- DEC $D016 ; NARROW THE SCREEN (EXACT TIMING REQUIRED)
- ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
- ;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
- ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
- ; ^ NOW WE ARE HERE
- STX $D016 ; EXPAND THE SCREEN
- #IF ├┘├╠┼╙ - 63
- #IF ├┘├╠┼╙ - 64
- BIT $24 ; 6567╥8
- #ELSE
- NOP ; 6567╥56┴
- #ENDIF
- #ELSE
- NOP ; 6569
- #ENDIF
- DEC M
- BMI ENDIRQ
- CLC
- LDA $D011
- SBC $D012
- AND #7
- BNE IRQLOOP ; ╘HIS INSTRUCTION TAKES 4 CYCLES INSTEAD OF 3,
- ; BECAUSE THE PAGE BOUNDARY IS CROSSED.
- BADLINE:
- DEC M
- NOP
- NOP
- NOP
- NOP
- DEC $D016
- ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
- ;SSSSSSSSSS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
- ;==========X╪╪╪========================================▄▄***====== ╨HI-2 6510
- ; ^ WE ARE HERE
- STX $D016
- ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
- ;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
- ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
- ; ^ ^^- WE ARE HERE (6569)
- ; ▄ \- OR HERE (6567╥56┴)
- ; \- OR HERE (6567╥8)
- LDY #2
- DEY
- BNE *-1
- NOP
- NOP
- #IF ├┘├╠┼╙ - 63
- #IF ├┘├╠┼╙ - 64
- NOP ; 6567╥8, 65 CYCLES/LINE
- NOP
- NOP
- #ELSE
- BIT $24 ; 6567╥56┴, 64 CYCLES/LINE
- #ENDIF
- #ELSE
- NOP ; 6569, 63 CYCLES/LINE
- #ENDIF
- DEC M
- BPL IRQLOOP ; ╘HIS IS A 4-CYCLE BRANCH (PAGE BOUNDARY CROSSED)
- ENDIRQ:
- JMP $EA81 ; RETURN TO THE AUXILIARY RASTER INTERRUPT
-
- RESTORE: ; DISABLE THE ╥ESTORE KEY
- LDA CNMI
- LDY CNMI+1
- PHA
- LDA #<NMI ; ╙ET THE ╬═╔ VECTOR
- STA CNMI
- LDA #>NMI
- STA CNMI+1
- LDX #$81
- STX $DD0D ; ┼NABLE ├╔┴ 2 ╘IMER ┴ INTERRUPT
- LDX #0
- STX $DD05
- INX
- STX $DD04 ; ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
- LDX #$DD
- STX $DD0E ; ├AUSE AN INTERRUPT.
- NMI = * + 1
- LDA #$40 ; ╥╘╔ PLACEHOLDER
- PLA
- STA CNMI
- STY CNMI+1 ; RESTORE ORIGINAL ╬═╔ VECTOR (ALTHOUGH IT WON'T BE USED)
- RTS
-
-
- ┬INARIES
-
- ╚ERE ARE THE PROGRAMS IN UUENCODED FORMAT. ╞IRST THE ╓╔├-20 PROGRAMS:
-
- ├OLOR BOXES FOR THE ╓╔├-20, ╬╘╙├-═ VERSION (PROBABLY DISTORTED DISPLAY):
-
- BEGIN 644 COPPER.6560
- ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─)"2┬
- ═%<╦0_<╘$─+└└┬-#╦╩4"-&┘&-*┘&╔0┌)"├1:1├2:1╚└:(╘/╘─)(╪┼─:└*┬-#]
- ═├┴61╩6╥-%└.╔$(╘5└┌╟└├2┌18*╘4─<─(─└1(:"─'╥020!"0─*0/)└╦└└╠└!*
- ═╠└"@$*╘/─*╔)]╪╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/
- ,─$┴╚)"3╩┬-#43+_╩
- └
- END
-
-
- ├OLOR BOXES FOR THE ╓╔├-20, ╨┴╠-┬ VERSION:
-
- BEGIN 644 COPPER.6561
- ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─╚┴├*
- ═╘/╫-!)"╨└(├0[:┼└├1╬1├2╬1╩8:┬5╚╘6─8╘╞─:└'┬-#]┌╬╩.)9&@"╚├0_8╪5
- ═─:┼╩├10#╩1"-%0.╔╨(╘╬─6"═%)')")└$2&@╔!\─$─└0─)"─#╥0*╨└+└└2╦└└
- ═╚!"═#┘"╩2?>-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘!(
- +:$┴╚┌╬╩(╘--,╧^╩.
- └
- END
-
-
- ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, ╨┴╠-┬ VERSION:
-
- BEGIN 644 RASTER.63
- ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
- ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
- ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
- ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
- ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌┬0─[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
- ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,",8╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
- ═╘*└"┬-#]┌╬╦╩╤╧╠0╙4╥!┌╩╘8└┌╨9└╘┬╔0╚╘8└┌─)├1─#╚╚&.#=╓┬└(╪%╫>┬.
- 1!-╓┬╫8╪.╫:┼└:(╘8└╪╨9└╓└8
- └
- END
-
-
- ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥56┴ VERSION
- (VERY OLD ╬╘╙├-═ ├64S):
-
- BEGIN 644 RASTER.64
- ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'@╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
- ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
- ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
- ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
- ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╦╩[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
- ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,"08╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
- ═╘*└"┬-#]┌╬╚─),;[$,╤,@>╩═&└.╠&0-(╩4.-&└.╔"8╘9└┌*!├@╫=╚@".!=╫╚
- 2├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
- └
- END
-
- ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥8 AND ABOVE
- (NOT TOO OLD ╬╘╙├-═ ├64S AND ALL ├128S)
-
- BEGIN 644 RASTER.65
- ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@(0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
- ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
- ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
- ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
- ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╚─).╨2╘/└└╥╠╩.$═"┬└8╪9╘*("╥═#]
- ═┌╬╩╔%(7[╚╠┬@└╚├0_<╪6╘(╪6╘"0─╤╧╠╨)1┬═$=#═$═└╔!]#─╤╧╧╩┌╬╦╩╙┴;0
- ═├┴;0╚└*(╘/╫╩┌╬╦╩┌╠;[$,╔,@>╩═&└.╠&0-(╩4:-&└.╔"8╘9└┌*!├@╫=╚@".
- 5!=╫╚├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
- └
- END
-
-
- ╘HAT WAS ALL, FOLKS! ╔ HOPE YOU LEARNED SOMETHING FROM THIS ARTICLE.
- ╞EEL FREE TO E-MAIL ME AT ═ARKO.═AKELA@╚╒╘.╞╔, SHOULD ANYTHING REMAIN
- UNCLEAR.
-
- ========================================================================
- ┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔╔
- BY ╙TEPHEN ╩UDD --- SJUDD@NWU.EDU
- ╟EORGE ╘AYLOR --- AA601@CFN.CS.DAL.CA
-
- ╫HEW! ╫HAT A BUSY TIME IT'S BEEN -- RESEARCH TO GET DONE,
- CONFERENCES, CLASSES... BETWEEN GETTING THINGS DONE AND BLOWING OTHER
- THINGS OFF, ╔ ONE DAY REFLECTED FOR A MOMENT AND REALIZED THAT ╔ HAD
- THREE DAYS LEFT TO GET THE NEXT ARTICLE TOGETHER FOR ├=╚ACKING! ╙O
- EVERYTHING HAS BEEN SLAPPED TOGETHER AT THE LAST MINUTE, AND ╔ HOPE
- YOU'LL FORGIVE ANY BUGS OR UNCLEAR CONCEPTS.
- >>> ┴╬┼├─╧╘┼ ┴╠┼╥╘ <<<
- ┴ND THAT REMINDS ME: ╔ JUST GOT ╩IFFY─╧╙ AND AN ╞─-2000 DRIVE --
- WHAT A WONDERFUL DEVICE. ╔ HAVE A 1.6 MEGABYTE DISK FORMATTED INTO
- THREE PARTITIONS. ╘HE FIRST CONTAINS MY ═ERLIN 128 ASSEMBLER, THE
- SECOND IS SOME 4000 BLOCKS LARGE AND ╔ USE IT FOR ALL MY VARIOUS
- VERSIONS OF CODE WHILE DEBUGGING, AND THE THIRD IS MAYBE 1000 BLOCKS,
- AND CONTAINS ONLY FINISHED CODE -- NO MORE SWAPPING DISKS, NO MORE
- DELETING OLD VERSIONS THAT ╔ HOPE ╔ DON'T NEED TO MAKE ROOM ON THE
- DISK. ┴LSO, WHEN ╔ INSTALLED ╩IFFY─╧╙ ╔ FOUND A SERIOUS BUG IN MY
- 128─ -- A CRICKET, DEAD AMONG THE ╔├'S.
-
- ╘HIS TIME WE WILL COVER A LOT OF GROUND WHICH ISN'T SO MUCH
- CUTTING-EDGE AS IT IS VERY USEFUL. ╠ET'S FACE IT: CUBES ARE GETTING
- MORE THAN A LITTLE DULL. ┴ WORTHY END GOAL IS TO HAVE A COMPLETELY
- GENERAL ROUTINE FOR PLOTTING A SERIES OF POLYGONS -- THAT IS, YOU SUPPLY
- A LIST OF (X,Y,Z) COORDINATES FROM WHICH THE PROGRAM CAN FORM A LIST OF
- POLYGONS. ╘HESE POLYGONS MAY THEN BE DISPLAYED IN 2─, ROTATED, MAGNIFIED,
- FILLED, ETC. ┴ND, MUCH TO MY THREE-DAY ASTONISHMENT, THAT IS EXACTLY
- WHAT WE ARE GOING TO DO.
- ┬UT FIRST, A LITTLE EXCURSION. ╧NE THING WE ARE OF COURSE ALWAYS
- THINKING ABOUT IS OPTIMIZATION POSSIBILITIES: IN THE SHOWER, WHILE
- SLEEPING/DREAMING, OUT ON DATES, ETC. ╙O, WHERE TO BEGIN? ╘HE BIGGEST
- CYCLE HOGS IN THE PROGRAM ARE LINE DRAWING AND FACE FILLING -- WELL,
- FILLING FACES IS PRETTY STRAIGHTFORWARD. ╫HAT ABOUT LINE DRAWING?
- ╫ELL, ONE DOWNER OF THE ROUTINE IS THAT EVERY SINGLE PIXEL IS
- PLOTTED. ┬UT AS WE KNOW, ON A COMPUTER ANY GIVEN LINE IS MADE UP OF
- SEVERAL SMALLER VERTICAL AND HORIZONTAL LINES -- WOULDN'T IT BE NEAT
- IF WE COULD THINK OF A WAY TO PLOT THESE LINE CHUNKS ALL AT ONCE,
- INSTEAD OF A PIXEL AT A TIME?
- ╚ECK YES IT WOULD! ╙O HERE WE GO:
-
- ╬EAT-O ┼NHANCED ├HUNKY ╠INE ─RAWING ╥OUTINE
- -------------------------------------------
-
- ╞IRST WE NEED TO BE IN THE RIGHT MINDFRAME. ╠ET'S SAY YOU'RE
- DRAWING A LINE WHERE YOU MOVE THREE PIXELS IN X BEFORE IT'S TIME TO TAKE
- A STEP IN Y. ╔NSTEAD OF PLOTTING ALL THREE PIXELS IT WOULD OF COURSE
- BE MUCH MORE EFFICIENT TO JUST STICK A NUMBER LIKE %00011100 IN THE
- DRAWING BUFFER. ┬UT SOMEHOW WE NEED TO KEEP TRACK OF A) HOW LARGE THE
- CHUNK NEEDS TO BE, AND B) WHERE EXACTLY THE CHUNK IS.
- ╔N THE ABOVE EXAMPLE, WE STARTED AT A PARTICULAR X-VALUE:
-
- %00010000
-
- AND WE WANT TO KEEP ADDING ONES TO THE RIGHT OF THE STARTING POINT; THREE,
- TO BE EXACT. ╚MMM... WE NEED TO SOMEHOW ROTATE THE STARTING BIT IN A WAY
- THAT LEAVES A TRAIL OF ONES BEHIND IT. ═AYBE ROTATE AND ╧╥┴ WITH THE
- ORIGINAL BIT? ┬UT WHAT HAPPENS WHEN YOU TAKE A STEP IN ┘?
- ╬O, WE NEED SOMETHING FAR SNEAKIER. ╠ET'S SAY THAT INSTEAD OF
- %00010000 WE START WITH
-
- X = %00011111
-
- ╬OW, WITH EACH STEP IN THE X DIRECTION, WE DO AN ARITHMETIC SHIFT ON X. ╙O
- AFTER ONE STEP WE HAVE
-
- X = %00001111
-
- AND AFTER TWO STEPS
-
- X = %00000111
-
- AND AT THE THIRD STEP OF COURSE
-
- X = %00000011
-
- ╬OW IT IS TIME TO TAKE A STEP IN ┘. ┬UT NOW LOOK: IF WE ┼╧╥ X WITH ITS
-
- ORIGINAL VALUE XOLD = %00011111, WE GET
-
- X ┼╧╥ XOLD = %00011100
-
- WHICH IS EXACTLY THE CHUNK WE WANTED. ═OREOVER, X STILL REMEMBERS WHERE IT
- IS, SO WE DON'T HAVE TO DO ANYTHING SPECIAL EACH TIME A STEP IS TAKEN IN
- THE Y-DIRECTION.
-
- ╙O HERE IS THE ALGORITHM FOR DRAWING A LINE IN THE X-DIRECTION:
-
- INITIALIZE X, DX, ETC.
- XOLD = X
- TAKE A STEP IN X: ╠╙╥ ╪
- HAVE WE HIT THE END OF A COLUMN? ╔F SO, THEN PLOT AND CHECK ON Y
- IS IT TIME TO TAKE A STEP IN Y?
- IF NOT, TAKE ANOTHER STEP IN X
- IF IT IS, THEN LET A=X ┼╧╥ XOLD
- PLOT A INTO THE BUFFER
- LET XOLD=X
- KEEP ON GOING UNTIL WE'RE FINISHED
-
- ╘HIS SIMPLE MODIFICATION GIVES US A SUBSTANTIAL SPEED INCREASE --
- ON THE OLD FILLED HIRES CUBE3D PROGRAM, ╔ MEASURED A GAIN OF ONE FRAME PER
- SECOND. ╬OT EARTH-SHATTERING, BUT NOT BAD EITHER! ╫HEN FACES ARE NOT
- FILLED, THE DIFFERENCE IS OF COURSE MUCH MORE NOTICABLE.
- ╘HERE ARE A FEW THINGS TO BE CAREFUL OF. ╘HERE WAS A BUG IN THE
- OLD ROUTINE WHEN THE LINE WAS A SINGLE POINT. ╔N THAT CASE DX=DY=0, AND
- THE PROGRAM WOULD DRAW A VERTICAL LINE ON THE SCREEN. ╘HERE ARE PROBABLY
- SOME OTHER THINGS TO BE CAREFUL OF, BUT SINCE ╔ WROTE THIS PART OF THE
- CODE THREE MONTHS AGO ╔ REALLY DON'T REMEMBER ANY OF THEM!
- ╘HIS TAKES CARE OF HORIZONTAL LINE CHUNKS -- WHAT ABOUT VERTICAL
- CHUNKS? ╫ELL, BECAUSE OF THE WAY POINTS ARE PLOTTED THERE IS NOTHING
- WE CAN DO ABOUT THEM. ┬UT, AS WE SHALL SOON SEE, IF WE USE AN ┼╧╥-BUFFER
- TO FILL FACES WE WILL BE FORCED TO TAKE CARE OF THE VERTICAL CHUNKS!
-
- ╟ENERAL ╨OLYGON ╥OUTINE
- -----------------------
-
- ╬OW WE CAN BEGIN THINKING ABOUT A GENERAL POLYGON ROUTINE. ╞IRST
- WE NEED A LIST OF SETS OF POINTS, WHERE EACH SET CORRESPONDS TO A
- POLYGON. ╘HE FIRST NUMBER IN A SET COULD BE THE NUMBER OF (X,Y,Z) POINTS
- IN THAT SET, AND THE POINTS COULD THEN FOLLOW. ╙O A TRIANGLE COULD
- BE GIVEN BY THE DATA SET:
-
- 3 -1 0 0 0 1 0 1 0 0
-
- ╘HIS WOULD BE A TRIANGLE WITH VERTICES AT (-1,0,0), (0,1,0), AND (1,0,0).
- ╫E CAN MASH A BUNCH OF THESE SETS TOGETHER, BUT SOMEHOW WE HAVE TO KNOW
- WHEN WE'VE HIT THE END -- FOR THIS WE CAN USE A ZERO, SINCE WE DON'T
- WANT TO PLOT POLYGONS WITH ZERO POINTS IN THEM.
- ╞OR THAT MATTER, HOW MANY POINTS SHOULD THERE BE IN A POLYGON?
- ╘HERE MUST BE AT LEAST THREE, OTHERWISE IT MAKES NO SENSE. ╙INCE WE
- WANT OUR POLYGONS TO BE CLOSED, THE COMPUTER SHOULD BE SMART ENOUGH TO
- CONNECT THE LAST POINT TO THE FIRST POINT -- IN OUR TRIANGLE ABOVE,
- THE COMPUTER WOULD JOIN (-1,0,0) TO (0,1,0), (0,1,0) TO (1,0,0), AND
- (1,0,0) TO (-1,0,0).
- ╬OW THAT WE HAVE A POLYGON, WE WANT TO ROTATE IT. ┘OU WILL
- RECALL THAT WE HAVE CALCULATED A ROTATION MATRIX ═, WHICH ACTS ON
- POINTS. ╙O WE NEED APPLY OUR ROTATION TRANSFORM TO EACH OF THE
- POINTS IN THE POLYGON, I.E. MULTIPLY ═ TIMES EACH POINT OF THE
- POLYGON. ╞URTHERMORE, WE NEED TO PROJECT EACH OF THESE POINTS.
- ╒H-OH: MATRIX MULTIPLICATION. ╔N THE PAST WE HAVE AVOIDED THIS
- ISSUE BY PUTTING THE VERTICES OF OUR CUBE AT 1 OR -1. ╙O WE NEED TO
- USE OUR MULTIPLICATION ROUTINE FROM LAST TIME. ┬UT WAIT! ┴S YOU RECALL,
- THE LAST PROGRAM USED A SPECIALLY MODIFIED MULTIPLICATION TABLE. ╘O GET
- A WIDER RANGE OF NUMBERS TO MULTIPLY WE WILL NEED ANOTHER SET OF
- MULTIPLICATION TABLES -- NO BIG WHOOP.
- ╬OW, IF YOU REVIEW THE MULTIPLICATION ROUTINE FROM LAST TIME,
- IT ADDS TWO NUMBERS AND SUBTRACTS TWO NUMBERS. ╫HAT KINDS OF NUMBERS
- WILL WE BE DEALING WITH? ╘HE MATRIX ELEMENTS VARY BETWEEN -64..64.
- ╘HIS THEN FIXES OUR RANGE OF POLYGON COORDINATES FROM -64..64. ╫HY?
- ╔F THE MATRIX ELEMENT IS 64, AND WE MULTIPLY IT BY 64, THE MULTIPLICATION
- ROUTINE WILL ADD 64 AND 64 AND GET 128, WHICH IS RIGHT ON THE EDGE OF
- OUR MULTIPLICATION TABLE.
- ├AN WE IMPROVE THIS ROTATION PROCESS IN ANY WAY? ╔N FACT, WE CAN
- CUT DOWN ON THE NUMBER OF MULTIPLICATIONS (I.E. DO EIGHT OR EVEN SEVEN
- INSTEAD OF NINE MULTIPLICATIONS). ╚OWEVER, THERE IS A FAIR AMOUNT OF
- OVERHEAD INVOLVED IN DOING SO, AND OUR MULTIPLY ROUTINE IS FAST ENOUGH
- THAT THE EXTRA OVERHEAD AND COMPLEXITY REALLY GAIN US VERY LITTLE IN ALL
- BUT THE MOST COMPLICATED OF POLYGONS. ╔N OTHER WORDS, ╔ DIDN'T BOTHER.
-
- ╫HAT ABOUT HIDDEN FACES? ┴GAIN, FROM LAST TIME YOU MAY RECALL
- THAT A METHOD WAS DESCRIBED WHICH USED THE CROSS-PRODUCT OF THE PROJECTED
- VECTORS. ╚OW DO WE IMPLEMENT THIS IN THE PROGRAM? ╫ELL, IF WE TAKE
- THE FIRST THREE POINTS OF THE POLYGON, WE HAVE TWO VECTORS. ╠ET'S SAY
- THESE POINTS ARE ╨1 ╨2 AND ╨3. ╘HEN ╓1=╨1-╨2 AND ╓2=╨3-╨2 ARE TWO
- VECTORS IN THE PLANE OF THE POLYGON WHICH ARE CONNECTED AT THE POINT ╨2
- (THIS ANALYSIS WILL OF COURSE ONLY WORK IF THE POLYGON LIES IN SOME PLANE).
- ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT, THE SIGN WILL BE POSITIVE OR
- NEGATIVE, AND THIS WILL TELL US IF THE POLYGON IS VISIBLE.
- ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT? ┴BSOLUTELY.
- V1 X V2 = -V2 X V1. ╫HAT IT REALLY BOILS DOWN TO IS HOW YOU DEFINE THE
- POINTS IN YOUR POLYGON. ╙PECIFICALLY, WHAT ORDER THEY ARE IN. ╨OINTS
- THAT ARE SPECIFIED IN A CLOCKWISE MANNER WILL GIVE A FACE POINTING IN
- THE OPPOSITE DIRECTION OF A POLYGON WITH THE SAME POINTS SPECIFIED IN
- A COUNTER-CLOCKWISE ORDER. ╔N MY PROGRAM, THE POLYGONS MUST BE ENTERED
- IN COUNTER-CLOCKWISE ORDER (WITH YOU FACING THE POLYGON) FOR HIDDEN
- FACES TO WORK THE WAY YOU WANT THEM TO ;-).
-
- ╧NE OTHER NEAT THING TO HAVE IS THE ABILITY TO ZOOM IN AND OUT.
- ╫E KNOW FROM THE VERY FIRST ARTICLE THAT ZOOMING CORRESPONDS TO MULTIPLYING
- THE PROJECTED POINTS BY A NUMBER, SO THAT'S WHAT WE'LL DO. ╘HE MULTIPLICATION
- ROUTINE RETURNS ┴=┴*┘/64, SO A ZOOM FACTOR OF 64 WOULD BE LIKE MULTIPLYING
- THE POINT BY ONE. ┴LL THE PROGRAM DOES IS MULTIPLY THE PROJECTED POINTS
- BY A NUMBER ZOOM, UNLESS ZOOM=64, IN WHICH CASE THE PROGRAM SKIPS THE
- ZOOM MULTIPLY. ┬E WARNED! ╬O CHECKS OF ANY SORT ARE MADE IN THE PROGRAM,
- SO YOU CAN ZOOM AT YOUR OWN RISK!
-
- ╘HE IMPORTANT THINGS TO REMEMBER ARE: WHEN ENTERING POLYGONS,
- MAKE SURE THE NUMBERS RANGE FROM -64 TO 64, AND THAT YOU ENTER POINTS
- IN COUNTERCLOCKWISE. ╧UR TRIANGLE EXAMPLE ABOVE REALLY SHOULD HAVE BEEN
- ENTERED AS, SAY,
-
- 3 -64 0 0 64 0 0 0 64 0
-
- ╞ILLED ╞ACES -- ╒SING AN ┼╧╥ BUFFER
- -----------------------------------
-
- ╫ELL WE STILL HAVE ONE THING LEFT, WHICH WAS ALLUDED TO IN THE
- PREVIOUS ARTICLE: USING ┼╧╥ TO MAKE A FILLED FACE. ╙OME POSSIBLE
- DIFFICULTIES WERE RAISED, BUT WHEN YOU PLOT A SINGLE POLYGON AT A
- TIME, THE PROBLEM BECOMES VASTLY SIMPLIFIED.
- ╞IRST ╔ SHOULD PERHAPS REMIND YOU WHAT EXCLUSIVE-OR IS: EITHER
- ┴ OR ┬, BUT NOT BOTH. ╙O 1 ┼╧╥ 0 = 1, AS DOES 0 ┼╧╥ 1, BUT 0 ┼╧╥ 0 = 0
- AND 1 ┼╧╥ 1 = 0. ┴S A SIMPLE INTRODUCTION TO USING THIS FOR FILLING
- FACES, CONSIDER THE FOLLOWING PIECE OF THE DRAWING BUFFER:
-
- 00001011 ═1
- 00000000 ═2
- 00000001 ═3
- 00001010 ═4
-
- ╠ETS SAY WE MOVE DOWN MEMORY, ┼╧╥ING AS WE GO. ╠ET ═2 = ═1 ┼╧╥ ═2. ╘HEN
- LET ═3 = ═2 ┼╧╥ ═3. ╘HEN LET ═4 = ═3 ┼╧╥ ═4. ╧UR LITTLE PIECE OF MEMORY
- IS NOW:
-
- 00001011 ═1
- 00001011 ═2
- 00001010 ═3
- 00000000 ═4
-
- ╫HAT JUST HAPPENED? ╔MAGINE THAT THE ORIGINAL MEMORY WAS A SERIES OF
- PIECES OF LINE SEGMENTS. ╫E HAVE JUST FILLED IN THE AREA BETWEEN THE
- TWO LINE SEGMENTS, LIKE MAGIC!
- ╔F YOU STILL AREN'T GETTING IT, DRAW A LARGE SECTION OF MEMORY,
- AND THEN DRAW AN OBJECT IN IT, LIKE A TRIANGLE, OR A TRAPAZOID, AND
- ┼╧╥ THE MEMORY BY HAND, STARTING FROM THE TOP AND MOVING DOWNWARDS.
- ┼╧╥ FLIPS BITS. ╔F YOU START WITH A ZERO, IT STAYS ZERO UNTIL
- IT HITS A ONE. ╔T WILL THEN STAY ONE UNTIL IT HITS ANOTHER ONE. ╙O
- YOU CAN SEE THAT IF YOU HAVE AN OBJECT BOUNDED BY ONES, ┼╧╥ING
- SUCCESSIVE MEMORY LOCATIONS WILL AUTOMAGICALLY FILL THE OBJECT.
- ╥IGHT? ╫ELL, WE HAVE TO BE CAREFUL. ╧NE MAJOR PROBLEM IS
- A VERTICAL LINE:
-
- 1 1
- 1 GOES TO 0
- 1 1
- 1 0
-
- ╬OT ONLY IS THE RESULTANT LINE DASHED, BUT IF THERE ARE AN ODD NUMBER OF
- POINTS IN THE LINE SEGMENT, THE LAST ONE WILL HAPPILY MOVE DOWNWARDS IN
- MEMORY, AND GIVE YOU A MUCH LONGER VERTICAL LINE THAN YOU EXPECTED! ╙INCE
- ANY LINE WITH SLOPE GREATER THAN ONE IS MADE UP OF A SERIES OF LINE
- SEGMENTS, THIS IS A MAJOR CONSIDERATION.
- ┴NOTHER PROBLEM ARISES WITH SINGLE POINTS: A ONE JUST SITTING ALL
- BY ITSELF WILL ALSO GENERATE A NICE STREAK DOWN YOUR DRAWING AREA.
- ╔F YOU THINK ABOUT IT, WHAT WE IDEALLY WANT TO HAVE IS AN OBJECT
- THAT AT ANY GIVEN VALUE OF X THERE ARE EXACTLY TWO POINTS, ONE DEFINING
- THE TOP OF THE OBJECT, AND THE OTHER DEFINING THE BOTTOM. ╘HIS GIVES US
- THE INSIGHT TO SOLVE THE ABOVE TWO PROBLEMS.
- ╞IRST LET'S THINK ABOUT VERTICAL LINES. ╔N PRINCIPLE WE COULD
- PLOT THE FIRST AND LAST ENDPOINTS OF EACH VERTICAL LINE CHUNK, BUT THAT
- IS EXACTLY WHAT WE DON'T WANT! ╥EMEMBER THAT THESE ARE CLOSED POLYGONS,
- WHICH MEANS THAT THERE ARE _TWO_ LINES WE NEED TO THINK ABOUT. ╔F ╔
- PLOT JUST A SINGLE POINT IN EACH VERTICAL LINE SEGMENT, THERE MUST
- BE ANOTHER POINT SOMEHWERE, EITHER ABOVE OR BELOW IT, FROM ANOTHER
- LINE SEGMENT, WHICH WILL CLOSE THE POINT TO ┼╧╥-FILLING. ╥EMEMBER, WE
- WANT EXACTLY TWO POINTS AT EACH VALUE OF X: ONE WILL COME FROM THE
- LINE, AND THE OTHER WILL COME FROM THE OTHER LINE WHICH MUST LIE ABOVE
- OR BELOW THE CURRENT ONE.
- ╞URTHERMORE, WITH ANY CONVEX POLYGON THERE ARE EXACTLY TWO
- LINES WHICH COME TOGETHER AT EACH VERTEX OF THE POLYGON. ╘HIS MEANS
- THAT THERE ARE ONLY CERTAIN CASES WHICH WE NEED TO WORRY ABOUT.
- ╞OR INSTANCE, TWO LINES MIGHT JOIN IN ANY OF THE FOLLOWING WAYS:
-
- \ / \ /
- \ / \ /
- \_____ _____/ \/ ETC.
-
- ╔F YOU DRAW OUT THE DIFFERENT CASES INVOLVING VERTICAL LINES, YOU CAN SEE
- THAT YOU HAVE TO BE CAREFUL ABOUT PLOTTING THE LINES. ╧NE TRICKY ONE
- IS WHERE TWO VERTICAL LINES WITH DIFFERENT SLOPES OVERLAP AT THE POINT
- OF INTERSECTION.
- ╙O AFTER STARING AT THESE PICTURES FOR A WHILE, YOU CAN FIND
- A CONSISTENT METHOD WHICH SOLVES THESE DIFFICULTIES. ┴S LONG AS YOU
- FOLLOW THE FOLLOWING RULES, THE PROBLEMS ALL DISAPPEAR; THE LINE ROUTINE
- NEEDS TO BE MODIFIED SLIGHTLY:
-
- 1) ╫HEN PLOTTING A VERTICAL LINE (I.E. BIG STEPS IN ┘ DIRECTION),
- DON'T PLOT THE ENDPOINTS (I.E. X1,Y1 AND X2,Y2).
- 2) ╫HEN PLOTTING A VERTICAL LINE, CONSISTENTLY PLOT EITHER THE
- FIRST PART OF EACH CHUNK OR THE LAST PART OF EACH CHUNK
- (EXCLUDING THE ENDPOINTS OF COURSE). ╔N OTHER WORDS, ONLY
- PLOT A POINT WHEN YOU TAKE A STEP IN X, AND THEN PLOT ONE
- AND ONLY ONE POINT.
-
- ╬OW ╔ DEDUCED THESE BY STARING AT PICTURES FOR A FEW HOURS AND TRYING
- DIFFERENT THINGS LIKE TOP/BOTTOM OF CHUNK, LEFT/RIGHT, FIRST/LAST, ETC.
- ┘OU CAN SEE THAT IN SOME CASES THIS ENSURES THAT ONLY ONE POINT APPEARS
- ON A GIVEN LINE SEGMENT. ┬UT TO ME THE ONLY WAY TO CONVINCE YOURSELF
- THAT THIS REALLY DOES WORK IS TO DRAW A BUNCH OF PICTURES, AND TRY IT
- OUT! ┘OU HAVE CASES WHERE TWO VERTICAL LINES INTERSECT, AND WHERE
- A VERTICAL LINE INTERSECTS A HORIZONTAL LINE.
- ┬UT THERE IS STILL ONE THING WHICH WE HAVE FORGOTTEN -- THE
- CASE OF A SINGLE POINT. ╘HIS CAN HAPPEN IN, FOR INSTANCE, A POINTY
- TRIANGLE, POINTING IN THE X-DIRECTION. ╚OW DO WE FIX THIS? ┬Y
- SIMPLY AVOIDING THE POINT: IN THE LINE DRAWING ROUTINE, USE ┼╧╥
- TO PLOT THE POINTS INSTEAD OF ╧╥┴. ╙INCE VERTICAL LINES SKIP THE
- ENDPOINTS, VERTICAL-HORIZONTAL INTERSECTIONS ARE ╧╦. ╚ORIZONTAL-
- HORIZONTAL INTERSECTIONS WILL FORCE THE POINT OF INTERSECTION TO
- BE ZERO.
- ╒H-OH, WHAT ABOUT INTERSECTIONS LIKE -----*------. ╤UITE FRANKLY
- ╔ JUST THOUGHT OF IT, AND ╔ THINK MY PROGRAM WILL FAIL ON INTERSECTIONS
- LIKE THESE. ─RAT. ╫ELL, THAT JUST GIVES US SOMETHING FOR NEXT TIME!
- ╧NE OTHER THING NEEDS TO BE MENTIONED: FOR ┼╧╥-FILLING TO BE USEFUL
- YOU NEED TO DRAW THE POLYGON IN A SPECIAL BUFFER, AND THEN ┼╧╥ THIS BUFFER
- INTO THE MAIN DISPLAY BUFFER. ╔F YOU TRY TO ┼╧╥ THE DISPLAY BUFFER DIRECTLY
- YOU ARE GOING TO HAVE A WHOLE HEAP OF TROUBLE, SUCH AS THE CONCERNS RAISED
- LAST TIME.
- ╞INALLY, THIS GIVES A SIMPLE WAY OF FILLING WITH PATTERNS INSTEAD
- OF BORING MONOCOLOR. ╔NSTEAD OF ┼╧╥ (┼╧╥┬╒╞),┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ YOU CAN
- USE ┼╧╥ (┼╧╥┬╒╞),┘ : ┴╬─ ╨┴╘╘┼╥╬,┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ (AS LONG AS YOU
- PRESERVE THE ORIGINAL ┼╧╥ (┼╧╥┬╒╞),┘).
-
- ╫ELL ╔ AM EXTREMELY TIRED AND ╔ HOPE ├RAIG HASN'T SENT OUT ├=╚ACKING
- WITHOUT ME! ╔ HOPE YOU HAVE FUN PLAYING WITH THE PROGRAM, AND ╔ WOULD BE
- VERY INTERESTED IN SEEING ANY NEAT GEOMETRIC SHAPES YOU MIGHT DESIGN!
-
- ╨ROGRAM NOTES:
- --------------
-
- - ╚IDDEN FACES DEFAULTS TO "ON". ╔F YOU ENTER A SHAPE AND A BLACK
- SCREEN COMES UP, HIT 'H' TO TURN OFF HIDDEN FACES (YOU PROBABLY
- ENTERED THE POLYGON CLOCKWISE).
- - ╘HERE IS NO PATTERN FILLING -- JUST SIMPLE ┼╧╥ WITH A TWIST:
- THE ┼╧╥ BUFFER IS ┼╧╥'D INTO THE DRAWING BUFFER.
- - ┘OU MIGHT START HOSING MEMORY IF YOU ZOOM TOO LARGE.
-
- ╙╠╩ 6/15/95
-
- ┴DDENDUM
- --------
- ╙TEPHEN ╩UDD SJUDD@NWU.EDU
-
- ╠AST TIME WE PUT A CIRCLE INTO THE 2─ GRAPHICS TOOLBOX. ├HRIS
- ═C┬RIDE HAS POINTED SOMETHING OUT TO ME ABOUT THE ALGORITHM, WHICH MAKES
- IT COMPLETE. ┴S YOU MAY RECALL, THE ALGORITHM GAVE A VERY SQUARISH
- CIRCLE FOR SMALL RADII. ├HRIS TOLD ME THAT SETTING THE INITIAL COUNTER
- VALUE TO ╥/2, INSTEAD OF ╥, GAVE A PERFECT CIRCLE. ╫HAT IS GOING ON?
- ╔F YOU RECALL THE ALGORITHM, WE ARE COMPUTING A FRACTIONAL QUANTITY,
- AND WHEN THAT QUANTITY BECOMES LARGER THAN ONE, WE DECREASE ╪. ╫OULDN'T
- IT BE A WHOLE LOT SMARTER TO ROUND OFF THAT FRACTION INSTEAD OF
- TRUNCATE IT? ╧F COURSE IT WOULD, AND THAT IS WHAT STARTING THE COUNTER
- AT ╥/2 DOES.
- ╙O, TO UPDATE THE PREVIOUS ALGORITHM, ┴ SHOULD BE INITIALIZED TO
- ╥/2 INSTEAD OF ╥, WHICH MEANS THAT WE CHANGE
-
- ╠─┴ ╥
-
- TO
-
- ╠─┴ ╥
- ╠╙╥
-
- FOR A PERFECT CIRCLE EVERY TIME.
-
- BEGIN 666 CUBE3D3.2.S
- ═ ' ╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘╩╚*"@╚*"@╚*"@
- ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'-415!(14┌@:┼5$1*"@╚*"@╚*"@
- ═╚*"@╚*"@╚*"@*@╘╩╚&=%3╒)'1:!╘05┼,3╒*@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
- ═╚'-405)4140┌╚#<╧,3$╧.32@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&9)3─┼32$5$.╩ ╫
- ═+╙$┘+╙─╘╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@8╘]-4$╤%5$5$.╩ ╤,┬\╤-╥\┘
- ═-*"@╚*"@*@╘╩╚%8╙+├"@8╘]-4$╤%5$5$.╩ ╙+╙(╨+╙─╒╚*"@╚*"@*@╘╩╚%8╙
- ═+├&@8╘]-4$╤%5$5$.╩ ╓+╙$╘+╙─╒╚*"@╚*"@*@╘╩╚%8╙+├*@8╘]-4$╤%5$5$
- ═.╩ ╓+╙$╒+╙─╒╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
- ═╚*"@*@╘╩╚'=%3$╨╠╚$┼&╚$%,3*!'3╘53╚%=%3$╥@5$┴)4┌"@*@╘╩╚%!23╘=2
- ═04╓@5╘┼,3*!23╒1!5$6@0:!#54)%+╩"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
- ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@*┌!╬15>@04┘$╚&┼-4%)/5─5$(:"@╚*"@
- ═*@╘╩╚&┘/5┌!7251(╚$9!4╒1%4╩!23╒5424┘%4╥╥@╚*"@*@╘╩╚$┴)1$1%3╩!3
- ═55)&04-%4╥╥@1─┼,3$5$╚*"@╚*"@*@╘╩╚$9!0╘53+*!!3─2@15┴44─&@5$]0
- ═╚%-%0╒)%5*"@*@╘╩╚%1%6%2@34534╘%'15,┴╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
- ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├"@*┌!╞05-4
- ═╚$-(54┘+6:!,24┘%╚*"@╚*"@*@╘╩╚%)/551)3─4╬╚*"@╚*"@╚*"@╚*"@╚*"@
- ═╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙
- ═+├&@*┌!╟14┘%4─%,╚%!/3%┼'3╘┌@4$╤/5*"@*@╘╩╚%=)5$┬@2$┼$1$5.╚$9!
- ═0╘53╚"┴╪+5!23╘150╒0╔*@╘╩╚$%.1*!:3╘]-╚$9%05154─4╬╚*"@╚*"@╚*"@
- ═╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├*@
- ═*┌!┼;╫(═0┼5&1─52╚$9)3$╤)3─>@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
- ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(25.@4%)/1╒)!3:!)4┌!)3┼1%3─1%1*!43┌"@
- ═*@╘╩╚$%#0╘]-4$%.6:!42$6@05)424-,1:!)3╩"@╚*"@*@╘╩╚&,]:$%#2╘┼.
- ═1╥╥@:┼5.+╩ ┘-:!)4╒-512┌@╚*"@*@╘╩╚&9/4╩!$151!24╤3╚$].╚%1(25.@
- ═4%)/1╒)!32╥@*@╘╩╚%)%042@5$┴%╚$%25$┼#3$4┴╚*"@╚*"@╚*"@╚*"@*@╘╩
- ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'=2251%╚%1/╚%53
- ═(:"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
- ═╚*"@╚*"@*@╘╩╚&╒94╘5,1╩!72$5.╚%┼/54┘'╚$1)1*"@╚*"@╚*"@*@╘╩╚$5!
- ═1╘523%╞@1┼)%455%3┼2@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&1/0╒1/4╩!!3─2@<╘%)
- ═3┼0╠╚$%.1*!(14%21*"@*@╘╩╚$=214%4╚&%21╒5-14┘4╚*"@╚*"@╚*"@╚*"@
- ═╚*"@*@╘╩╚*!┴0─]55*!)5*!!3─2@04)/550┌╚$)55*"@╚*"@*@╘╩╚*!%5─52
- ═34]21:"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&-!346@3╒54╚$)9╚%1(1:!3
- ═04╒%╚&1/3╒*@╚*"@*@╘╩╚$%3╚$┼.╚&╞@5╘5.5"┌@╚*"@╚*"@╚*"@╚*"@╚*"@
- ═*@╘╩╚*"@╚"╓@<┼5"04┼9052@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@
- ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(3╒5'2*!╔╚%-014%+╚%=)5$┬@
- ═5$┴%╚*"@╚*"@*@╘╩╚%1/3─=515.@3╘:@345.╚$%.1*!/1╩!!3─=,15.@*@╘╩
- ═╚$%.1*!(059%╚$┘/5*!,3╒9%+*!╔╚$%-╚*"@╚*"@*@╘╩╚$)%0╘]-1:!!4┌!3
- ═3╒5.1$┼.1┌!"4─%34╥╥@3╒*@*@╘╩╚$&@5$┼.2╘╤)3─>@0╒┼-0─%,+╩"@╚*"@
- ═╚*"@╚*"@*@╘╩╚*"@╚"╓@,:!├3╒))3┼1(24%.4┌ ╤,┌"@╚*"@╚*"@*@╘╩╚*"@
- ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚' ╬<╥┌@=$┴)4┌!705.@
- ═5╒))5%1%3╩!54╘┼.1┌"@*@╘╩╚*"@╚*"@;4523$┼.╚#$╥."┌@╚*"@╚*"@╚*"@
- ═╚*"@*@╘╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘-(&]╥9╥ ─
- ═.# ╨, ╘-*╩!├3╘┘35$%.5%,-#6)╒9╞8╤(&5╤=2 ─,╙ ╨," [9─┼24╒2@0╘┴!
- ═4─%#5$52╚%-%5 ╒┬=69╞,┬!┼<74@)#,╪,# @.╫-%0╘].1*!#2$%204-415*@
- ═4╘54#65╧<╞)╒9┬!┼<74@)#0╨,# @.╓5╧<┬╒"549&15(-8╟5╞9╞5╥(&5╤=2 ─
- ═83,@.╫!215-534%"3%╞@5$┴%╚%1!4$6@5╘].)╒2@0─6@4┼5.3─┼.1╨╒╪,2!┼
- ═<74@)&9┬(#═╨3╘┼.5%.@1─]2╚$1205=)3─>@0:!,24┘%#7─╤(&5╤=2 ─9╞,@
- ═.╫1(15-%╚%╔%4─^@4$%'1:!!1$1215-315,->#(@97%╒("1╞9" [1$].)╒2@
- ═0╘].1─╤)0╒2@5╘┼42*!┬87-╔8╨╒┘,┬!┼<74@)&9┼#6]╠9'@@97%╒("1╞9 ╒├
- ═:'5╬:╥!┼<74@)&9┼#61╪(&5╤=2 ─-├<@.╫1(25.@25.@4╘┴!4─5$╚%=)5$┬@
- ═=#&@0─5,3╒<-9'─@97%╒("0╓. ╒╘96╒╨,2!┼<74@)&9┬(#═╧1╩!#3╒524╘4╠
- ═╚$-/54╤$╚$-/3─9,24-4╚%=)5$┬@6#$-=&5═<#(@97%╒("1╞8╥ [=$5-4$]2
- ═05)9╚%9!4─┼!0─╤%4╨╒┌=&5═<"!┼<74@)# ╥(#═╒4╘5$╚$9/4╩!"549&15*@
- ═4╒=!4"┌@╚&1/3┬=4╚%1/54-(+@╒┌,2!┼<74@)#(╥(#═╒4╘5$╚$)9╚$╒!5$┬@
- ═4─]55$┼.10╒┌,┬!┼<74@)#(╘(#═─3╘╪╟5*!43╒5#2*!42$531:!%251(15(┴
- ═#7╚╙(&5╤=2 ─,├8->├0@97%╒("0╥. ╒╦(&5╤=2 ─8├8@.╓-/3┼-404┘4╚%53
- ═142@1─]2╚$┴)1$1%3@╘@(" [4╒521─%#1:!$151%0╒1)3╘┌@+:!$3╘╪╟5*!4
- ═3╒5#2 ╒╚:61┼(&5╤=2 ─8├4@.╓%21:!355)&04-%4┌!(241$14╪_#69╔;&╨@
- ═97%╒("0╒," [85)%╚%=%╚%5324┘'╚&5╧<┬╒&24╤,/╨╒┴;╞=═87@@97%╒(#$╥
- ═," [=$┴%4─6@05)%╚#(╩4$─╧04┘'34%8╚$%.1╘╤%4╨╘-*╩!╓:6,-#79═8╫-┬
- ═(&5╤=2 ─9# ╤. ╒┬:╓=╬9"!┼<74@)&0╨,├ -8╞]╥9&5╥(&5╤=2 ─9# ╥,0╒╙
- ═<╫1┴<╟0@97%╒(#$╙-#0@.╒)/5┌ ┘╚$┼.╚%-#4─5%3╩!-14╒/4┼╞@052@,3 ╥
- ═- ╘-#2╩@:╘523─%,#0╒├:')╧=70@97%╒("1╞9╞0╥#6=┼=&┼╬(&5╤=2 ─9╞9┼
- ═- ╘-*╩!╙3╘╒%╚%9!4─┼!0─╤%4╨╘-9╓╤╧8╟┴═:6╪@/2 ─,╓8@.╫1(15-%╚$%2
- ═1:!54╘5$╚$┼.╚$-,14%224┘'╚%1(10╒╟;&]┬>&╒┴>" ]("0╘," [1%)!5╘┼.
- ═1┌ ╚1╘╤/0─%,*:!"549&15(-9╓╤╧8╟┼═:6╪@/2 ─-#$-9╓╤╧8╟┼═87@@/2 ─
- ═-#(-;&]├>&╒╔;┬ ]("0╒-╥ [=$┴%4╘6@05)%╚%53142@24┌@0╘╤%05))3─>@
- ═5$┴%#6╤╧8╫┴═87@@/2 ─-3@@.╓5╧<╩ ╚3$]#04╨╔╚$)51─9%4@╒╠;╓-┘;6┼╬
- ═(#╘@)#4┘#6╤╧8╫┼═87@@/2 ─-├ -<#%╪(#╘@)#─╥(#═╘2$531:!!4─6@5$5-
- ═4$]205)9╚%-43╒)!1╘4-<#%┘(#╘@)#─╙(#═╒4╘5$╚$┼.╚%!,3╒1424┘'╚%1(
- ═1:!04─]*14-424].#7 ╤>┬ ]("0┘- ╒╨,╟@@/2 ─.34@.╫1(15╞@05)%╚$┴%
- ═4─6@4╘^@5$┴!5*!710╒╨,╟─@/2 ─.38@.╘1/3┬=4╚$┴!5─6@5$^@4─5#04╤#
- ═54╤!5$6@5$┴%32╪-<#)┌(#╘@)&%┼#7 ╙>" ]("1┴9┬ [=$┴%6:!-04═%╚$╤)
- ═1─6@14%362╪-<#-┘(#╘@)&(╨#7 ╙>┬ ]("1┬,2 [=╘┴9╚$%21:!93╒6@3$]/
- ═2╘┼.1┌!!5*!-1:!,24═%╚%1(050_#7 ╤=" ]("1┬,┬ [9$].)╒2@64]5╚%12
- ═55-4╚$╒%/╨╒╨,╟0@/2 ─8├,-<#-╘(#╘@)&(╘(#═╚059)3─>@04┘/5$┴%4╩!#
- ═2$┼,1*!705-.)╒2@35╞@241%02╪-:6┘─97@@/2 ─-3$-8╓]╒;╟1╨=',@/2 ─
- ═-3(->╞]╧;2 ]("0╫,2 [>─]/3:!&04-43╒(-9'-╪(#╘@)#8╤(#═─<╫┬@25.@
- ═5$┴%╚$┼.0╒)%345.5*!&3╒(-(" @.╒)/5$%424┘'╚$%23╒5.1*!8#61╙>2 ]
- ═("0╓,┬ [<╘┼-24╤!4╩!&3╒*@9'-┘+*!─<╫╚-9'-┌(#╘@)#8╙#7-╪(#╘@)#8╘
- ═(#═╘2$531:!!4─6@5$┴%╚$%#5%5!3*!!3─=,15.@24┌@6*!9╚$%.1*!:#7-┘
- ═(#╘@)#8╒#7-┌(#╘@)#8╓#70╤(#╘@)#8╫(#═╘2$531:!!4─6@55-%1*!)3╩!4
- ═2$6@4─]4051)3╘╪-=#(@/2 ─-├@-=#,@/2 ─-├─@.╫-%1:!42$6@05)424-,
- ═1:!&3╒*@34]21:!$151!24╤3#70╘(#╘@)#9┴#70╒(#╘@)#9┬#70╓(#╘@)#9├
- ═#70╫(#╘@)#9─#70╪(#╘@)#9┼#70┘(#╘@)#9╞#70╤," ]("0╫, ╒┴,3$@/2 ─
- ═834@.╫1(15-%╚$%21:!42$6@14╤%345.5%.@3╘:@5$┴%╚%)/5$%424].╚$╒!
- ═5%))6 ╒┬,3(@/2 ─838@.╫┴┘>@╒├,3,@/2 ─83<-9#(╤(#╘@)&$╪(#═╘2$6@
- ═3┼5-0─52╚$1%3─]415.@*%)/5╥╤#3╘╤534╪╔#64╥,┬ ]("1┴.0╒╞,├,@/2 ─
- ═86$-9╙,╤(#╘@)&%┬#6@╙,┬ ]("1┴8╨╒╔,╙,@/2 ─860-#0╘╩*┬╩@;4%#4─]3
- ═#0╒═;╫9┼(&╒┴8╨╘@;&1┴(%╘╤#2!╙=&$@73(-(#╨\/ ╘-9╓5╘:╓5┘(&╒┴8╥ @
- ═.╫=!252@1─]2╚$&@2╘594%)%4╒,-=╓%╔="!╩<╫(@9╓5╘:6╪-(&-═<" ├,# -
- ═(&)┼<2!╫86┼╘#2 \/#╨-#61┼8╟5╟(&╒┴8╥ @.╫!224┘4╚$&@0╘┴!4─%#5$52
- ═#2!─;┌ ╨╚* [9$].)╒2@05-314╒"3$4-#2!╠9&&@(╒╘╤#2!╩<╫*@8╓┴╥;╫5╘
- ═#2!├;&─-(#╪^/┬!╟971╦97─@.╓%.1*!704┼4╚%1/╚$-/3┼1)3┼5%#2!├;7 @
- ═(╥=3)╥ [;5╞@4╘5#4─5#5*!35╘┼40╘┬@2╘59#2!┬;╞4@;#$-(&╔╙<┬!├;&5┴
- ═;╟5╨#2!╩;7 @9&]╬90╒╠,2!├;7 @(╥=8)╥ [;5╞@4╘5#4─54╚$%"3╒)4╚$═%
- ═60╘@8╞┘┼(&1╧;╞4-(&╔═<"!├;&5┴;╟5╨#2!╞:6╪-9&]╬92 \/#╨-#61┼8╟5╟
- ═82!═86,-(&1╧╚# -(&╤─82!=,0╘@<╫1┴(#$╨,├0-(&9╔;@╒─;╓┘┼82 \/#╨-
- ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#0╘@;&1┴(",─,# -
- ═('-╘82!┬:╓=╬9 ╘@<╫1┴(&)╧<╞1┼<@╘@;&1┴('9═8╫-┬#2!┴;╞0@(╥4╨,# ╨
- ═,3$╤,2 [<╘-2145.╚$╒%34]26:!43┌ ╤,#(╘#2!╧<╞$@(╥4╨,# ╤,# ╨, ╘@
- ═<╫1┴('9═8╫-┬#0╘@;&1┘(",╨, ╘@;&1┴(",\='1┼>'0-('-╘82!╘96╒╨,0╘@
- ═;&1┴(",^='1┼>'0-('-╘82!╘96╒╨,@╘@:╞╒╨('1╔=&╤┼#71╘97┴╘(&┴┼>" ┘
- ═,╙ ╒,3$╤,3$╤(#═#3$5!4╩!30╒)%14╪╠╚%=(251%+*!#4┼-2╚$1.#2!╘>'0@
- ═)┌"@╚*"@╚*"@╚*"@╚*!#54)%,╘2@5├,╬,┬<╠,$0╠,$0-('1╪=" ╟╚*"@╚*"@
- ═╚*"@╚*"@╚*"@╚*"@0┼─╟+#!$#2!╚97@@.68@.╘-904╪-('1╪=" ╟╚*"@╚%-4
- ═15!(14┌@2┼5$1"<-(&┴┼>" ┘.0╘@='┴╘(">@╚*"@1╘5/4─=%╚%1!64╤/4┬<╠
- ═,$0╠,$0-(&┴┼>" ┘8@╘@='┴╘(">@╚$-(14-+╚$]55*!42$6@2─%.+╩ ┘-:!)
- ═4╒-51:!/1┬<╠,$0-(&┴┼>" ┘-@╘@='┴╘(">@╚$,]2$%#2╘┼.1╥<-(&┴┼>" ┘
- ═8@╘@='┴╘(">@1─]2╚$╒/4─6@1$5404┼,4╥$╟+#!$#2!╚97@@,&0╤9#%─.64╤
- ═,@╘@='┴╘("=&,2]&,┬<╠.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!8+5)/5$%424].
- ═)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&,╥]&-"<╠.3(-('1╪=" ╟╚"╓@24┘#
- ═+╘1%0┌!9+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&-2]&-┬<╠
- ═.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!:+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤
- ═,@╘@='┴╘(">@1├>@╚"<╠.3(-('1╪=" ╟╚"╓@4─53150╟+#!$#2!╚97@@,60╤
- ═9#$╥#2!╘>'0@)┌ ╦+╥╓@)╥╨┘,@╘@='┴╘(">@+:!:3╘]-╚$┼.+╘]55"<╠,$0-
- ═(&┴┼>" ╤9#%─,3(-('1╪=" ╟╚*!(╚* ╟+#─╥#2!╘>'0@)┌ ═╚%1/1╘=,1:!(
- ═241$14┌@4╒521─%#15,╟+#!$#2!╚97@@,60╤9#$╥#2!╘>'0@)╒-004-%)╥╨┘
- ═,@╘@='┴╘(">@+:!43╘='3$6@4╒521─%#1:!&24╤,24┘')╥╨╨1"╨╨1 ╘@='┴╘
- ═(">@╚%!215-3╚%&@5$^@455)5"<╠,$0-(&┴┼>" ╨9# ╒#2!╘>'0@)┌"@╚*"@
- ═╚%!215-3╚$%.6:!+15╞@5$^@0─5'24╪╟+#!$#2!╚97@@,# -=&┼╘;&4@;&1┴
- ═("┴╘96╒╨,2─╠>0╘@8╞5╤(#╔├;╓┘╘#2!╩<╫(@8╓┴╥;╫5╘#2!╔;╟─-(&)╬92!╘
- ═:71╠90╘@:6┘├('1┼;7 ╥#2!╩;7 @=&┼╘;&4-.╞-╧;╟0@/├╪^(&=┼=&═┼>0╘-
- ═*┬╚╩*╩!╙152@55"@5$%"3$53*#\╔#0╘╩╚'1!0─╤%4┌!!4─6@0╒524─5.5$╤9
- ═╚%-%5*!54*!)3╩!┬87-╔8╨╘╩╚$%.1*!"6:!42$6@05-314╒"3$52+@╘-=&%┬
- ═;&5╙(&╤─82 ├/╟1═871╚,0╘@<╫1┴('╚╤*╙$-('-╘82!┌,┬╠╤#2!╠9&$@(╙┘╘
- ═;6%╘:#(-('-╘82!┌,╥╠╤#2!╙=&$@>├0╦,0╘-*┬╚╩*╩!├3$5!4╩!30╒)%14┌@
- ═04┘$╚%-%5*!54* ┬0─┼434%0(@╒╙971╒<"!╠9&$@(╥0╨,2 [=╘┴)5$4-('-╘
- ═82 ─9# ╥,2 [=$┴)4┌!)4┌!$3╘┘%╚%-/╚%1(052@3╘╤$15(-(&╤─82 ├,30╫
- ═(#═-04-(24┘%4┌!724╤,╚%-%5*!54 ╘@:╟-╥(&-╚<╞]╒= ╘@;&1┴(",─,# @
- ═.╘-/4┼)%0╒1,60╘@<╫1┴("1─,#(╤#2!╠9&$@(╙╤╙<╫1┴<╟0-(&%─8╥ ├,3(@
- ═.╫1(1:!'3╘%,╚$┼3╚%1/╚$-%3┼1%4╩!42$6@1╒)!4$┴)0╒,-('-╘82!╘96╒╨
- ═,2 [8╘],54╒.╚#$╥#2!╠9&$@(╙┘╙<╫1┴<╟0@.╫)/5┌ ┘#2!╙=&$@=&5═<#$╦
- ═,2 [<╫-╘87)╘╚%!/24┘44┌!43┌!23╒>@.0╘@;&1┴(",╨, ╘@;&1┘(",╨, ╘@
- ═;&1╪(",╨," [6*!724╤,╚$-/54┘4╚#$╓╚%)/5╒.@1─]2╚%53#2!├;&,-#3╔╠
- ═;╓]╨('-╘82 ╚=&5═<#$╔+'─-(&┼╬>0╘@861├(",╤-@╘@8╞-├(#╔╠;╓]╨#2!├
- ═;&,-(&╤─82!╘96╒╨,0╘@861├(",╘," [;─5%1*!43┌!!1$2@-#"@5$^@5$┴%
- ═╚$)!4╘6@4$])3┼1%4@╘@<╫1┴('1┼;7 ╤(#═╘3┌!*54╒0╚%1/╚%1(1:!.15┴4
- ═╚%)/5╨╘@;&1┴('1┼;7 ╤*╙$-(&%─8╥ ├,# @.╫1!2╘6@0╘%21:!/1╩!#05)2
- ═2453#2!╙=&$@=&5═<#$╦,0╘@;&1┘(",╨, ╘@:6┘╪#2!╘>&$@(#═╪╚$┼3╚$%,
- ═4╘^@04┌@24┘$15┬@24┘43┌!42$6@0╘┴!4─%#5$52╚$┘534)%4@╘@8╫!╪(",╤
- ═-@╘@8╞┘┼(#╔╠;╓]╨(#═╬145$╚%1/╚$1/╚$┼4╚#$╓╚%1)3453#0╘╩*┬╚╩╚&-,
- ═14%2╚$)51─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^
- ═8╟5╞9├$-('-╘82!┬=69╞97(╦,0╘@;&1┘(",─,# -(&╤─>" ├,├0@.╓%34╒5-
- ═24┘'╚$%,3*!42%)%1:!"549&15)3╚$%210╘@;&1┴(",─,# @.╘)!0╘╠═5$\═
- ═0─%#2╨╘┌8╞╤╧;╫ @<╫1┴("┴┬=69╞97(╔+'─-(&┼╬>0╘@8╞┘┼(#╔┬;&]╧< ╘@
- ═:6┘├(&)╒9╞9┼<┬╠╤#2!─97@-(&)╬92 ┌8╞╤╧;╫ -#2╚╩*┬╩@<╘54╚%50╚$)5
- ═1─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^8╟5╞9├$-
- ═('-╘82!┬=69╞97(╦,0╘@<╫1┴('╔╘96╒╨(#═:5$5-4*!724╤,╚$╒!2╘6@3$┼&
- ═1:!324╒03$6@1─]2╚%53#2!╠9&$@=╞╒├<╓(-(&%╬9" ├)3$╤,3$╨,# ╤(#═╙
- ═5$%25*!(15)%╚%-/╚%1(052@4╒=!4*!"549&15)3╚%=)3$╥@5╘]22┌!224=(
- ═5 ╘@;╫)┴(",┼,# ╨,#$╤,3 -('-╘82!╓;6-╙8@╘-*┬╚╩*╩!╙152@55"@24┘)
- ═5$┼!3*!604╤515,-#6┼╬:70@;&1┴(",╨, ╘@<╫1┴(&╤╧8╫┴═:6╪-('-╘82!╠
- ═;╓-╪;6%╪#2!╙=&$@;&]├>6╒╔;@╘@<╫1┴(&╤╧8╫┼═87@-('-╘82!╟;&]┬>&╒╔
- ═;@╘@<╫1┴(&=╠;╓)┘;6┼╬#2!╙=&$@9╓╤╧8╟┴═87@-('-╘82!╟;&]┬>6╒┴> ╘@
- ═<╫1┴(&1╙> ╘@<╫1┴(&1╙>0╘@<╫1┴(&1╙>@╘@<╫1┴('-╪#2!╙=&$@<╫─-('-╘
- ═82!╙>@╘@<╫1┴(&9╔;&╨-(&╤─82 ├,#$-('-╘82!╚:61┼#2!╠9&$@(╙8╘#2!╙
- ═=&$@>╞]╧;0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘-*╩!═
- ═04┼.╚$╤/3╒ -#2╚╩*┬╩@9╘54╚$═%65!215-3#0╒═86┼╬#2!├;&─-:╫!╥97-╙
- ═(&╔╙<┬!╟971╔;@╘@8╓╒╨(",╤,╙,@.╓8╤/╨╘@8╞┘┼(#╔╞,@╘@;&1┴(&1╙> ╘@
- ═8╓╒╨("-┴;╞=═87@╧,┬ [;─^@34]21:!42$%.╚%!)#2!┬97$@.╞-╧;╟0╤#2!╔
- ═;╞,@9'-╪(#═/5$┴%4┼=)4╘6@24┘#4─5!4╘6@6"╒23╒1!5$┼/3@╘@:╞╒╨(#╔├
- ═;╓┘╘#3╔╞,┬!├;7 @(╙$╙-╥ [9├(_#2!┬;╞4@.╞8╙#2!╠9&$@9'-╪#2!┬97$@
- ═.╞-╧;╟0╤#2!─96,@9'-╪#2!╩;7 @.╞-╧;╟0-.╞8╙(&-═<" ├,3,╘#2!┬;╞4@
- ═.╞8╘#2!╠9&$@9'-┘#2!├;7 @(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@
- ═9'-┘(#═╔3─-214%31:!9+5)/5$%424].#2!╩;7 @.╞-╧;╟0-.╞8╘(&-═<" ├
- ═,3,╪#2!┬;╞4@.╞8╒#2!╠9&$@9'-┘#2!┬97$@.╞-╧;╟0╤#2!─96,@9'-┘#2!╩
- ═;7 @.╞-╧;╟0-.╞8╒(&-═<" ├,3,╒#2!┬;╞4@.╞8╓#2!╠9&$@9'-┌#2!├;7 @
- ═(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@9'-┌(#═:+5)/5$%424].#2!╩
- ═;7 @.╞-╧;╟0-.╞8╓(&-═<" ├,3,┘#2!┬;╞4@.╞8╫#2!╠9&$@9'-┌#2!┬97$@
- ═.╞-╧;╟0╤#2!─96,@9'-┌#2!╩;7 @.╞-╧;╟0-.╞8╫(&-═<" ├,3,╓#2!┬;╞4@
- ═.╟!╠=7,-(&╔═<"!╔;╞┼╘#3╔├;╓┘╘,2!╩;7 @.╞-╧;╟0-.╟!╠=7,@8╓╒╨(",╟
- ═*╥<-(&)╬92 ┌;6┼╬=7,-(&┼╬8╥!┌;╓]═(#═┬04@╠╚%=(3┌!.145$4┌!%4┼)/
- ═4╩!#2$5#2╘┼.1╙\-(&┼╬8╥!┌;╓]═#2!╩;7 @.╞-╧;╟0-.╞╒╔;╟5╙(&-═<" ├
- ═)╥╘╟#2!┬;╞4@.╞@-(&1┼8╥!┌;╓]═#2!─96,@>╞]╧;0╘@8╟!╠(#╔├;╓┘╘#2!╔
- ═;╞,@>╞]╧;0╘@:6┘├('╔╧;╓╘-(&╔═<" ┌8╓]╬= ╘┌:"!├;7 @(╥=()╨╘@8╞┘┼
- ═(#╔╙<&%├90╘@;&1┴(&┴╔9&4-(&5╧<┬ ├)# ╤#2!╙=&$@:&┼─90╘@:╞╒╨(#╔├
- ═;╓┘╘#3╔╙<&%├92!├;7 @(╥>@)╨╘@8╞┘┼(#╔╤#2!╠9&$@9╞┼╠; ╘@96]╥(",─
- ═,#$-('-╘82!╞:6╤╠#2!╩;7 @.╞-╧;╟0-.╟$@8╓╒╨(",╟42<@.╒&@455)5%,-
- ═(&)╬92 ┌8╓]╬= ╘@:╞╒╨(&-╠96%╬=7 -#3╔├;╓┘╘('-┼:2 @.╫-0145$╚%1(
- ═24┘'4┌!54*!!╚$))5 ╘-*┬╚╩*╩!╒4$1!5$6@04┘'3$53#0╒╒<&1┴=&4@8╓╤├
- ═#2!╠9&$@<╫@-(&%─8╥!─<╫@-(&-═<" ├86┘╟;6%╪(#═┴4─6@5╘6@/├╓@34%8
- ═24╒53:!!3─=,13\-(&)├8╥ ┌8╓]╬=#$-('-┬8╥ ├86┘╟;6%╪(#╔╔1┬!33╥╨@
- ═4─53150-.╞-╧;╟0╤('-╘82!╙> ╘@8╓╤├#2!╠9&$@<╫─-(&%─8╥!─<╫─-(&-═
- ═<" ├86┘╟;6%╪#2!┬8╓,@.╞-╧;╟0╥#2!╙8╞,@(╓%╬9╓╒┴>" [<╘%-1:!$14%,
- ═#3╔├;╓┘╘,┬!╙=&$@<╫─-(&-╠8╨╘@;&1┴('-┌#2!┴9&,@9'-┌#2!├;7 @(╓%╬
- ═9╓╒┴> ╘@8╞-├(#╔├;╓┘╘,╨╘@<╓)├("-┴;╞=═87@-.╞-╧;╟0╙('-╘82!╙>@╘-
- ═*┬╚╩*╩!╥3╒1!5$6@0╘]/4─1)3─%415,-#7)╧=&%╘90╘-*┬╚╩╚&9)4┼-4+*!#
- ═04╤#54╤!5$6@5#$╠5#(╠+┬╪╬+%0╤, ╘-*┬╩@=%=/╚$╒!0╒)/4┌!43┌!324╒0
- ═3$┼&6:!/55*@3$┼&10╒┴9&1┴(&╒┴8╥ @.╓%$1*!45╘^@04┘'3$53╚%1/1╘54
- ═2$52#2!├;&,-(&╤─82!=,0╘@861├(%╘╥#2!├;7 @(╓%╬9╓╒┴>" [:5.@5$┴%
- ═╚%-53: ^╚#(╩4$─_#2!┬8╓,@9&]╬90╘@<╓)├("-┴;╞=═87@@.╓┼&╚%-/+*!3
- ═54)44─%#5* ╥*┼!)#61╧;╞4@/#╨\#0╒╙=6)┴(&╒┴8╥ @.╫-50┼1204-4╚%17
- ═3┌!!3─=,15,-('-┼8╨╘@;&1┴(%╘╤#2!╙8╞,@73(-(&)├<╥!─;╓┘┼#2!┴9&,@
- ═(╓%╬9╓╒┴>" [;╘]04╥╥@5╘6@3─5%1*!43┌!!1$2@,┬╔020╒─;╓┘┼(#╨\/ ╘-
- ═*┬╩@;─]7╚$-!3$-53$%41:!4,2╤4,┬╤%5$,╬#0╘@/├╪^('-╒8╞$╠<╫─[<╫╚-
- ═('-╘82!╘,2 [5#$]4╒─═4╒╚-(#╪^/┬!┴9&1┴+'-┘.╫-┌#2!╙=&$@=#(@.╒0╥
- ═/5-9*╒-:#2 ^/├╪@861─82╤╙>#═╙>@╘@<╫1┴('0╙(#═4,╙╒36"═36@╘@/├╪^
- ═('-╒8╞$╠<╫@[<╫╚-('-╘82!╘-" [5#0]4╒@═4╒╚-(#╪^/┬!┴9&1┴+'-╪.╫0╥
- ═#2!╙=&$@=#4@.╒0╒/5-8*╒0╥#2 ^/├╪@<╫5┬82╤╙>#═╘,0╘@<╫1┴('0╓(#═4
- ═-├╒36"╒4,0╘@/├╪^(&%─9&$╠<╫@[=#$-('-╘82!╘-╥ [5#<]4╒@╦5#$-(#╪^
- ═/┬!╙=6)┴+'0╥.╫-╪#2!╙=&$@=#@@.╒0╪/50╥+5-8#2 ^/├╪@<╫5┬82╤╙>3═╙
- ═> ╘@<╫1┴('0┘(#═4.3╒362╒36 ╘@/├╪^(&%─9&$╠<╫@[<╫─-('-╘82!╘,3 @
- ═.╒0╤,#╒36"═360╘-*╩!┼5*!63╘┼,02$-#2╚╩*╩!╬15┴4+*!#04╤#54╤!5$6@
- ═82╤┬+&,╠+┬╪╬+&─-#2╚╩╚&%.3╒1(15*@55-%1┼5,╚$╤)5%1,1:!-04-23╨╒─
- ═:78╥(&╒┴8╥ @.╓1)5─┼$1:!!╚%-)1╘┘%1*!.54╒"15*@0┼╞@,@╘[:52@25.@
- ═05-354╒%1*!42$%4╚%1(1:!.54╒"15(-(&)╨;"!╨;╫,@.╘┼3╚$┼.╚%1(1:!!
- ═0╘-5355,051/4@╘@8╓╤├#2!┼;╫(@(╥1╞9┬ [=╘6@3─5%1*!43┌!53┬╒.14=!
- ═5$┼61:!42$6@3┼5-0─52#2!┴9&,@(╙ ╤(#═"6:!404═)3─>@250╟4┌!#3╘╒0
- ═3$5-14┘4#2!╠<╫(@(#═$259)1$6@0┼╞@5%=/#2!├;&,-(&5╧<┬ ├)&9╞#2!┴
- ═9&,@(╙ ╤(#══04═%╚$┼4╚$┘%1╘%4259%╚$%'04┼.#2!╩;7 @9&]╬961╔=@╒╨
- ═;╫,@;'-╥(" [;┼5-0─52╚$┼3╚%!/4╘┼4259%#61╧;╞5─:78@/#╨\#0╒═=6╨╥
- ═(&╒┴8╥ @.╓╒53%1)4$╤9╚$&@4╘┼'3─5$╚$┘534)%4╩!"6: ╥#2!┬<&╨@<&]╙
- ═;0╘@8╓╤├#2!┼;╫(@(╥1╞9@╘@861├(",─,#$-(&%╙; ╘@8╓╤├#2!┼;╫(@(╥1╞
- ═9@╘@861├(",─,#$-(&╔═<"!─;╓┘┼;75╠#7!╧<╓╘@87-╠#61╧;╞5═=6╨@/#╨\
- ═#0╘╩*╩!╬3╒1%╚%1(052@5╘6@05)%╚$-54┼)%3┼1,6:!-04═)3─>@0:!-24┘/
- ═4╩!,14%0#2╚╩╚$]&╚$9!251(╚%1(052@3─^@3╒9%4─9,3╒=3╚%=)3$╥@3╘-#
- ═55(╬#0╘┌8╓%╠8╓$@8╓╤├#2!╠9'@@=#$-(&╤─82!├;╫,╠> ╘@;&1╪('0╥#2!┴
- ═9&,@8╓]╙+'@-('-╘82!┴,3$@.╓$]*$-/4╥┴4,2─╦0╘]3*%0╥*2─╧,@╘┌8╓%╠
- ═8╓(@;&1╪('0╤#2!╠9&$@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╥#2!╙8╞,@<╓┼╬+'@-
- ═('-╘82!┬,3(@.╓(]*%-)3┬┴4,2─═4╘┼.*%0╥*2─╧,@╘┌8╓%╠8╓,@;&1╪('-┘
- ═#2!╠9&$@<╓┼╬+'@-(#╪^/┬!═=6╨╥#2!╙=&$@8╙$╙(#═├/5-)3┬┴362─-.╞-┴
- ═;&-─('-┼8╨╘@;&1╪('0╪#2!╠9&$@8╓]╙+'@-(&╤─>"!╘-╨╘@<╓)├(&-╧<╥╤╪
- ═#2!╙96,-(&╤─>"!╘-0╘@<╓)├(&-╧<╥╤╪#2!├;&,-(&╤─>"!╘-@╘@861├(&-╧
- ═<╥╤╪(#═─23╘╚0╘]3*%0╪*2╒#3╒,╚5#<╔*╘-/4╥┴4-┬─═0╘]3*%0╒*2─╧,@╘@
- ═/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╙#2!┴9&,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╘
- ═#2!╙8╞,@<╓┼╬+'@-('-╘82!─,├$@.╓0]*%-)3┬┴4,╥─═4╘┼.*%0╘*2═─22─╧
- ═,@╘┌8╓%╠8╓4@<╓5├#2!╠9'@@=#4-(&╤─82!╙:6╪╠> ╘@;&1╪('0╓#2!╙8╞,@
- ═<╓┼╬+'@-('-┼8╨╘@;&1╪('0╫#2!╙8╞,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╪#2!╙
- ═8╞,@<╓┼╬+'@@.╓5)/2┴324╪╚5#4╔+5-)3┬┴4-┬─═4╘┼.*%0╫*2╒324╪╚5#@╔
- ═*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!├;╫,╠> ╘@8╓╤├#2!╠
- ═9'@@=#0-(&%─8╥!├;╫,╠> ╘@<╫1┴(&4╥,┬ [93╘╚0╘]3*%0╙*2═#3╒,╚5#0╔
- ═*╓5)*2\╥#3╔├86╤├9┬!╠9'@@=#─-(&╤─82!╙:6╪╠> ╘@<╓5├#2!╠9'@@=#$╨
- ═#2!╙8╞,@<╓┼╬+'@-('-╘82!╞,├,@.╓8]*%-)3┬┴4.2─═4╘┼.*%0╤,"─╔+╙(-
- ═.╞-┴;&-╟(&╤─>"!╘-@╘@;&1┴('-╔;┬╤╪#2!╙96,-(&╤─>"!╘. ╘@<╓)├('-╔
- ═;┬╤╪#2!╙96,-(&╤─>"!╘-╨╘@<╓)├('-╔;┬╤╪#2!╙96,-(&╤─>"!╘-0╘@<╓)├
- ═('-╔;┬╤╪(#═╟23╘╚4╘┼.*%0╓*2╒324╪╚5#@╔+5-)3┬┴4-╥─═4╘┼.*%0╒*2─╧
- ═,@╘@/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╘#2!┴9&,@8╓]╙+'@-('-┼8╨╘@;&1╪
- ═('0╙#2!╙8╞,@8╓]╙+'@-('-╘82!╟,╙$@.╓<]*$-/4╥┴4-"─═0╘]3*%0╙*2═╟
- ═22─╧,@╘┌8╓%╠8╓@@8╓╤├#2!╠9'@@=#8-(&╤─82!├;╫,╠> ╘@;&1╪('0╫#2!┴
- ═9&,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╒#2!╙8╞,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╪
- ═#2!╙8╞,@8╓]╙+'@@.╓┴)/2┴#3╒,╚5#8╔*╘-/4╥┴4-╥─═0╘]3*%0╒*2╒#3╒,╚
- ═5#@╔*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!╙:6╪╠> ╘@8╓╤├
- ═#2!╠9'@@=#0-(&%─8╥!╙:6╪╠> ╘@<╫1┴(&@╙,┬ [:#╘╚4╘┼.*%0╙*2═324╪╚
- ═5#0╔*╓┴)*2\╥#3╔╫:&5╫(&-╠8╨╘@;&1╪('0┘#2!╠9&$@8╓]╙+'@-(&╤─>"!╘
- ═,3 -(&%─8╥!├;╫,╠> ╘@<╫1┴(&─╙,╥ [:3╘╚0╘]3*%0┘*2═#3╒,╚5#$╨*2─╧
- ═,@╘-*┬╩@:50╟4┌!!3$╥@1$]73─┴)3$╥@1┼)/3:!(15)%+@╘-9&]╫;╞┴╔;&╨-
- ═*┬╚╩*╩!├3$5!4╩!"549&15(-*╩!┴╚$╤)5%1,1:!-04-23╨╘-<╓5╘8╟5╞(&╒┴
- ═8╥ @.╫!55*!"549&15)3╚%=(15)%╚%1(15╞@0╘%.╚$)%╚$┴54┼0-(&╤─82 ├
- ═,# -('-╘82!┬=69╞97(-(&╤─82!┌=&5═<" [:$┼'2*!"651%#7-╘86)╒9┬!╙
- ═=&$@8╟5╞9╞5╥*╙$-(#╨\/ ╘-(#╪^/┬!╙971┬=68-8╓╤╥9')┴=╥!╠9'@@(╙ ╪
- ═#2!╠9&$@(╙ ╨#3╔╞;╓]╠(&╤─>2 ├,# -.╞1╧<&4@<╫1┴("┴┬=69╞97(╔+'─-
- ═(&┼╬>0╘@8╞┘┼(#╔─;╫!┼#2!╔;╞,@8╟5╞9╞5╥*╙$-(&1┼> ╘@8╞┘┼(#╔╞;╓]╠
- ═#0╘╩*┬╚╩╚&╒9╚$=/3╘1.15-3╚$)55*!╔)╘╓@0:!$3╒!%#2╔├;')─<╞%╫╚&╤─
- ═8:!╟;&]┬>&╒╔;@╘╩╚&╤╙<╩"@.╓┘%142@5$^@1╘54╚$┼.5$^@5$┴%╚%))1╘┴4
- ═╚$-/3%5-3@╘╩╚&)├8┌ ┌979┼;╩ [95┴03$%)3─5$╚$┼.╚$╒/4─6@1$5404┼,
- ═╚$)%3$]7#2╩@;&1┘╚",─.# -*╩!╙='╞@8╟5╞9╞5╥╚#═╨4─5354╒!0─╤9╚%1(
- ═25.@5╘┼,3*!"1:!!╚$╤)5%1,10╘╩╚&-╠8┌"@.╘╒/4─6@149&24-)14┘4+@╘╩
- ═.╞5╓96┌@861├╚&)╒9╞9┼<┬╠╤#2╩@<╫1┴╚&)╒9╞9┼<┬╠╤#2╩@;&1┴╚&=╠;╓)╪
- ═;6%╪#2╩@<╓5├#2╩@<╓)├╚&=╠;╓)╪;6┼╬#2╩@=&%╪#2╩@:6┘╪#2╩@;&1┘╚&=╠
- ═;╓)┘;6%╪#2╩@8╞5╤╚#╔╥97-┼= ╘╩.╟┼┴>:!╠9&&@(╥0╨, ╘╩╚&╤─>:!╟;&]┬
- ═>6╒┴> ╘╩.╞)╠86┬@<╫1┴╚"┴┬=69╞97(╔+'─-*╩!─97─-*╩!├<'╞@9╓╤╧8╟┼═
- ═:6╪-*╩!┬8╫.@.╞)╠86@-*╩!╠9&&@8╟5╞9╞5╥#2╩@96]╥╚",─.# -*╩!╙=&&@
- ═8╟5╞9╞5╥#2╩@8╞┘┼╚#╔╫:&]╨964-*╩!╔;╞.@8╟5╞9╞5╥*╙$-*├╔╫:&]╨966@
- ═9&5╪#2╩@8╞┘┼╚#╔┘87─-*├╔╥97-┼=*!╠9&&@(╙"@.╓┘%142@5$^@4─53152@
- ═5$┴%4╘6@1╒594╨╘╩╚'-╘8:!╟;&]┬>&╒┴> ╘╩╚'-╘8:!╟;&]┬>6╒┴> ╘╩╚&╤─
- ═8: ├)&9╞#2╩@<╫1┴╚&=╠;╓)╪;6┼╬#2╩@<╫1┴╚&=╠;╓)┘;6┼╬#0╘╩*┬╚╩╚&┘%
- ═6%0╠╚%)%042@04┘$╚$1205>@4$],64=/3┼,-#7)┼861─<╞%╫(&╤─>2 ├,# -
- ═('-╘>2!╔;╞1┼> ╒╧8╞╔╠;╓]╨(&╤─>2!╔;╞1┼> ╘@;&1┴('!╧;'┼╠:7-╘+'─@
- ═.╓9)4┼-4+*!42$6@3┼5-0─52╚$]&╚%!/24┘44╨╘@8╞┘┼(#╔├;╓┘╘(#═┬552@
- ═24:@3┼5-4$])3┼13╚$┼3╚%╔%4─^@5$┴%3@╘@:╞╒╨(&]┬:╞1╧;╞4@.╒=%╚$%2
- ═1:!!5*!42$6@14┘$╚$]&╚%1(1:!,25-4#3╔├;╓┘╘('-╘82!├;╫5╬='!╘<╨╘@
- ═:6┘├(&┼╬9&5╪#0╘╩╚')/5$%41:!04─]*14-4╚$%.1*!$4─%7╚%1(1:!03╘╤9
- ═1╘].#2╩@;4%+1:!355)%╚$)51─9%4╩!"14┼.1┌!$4─%73╩!43┌!)4┌!#3$5!
- ═4┬$-#3╔─;╓┼╘(&╔╙<┬!╥;╫1╨<╞]╩#0╘╩╚&-/3┼9%4┼2@6$╒)3╩!!3─2@6$╒!
- ═6*!43┌!#3╘╤534┘3#0╘@;&1┴(&╤╧8╫┴═:6╪-(&╤╙<@╘@;'-╥#2!╠<╫(@(#═8
- ═╚$╒/1* ╪#2!╙=&$@;&]├>&╒╔;@╘@8╓╒╨(&=╠;╓)╪;6┼╬#2!┬8╫,@.╞┘┴: ╘@
- ═<╫1┴(&=╠;╓)╪;6┼╬#3╔╬86@@;&1┴(&╤╧8╫┼═:6╪-(&-═<"!╟;&]┬>6╒╔;@╘@
- ═8╞-╙(#╔╒:'5╚#2!╙=&$@9╓╤╧8╟┼═:6╪-.╟5╚=6@@;&1┴(&╤╧8╫┴═87@-(&╤╙
- ═<@╘@;'-╥#2!╠<╫(-('-╘82!╠;╓-╪;6%╪#2!├;7 @9╓╤╧8╟┴═87@-(&)├8╥ ┌
- ═;╞]╫87─-('-╘82!╟;&]┬>&╒┴> ╘┌;╞]╫87─@;&1┴(&╤╧8╫┼═87@-(&-═<"!╟
- ═;&]┬>6╒┴> ╘@8╞-├(&5╧<╞9╔;&╨-('-╘82!╟;&]┬>6╒┴> ╘-*╩!╔1╩!54╘┼.
- ═1┌!42$6@96]╥+4)51─9%4┬╥@0╘]06:!)3┼1/╚$1205=)3─>@0┼5&1─52#2╩@
- ═84┘$╚%1(14┌@0╘╤%05*@5$┴%╚&5╧<┬╒"549&15(-#65╧<╞9╔;&╨@;&1┴(&9╔
- ═;&╨-(&)┼<2!╧8╞╔╠;╓]╨#0╘@/├╪^('-┼=&)╒9@╘@;&1┴(",\96]╥8╟5╞#2!╙
- ═=&$@=&5═<#$-(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴('1┼;7 ╤*╙$-#2!╠9&$@;&]├
- ═>&╒╔;┬ [;&]├>&╒╔;╩!.3╒>@0╘].5$%)3┼.@0╘],54╒.#2!╠<╫(@(#═┼04-(
- ═╚$-/3%5-3╩!)4┌ ╤,├┬@0┼┼415,-(&)├8╥ ┌979┼;┬ [<╘^@5$┴%4─6@34┼'
- ═2%2@0─6@0:!#05)260╘@;&1┘(",─.# -('-╘>2!┬=69╞97(-('-╘>2!╘96╒╨
- ═,0╘@8╓╤├#3╔┼=╞5╬('-╘82!╘,@╘@861├(&)╒9╞9┼<┬╠╤#2!╙=&$@8╟5╞9╞5╥
- ═*╙$@.╓5!0╘┬@0╘],54╒.╚$┼3╚#$╥.*!"651%4╨╘@;&1┴('0╥#2!┴9&,@=&5═
- ═<#$╦,2 [;─]7╚%=%╚%=)3$╥@4╒1!4┼2@052@5$┴%#2!╙=&$@=&5═<#$╦,2 [
- ═0╘],54╒.#0╘@;&1┴(&╤╧8╫┴═87@-('-┼8╨╘@<╓)├(&╤╧8╫┴═:6╪-('1┴>" [
- ═=$]404╥@3┼5-0─52╚$]&╚$-/3%5-3┼.@5$^@1$\-(&┼╬>" @.╘4╬1╥┌@1─┼,
- ═3*!#3╘╤534┘3╚#$╬+├,-(&╤─>2!╠;╓-┘;6%╪#2!┬;╞4@.╞9╧;╫ -(&┼╬8╥!╠
- ═;╓-┘;6%╪#3╔╞;╓]╨(&╤─>2!╠;╓-┘;6%╪#2!╠9&$@(╙ ╨#3╔╟;╓]╨(&5╧<┬ ╚
- ═=&5═<#$╔+'─@.╓5╧<┬╒"549&15(-('!╚80╘╩╚&╒!64)%╚%!55*!!3╩!┼;╫*@
- ═0─5,3╒<_#2!┼;╫(@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82 ├
- ═,# @.╓╒)1╘┴4╚$%3╚%=%3$╥@0╘╤%05*@252@3─]7#2!╙=&$@*'1┼;7 ╤*2╤┘
- ═#2!╨;&$-(&1┼>0╘@8╫!┘(&╤╧8╫┼═:6╪-(&)├<╥ ┌9╓]╧< ╘@;&1┴(&)╒9╞9┼
- ═<@╘@96]╥(",─.# -('-╘82!┬=69╞97(-('-╘82!╘96╒╨,0╘@8╞┘┼(#╔┬;╓]╨
- ═#2!╔;╞,@8╟5╞9╞5╥*╙$-(&┼╬8╥!╘96╒╨,2╠╤#3╔┬;╓]╨(&1┼> ╘@8╞┘┼(#╔╞
- ═;╓]╨#2!╩;7 @;╓)╩;&]╧< ╘-;╓)╩9&]╬90╘╩*┬╚╩╚'-705"@0┼5&1─524╨╘-
- ═<╫=┴<&)╒9┬!╠9&$@=╞╒├<╓(-(&5╧<┬ ├)# ╥(#═╨4─545%╞@5%))0╘═9+*!%
- ═2#\-('-╘82!╓;6-╙8@╘@;&1┴(",─,#@-(&5╧<┬!┌=&5═<" [6┼1%35 ]2$┼'
- ═2*!"651%╚$╔54╒2@1─╤)4%,-('-╘82!┌=&5═<" [0─545╘5%3╩ ─,╙"@04┘$
- ═╚"0╙. ╘-(&╔═<"!═86┼╬(#═┴4─]53─2@04┘$╚$%23╒5.1*!71:!'3╥╪╬+@╘-
- ═('1╪=" ╟9╘5%╚&)204┼.+*!72$%4╚$1/╚%┼/5:!704┘4╚%1/╚$1/╚"<-('1╪
- ═=" ╟5$].24=(5#\╟#0╘╩*╩!╥3╒1!5$4╠╚%!23╘╔%0╒0╠╚$%.1*!35$]21:!4
- ═2$6@4$])3┼13#2╚-*╩!╘2$┼3╚%!!4┼2@25.@0:!324=.249)0╘%.5*!#2$%.
- ═1╘6@4╘┼.0╘4-*╩!6,┬╪╨+╩"@;─]7╚$┼4╚$┼3╚$&@0╘]-4$╤%5$5,6:!'14┘%
- ═4─%,╚%!/3%┼'3╘┌@4$╤/5%1%4┬╪-*╩!┴╚%-%5*!/1╩!03╘┼.5%.@25.@4─5!
- ═1*!)3┬╥@4─]4051%1*!!3─2@4%)/2─5#5$5$+*!!3─0-*╩!03$]45$5$╚$┼.
- ═5$^@5$┴%╚$1205=)3─>@0┼5&1─52╚"┴┼;╫*@3╒*@3─]234%,*2╪-#7)╧='!╥
- ═;╓╚-#2╩@8:!.14%4╚$╒!0╒)/#6┘┼9╥!═86,@(#═├2$%.1╘6@5$┴%╚%-)1╘┌@
- ═3╘:@0:!45╘\╟4┌!#3╘╒03$5-14┘4#2!├;&,-(&╤─82!=,2 [3┼5-0─52+@╘@
- ═96]╥(",─9╞8-(&%─8╥ ├)# ╤#2 \/#╨-#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
- ═+2╘═+2╘═+2╘═+2╘═#2╩@=$┴%4╘6@34%#4─]3╚%)%4$╤!0╘6@5$┴%╚%!2159)
- ═3╒53╚%!23╘╔%0╒1)3╘╪-*╩!354)23╒5424┘%+@╘-<╓╒╒;'2@;6%├╚#══54╤4
- ═25!,6:!45╘^@4╘┼'3─5$╚#@═0─┼4#2 [3┼5-0─524╙╩@82╔┘+╙8╘╚"╘^╚&$-
- ═('-╘8:!┌,╨╘@8╓╤├╚* [=$┴)4┌!-54╤425!,6:!)4┌!&3╒*@3─]234%,#2!┼
- ═;╫*@(╥1╞9╩ [3┼5-0─524╥╥@22┘%+╩!8/2╘╓-"╪╬-├0-(&%─8┌ ├)# ╤#2!╙
- ═=&&@>├0-(&╤─8: ╚>├,╔+'─-('-┼8╨╘@<╓)├╚"┴┌-"─╠>0╘@/#╨\╚* [84╤,
- ═╚$1/3─6@.┬─-#7-═=6╤╘>┬!═86,@.╓╒53%1)4$╤9╚%173┌!324=.142@."╒"
- ═250-(" @.╘┘534)%4┼,┌╚&$╩>2\╓-* ═/╩!┴#2!╙=&$@>├$-(&-╠8╥ @.╓%.
- ═1*!42$┼3╚$╒53%1)4$╤9╚$┼3╚%-014-)1─┼#04╤,60╘@96]╥(",─9╞8@.╘9/
- ═4╩!42$6@4%)/2─5#5$┼/3╩!005)4+*!72$5210╘@861├(",─,#$@.╘┘534)%
- ═4┼.@05)%╚"╘╤,3 ╬+├$╤,*!!3─2@,"╪╬-# -('-╘82!┌,@╘@;&1┴("┴┌,2─╠
- ═>0╘@<╓5├#2!╙8╞,@*'╚╥*2╤┘#2 \/#╨@(#═┴3$╥@1$].1: ┌*0╘-<')╧:╞5├
- ═="!═86,@(#═╘2$6@04-454%,╚%!23╘╔%0╒1)3╘┌@4─]55$┼.10╘[=$┴%╚%)/
- ═551)3─6@5$%+15.@5$┴%╚%!/24┘4#3═=,:!=,╩!=,╥╥@4─]4051%4┌!!3─0-
- ═.╒!23╘╔%0╒13╚$┼4+*!!3─2@4╒1/4─53╚%1(10╘[4─5354╤4╚$┼.╚%╘╤╚%╘╥
- ═╚%╘╙+@╘-(&╤─>2!=,2 [;55,5$┼03%╞@1─┼24╒2@4─]4051)3╘┌@0╘],54╒.
- ═#2!╠9&$@83$╤#2 ^/├╪@<╓╒╒;'0-('-╘82!╨,70-(&╤─82!─,├$-(#╪^/┬!╙
- ═;75╠= ╘@<╫1┴(' ╥= ╘@;&1┴(&<╙,0╘@/├╪^('-═=6╤╘#2!╙=&$@<#-╘#2!╠
- ═9'─@73(@.╫-%0╘].1*!#3╘╤534╪-(&╤─82!┬,3(-(#╪^/┬!╙;75╠= ╘@8╓╤├
- ═#2!┴9&,@<#%╘#2!╙=&$@<#%╘#2!╠9&$@93(╥#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@
- ═861├(' ╥= ╘@<╫1┴(' ╥= ╘@;&1┴(&@╙,@╘@/├╪^('-═=6╤╘#2!├;&,-(&%─
- ═8╥!╨,╫0-('-╘82!╨,╫0-(&╤─>2!=,╥ [=$┴)4─2@0╘],54╒.#2!╠9&$@8╙$╙
- ═#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@861├(' ╤= ╘@<╫1┴(' ╤= ╘@;&1┴(&8╥,╨╘@
- ═/├╪^('-═=6╤╘#2!├;&,-(&%─8╥!╨,╟0-('-╘82!╨,╟0-(&╤─82!╔,╙,-(#╪^
- ═/┬!╙;75╠= ╘@8╓╤├#2!┴9&,@<#-╘#2!╙=&$@73,@.╫)/5$%4142@>@╘@=&%╪
- ═#2!╠9'─@>╞1╔=┬╤╪(#═╘04),1:!/1╩!$+╥┴:*╒╚╨*0╘@(" [;─]7╚'╞@0╘].
- ═5$%)3┼.@4%)/2─5#5$┼/3╩!#3╘┘35 ╘-(&╤─82!╨,70-(#╪^/┬!╙;75╠='╚-
- ═(&╤─>"!┌;╓]═#2!├<'@@(╙8╘#2!┬97$@8╓]╬='@-('-╘>2!╘96╒╨,0╘@;&1┘
- ═('╔╧;╓╘-(#╪^/┬!╙;75╠= ╘@;&1┘('1┼;7 ╤#6-╧;╟1╪(&-╠8╨╘@861├(",╓
- ═-" [;╘9&4╘54╚%1(1:!#3╘]21$┼.051%#2!╙=&$@73$@.╫)/5$%4142@04┘$
- ═╚%!23╘╔%0╒1%1 ╘@8╓╒╨(&╤╧8╫┴═:6╪@.╫-%1:!)1╩!)5*!)4┌!!╚$╤/0╘%,
- ═╚$╒)3─┼-54╘-(&)├<╥!╬;╫1╪;6┼╬#2!╙=&$@;&]├>&╒╔;@╒╬;╫1╪;6┼╬(&-═
- ═<"!╠;╓-╪;6%╪#2!┬8╓,@;╞]╘>&╒┴> ╘@<╫1┴(&╤╧8╫┴═87@-#6┘╧='┴═87@@
- ═;&1┴(' ╥= ╘@/├╪^('-═=6╤╘>@╘@8╫!╪(",╓- ╘@8╞5╤(&-╧;╟1┘#2!╠9'─@
- ═>╞]╧;0╘@/├╪^('-═=6╤╘#6-╧;╟1┘(&-╠8╨╘@861├(",╓- ╘@<╫1┴(%╘╥(#═╥
- ═3╒1!5$5$╚$%.1*!04─]*14-4142@>0╘@8╓╒╨(&╤╧8╫┼═:6╪-(&)├<╥!╬;╫1┘
- ═;6┼╬#2!╙=&$@;&]├>6╒╔;@╒╬;╫1┘;6┼╬(&-═<"!╠;╓-┘;6%╪#2!┬8╓,@;╞]╘
- ═>6╒┴> ╘@<╫1┴(&╤╧8╫┼═87@-#6┘╧='┼═87@@/#╨\(" [84╤,╚$1/3─4-#2╩@
- ═;&1┴╚",\96]╥8╟5╞╚#═╞25)35*!71:!.145$╚%1/╚$-,14%2╚%1(10╘╩╚'-╘
- ═8:!┬=69╞97*@.╓5╧<╩!"549&15(-*╩!╠9&&@(╙┘┼;╫)┬=68-*╩!╙=&&@8╟5╞
- ═9╞5╥*╙$-#2!╠9&$@(╙ @.╫)%4╘54╚'┼-24┌@04┘$╚'┼-05@-('-╘82!╠;╓-┘
- ═;6%╪#2!╙=&$@;&]├>&╒┴> ╘@;&1┴(",─9╞8-('-╘82!╠;╓-┘;6┼╬#2!╙=&$@
- ═;&]├>&╒╔;@╘-<╞5┴9'!╘<╥!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙
- ═=&$@<#%╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┘#2!╔;╟─-(&╤─
- ═82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┌#2!╔;╟─-(&1┼8╥!├;╫5╬='!╘<╨╘@;&1┴
- ═('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟@-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘
- ═82!╨,╟─-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟╚-(&┼╬>0╘@9&5├
- ═(&-╧=6┘╘<'1╙#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙> ╘@:6┘┘#2!╠9&$@
- ═<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙>0╘@:6┘┘#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴
- ═(' ╙>@╘@:6┘┘#2!╙='─@:6┘─97@-(#╪^/┬!╨<╞]╩96-╘+' ╤>#═╨,7─[<#%┌
- ═#2 ^/├╪@<')╧:╞5├="╤╨,╟@[<#)┘.╫ ╥>@╘@/├╪^('!╥;╓╔┼8╫0╠<#-╪.╫ ╙
- ═>3═╨,╫╚-#2!╠9&$@:&┼─90╘@8╞5╤(#╔─;╓┼╘#2!╠9&$@<#)╪(#═╚241$14┌@
- ═1─%#1:!#2$5#2╨╘@<╓5├#2!╙8╞,@<#%╪#2!╘87─@(#═┘/2┴8,┬╒8,2─-(&╤─
- ═82!╨,╫─-('-┼8╨╘@<╓)├(' ╥>2 [83╘╚63,═63(╔#2 ^/├╪@<╓╒╒;'0-('-╘
- ═82!╘96╒╨,0╘@;&1┴(' ╙> ╘@<╓5├#2!╙8╞,@<#)╪#2!╘87─-(&╤─82!╨,╟─-
- ═('-┼8╨╘@<╓)├(' ╤>0╘@/├╪^('-═=6╤╘#2!├;7 @=&5═<#$@.╓┼&╚%@╤*┼─╥
- ═+5─╤*┼@╥╚#┌@,*!42$5.╚$9!0╘4-(&)═:2 ┌9&]╔=" [25.@5─┼324),10╘@
- ═9&5├(&-╧=6┘╘<'1╙(#═╧5$┴%4┼=)4╘6@4─5!1*!)3╩!214╒!24┘)3─<-(&)┼
- ═<2 ┌86)╧<╟0@.╒!/24┘44┌!!3─2@4─5455).#3╔╨;╓]╨(&┼╬8╥!╔;╞1┼> ╘@
- ═:6┘├(&┼╬9&5╪#2!╔;╞,@:6┘─97@-(&1┼8╥!├;╫5╬='!╘<╨╘@8╞┘┼(#╔╨;╓]╨
- ═#3╔┴8╞]╥="!╥=',-#3╔─;╓┼╘(&╤─82!╨,7@-('-╘82!╪,0╘@;&1┴(' ╤>0╘@
- ═<╫1┴('─╤#2!╠9&$@<#)╪#2!╙=&$@>#(-(&╤─82!╨,╟─-('-╘82!┘,@╘@:╟-╥
- ═(&1╥87<-(&╤─82!╨,╟@-('-╘82!╪,0╘@;&1┴(' ╥>0╘@<╫1┴('─╤#2!╠9&$@
- ═<#-╪#2!╙=&$@>#(-(&╤─82!╨,╫─-('-╘82!┘,@╘@:╟-╥(&1╥87<-#2!─96,@
- ═8╓]╒;╟1╨=',-(&)╬92!╨;╓╤┘;&]╧<" [:5.@252@2┼535*!!╚%1224%.1╘╤%
- ═/╨╘@:╞╒╨('!╧;'┼─;╓┘┼#0╒╨;╓╤┘;&]╧<"!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘
- ═;&┼╙="╤┘#2!╙=&$@<#)╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┘
- ═#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┌#2!╔;╟─-('-╘>2!╔;╞1┼
- ═> ╘@/├╪^('!╥;╓╔┼8╫0╠<#)╪.╫ ╥>3═╨,╟╚-#2!╠9&$@<#)╪#2!╙=&$@>#$-
- ═(&╤─82!╨,╟─-('-╘82!┘,0╘@;&1┴(' ╙> ╘@<╫1┴('@╥#2!╠9&$@<#-┘#2!╙
- ═=&$@>3(-(&╔╙<┬!─<╞%╫#0╘@;&1┴(' ╥> ╘@<╫1┴(' ╙> ╘@;&1┴(' ╥>0╘@
- ═<╫1┴(' ╙>0╘@9&5├(&-╧=6┘╘<'1╙#2!┬97$@<&]╠>61╧;╞4-(&╔═<"!╨;╓╤┘
- ═;&]╧< ╒╨;╓╤┘9&]╬92!╠9&$@<#%╪(#═├3$]31:!42$6@4$],64=/3@╘@<╫1┴
- ═('@╥#2!╠9&$@<#%┘#2!╙=&$@>3(-(&╤─82!╨,╫@-('-╘82!╪,0╘@;&1┴(' ╙
- ═>0╘@<╫1┴('─╤#2!╩<╫(@9')┴=╨╘@<╟1╙#0╘@='┴╘("=╙04╒%╚%1(24┘'╚%=%
- ═╚$1/╚$5615)9╚$┘)1╘┴4+*!╨24┘+63╩@)╨╘@='┴╘("=44┼╞@5$^@5$%+1:!/
- ═5─52╚%1(1:!73╒),1"$╟#0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
- ═+2╘═+2╘-*╩!╟14┘%4─%,╚%%515-424].04),12╒604╤51:!%4┼)/4╩!04─]#
- ═14154─4-#2╔├:&]╦9:!╠9'┬@(╙ ╨#2╚┌;&]╧<*!╠9&&@.╞-╘97┴╘+'@-*╩!┬
- ═97&@.╞1╧;╞4-*╩!╩<╫*@8╓┴╥;╫5╘#2╩@:6┘╪#2╩@:╞╒╨╚#╔╠;╓]╨#2╚┌9&]╬
- ═9:!╥=',-*├╔├=&5╪=*!╚97┬@,&2@.╓-╥#2╩@='┴╘╚"=33╘╒%5$┴)3─>@0╘┴/
- ═2╘5$╚#╚╚)╨╘╩╚&┴┼>* ╨9# ╨#2╚-('1╪=" ╟;─%21┬$╟#0╘╩+2╘═+2╘═+2╘═
- ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚&1205=)3┬>@0:!,24┘%+╩"@8:!&
- ═04┴.╚$╤!2$╪╬#0╘╩*┬╩@<╘]-1:!54╘5&54╥@34%#4─]3#0╒├:6┘╔="!═86,@
- ═(#══04-23┌!43┌!)3─┼424%,25╔%╚%1(1:!#3╒5.5$52#2!╠9&$@73$@.╘18
- ═╚$]2╚$19#2!╠<╫(-(#╨\/" @.╫1(1:!$6"\╥╚$╒!2╘53╚$&@3─┼#15*@3$]/
- ═2╘┼.1┌!,24┘%#0╘╩*┬╚╩*╩!═04-23┌!43┌!404═%╚$&@4╒1%4*!)3╩!╪#0╒╪
- ═<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%4─%424].4╨╘@
- ═/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔>&,@.╫501$%4
- ═1:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@4╒1%4*!)3╩!┘
- ═#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4╚%1(1:!,05-4
- ═╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&]╥82 ╚8╟5╞9╞5╥*2╤┘#2!╙=&$@*&)╒9╞9┼
- ═<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&]╥82 ╚8╟5╞9╞5╥*2╤┘
- ═(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫501$%41:!#2%5.
- ═2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.0╒)%05-%╚%1(
- ═1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬92!├,@╘@:6┘├
- ═(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-(&%─8╥!─> ╘@
- ═:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-(&5╠<╓4-(&1┼
- ═>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴┘(&%─
- ═8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!╧<╞$@*&)╒9╞9┼<┬─╠
- ═>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠9'@-('!╠80╘@
- ═:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞:6╪-(&1┼> ╘@
- ═8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!84╒1%4 ╘-*┬╚╩
- ═*┬╩@=$%+1:!!╚%-415"@24┌@>0╘->7-╘97 @;6%├#2!╠9'@@9'─@.╓┘534)%
- ═4╩!/1╩!,3╘]0╚$┼415)!5$┼/3┼,-(&)┼<2!─;╓┘┼(#═╔1╩!$63╘╨╚$┼4)╒.@
- ═2┼535*!!╚%!/24┘4#2 ^/├╪@8╓┼╬:70╠9'─-('-┼8╨╒┘;&]╧<"!╨:&$-(&╤─
- ═82!╧;&1╪#2!╧<╞$@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-('!╠80╘@
- ═:68@:2╤=,0╘@:6┘┘#2!┼;'-┼#2!─97─-(&9╔;@╘@<╓)├(&1╪#2!┬8╓,@9╞┼╪
- ═> ╘@9&5╪#2!┬;╞4@>6╤╧;╫ -9&]╬92!╠9&$@;╓╤─> ╘@;╫)┴("┴┬=69╞97(╔
- ═+'─-('-╘82 ╚8╟5╞9╞5╥*2╤┘#2!╥=',-#69╔>'@@861├(&1┘#2!╠<╫(@;╓╤─
- ═> ╘@<╓5├(" [:4╒03╒)404┘4(0╘@8╞5╤(&9╔>&,-(&1┼> ╘@8╞┘┼('┼╠;╓]╨
- ═#2!╩;7 @9&]╬90╘-9╞┼╪8╥!╨:&$-(&╤─82 ├)#@╨#2!╙=&$@;╓╤─> ╘@96]╥
- ═(&)╒9╞9┼<@╘@<╫1┴(&)╒9╞9┼<@╘@8╞┘┼(&,╥#2!╔;╞,@8╟5╞9╞5╥*╙$-8╙(@
- ═<&╤┴#2!─97@-(&)╬92!┘;&]╧< ╘@:╞╒╨(&1╧;╞4-(#╨\/" @.╓5.1*!/1╩!═
- ═04-23┌!94╒1%4 ╘-*╩!╘04═%╚$%.╚%┬@4╒1%4*!)3╩!42$6@96]╥╚$)51─9%
- ═4@╘╩╚'1(1:!33╘╤%╚$-(04┘'1:!)4┌!43┌!54╘6@96]╥╚$┼.4╒1%042@3╘:@
- ═;╫)┴#0╒┼;╫)╪<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%
- ═4─%424].4╨╘@/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔
- ═>&,@.╫501$%41:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@
- ═4╒1%4*!)3╩!┘#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4
- ═╚%1(1:!,05-4╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&5╧<┬ ╚8╟5╞9╞5╥*2╤┘#2!╙
- ═=&$@*&)╒9╞9┼<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&5╧<┬ ╚
- ═8╟5╞9╞5╥*2╤┘(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫50
- ═1$%41:!#2%5.2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.
- ═0╒)%05-%╚%1(1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬
- ═92!├,@╘@:6┘├(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-
- ═(&%─8╥!─> ╘@:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-
- ═(&5╠<╓4-(&1┼>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼
- ═#0╒╞:7┴┘(&%─8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!┼;╫(@
- ═*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠
- ═9'@-('!╠80╘@:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞
- ═:6╪-(&1┼> ╘@8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!8
- ═4╒1%4 ╘-#2╩@=$%+1:!!╚%─═4╒1%4*!)3╩!42$6@96]╥+4)51─9%4@╘╩╚&-(
- ═04┘'15.@1┼)/3:!!0─]61:!!4─4┌╚$].3%╞@4$╤/5*!,05-4╚%!!4┼2@3╘:@
- ═14%#2 ╘╩╚%9%4┼1)0╘%,╚$-(54┘++*!$3╘╪╟5*!03$]4╚$╤!4╒2@4$])3┼0╠
- ═╚%!,3╒2@5╘┼42*!┼;╫(-#65╧<╟┼╙=&5╨(&╒┴8╨╘@;&1╪(&1┘(#═╬54╒"15*@
- ═3╘:@3$]/4*!)5$52051)3╘┘3#2!┬97$@9&]╬92 [:4:@1%─],*!)5"=3╚$╔5
- ═4╒2@0:!03╘┼.5 ╘@/├╪^(&-╔;╞┼╘+&1┘#2!╙96,-*╟┼╠;╓]╨╚'!╚80╘╩╚&╤─
- ═8:!╧;&1╪#2╩@;╫)┴╚"┴┬=69╞97(╔+'─-*╩!╙=&&@*&)╒9╞9┼<┬─╠>0╘╩╚'!╠
- ═80╒┘;&]╧<"!╔9┬!╔+%╘╤#2!╔;╟─-(&5╠<╓4-(&1┼>0╘@9╞┼╬#2!╙8╞,@9'@-
- ═(&)├8╥!╞:7┴╪#2!─97@-(&)╬92!┘;&]╧< ╘╩9&]╬9:!╠9&&@;╓╤─> ╘╩╚&]╥
- ═8: ╚8╟5╞9╞5╥*2╤┘#2╩@<╫1┴╚"┴┬=69╞97(╔+'─-9&]╬92!╥=',-#69╔>'@@
- ═861├(&1┘#2!╨:&$@(#═╫1:!/3─╤9╚%!,3╒2@5$┴%╚$╤!4╒2@4$%25*!/1╩!%
- ═04-(╚$-(54┘+#2!╠9&$@;╓╤─> ╘@96]╥("┴┬=69╞97(╔+'─-('-╘82 ╚8╟5╞
- ═9╞5╥*2╤┘#2!╨;&$-(&╤╙<┬!╧;&1╪#2!╙96,@(#═╔35!/4┼1!3┼0┴#2!┬97$@
- ═9╞┼╪8╨╘@9&5╪#2!┬;╞4@>6╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴├('!╚80╘@;&1┴
- ═(",─.# -('-╘82!╧;&1╪#2!┼;╫(@8╟5╞9╞5╥#2!╙=&$@8╟5╞9╞5╥#2!┬;╞4@
- ═8╙(-(&┼╬8╥!┬=69╞97(╦,0╒├,┬!╨;&$-(&1┼> ╘@8╞┘┼('┼╠;╓]╨#2!╩;7 @
- ═9&]╬90╘@/#╨\(" [94┘$╚$]&╚&╒!0╒)/╚%┼35$50#2╚╩*┬╩@:4┘)5$┼!3*!,
- ═24┘%╚%-%5%50#0╘╩*╩!╘2$6@0╘]-345.5$5$╚$╤)3─53╚$)%3$]7╚$%21:!.
- ═3╒>@5$%+14┌@0╘%21:!/1╩!"6:!42$4-*┬╩@0╘%,3$┼.1┌!23╒5424┘%+@╘╩
- ═9')┴=┌ ^/├┌@;6]╓92╤╘>#$[>#&@╚#══3╒9%╚%-4549&╚$┼.5$^@6─523┌!0
- ═04=%#2╩@/├╪^╚&╒╧=╞4╠='@╥.╫@╥╚* [=╘┴%4─6@252@0╘%.╚$)%╚$╒/1$┼&
- ═245$#2╩@/├╪^╚&╒╧=╞4╠='─╤.╫─╤#2╩@/├╪^╚&╒╧=╞4╠='─╥.╫─╥#0╒─<╞%╫
- ═(&╤─82!╞:6╤╠#2!┬;╞4@.╟-┼=&5╧<@╘@/├╪^('-┼=&)╒9@╘@:╞╒╨(#╔╙971╒
- ═< ╘┌<╓5╘96]╥(&╤─82 ├/&5╧<╞)╒9┬ [=5-%╚&5╧<╩!"549&15*@24┘35$5!
- ═1*!/1@╘@<╫1┴(&)╒9╞9┼<┬ [1$┼34$╤!6:!"549&15*@1─]2╚$1205=)3─<-
- ═(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘┌<╓5╘=7 @<╓5├(" [;4%+
- ═1:!355)%╚%@╤/%@╥#2!╠9&$@>#(-('-┬8╥!╪,0╘@8╞-╙(#╔├;╓┘╘#2!╠9&$@
- ═>3(@.╓┼&╚$┘/5"╥@4╒=!4*!╨,:!!3─2@<#(-(&╤─>2!┘,0╘@<╫1┴('─╤#2!╙
- ═='─@>3(-(&╤─82!╪,0╘@;&1┘('@╥#2!╙='─@>#$-('-╘82!╪,@╘-('-┼8╨╘@
- ═<╓)├('@╤(#═╬3╒>@83╒$6 ╘┌8╓]╬="!╙=&$@9'@-(&╤─>"!╪,2 [<%54╚%@╤
- ═╚$┼.5$^@>"╥@3─]7╚%=%╚$-!3╩!44─%32*!╪,0╘-8╓]╠=6╒╬('1╪82 [9─┼.
- ═1*!42$6@1─┼24╒2@0╘],54╒.╚$9/4╩!╪#2!╠<╫(-(&╤╙<┬ @.╫1(15)%╚$%2
- ═1:!8,2\╪╚#$╥.*!"651%╚$),3╘-+4╨╘@;'-╥(" [=╘┴)0╘┬@345!3┼.@6#$╧
- ═,3:@,├4╓╚$)95$6@0─╤/0╘═3#2!╠<╫(-(&)├8╥ ┌979┼;┬ [=╘┼42*!!╚%!/
- ═4╒-)0─╤%╚$585%)!╚#$╥.*!"651%╚$),3╘-+#2!╠9'─@(╥0╪," [24:@4╘\╠
- ═╚%-%5*!42$6@2$┼'2*!"250-('-╘>2!┬=69╞97(-(&-╠8╨╘┌979┼;┬!┴9&,@
- ═8╟5╞9╞5╥*╙$@.╓%$1*!)3╩!42$6@3┼5-0─52╚$]&╚#(╒-╩!"651%╚$),3╘-+
- ═4╨╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘@<╓5├#2!╠9&$@>3(@.╓-!3$-53$%41:!$60╘@
- ═<╓)├('─╤#2!┬8╫,@.╞-╧;╟0╥(#═╔4┌!9,├┘9,3\-(&5╧<┬ ├)&9╞(#═╧5$┴%
- ═4┼=)4╘6@1%─]63$═63(-(&%─8╥ ├)# ╤#3╔├;╓┘╘,┬!╙=&$@9'─-(&-═<"!─
- ═>" [=╘┴/)╒.@0─┼'1╘52.╩!$6:!/4╩!$6#\-(&)├8╥!╙=&5╨:6┘╪(#═╔1╩!$
- ═6"╥@5$┴%3┬╪╬+@╘@:╞╒╨('-╘97!╔;╟─-#7-╘97!╔;╟@@;&1┘('─╤#2!├<'─@
- ═>3(-(&╤─82!┬:71╨+'@@.╫┬@0╒524─5.5$╤9╚$-/3┼1!24┘3╚%@╤#2!╙=&$@
- ═;╓╤─> ╘@<╫1┴(&-╚=6┘╦#2!┬8╓,@>&┼╬8╫─@.╓1/╚%=%╚%-415"@1─]25╘%2
- ═1%.@3╒*@0─%#2╒=!4─13╚$┼.╚'─_#2!╩;7 @>&1┼8╫─-#7┴╔;╞-┘(&╤─82!╞
- ═:6╤╠#2!┬97$@;╞]╥;7┴╔;╞,-(#╪^/┬!┼;╫)╪<╫1┼<"╤╔;╟─-;╞]╥;7┴╔;╞,@
- ═/├╪^('┴╙=&5╨+&┼╬>0╘->&1┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═>&1┼8╨╘@
- ═/├╪^(&5╧<╟┴╙=&5╨+&1┼>0╒╬;╫)═>&1┼8╥ ^/├╪@>'-╘97 ╠9&5┘#0╒╙=&5╨
- ═:6┘┘(&╤─>2!┘,0╘@;&1┴(&)╔=' ╠>" [>#╒8,0╘@<╫1┴(&]╠9'@-(&╤╙<┬ @
- ═.╫╞@1$]%4╘╪╟5*!54╘6@0╘┴53─═3#2!┼;╫(@;╓╤─>" [<╘^@5╘6@2┼535*!7
- ═04┘4╚%1(1:!"250-('-╘82!╧;&1╪#2!├<'─@>3(-(&)├<╥!┘9&5├>0╘->6┼╬
- ═8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═:6┘├#2 ^/├╪@96]╥>7-╘97 ╠:6┘┘#6┘╧
- ═<╞╒╔;╞,@/├╪^('┼╙=&5╨+&┼╬>0╘->61┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═
- ═9&5├#2 ^/├╪@96]╥>7-╘97 ╠9&5┘#6┘╧<╞╒─96,@/├╪^('┼╙=&5╨+&1┼>0╘-
- ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#2╩@8╘╤%04┌@55 -
- ═#6-╠96%╬=7 @;&1┴('9═8╫-┬(#═╙5╘┼40╘┬@0╘┴!4╩!23╘╓@0─%#2┌!)3@╘@
- ═86┘─(",┼,3$╤,3 ╤,#$@.╘1%1─%53%0-('-╘82!╓;6-╙8@╘-(')╘<╥ @.╘)9
- ═12$-#2!╘>'0@)╒-024┘!3*!#4─%#2╘52╚"<-('1╪=" ╟4╘╤*╚#8╧.34╟#0╘╩
- ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚'-%5*!54*!"252@
- ═5$%"3$4-#2!─<╥!>(#═├3$5!4╩!43┌!%3─2@3╘:@4$%'10╘@(" [<╘^@5$┴!
- ═5*!404),15.@4╒1!4┼2@3╘┌@0:!004=%╚$)/54┘$05)9#6)╔=' @;'5╨(#$╓
- ═(#╠╤,├┬@94┘44─┼%4┌!&3╒*@> ╘@9&9┬("4╤,3$╤,3$╤,0╘@9&9┬("4╨,3$╤
- ═,3$╤,0╘@9&9┬("4╨,#$╤,3$╤,0╘@9&9┬("4╨,# ╤,3$╤,0╘@9&9┬("4╨,# ╨
- ═,3$╤,0╘@9&9┬("4╨,# ╨,#$╤,0╘@9&9┬("4╨,# ╨,# ╤,0╘@9&9┬("4╨,# ╨
- ═,# ╨,0╘@+2╒>#0╒╙:6╪@.╫1!0─╤%╚$]&╚%-)3─53+* ╤,├"@0┼┼415,-8╓]╙
- ═(&5╤=2!╙:6╪╦,3(╪(#═╘04),1:!/1╩!#3╒-)3─53#2 @(#═┬3╒1(╚$]&╚%1(
- ═15-%╚%1224>@5$%"3$53╚$%210╘@(" [0╒524─5.5$╤9╚%-%5*!54*!&4─]-
- ═╚&)┴<╓┼├#7╔─:78@97%╒(&-╧<╥╠╤,├@@.╓1)5─┼324].╚%1!0─╤%#71═871╚
- ═,2!┼<74@>╞1╔=┬╠╙.#0@.╓╒!5$┬@5$%"3$6@3╘:@1┬┴8*3╒8*┼@╧,├4╓#71═
- ═871╚,┬!┼<74@=&╒┴=&@╤*╙4╤,┬ [<╘5#3╘┘$╚$╒!5$┬@5$%"3$4-<&]╠>6╤╔
- ═<╫0@97%╒('1═871╚,┬╠╒,3(@.╓╤)4╒2@3╘:@4$],64=/3┼,-&┴╚:&┴╚:&┴╚:
- 8&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
-
- END
-
- BEGIN 666 CUBE3D3.2.O
- ═ ("╔ (╘@╘(╘┴╘*╘8╘"─/"1"-&-"@ *─?┴?╬╔@(7\3+╥!─╨41$1$@(" @(" @
- ═(" @(" @0╒5"13-$(%8╙+├(-#2 @(" @(" @(" @(" @(" @($)9#9\@(" @
- ═4╒1%4$┴%3┬!*541$╞2 @("!'14]21╘4@5$%93$]2#0╓;("!#2$5#2╥!/550@
- ═5$┴%($╔!3┬╪@.34@25-3544@3╘8-┼┬ @0╙╒(04-+24┘'╞╥!&3╒(@34]212!$
- ═151!24╤3(0╘-'1╓>$─8╤+╘8╥─┬ ═($┼.0╥]$14,@6"╒23╒1!5$┼/3@╘='1)&
- ═,╥]&-)(@+2!)3─,╧1$5#(%─═4─]4051)3╘╪-'1╘21├4╧1├:2("╘@24┘#+╘1%
- ═0╥!:+5)/5$%424].#1╘=$┬!&-╥ @─┬ ═(%)%4╘54#1╘=$┬ ╦+╥╘@─┬ ═(%╔/
- ═3╘╘@24╪╧3╒54#1╘=$┬ @2" @─┬ ═(%1/1╘=,12!(241$14╪@4╒521─%#15,-
- ═'1╘24╒!!0╘62("╘@5$]'1╘╤%(%-54─9!0╘4@1─┼,3$┼.1╨╘-("!04─534╥!1
- ═(%1/(%%5250-#04@(" @("!04─534╥!!3┼─@2╘59(%1/($)%1╘┼.#0"╤^_ +
- ═(-+_╥-#╓┘╧╤,╧($@┘/_) /#┘╩9*%(╪4┼╩92%)╪4╔╩0&-(="╔─╥#2_┌─ ├2'0
- ═╩4!╔#(7[╩06%_*─ ╚ "┬ !┬1^\┴╔$)#┘&*7[:2┬%^┌7\:0"%_* ┌(╦@$-#─
- ═╩0"%╚┌─╨┴:2@ *(8╩0"1╚\├0^^:─╥═#╓╩0"%╚┌─╨┴:2% ╩╘8╘"╟╤"0┌-&-"╔
- ═ (57┴5┬%685@┴3^%085 ┴4*%885┬┴6.%9(5┼┴6:%4*─!┴;6╔0(5╤6"#─_\╞%
- ═╘ ╬┼8<─\\%'╞84╨-@\╞)╘ ╞┼8?!$╤╞%,#8/)┴═ +╔6+)// ╒┘╞),#8/)┬═ )
- ═╔6+╨*,9┬3 ╓#╥8?0"┌5├╥3╙╨&>9├3 ╓#╥8╧0":5├\ ╙&8╘╨-@\╞(╘ 9,1╚),
- ═#8/)*] '┘╟'╞<4╨-@\─═╘ ╫&<<9╤$"├╞<>9╤3 ╓#╥4├0":6╒20&%═4╨-@\─@
- ═╘ ╞┼4$─!┴5!,#8/)4= #3)╞.>!┬┼9&5┴╥7┬0 ╬┼╪┴608╔65┼8╠┼╪─ +╔>(5┼
- ═&*5╞96/)>) "┌7┬%9├┬┼9>5╞╠ )╔>(5╟&*5┼96;)>) "┌7┬%:!┬┼9&5╞╥7┬0
- ═ ╬┼╪┴6─╪╔63┼9╦ ":7┬%:┴┬┼9&5╚╥7┬0 ╬┼╪┴6╠╪╔63┼9[ ":7┬%;!┬┼9&5╟
- ═╥7┬0 ╬┼╪┴6╘╪╔6├┼9+ ":7┬%;├┬┼9>5─╠ )╔>(5╧&*5─967)>) "┌7┬%<!┬╞
- ═9[╘ ─*9╚?0"0┴:6╞9[╓ ├╙┬╞:/╓ ├╪6╞╔╞6]@(\0#┴┴)_╓─!"┴┴)_╓─!3-╓#
- ═"╚6╟.*9╬╧0"0╔╞╫] ) ╪╔╞╧] ) 8╔╞╤] ) 0#┴┴)_╓─!2┴┴)_╓─!3 >$2┴┬╞
- ═:7╓ ├╙┬╞:╧╓ ├╪6╚.*9╦╧8"/╔╞╙]@(\╪╔╞╫]@(\╪╔╞[]@(\0#┴┴)_╓─!2┴┴)
- ═_╓─!3#╓$2┴┬╞:7╘ ─!┬╞:╟╘ ─(6╔╔╞^]@(\╪╔╟#]@(^%╩╩9╠╧8"/.*9╬_8"/
- ═.*9═_8"/.*9╦_8"/$ ╪82?]╔ 4╚82?]╔ 4╥ ┴$╚8╔╞╔] ) ╪╔╞╟] )"%╩╤┬╞
- ═;+╘ ─*9═?0"0.*9╦_0"0.*9╬_0"0$ ╪82?]╔ 4╚82?]╔ 4╥╓┴$╚8╔╞┼]@(\8
- ═╔╞╔]@(^%╦!┬╞;[╘ ─*9╨?0"0┴:╓╔ (6├╔0*%╔*((╩0"@ )&├╥-#[┘╩3*╘/2@
- ═ (11╔%&┘ );0 ╘╥*┴852┘┼$@╤86┼5╘╔*2╚57╤3^╨ ╚4_╔5╟%0; "┴4&┼6$╔*
- ═2╚58╤4"0 ╚5 ╔6#%0╔ "┴4*┼4/#!╩0"%╚┌4"┴:2╔ (7[╩4"%_*572╔ '╚("$
- ═╚╪3[&(5╚9:2%╔*5╚9?╥%_*58..57╩╬┬─8- "┘╞"─8*─ 4?═(4:.1╚┌─ ─?═╚
- ═┬,19╠.^┼╚╘╞ ┴:.%^] $┘╩3╞_,╦0╓─╙═┴*╘8╘$─"├1├0╩0┴% ╚4"3&┌"9╘5%
- ═(&)204┼.+"!72$%4($1/(%┼/52!704┘4(%1/($1/(%1/3─┼'2%0_╩0"%8(58
- ═╩?^%6857╔%&┘ ):%─╠┬┘ ):%─\┬┘ ):%┼,├&4╦─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬
- ═╥,92╬0"6┴:_(╬0"6┴;#(╬0"6┴;'(┴%&──╩6┼┴2882?]╔ 84╚╠28╪\2┬%╠╩6╚
- ═┴2882?]╔ 84╚╠28╪\2┬%╠┌6╦┴2882?]╔ 84╚╠28╪\2┬%═*23╔::%)┴┴)_╓─!
- ═┴2┬╤)├├╤*!┴┼╠╚6╥╔:╞%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╥%)┴┴)_╓─!┴2┬╤
- ═)├├╤*!┴┼═(6╘╔)2┼╔╪4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼╩╚4╞&$╟_:0&%*+$╞
- ═./$╚&&6╙┴;.┼╦84╞&$╟_:0&%*+$╞./$╚&&6╘┴92╩╧("0╔;*%(┴┴)_╓─!┴22╤
- ═(├├╤)*9╤╪$#╨%(3[╔'&%)┴┴)_╓─!┴2┬╤)├├╤**3[&&┼ ┴9+%5[ "┴5?%6) "
- ═┴5┬┼╠╪4┬&$╟_:0&%)+$┬./$─╪$#╨$*1╤┴2882?]╔ 84╚╠28╪\2@8:4"%─\59
- ═╠ *%6<5@─ *%8*25╔:6%)┴┴)_╓─!┴2┬╤)├├╤*(6╥╔:┬%)┴┴)_╓─!┴2┬╤)├├╤
- ═*(6╙╔:╬%)┴┴)_╓─!┴2┬╤)├├╤*(6╘╔):┼╔╚4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼
- ═╩84╞&$╟_:0&%*+$╞./$╚&&6╙┴;.┼╦(4╞&$╟_:0&%*+$╞./$╚&&6╘┴;2─╦╩6╟
- ═┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╩┴2882?]╔ 84╚╠28╪\2@89;.%╠┌6═┴288
- ═2?]╔ 84╚╠28╪\2@89;2%╦╩╩\@)"┼╠╚4┬&$╟_:0&%)+$┬./$─╔╟'@0/ 4┴/╬─
- ═<84╞&$╟_:0&%*+$╞./$╚╔/╠8:4"%┼<57╠ *%5\58─ *%6*6╙┴2(82?]╔ 84─
- ═╠2(╪\23@0/ 0╔'&%)┴┴)_╓─!┴2┬╤)├├╤*!┴╔0(66╤5╞╨ ╚59╤6"0 ╚5@╔*^┼
- ═╔84╞&$╟_:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%
- ═*+$╞./$╚┴;2─╠*6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪
- ═\2@89;.%╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╤╔:>%)┴┴)_╓─!┴2┬╤)├├╤
- ═*!┴┼╠╚6╥╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼
- ══(6╤╩╦╥ ─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪
- ═\2┬─^╤┴╔0(6╧╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞
- ═&$╟_:0&%*+$╞./$╚&&┼ ┴;#%6; "┴5╟%8) "┴6"┼═?!'╔94╪┘9*╚╔; ╪┘9:%
- ═)┴┴)_╓─!┴2┬╤)├├╤*(7[╔:\╪┘96╚╔98╪┘9.%)┴┴)_╓─!┴2┬╤)├├╤*,7[, _&
- ═4╧ *┘┼'╞4>91╤┼+0]╞"┼─╚7[╔9.%_*65┴?╓┼┼╚7^(-"+╔96%^┌66┴?╥┼╦╪7]
- ═╔;"%_┬#0┬\92╘ -,=╪╬─4;─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬╥(11╔)6┼╔84╞&$╟_
- ═:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%*+$╞./$╚
- ═┴;2─┼╩6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪\2@89;.%
- ═╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╬╔:>%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╚6╥
- ═╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼═(6╬╩╦╥
- ═─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪\2┬─^╤┴╔
- ═0(65╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞&$╟_:0&%
- ═*+$╞./$╚&&┼ ┴9;%6; "┴5╟%8) "┴6"┼┼87[╔9:%_*6╧┴?╓┼╠(7^(-"+╔96%
- ═╦┌66┴;#&4╧ #3!&*╔9*%_:63┴?┌┼╦╪7[╔;"%_"#0┬╓!╙04╒%(%1(24┘'(%=%
- ═($1/($5615)9($┘)1╘┴4+"!╨24┘+63╚@5%)9(%1/(%1!2╘4@3╒9%4┬!42$4@
- ═5╘]23$0┴;─%21┬&┼4- +╩0"%╚┌4"┴:1,┘╪╬╔ (6├╩4"%╔#┬┼_>7[╠!.┼_╩3\
- ═┴?╥$_╩7[╔/╓$^╪7]..7[┴6>╞^╪╔*2─╔*─ 6@@(2├&&6─┴:0╪╔?[┼_+ $2?]╔
- ═ 85╚╤6>0 ╘╥-├:3\╤/┌] (^%_87^─ -,╪╪╥┼4/!3╔╞>┼9╘╔&_╧ 0┘6┬0,<╦0
- ═]:7]1?┘1╚┘&├8$┬┼_5&├─:.╔_╪7]┴?┌╔@$6├┴:/0 ╬:─:.5╚╠ -┼9\├*╘,╔,
- ═38╤┼9╘┬┼_47^4:.1╚┌7^┴?╒╚╥,╦0╠╓"╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┴&├
- ═─:-@2*7]$:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟╥,╦0╥─╥@├&5╟2*7]
- ═1?╪1╚┘&├╔?┌%_6├(╥═"╙8*50\%.╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┼&├─:-@
- ═2*7]4:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟┬,╦0╥─╙╫├&5╟2*7]1?┘1
- ═╚┘&├╔?┌%_6┬(╥═"╙8*9╟╔6=*1╧[╨$.5╚─#'*╘/6┼_47^$:.1╚╓!(╔?╘1╚┘&├
- ═╩?^%_87^╩8!%╚╪6├╘ +╞╔&├┼:+ #96>(╥═#*3$╩-96=(╔?╒%_┴&├─:.┼_╚7]
- ═:(├*╘+-@╔/╥] (^%_4╔%_87]╤/┌╨?╩50\#╩╞:/ ,╔6┴*.,├┼9┘ $╥═#╪8&5╚
- ═2*7]4:.1╚╓┴&_3├╨!╠╦0┘4╥╤├4┬╔@(7]1:.%╚] "┘╩1╚╥═#13+&-╔╞├╨%*5╚
- ═2├┴(╔?╘1╚┘&├:,├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],\╪╒(╩8"%_46├
- ═┴:/0 ╬:─:,╦0╥╘╙╙├:50\#╩╞:/ ,╔6┴*.(├┼9┘ $╥═#╪8&5╚2*7]4:.1╚╓┴&
- ═_3├╨!╠╦0┘4╨╧├─┬╔@(7]1:.%╚] "┘╩1╚╥═#13"^.╔╞├╨%*5╚2├┴(╔?╘1╚┘&├
- ═:(├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],<8┘(╩8"%_46├┴:/0 ╬:─:,╦0
- ═╥╘╤╤├╩╘8╘"╟╒├1├08%-024┘!3"!#4─%#2╘52(%-,2┬ ╓+╙─╒
- ═
- ═ #_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?
- ═#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_
- ═?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\'
- ═ ╨'_?╙\?#╨<# 1╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- !&┴╚:
-
- END
-
- BEGIN 666 SHAPE3.2
- ═ 1╨┴' ├╥!#54)%,╘0@4╘┴!4$4@24┘)5"!04─]'4─%- $<<!0"7-3$╠,├4╒
- ═.╔<╒,┬╨╤,├<┌┼╙4╒+#(╒-3╩7-38╠,3(╫.╔╨ ;┴╤┬ (\@34%)3┬!04─]'4─%-
- ═(%-405)44╥!!5"!,24┘%(#4╨,# =!╤├ #╚ ┬!╤─ (\@4%)/1╒)!32!.3╒1%
- ═4╨":'&╪ ├╥!33$╚@-┬\╤-┬\┘-0"╨''@ ├╥!$051!($9/4─╒!5"!)4╙╚ ╒┴╤]
- ═ (\@3┼5-4$])3┼13+%@╤+%─╤+%╚╤+%@╥+%─╥+%╚╥+"╪╬+@#╫'(( ├╥!42$4@
- ═4$],64=/3┬!,25-4("╔-55-4*┬!"10 5'8< ├╥!415)-24┘!5$5$(%=)5$@@
- ═02!:15)/(0 ;'8─ .@ ^'8╨ ├╥!/1┬!#3╒524╘4╠(%1(15)%($┼3($$@3$]4
- ═($]& %╪=─0"/($154$╤)0╘%424].($1205=)3─<@3$┼.15, @╤╓3 (\@5╘┴%
- ═3┬!&04-%4╥!!4─5.)╒0@0─5)3─<@1─┼,3$5$ *8=┼@"/($$@1─%35"!04─]'
- ═4─%-(%=/54╤$3┬=4($1205< ╥┴╓@ (\@5$┴%(%-!344@3$┼.12!45╘┼#12╨@
- ═0┼54(%1(25, ┌!╓┼ (\@25,@1╘]/1"!%3─]51╘@@1─]2($┘/5╥$ "┴┌╟ (\@
- ═3╘8@0╘]54┼-%+"!&3╒(@1─┼,3$5$($9!0╘53 "╠>╩ "/(%1(25,@25,@3─\@
- ═3$].1╘52($%.($┼34╒5% #$>╩@ ┌ %8>═ "/($9%14╨@1┼)%12!43╥!0550@
- ═64]54┬!/5╘╪@1$%400!\'╦─ ├╥!)3┬╨@0┼54($-(04┘'12!42$4@4$]+12!)
- ═3┬!,24┘% )@>╧@"/(#4╨,#4@5$\@55-%($,╤($%.1"!#,@">'╠@ .@##'═(
- ═├╥!33╒)262!!0─]55"!33╘╒%($]&(%1(12!,25143$4 ╫┴[7 (\@0┼5'4╥╨@
- ═15(╬+┬╪@1─5!5%5215, _┴[< (\@5$┴)4╥!705,@02!214%,(%)54╘@@2─]"
- ═+@ $'^8 .@ ╟'_ ├╥!!3─0@248@64]5($9%14╨@4╘\@24┘#3$┼.140╠ $0?
- ═^@"/(%=2251%(%1/(%-*541$0$┘752┘%1%4 2┴\$ 3╚ :1\. 8\@04┘$($%"
- ═3╒9%($%,3"╨@2$%612!&54╪┴ &\?& $┌ ($?┘@./($9)4┼-4(%-(05!% )<?
- ═┘╨-!,;+"*#8╤*3╔!,╦+"*#8╥*0#''^@#@╥ ╘+"╘╥-┬╨═,├8╠-├0╠,├8╠+3(╓
- ═+#8╘+#(╓+#8╘+#8╘+"╘╥-┬╨╓-"╨╓- #╙'_(#@╥ ╘+"╘╥-┬╨═,├8╠,"╨╥-┬╨═
- ═,├8╠,"╨╥-┬╨╓-"╨╨+"╘╥-┬╨╓-"╨╨ !<@_ .#(#,╠,"╨═,├8╠,╙(╠,38╠,╙(╠
- ═,╙(╠+3$╓+#,╥+#,╥ !\@!@2#(# ,┬!*!(\@4╘5#3╘┘$(%-(05!% $@@2╨1"
- ═,;+"*#8╤*3╔",╦+"*#8╥*0!\($╨$@╥ ╘+"╘╤-2╨╙,"╨═,3(╠+3$╒+"╘╙,"╨═
- ═,3(╠+34╫+"╘╙,"╨═,╥╨═-3$╠+38╠+3, ╦"!6!(,@-"╨╤-2╨╙,"╨═,3(╠-3$╠
- ═+38╠+3,╠-3<╠+3,╨+"╘╙+#$╒+"╘╙,"╨═,3( ╪"!@!(,@-"╨╤-2╨╙,"╨═,3(╠
- ═,34╠+3,╨+"╘╤,┬╨═,34╠+3,╨+"╘╤,┬╨═,34╠,╙ ╠+3$╥ "0┴:@2#(#<╠,34╠
- ═+3,╨+"╘╤,┬╨╒-╥╨═,╙ ╠+3,╠,╙,╠+3,╨+#8╠,"╨═,╙ ╠,3(╠+3,╙+"╘╙,"╨╓
- ═+"╘╒-╥╨═,╙ ╠+3, -┬%╠!(,@+3$╒+"╘╙,"╨═,3( 6╥%╘!(,@,╥╨╙,╥╨═,╙ ╠
- ═,"╨╙,╥╨═,╙ ╠+30╠,╙─╠+3,╨+"╘╥ (,┴?@2#(#,╠+3,╙+"╘╙,"╨╨+"╘╙.2╨═
- ═,╙ ╠+3(╠+3,╙+"╘╙,"╨═- "╧(8@$@╥ ╘+#8╠+3,╨+#,╠-┬╨═,╙ ╠+38╠,3@╠
- ═+3,╨+"╘╘+#$╪+"╘╙,"╨╤ -\┴─@2#(#0╠+38╠+3,╨+#,╠+3$╪+"╘╙,"╨╤+"╘╤
- ═."╨═,╙ ╠+30╠+38╠+3,╨+"╘╓ <┬╟ 2#(#,╠+34╫+"╘╙,"╨═,╥╨═,╙,╠+3,╨
- ═+#8╠+34╤+"╘╤,┬╨═,╨ ╧(╩8$@╥ ╙+"╘╙,╥╨═,╙ ╠-┬╨═,34╠,╙ ╠+3$╥+"╘╒
- ═,2╨═,3(╠+3, 4╥*╨!(,@,╥╨═,34╠,╙ ╠+3$╥+"╘╙,╥╨═,╙ ╠-┬╨╨+#8╠,3(
- ═=2*┌!(,@,╥╨╨+#8╠,3(╠+3,╙+"╘╙,"╨╓+# ╠+3,╨+#$╥ )─┬╤ 2#(#,╠,34╠
- ═,╙ ╠+3$╥+"╘╤-2╨╙,"╨═,3(╠,"╨╓+#$╥ +╚┬╙@2#(#,╠,"╨═,╙ ╠,3(╠,╙,╠
- ═+3,╨+#8╠,"╨╓+#$╥ -╨┬╓ 2#(#,╠,"╨╓+#$╥+#,╙+"╘╙,"╨╓+#$╒+#,╨+"╘╤
- ═,@ !(^($@╥ ╙+#$╒+#,╨+"╘╤,┬╨╙,╥╨═,╙ ╠-┬╨╒,2╨═,3(╠+3, )┬/╠!(,@
- ═,╥╨╙,╥╨═,╙ ╠-┬╨╒-╥╨═,╙ ╠+3,╠-3$╠+3$╥+"╘╙ "╪├]@2#(# 0",2!8\@
- ═5$┴)4─0@4╘┴!4$4 5┬,3!4,╤╠╠(╚-├$╔.─,╥╠╠(╚-├(╔ ' ├% 6/(%┼/55(@
- ═1$%402!'3╘53($┴%4─4 >"/0!╪,@, ",(╪@30┼"╥,├4╓╦"@┘╦#$╓╩├8╔ + ├
- ═├!./($-(04┘'12!"14╤/5╥!43╥!03╘┼.5"!43╥!$051! ,(├├1.7-├4╠0├$┌
- ═┼╙8╓+$(╥ .$├─┴.'3├╩70┼ ╠3├╔"4+)"4*╚╤.╚═.╠├"╟-3 ╒, #╔(┘<3╞2!.
- ═ 8─╟!.!2;(╤╔#.╠3├╩'4#╩+4+,╨╔╒"╥,├4╓╩┼ &"2╞$┘="4"╤0.─)0╠─)0
- ═╩├$ (┬2╦$┘─┬+┬([ "╪─╠!.".╚─╒,#$╨ #\─╬┴.>,╙(╫-├@┌╟#╩,.╚ :
- ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- 0&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
-
- END
-
- BEGIN 666 TABLES$8F80-$95FF
- ═@(\ @,%!╨@*"╨╘/$!$3%!47&!─:&╤╨='1╪>'╤\@(" @(" @'╤\>'┴╘='!╠:
- ═&1@7%103$1 /#0╠*" <% ╨( _╧╫[^?├╓]?/╤\._═[.╧╔┌.?╞┘>3├╪^+┬╪>'@
- ═╪.#@╪.#@╪>'┬╪╬/├┘.7╞┘^├╔┌^╙═[_#╤\_7╓^/╟[_?╪ _╨ #_\" @(" ?
- ═'╤╪>'1╘<&╤╚9&!<5%!,1$ \-"╨╚(!╨4# @#^_?╧┘^/;╒\_'╨[^╫╠┌^╟╚┘^;┼
- ═┘./├╪╬+┴╪>#@╪.#@╪.#┴╪>+┬╪^/─┘>;╟┌.╟╦[.╫╧\/'╙]?;╪^?╧]_@ " ╨4'
- ═" ╚+#0\0$1,4%1<8&1╚;'!╘='┴╪?'╥ @(" _____╨ (┬(┬(┬(├(╥,├(╥,├
- ═(╥,─)"0─)"0─)"4┼)24┼)24┼)┬8╞)┬8╞)┬8╟)╥<╟)╥<╟*"@╚*"@╚*"─╔*2─╔
- ═*2╚╩*┬╚╩*┬╠╦*╥╠╦*╥╨╠+"╨╠+"╘═+2╘═+┬╪╬+┬╪╬+╥\╧+╙ ╨,# ╨,3$╤,3$╥
- ═,├(╥,╙,╙,╙0╘-#0╒-34╒-├8╓-├<╫-╙@╪.#@8&!@8&1─9&1─9&1─9&1─9&1─9
- ═&1─9&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╠;&╤╠;&╤╠;&╤╠;&╤╠;&╤╨<'!╨<'!╨<'!╨<
- ═'!╨<'1╘='1╘='1╘='1╘='1╪>'┴╪>'┴╪>'┴╪>'┴\?'╤\?'╤\?'╤\?(" @(" @
- ═(" @(" ┴(2$┴(2$┴(2$┴(┬(┬(╧__ /____\ \ _╨#__╨ #_____
- ═ /____\ _____╨ #_ /__ /_╨__\ _____╨ #_
- ═____ /____\ _____╨ #_____ /____\ _____╨
- ═ #_____ /_╨ 0$! 0$! 0$" @(" @(# ╨,#! 0$
- ═! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45%┴<7
- ═&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫.#─┌
- ═.╙╨]/├] 04)#1$5&1╘┴)2─═-3─]045)35%976"╠╩*2─╚)╥8╞)20├(╥(┴(" ?
- ═'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)" @(
- ═!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
- ═ $! 0$! 0$! @(" @(" ╨,# ╨0$! 0%!04%!@8&!╨<'" @(
- ═"0─)"@╚+"╨╠,# ╘-#@╪/#╤ 0$1$2$┴,3%!05%187%╤@8&1╚:&╤╨<'1╪>'╥ @
- ═(2(├(╥0┼)┬8╟*"─╔*┬╠╠+2╪╬+╙ ╤,├,╘-34╓-╙@┘.├╠\/3╪_0$%"0╘1%1─=(
- ═24╔+34┘/4%%24╒165╒@╦*┬─╔*"<╞)┬4─(╥,┬(2 @'╤╪>'1╨<&╤╚:&1@8%╤<6
- ═%144%!,3$┴(1$1 0#╨\.#@╘-# ╨+"╨╠*"@─)"0@(" <'!╨8&!@4%!04$! 0$
- ═ ╨,# ╨(" @(" @$! 0$! 0$! ! 0$!
- ═ 0$! 0(" @(" @,# ╨,$! 0$!04%!08&!@<'!╨@(" ─)"0╚*"╨╠+# ╨-#0╪.
- ═#╨\0$!$1$┴(3$╤04%146%╤<8&!─:&┴╠<'!╘>'┴\@("$┬(╥,─)28╞)╥@╔*2╚╦
- ═+"╘╬+┬\╨,3(╙-#4╒-├<╪.3╚[/#╘^/╘ _/├╘\.╙╚┘.#<╓-34╘,╙(╤,"\╬+┬╘╠
- ═*╥╚╔*2@╟)┬8┼)",├(┬$@(!\>'┴╘<'!╠:&┴─8&!<7%┴45%!03$╤(2$1$0$ \/
- ═#@╪-#0╨,"╨╠+"@╚)"0─(" @'!╨<&!@8%!04%! 0$! ,# ╨," @(" @(! 0$!
- ═ 0$! 0 0$! 0$! 0$" @(" @(# ╨,#
- ═! 0$! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45
- ═%┴<7&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫
- ═.#─┌.╙╨]/├] /╙╪]/#╠┌.3@╫-├4╒-#,╥,3 ╧+┬╪═+"╠╩*2─╚)╥8╞)20├(╥(┴
- ═(" ?'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)
- ═" @(!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
- ═ !╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
- ┼&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
-
- END
-
-
- ********************************
- * *
- * ╙TEPHEN ╩UDD *
- * ╟EORGE ╘AYLOR *
- * ╙TARTED: 7/11/94 *
- * ╞INISHED: 7/19/94 *
- * V2.0 ├OMPLETED: 12/17/94 *
- * V3.0 ├OMPLETED: 3/20/95 *
- * V3.1 ├OMPLETED: 6/14/95 *
- * V3.2 ├OMPLETED: 6/15/95 *
- * *
- * ╫ELL, IF ALL GOES WELL THIS *
- * PROGRAM WILL ROTATE A CUBE. *
- * *
- * V2.0 + ╬EW AND ╔MPROVED! *
- * ╬OW WITH FASTER ROUTINES, *
- * HIDDEN SURFACES, FILLED *
- * FACES, AND EXTRA TOP SECRET *
- * TEXT MESSAGES! *
- * *
- * V3.0 + ╞AST CHUNKY LINE *
- * ROUTINE. *
- * *
- * V3.1 + ╟ENERAL POLYGON PLOT *
- * WITH HIDDEN FACES (╪-PRODUCT)*
- * AND ZOOM FEATURE. *
- * *
- * V3.2 + ┼╧╥-BUFFER FILLING *
- * *
- * ╘HIS PROGRAM IS INTENDED TO *
- * ACCOMPANY THE ARTICLE IN *
- * ├=╚ACKING, ╩UN. 95 ISSUE. *
- * ╞OR DETAILS ON THIS PROGRAM, *
- * READ THE ARTICLE! *
- * *
- * ╫RITE TO US! *
- * *
- * ═YSELF WHEN YOUNG DID *
- * EAGERLY FREQUENT *
- * ─OCTOR AND ╙AINT, AND HEARD *
- * GREAT ┴RGUMENT *
- * ┴BOUT IT AND ABOUT: BUT *
- * EVERMORE *
- * ├AME OUT BY THE SAME ─OOR *
- * AS IN ╔ WENT. *
- * - ╥UBAIYAT *
- * *
- * ╘HOUGH ╔ SPEAK WITH THE *
- * TONGUES OF MEN AND OF ANGLES *
- * AND HAVE NOT LOVE, ╔ AM *
- * BECOME AS SOUNDING BRASS, OR *
- * A TINKLING CYMBAL. *
- * - 1 ├ORINTHIANS 13 *
- * *
- * ╨.╙. ╘HIS WAS WRITTEN USING *
- * ═ERLIN 128. *
- ********************************
-
- ╧╥╟ $8000
-
- * ├ONSTANTS
-
- ┬╒╞╞1 ┼╤╒ $3000 ;╞IRST CHARACTER SET
- ┬╒╞╞2 ┼╤╒ $3800 ;╙ECOND CHARACTER SET
- ┼╧╥┬╒╞ ┼╤╒ $4000 ;┼╧╥-BUFFER
- ┬╒╞╞┼╥ ┼╤╒ $┴3 ;╨RESUMABLY THE TAPE WON'T BE RUNNING
- ╪1 ┼╤╒ $╞┬ ;╨OINTS FOR DRAWING A LINE
- ┘1 ┼╤╒ $╞├ ;╘HESE ZERO PAGE ADDRESSES
- ╪2 ┼╤╒ $╞─ ;DON'T CONFLICT WITH ┬┴╙╔├
- ┘2 ┼╤╒ $╞┼
- ╧╠─╪ ┼╤╒ $╞─
- ├╚╒╬╦ ┼╤╒ $╞┼
- ─╪ ┼╤╒ $67 ;╘HIS IS SHARED WITH ╘1 BELOW
- ─┘ ┼╤╒ $68
- ╘┼═╨1 ┼╤╒ $╞┬ ;╧F COURSE, COULD CONFLICT WITH X1
- ╘┼═╨2 ┼╤╒ $╞├ ;╘EMPORARY VARIABLES
- ┌╘┼═╨ ┼╤╒ $02 ;╒SED FOR BUFFER SWAP. ─ON'T TOUCH.
- ┌1 ┼╤╒ $22 ;╒SED BY MATH ROUTINE
- ┌2 ┼╤╒ $24 ;─ON'T TOUCH THESE EITHER!
- ┌3 ┼╤╒ $26
- ┌4 ┼╤╒ $28
- ╦ ┼╤╒ $┬6 ;├ONSTANT USED FOR HIDDEN
- ;SURFACE DETECTION - DON'T TOUCH
- ╚╔─┼ ┼╤╒ $┬5 ;┴RE SURFACES HIDDEN?
- ╞╔╠╠ ┼╤╒ $50 ;┴RE WE USING ┼╧╥-FILL?
- ┴╬╟═┴╪ ┼╤╒ 120 ;╘HERE ARE 2*PI/ANGMAX ANGLES
-
- * ╓╔├
-
- ╓═├╙┬ ┼╤╒ $─018
- ┬╦╟╬─ ┼╤╒ $─020
- ┬╧╥─┼╥ ┼╤╒ $─021
- ╙╙╘┴╥╘ ┼╤╒ 1344 ;ROW 9 IN SCREEN MEMORY AT 1024
-
-
- * ╦ERNAL
-
- ├╚╥╧╒╘ ┼╤╒ $╞╞─2
- ╟┼╘╔╬ ┼╤╒ $╞╞┼4
-
- * ╙OME VARIABLES
-
- ╟╠╧┬╪═╔╬ = $3╞ ;╘HESE ARE USED IN CLEARING THE
- ╟╠╧┬╪═┴╪ = $40 ;DRAWING (GLOBAL) BUFFER
- ╟╠╧┬┘═╔╬ = $41
- ╟╠╧┬┘═┴╪ = $42
- ╠╧├╪═╔╬ = $57 ;╘HESE ARE USED IN CLEARING THE
- ╠╧├╪═┴╪ = $58 ;┼╧╥ (LOCAL) BUFFER
- ╠╧├┘═╔╬ = $59
- ╠╧├┘═┴╪ = $60
- ╨1╪ = $92 ;╘HESE ARE TEMPORARY STORAGE
- ╨1┘ = $93 ;╒SED IN PLOTTING THE PROJECTION
- ╨1┌ = $94
- ╨2╪ = $95 ;╘HEY ARE HERE SO THAT WE
- ╨2┘ = $96 ;DON'T HAVE TO RECALCULATE THEM.
- ╨2┌ = $┴┼
- ╨3╪ = $┴╞ ;╘HEY MAKE LIFE EASY.
- ╨3┘ = $┬0
- ╨3┌ = $┬1 ;╫HY ARE YOU LOOKING AT ME LIKE THAT?
- ╨1╘ = $┬2 ;─ON'T YOU TRUST ME?
- ╨2╘ = $┬3
- ╨3╘ = $┬4 ;╚AVING ANOTHER CHILD WASN'T MY IDEA.
- ╔╬─┼╪ = $51
- ├╧╒╬╘╨╘╙ = $52
- ┌╧╧═ = $71 ;┌OOM FACTOR
- ─╙╪ = $61 ;─╙╪ IS THE INCREMENT FOR
- ;ROTATING AROUND X
- ─╙┘ = $62 ;╙IMILAR FOR ─╙┘, ─╙┌
- ─╙┌ = $63
- ╙╪ = $64 ;╘HESE ARE THE ACTUAL ANGLES IN X Y AND Z
- ╙┘ = $65
- ╙┌ = $66
- ╘1 = $67 ;╘HESE ARE USED IN THE ROTATION
- ╘2 = $68
- ╘3 = $69 ;╙EE THE ARTICLE FOR MORE DETAILS
- ╘4 = $6┴
- ╘5 = $6┬
- ╘6 = $6├
- ╘7 = $6─
- ╘8 = $6┼
- ╘9 = $6╞
- ╘10 = $70
- ┴11 = $┴5 ;╘HESE ARE THE ELEMENTS OF THE ROTATION MATRIX
- ┬12 = $┴6 ;╪┘┌
- ├13 = $┴7
- ─21 = $┴8 ;╘HE NUMBER DENOTES (ROW,COLUMN)
- ┼22 = $┴9
- ╞23 = $┴┴
- ╟31 = $┴┬
- ╚32 = $┴├
- ╔33 = $┴─
-
-
- *** ═ACROS
-
- ═╧╓┼ ═┴├
- ╠─┴ ]1
- ╙╘┴ ]2
- <<<
-
- ╟┼╘╦┼┘ ═┴├ ;╫AIT FOR A KEYPRESS
- ╫┴╔╘ ╩╙╥ ╟┼╘╔╬
- ├═╨ #00
- ┬┼╤ ╫┴╔╘
- <<<
-
- ─┼┬╒╟ ═┴├ ;╨RINT A CHARACTER
- ─╧ 0 ;─ON'T ASSEMBLE
-
- ╠─┴ #]1
- ╩╙╥ ├╚╥╧╒╘
- ├╠╔
- >>> ╟┼╘╦┼┘ ;┴ND WAIT TO CONTINUE
- ├═╨ #'S' ;═Y SECRECT SWITCH KEY
- ┬╬┼ ╠1
- ╩╙╥ ├╠┼┴╬╒╨
- ╩═╨ ─╧╬┼
- ╠1 ├═╨ #'X' ;═Y SECRET ABORT KEY
- ┬╬┼ ─╧╬┼
- ╩═╨ ├╠┼┴╬╒╨
- ╞╔╬
- ─╧╬┼ <<<
-
- ─┼┬╒╟┴ ═┴├
- ─╧ 0
- ╠─┴ ]1
- ╙╘┴ 1024
- ╞╔╬
- ─╧╬┼┴ <<<
-
- *-------------------------------
-
- ╠─┴ #$00
- ╙╘┴ ┬╦╟╬─
- ╙╘┴ ┬╧╥─┼╥
- ╠─┴ ╓═├╙┬
- ┴╬─ #%00001111 ;╙CREEN MEMORY TO 1024
- ╧╥┴ #%00010000
- ╙╘┴ ╓═├╙┬
-
- ╠─┘ #00
- ╠─┴ #<╘╘┼╪╘
- ╙╘┴ ╘┼═╨1
- ╠─┴ #>╘╘┼╪╘
- ╙╘┴ ╘┼═╨2
- ╩═╨ ╘╔╘╠┼
- ╘╘┼╪╘ ╚┼╪ 9305111111 ;CLEAR SCREEN, WHITE, CRSR DN
- ╘╪╘ ' CUBE3D V3.2',0D,0D
- ╘╪╘ ' BY',0D
- ╚┼╪ 9╞ ;CYAN
- ╘╪╘ ' STEPHEN JUDD'
- ╚┼╪ 99
- ╘╪╘ ' GEORGE TAYLOR',0D,0D
- ╚┼╪ 9┬
- ╘╪╘ ' CHECK OUT THE JAN. 95 ISSUE OF',0D
- ╚┼╪ 96
- ╘╪╘ ' C=HACKING'
- ╚┼╪ 9┬
- ╘╪╘ ' FOR MORE DETAILS!',0D
- ╚┼╪ 0─1─1─9┼12
- ╘╪╘ 'F1/F2',92
- ╘╪╘ ' - INC/DEC X-ROTATION',0D
- ╚┼╪ 1─1─12
- ╘╪╘ 'F3/F4',92
- ╘╪╘ ' - INC/DEC Y-ROTATION',0D
- ╚┼╪ 1─1─12
- ╘╪╘ 'F5/F6',92
- ╘╪╘ ' - INC/DEC Z-ROTATION',0D
- ╚┼╪ 1─1─12
- ╘╪╘ ' F7 ',92
- ╘╪╘ ' - RESET',0D
- ╚┼╪ 1─1─12
- ╘╪╘ ' +/- ',92
- ╘╪╘ ' - ZOOM IN/OUT',0D
- ╚┼╪ 1─1─12
- ╘╪╘ ' H ',92
- ╘╪╘ ' - TOGGLE HIDDEN SURFACES',0D
- ╚┼╪ 1─1─12
- ╘╪╘ 'SPACE',92
- ╘╪╘ ' - TOGGLE SURFACE FILLING',0D,0D
- ╘╪╘ ' PRESS Q TO QUIT',0D
- ╚┼╪ 0─05
- ╘╪╘ ' PRESS ANY KEY TO BEGIN',0D
- ╚┼╪ 00
- ╘╔╘╠┼ ╠─┴ (╘┼═╨1),┘
- ┬┼╤ :├╧╬╘
- ╩╙╥ ├╚╥╧╒╘
- ╔╬┘
- ┬╬┼ ╘╔╘╠┼
- ╔╬├ ╘┼═╨2
- ╩═╨ ╘╔╘╠┼
- :├╧╬╘ >>> ╟┼╘╦┼┘
-
- **** ╙ET UP TABLES(?)
-
- * ╘ABLES ARE CURRENTLY SET UP IN ┬┴╙╔├
- * AND BY THE ASSEMBLER.
-
- ╘┴┬╠┼╙ ╠─┴ #>╘═┴╘╚1
- ╙╘┴ ┌1+1
- ╙╘┴ ┌2+1
- ╠─┴ #>╘═┴╘╚2
- ╙╘┴ ┌3+1
- ╙╘┴ ┌4+1
-
- **** ├LEAR SCREEN AND SET UP "BITMAP"
- ╙┼╘╒╨ ╠─┴ #$01 ;╫HITE
- ╙╘┴ $─021 ;╘HIS IS DONE SO THAT OLDER
- ╠─┴ #147 ;MACHINES WILL SET UP
- ╩╙╥ ├╚╥╧╒╘
- ╠─┴ #$00 ;CORRECTLY
- ╙╘┴ $─021
- ╠─┴ #<╙╙╘┴╥╘
- ┴─├ #12 ;╘HE GOAL IS TO CENTER THE GRAPHICS
- ╙╘┴ ╘┼═╨1 ;├OLUMN 12
- ╠─┴ #>╙╙╘┴╥╘ ;╥OW 9
- ╙╘┴ ╘┼═╨1+1 ;╙╙╘┴╥╘ POINTS TO ROW 9
- ╠─┴ #00
- ╠─┘ #00
- ╠─╪ #00 ;X WILL COUNT 16 ROWS FOR US
- ├╠├
-
- :╠╧╧╨ ╙╘┴ (╘┼═╨1),┘
- ╔╬┘
- ┴─├ #16
- ┬├├ :╠╧╧╨
- ├╠├
- ╠─┴ ╘┼═╨1
- ┴─├ #40 ;╬EED TO ADD 40 TO THE BASE POINTER
- ╙╘┴ ╘┼═╨1 ;╘O JUMP TO THE NEXT ROW
- ╠─┴ ╘┼═╨1+1
- ┴─├ #00 ;╘AKE CARE OF CARRIES
- ╙╘┴ ╘┼═╨1+1
- ╠─┘ #00
- ╔╬╪
- ╘╪┴ ;╪ IS ALSO AN INDEX INTO THE CHARACTER NUMBER
- ├╨╪ #16
- ┬╬┼ :╠╧╧╨ ;╬EED TO DO IT 16 TIMES
-
- **** ├LEAR BUFFERS
-
- ╠─┴ #<┬╒╞╞1
- ╙╘┴ ┬╒╞╞┼╥
- ╠─┴ #>┬╒╞╞1
- ╙╘┴ ┬╒╞╞┼╥+1
- ╠─┘ #$00
- ╠─╪ #24 ;┴SSUMING ALL THREE BUFFERS ARE
- ╠─┴ #$00 ;BACK-TO-BACK
- :┬╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
- ╔╬┘
- ┬╬┼ :┬╠╧╧╨
- ╔╬├ ┬╒╞╞┼╥+1
- ─┼╪
- ┬╬┼ :┬╠╧╧╨
-
- **** ╙ET UP BUFFERS
-
- ╠─┴ #<┬╒╞╞1
- ╙╘┴ ┬╒╞╞┼╥
- ╠─┴ #>┬╒╞╞1
- ╙╘┴ ┬╒╞╞┼╥+1
- ╙╘┴ ┌╘┼═╨ ;ZTEMP WILL MAKE LIFE SIMPLE FOR US
- ╠─┴ ╓═├╙┬
- ┴╬─ #%11110001 ;╙TART HERE SO THAT SWAP BUFFERS WILL WORK RIGHT
- ╧╥┴ #%00001110
- ╙╘┴ ╓═├╙┬
-
- **** ╙ET UP INITIAL VALUES
-
- ╔╬╔╘ ╠─┴ #00
- ╙╘┴ ╠╧├╪═╔╬
- ╙╘┴ ╠╧├╪═┴╪
- ╙╘┴ ╠╧├┘═╔╬
- ╙╘┴ ╠╧├┘═┴╪
- ╙╘┴ ╟╠╧┬╪═╔╬
- ╙╘┴ ╟╠╧┬┘═╔╬
- ╙╘┴ ╟╠╧┬╪═┴╪
- ╙╘┴ ╟╠╧┬┘═┴╪
- ╙╘┴ ─╙╪
- ╙╘┴ ─╙┘
- ╙╘┴ ─╙┌
- ╙╘┴ ╙╪
- ╙╘┴ ╙┘
- ╙╘┴ ╙┌
- ╙╘┴ ╞╔╠╠
- ╠─┴ #01
- ╙╘┴ ╚╔─┼
- ╠─┴ #64
- ╙╘┴ ┌╧╧═
-
- *-------------------------------
- * ═AIN LOOP
-
- **** ╟ET KEYPRESS
-
- ═┴╔╬
- ├╠╔
- ╦╨╥┼╙╙ ╩╙╥ ╟┼╘╔╬
- ├═╨ #133 ;╞1?
- ┬╬┼ :╞2
- ╠─┴ ─╙╪
- ├═╨ #┴╬╟═┴╪/2 ;╬O MORE THAN PI
- ┬┼╤ :├╧╬╘1
- ╔╬├ ─╙╪ ;OTHERWISE INCREASE X-ROTATION
- ╩═╨ :├╧╬╘
- :╞2 ├═╨ #137 ;╞2?
- ┬╬┼ :╞3
- ╠─┴ ─╙╪
- ┬┼╤ :├╧╬╘1
- ─┼├ ─╙╪
- ╩═╨ :├╧╬╘
- :╞3 ├═╨ #134
- ┬╬┼ :╞4
- ╠─┴ ─╙┘
- ├═╨ #┴╬╟═┴╪/2
- ┬┼╤ :├╧╬╘1
- ╔╬├ ─╙┘ ;╔NCREASE Y-ROTATION
- ╩═╨ :├╧╬╘
- :╞4 ├═╨ #138
- ┬╬┼ :╞5
- ╠─┴ ─╙┘
- ┬┼╤ :├╧╬╘1
- ─┼├ ─╙┘
- ╩═╨ :├╧╬╘
- :╞5 ├═╨ #135
- ┬╬┼ :╞6
- ╠─┴ ─╙┌
- ├═╨ #┴╬╟═┴╪/2
- ┬┼╤ :├╧╬╘1
- ╔╬├ ─╙┌ ;Z-ROTATION
- ╩═╨ :├╧╬╘
- :╞6 ├═╨ #139
- ┬╬┼ :╞7
- ╠─┴ ─╙┌
- ┬┼╤ :├╧╬╘1
- ─┼├ ─╙┌
- ╩═╨ :├╧╬╘
- :╞7 ├═╨ #136
- ┬╬┼ :╨╠╒╙
- ╩═╨ ╔╬╔╘
- :├╧╬╘1 ╩═╨ :├╧╬╘
- :╨╠╒╙ ├═╨ #'+'
- ┬╬┼ :═╔╬╒╙
- ╔╬├ ┌╧╧═ ;┬AH, WHO NEEDS ERROR CHECKING?
- ╔╬├ ┌╧╧═
- ╩═╨ :├╧╬╘
- :═╔╬╒╙ ├═╨ #'-'
- ┬╬┼ :╚
- ─┼├ ┌╧╧═
- ─┼├ ┌╧╧═
- ┬╨╠ :├╧╬╘
- ╔╬├ ┌╧╧═
- ╔╬├ ┌╧╧═
- ╩═╨ :├╧╬╘
- :╚ ├═╨ #'H'
- ┬╬┼ :╙╨┴├┼
- ╠─┴ ╚╔─┼
- ┼╧╥ #$01
- ╙╘┴ ╚╔─┼
- ╩═╨ :├╧╬╘
- :╙╨┴├┼ ├═╨ #' '
- ┬╬┼ :╤
- ╠─┴ ╞╔╠╠
- ┼╧╥ #$01
- ╙╘┴ ╞╔╠╠
- ╩═╨ :├╧╬╘
- :╤ ├═╨ #'Q' ;Q QUITS
- ┬╬┼ :├╧╬╘
- ╩═╨ ├╠┼┴╬╒╨
-
- :├╧╬╘ ╙┼╔ ;╙PEED THINGS UP A BIT
-
- **** ╒PDATE ANGLES
-
- ╒╨─┴╘┼ ├╠├
- ╠─┴ ╙╪
- ┴─├ ─╙╪
- ├═╨ #┴╬╟═┴╪ ;┴RE WE >= MAXIMUM ANGLE?
- ┬├├ :├╧╬╘1
- ╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
- :├╧╬╘1 ╙╘┴ ╙╪
- ├╠├
- ╠─┴ ╙┘
- ┴─├ ─╙┘
- ├═╨ #┴╬╟═┴╪
- ┬├├ :├╧╬╘2
- ╙┬├ #┴╬╟═┴╪ ;╙AME DEAL
- :├╧╬╘2 ╙╘┴ ╙┘
- ├╠├
- ╠─┴ ╙┌
- ┴─├ ─╙┌
- ├═╨ #┴╬╟═┴╪
- ┬├├ :├╧╬╘3
- ╙┬├ #┴╬╟═┴╪
- :├╧╬╘3 ╙╘┴ ╙┌
-
- **** ╥OTATE COORDINATES
-
- ╥╧╘┴╘┼
-
- *** ╞IRST, CALCULATE T1,T2,...,T10
-
- ** ╘WO MACROS TO SIMPLIFY OUR LIFE
- ┴──┴ ═┴├ ;┴DD TWO ANGLES TOGETHER
- ├╠├
- ╠─┴ ]1
- ┴─├ ]2
- ├═╨ #┴╬╟═┴╪ ;╔S THE SUM > 2*PI?
- ┬├├ ─╧╬┼
- ╙┬├ #┴╬╟═┴╪ ;╔F SO, SUBTRACT 2*PI
- ─╧╬┼ <<<
-
- ╙╒┬┴ ═┴├ ;╙UBTRACT TWO ANGLES
- ╙┼├
- ╠─┴ ]1
- ╙┬├ ]2
- ┬├╙ ─╧╬┼
- ┴─├ #┴╬╟═┴╪ ;╧OPS, WE NEED TO ADD 2*PI
- ─╧╬┼ <<<
-
- ** ╬OW CALCULATE T1,T2,ETC.
-
- >>> ╙╒┬┴,╙┘;╙┌
- ╙╘┴ ╘1 ;T1=SY-SZ
- >>> ┴──┴,╙┘;╙┌
- ╙╘┴ ╘2 ;T2=SY+SZ
- >>> ┴──┴,╙╪;╙┌
- ╙╘┴ ╘3 ;T3=SX+SZ
- >>> ╙╒┬┴,╙╪;╙┌
- ╙╘┴ ╘4 ;T4=SX-SZ
- >>> ┴──┴,╙╪;╘2
- ╙╘┴ ╘5 ;T5=SX+T2
- >>> ╙╒┬┴,╙╪;╘1
- ╙╘┴ ╘6 ;T6=SX-T1
- >>> ┴──┴,╙╪;╘1
- ╙╘┴ ╘7 ;T7=SX+T1
- >>> ╙╒┬┴,╘2;╙╪
- ╙╘┴ ╘8 ;T8=T2-SX
- >>> ╙╒┬┴,╙┘;╙╪
- ╙╘┴ ╘9 ;T9=SY-SX
- >>> ┴──┴,╙╪;╙┘
- ╙╘┴ ╘10 ;T10=SX+SY
-
- * ┼T VOILA!
-
- *** ╬EXT, CALCULATE ┴,┬,├,...,╔
-
- ** ┴NOTHER USEFUL LITTLE MACRO
- ─╔╓2 ═┴├ ;─IVIDE A SIGNED NUMBER BY 2
- ;╔T IS ASSUMED THAT THE NUMBER
- ┬╨╠ ╨╧╙ ;IS IN THE ACCUMULATOR
- ├╠├
- ┼╧╥ #$╞╞ ;╫E NEED TO UN-NEGATIVE THE NUMBER
- ┴─├ #01 ;BY TAKING IT'S COMPLEMENT
- ╠╙╥ ;DIVIDE BY TWO
- ├╠├
- ┼╧╥ #$╞╞
- ┴─├ #01 ;═AKE IT NEGATIVE AGAIN
- ╩═╨ ─╧╬┼─╔╓
- ╨╧╙ ╠╙╥ ;╬UMBER IS POSITIVE
- ─╧╬┼─╔╓ <<<
-
- ═╒╠2 ═┴├ ;═ULTIPLY A SIGNED NUMBER BY 2
- ┬╨╠ ╨╧╙═
- ├╠├
- ┼╧╥ #$╞╞
- ┴─├ #$01
- ┴╙╠
- ├╠├
- ┼╧╥ #$╞╞
- ┴─├ #$01
- ╩═╨ ─╧╬┼═╒╠
- ╨╧╙═ ┴╙╠
- ─╧╬┼═╒╠ <<<
-
- ** ╬OTE THAT WE ARE CURRENTLY MAKING A MINOR LEAP
- ** OF FAITH THAT NO OVERFLOWS WILL OCCUR.
-
- :├┴╠├┴ ├╠├
- ╠─╪ ╘1
- ╠─┴ ├╧╙,╪
- ╠─╪ ╘2
- ┴─├ ├╧╙,╪
- ╙╘┴ ┴11 ;┴=(COS(T1)+COS(T2))/2
- :├┴╠├┬ ╠─╪ ╘1
- ╠─┴ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘2
- ╙┬├ ╙╔╬,╪
- ╙╘┴ ┬12 ;┬=(SIN(T1)-SIN(T2))/2
- :├┴╠├├ ╠─╪ ╙┘
- ╠─┴ ╙╔╬,╪
- >>> ═╒╠2
- ╙╘┴ ├13 ;├=SIN(SY)
- :├┴╠├─ ╙┼├
- ╠─╪ ╘8
- ╠─┴ ├╧╙,╪
- ╠─╪ ╘7
- ╙┬├ ├╧╙,╪
- ╙┼├
- ╠─╪ ╘5
- ╙┬├ ├╧╙,╪
- ├╠├
- ╠─╪ ╘6
- ┴─├ ├╧╙,╪ ;─I=(COS(T8)-COS(T7)+COS(T6)-COS(T5))/2
- >>> ─╔╓2
- ├╠├
- ╠─╪ ╘3
- ┴─├ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘4
- ╙┬├ ╙╔╬,╪
- ╙╘┴ ─21 ;─=(SIN(T3)-SIN(T4)+─I)/2
- :├┴╠├┼ ╙┼├
- ╠─╪ ╘5
- ╠─┴ ╙╔╬,╪
- ╠─╪ ╘6
- ╙┬├ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘7
- ╙┬├ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘8
- ╙┬├ ╙╔╬,╪ ;┼I=(SIN(T5)-SIN(T6)-SIN(T7)-SIN(T8))/2
- >>> ─╔╓2
- ├╠├
- ╠─╪ ╘3
- ┴─├ ├╧╙,╪
- ├╠├
- ╠─╪ ╘4
- ┴─├ ├╧╙,╪
- ╙╘┴ ┼22 ;┼=(COS(T3)+COS(T4)+┼I)/2
- :├┴╠├╞ ╠─╪ ╘9
- ╠─┴ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘10
- ╙┬├ ╙╔╬,╪
- ╙╘┴ ╞23 ;╞=(SIN(T9)-SIN(T10))/2
- :├┴╠├╟ ╠─╪ ╘6
- ╠─┴ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘8
- ╙┬├ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘7
- ╙┬├ ╙╔╬,╪
- ╙┼├
- ╠─╪ ╘5
- ╙┬├ ╙╔╬,╪ ;╟I=(SIN(T6)-SIN(T8)-SIN(T7)-SIN(T5))/2
- >>> ─╔╓2
-
- ├╠├
- ╠─╪ ╘4
- ┴─├ ├╧╙,╪
- ╙┼├
- ╠─╪ ╘3
- ╙┬├ ├╧╙,╪
- ╙╘┴ ╟31 ;╟=(COS(T4)-COS(T3)+╟I)/2
- :├┴╠├╚ ├╠├
- ╠─╪ ╘6
- ╠─┴ ├╧╙,╪
- ╠─╪ ╘7
- ┴─├ ├╧╙,╪
- ╙┼├
- ╠─╪ ╘5
- ╙┬├ ├╧╙,╪
- ╙┼├
- ╠─╪ ╘8
- ╙┬├ ├╧╙,╪ ;╚I=(COS(T6)+COS(T7)-COS(T5)-COS(T8))/2
- >>> ─╔╓2
- ├╠├
- ╠─╪ ╘3
- ┴─├ ╙╔╬,╪
- ├╠├
- ╠─╪ ╘4
- ┴─├ ╙╔╬,╪
- ╙╘┴ ╚32 ;╚=(SIN(T3)+SIN(T4)+╚I)/2
- :╫╚┼╫ ├╠├
- ╠─╪ ╘9
- ╠─┴ ├╧╙,╪
- ╠─╪ ╘10
- ┴─├ ├╧╙,╪
- ╙╘┴ ╔33 ;╔=(COS(T9)+COS(T10))/2
-
- ** ╔T'S ALL DOWNHILL FROM HERE.
-
- ─╧╫╬╚╔╠╠
- **** ├LEAR BUFFER
- * ┴ LITTLE MACRO
-
- ╙┼╘┬╒╞ ═┴├ ;╨UT BUFFERS WHERE THEY CAN BE HURT
- ╠─┴ #00
- ╙╘┴ ┬╒╞╞┼╥
- ╠─┴ ┌╘┼═╨ ;╚IGH BYTE
- ╙╘┴┬╒╞ ╙╘┴ ┬╒╞╞┼╥+1
- <<<
-
- >>> ╙┼╘┬╒╞
- ├╠╥─╥┴╫ ╠─╪ #08
- ╠─┴ #00
- :╞╧╧╠ ╠─┘ #00
- :─╧╨┼ ╙╘┴ (┬╒╞╞┼╥),┘
- ╔╬┘
- ┬╬┼ :─╧╨┼
- ╔╬├ ┬╒╞╞┼╥+1
- ─┼╪
- ┬╬┼ :╞╧╧╠
-
- **** ═Y GOODNESS BUT ╔'M A DOPE
- *├╠╥─╥┴╫ ╠─┴ ╟╠╧┬╪═╔╬
- * ╠╙╥ ;╬EED TO GET INTO THE RIGHT COLUMN
- * ┬├├ :┼╓┼╬ ;┼XPLAINED IN MORE DETAIL BELOW
- * ╠─┘ #$80
- * ╙╘┘ ┬╒╞╞┼╥ ;╨RESUMABLY THIS WILL BE A LITTLE
- * ├╠├ ;MORE EFFICIENT.
- *:┼╓┼╬ ┴─├ ┬╒╞╞┼╥+1
- * ╙╘┴ ┬╒╞╞┼╥+1
- * ╠─┴ ╟╠╧┬╪═┴╪
- * ╙┼├
- * ╙┬├ ╟╠╧┬╪═╔╬
- * ╘┴╪
- * ╔╬╪
- * ╠─┘ ╟╠╧┬┘═┴╪
- * ┬┼╤ :╥┼╙┼╘
- *:┘┴┘ ╠─┴ #$00
- * ╠─┘ ╟╠╧┬┘═┴╪
- *:┬╠┴╚ ╙╘┴ (┬╒╞╞┼╥),┘
- * ─┼┘
- * ├╨┘ ╟╠╧┬┘═╔╬
- * ┬├╙ :┬╠┴╚
- * ╠─┴ ┬╒╞╞┼╥
- * ┼╧╥ #$80
- * ╙╘┴ ┬╒╞╞┼╥
- * ┬╬┼ :╫╚╧╨┼┼
- * ╔╬├ ┬╒╞╞┼╥+1
- *:╫╚╧╨┼┼ ─┼╪
- * ┬╬┼ :┘┴┘
- *:╥┼╙┼╘ ╠─┴ #0 ;╬EED TO RESET THESE GUYS
- * ╙╘┴ ╟╠╧┬╪═┴╪
- * ╙╘┴ ╟╠╧┬┘═┴╪
- * ╠─┴ #$╞╞
- * ╙╘┴ ╟╠╧┬╪═╔╬
- * ╙╘┴ ╟╠╧┬┘═╔╬
-
- **** ╬EXT, READ AND DRAW POLYGONS
-
- ╥┼┴──╥┴╫ ╠─┘ #00
- ╙╘┘ ╔╬─┼╪
- ╧┬╩╠╧╧╨ ╠─┘ ╔╬─┼╪
- ╠─┴ ╨╧╠┘╠╔╙╘,┘ ;╞IRST, THE NUMBER OF POINTS
- ┬╬┼ :├╧╬╘ ;┬UT IF NUMPOINTS IS ZERO THEN
- ╩═╨ ╧┬╩─╧╬┼ ;WE ARE AT THE END OF THE LIST
- :├╧╬╘ ╙╘┴ ├╧╒╬╘╨╘╙
- ╔╬├ ╔╬─┼╪
-
- * ╥OTATE PROJECT AND DRAW THE POLYGON
- * ═AKE SURE BUFFER BEING DRAWN TO IS CLEAR!
-
- :─╧╔╘ ╩╙╥ ╥╧╘╨╥╧╩
-
- * ├ONVERT XMIN AND XMAX TO COLUMNS
-
- ╠─┴ ╠╧├╪═╔╬
- ╠╙╥
- ╠╙╥
- ╠╙╥ ;X MOD 8
- ╙╘┴ ╠╧├╪═╔╬
- ├═╨ ╟╠╧┬╪═╔╬
- ┬├╙ :╬┴╚
- ╙╘┴ ╟╠╧┬╪═╔╬
- :╬┴╚ ╠─┴ ╠╧├┘═╔╬
- ├═╨ ╟╠╧┬┘═╔╬
- ┬├╙ :╒╚╒╚
- ╙╘┴ ╟╠╧┬┘═╔╬
- :╒╚╒╚ ╠─┴ ╠╧├╪═┴╪
- ╠╙╥
- ╠╙╥
- ╠╙╥
- ╙╘┴ ╠╧├╪═┴╪
- ├═╨ ╟╠╧┬╪═┴╪
- ┬├├ :╬╧╫┴┘
- ╙╘┴ ╟╠╧┬╪═┴╪
- :╬╧╫┴┘ ╠─┴ ╠╧├┘═┴╪
- ├═╨ ╟╠╧┬┘═┴╪
- ┬├├ ┼╧╥╞╔╠╠
- ╙╘┴ ╟╠╧┬┘═┴╪
-
- * ╔F USING THE ┼╧╥-BUFFER, COPY INTO DRAWING BUFFER
- * ┴ND THEN CLEAR THE ┼╧╥-BUFFER
-
- ┼╧╥╞╔╠╠ ╠─┴ ╞╔╠╠
- ┬┼╤ ╧┬╩╠╧╧╨
-
- >>> ╙┼╘┬╒╞
- ╠─┴ #<┼╧╥┬╒╞
- ╙╘┴ ╘┼═╨1
- ╠─┴ #>┼╧╥┬╒╞
- ╙╘┴ ╘┼═╨1+1
-
- ╠─┴ ╠╧├╪═╔╬ ;╠╧├╪═╔╬ NOW CONTAINS COLUMN
- ╠╙╥ ;┼ACH COLUMN IS 128 BYTES
- ┬├├ :┼╓┼╬ ;╙O THERE MIGHT BE A CARRY
- ╠─┘ #$80
- ╙╘┘ ┬╒╞╞┼╥
- ╙╘┘ ╘┼═╨1
- ├╠├
- :┼╓┼╬ ╙╘┴ ╘2
- ┴─├ ┬╒╞╞┼╥+1
- ╙╘┴ ┬╒╞╞┼╥+1 ;┼ACH COLUMN IS 128 BYTES
- ╠─┴ ╘2
- ┴─├ ╘┼═╨1+1 ;╬OW WE WILL START AT THE
- ╙╘┴ ╘┼═╨1+1 ;COLUMN
-
- ╠─┴ ╠╧├╪═┴╪
- ╙┼├
- ╙┬├ ╠╧├╪═╔╬
- ╘┴╪ ;╘OTAL NUMBER OF COLUMNS TO DO
- ╔╬╪ ;E.G. FILL COLUMNS 1..3
- ╠─┘ ╠╧├┘═┴╪
- ┬╬┼ :╞╧╧╨
- ╔╬├ ╠╧├┘═┴╪
- :╞╧╧╨ ╠─┘ ╠╧├┘═┴╪
- ╠─┴ #00
- :╟╧╧╨ ┼╧╥ (╘┼═╨1),┘ ;┼╧╥-BUFFER
- ╨╚┴
- * ═AYBE PUT AN ┼╧╥ BELOW?
- ┼╧╥ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╠─┴ #00 ;═IGHT AS WELL CLEAR IT NOW
- ╙╘┴ (╘┼═╨1),┘
- ╨╠┴
- ─┼┘
- ├╨┘ ╠╧├┘═╔╬
- ┬├╙ :╟╧╧╨
- ╠─┴ ┬╒╞╞┼╥
- ┼╧╥ #$80
- ╙╘┴ ┬╒╞╞┼╥
- ╙╘┴ ╘┼═╨1
- ┬╬┼ :┬╧╧╨
- ╔╬├ ┬╒╞╞┼╥+1
- ╔╬├ ╘┼═╨1+1
- :┬╧╧╨ ─┼╪
- ┬╬┼ :╞╧╧╨
- ╩═╨ ╧┬╩╠╧╧╨
-
- ╧┬╩─╧╬┼
- **** ╙WAP BUFFERS
-
- ╙╫┴╨┬╒╞ ╠─┴ ╓═├╙┬
- ┼╧╥ #$02 ;╨RETTY TRICKY, EH?
- ╙╘┴ ╓═├╙┬
- ╠─┴ #$08
- ┼╧╥ ┌╘┼═╨ ;ZTEMP=HIGH BYTE JUST FLIPS
- ╙╘┴ ┌╘┼═╨ ;BETWEEN $30 AND $38
-
- ╩═╨ ═┴╔╬ ;┴ROUND AND AROUND WE GO...
-
- ╘╪╘ '╟EE ┬RAIN, WHAT DO YOU WANT TO DO '
- ╘╪╘ 'TONIGHT?'
-
- ** ╥OTATE, PROJECT, AND STORE THE POINTS
- *
- * ╘HIS PART IS A SIGNIFICANT CHANGE SINCE
- * V2.0. ╬OW IT IS A COMPLETELY GENERAL POLYGON PLOTTER.
- * ┴ SET OF POINTS IS READ IN, ROTATED AND PROJECTED, AND
- * PLOTTED INTO THE DRAWING BUFFER (┼╧╥ OR NORMAL).
-
- ╥╧╘╨╥╧╩
-
- * ┴ NEAT MACRO
- ╬┼╟ ═┴├ ;├HANGE THE SIGN OF A TWO'S COMPLEMENT
- ├╠├
- ╠─┴ ]1 ;NUMBER.
- ┼╧╥ #$╞╞
- ┴─├ #$01
- <<<
-
- *-------------------------------
- * ╘HESE MACROS REPLACE THE PREVIOUS PROJECTION
- * SUBROUTINE.
-
- ╙═╒╠╘ ═┴├ ;═ULTIPLY TWO SIGNED 8-BIT
- ;NUMBERS: ┴*┘/64 -> ┴
- ╙╘┴ ┌3
- ├╠├ ;╘HIS MULTIPLY IS FOR NORMAL
- ┼╧╥ #$╞╞ ;NUMBERS, I.E. X=-64..64
- ┴─├ #$01
- ╙╘┴ ┌4
- ╠─┴ (┌3),┘
- ╙┼├
- ╙┬├ (┌4),┘
- <<< ;┴LL DONE :)
-
- ╙═╒╠╘┌ ═┴├ ;═ULTIPLY TWO SIGNED 8-BIT
- ;NUMBERS: ┴*┘/64 -> ┴
- ╙╘┴ ┌1
- ├╠├ ;┴ND THIS MULTIPLY IS SPECIFICALLY
- ┼╧╥ #$╞╞ ;FOR THE PROJECTION PART, WHERE
- ┴─├ #$01 ;NUMBERS ARE -110..110 AND 0..40
- ╙╘┴ ┌2
- ╠─┴ (┌1),┘
- ╙┼├
- ╙┬├ (┌2),┘
- <<< ;┴LL DONE :)
-
- ╨╥╧╩┼├╘ ═┴├ ;╘HE ACTUAL PROJECTION ROUTINE
- ;╘HE ROUTINE TAKES THE POINT
- ;]1 ]2 ]3, ROTATES AND
- ;PROJECTS IT, AND STORES THE
- ;RESULT IN ]1 ]2 ]3.
-
- ╠─┘ ]1 ;═ULTIPLY FIRST ROTATION COLUMN
- ╠─┴ ┴11
- >>> ╙═╒╠╘
- ╙╘┴ ╨1╘
- ╠─┴ ─21
- >>> ╙═╒╠╘
- ╙╘┴ ╨2╘
- ╠─┴ ╟31
- >>> ╙═╒╠╘
- ╙╘┴ ╨3╘
- ╠─┘ ]2 ;╙ECOND COLUMN
- ╠─┴ ┬12
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨1╘
- ╙╘┴ ╨1╘
- ╠─┴ ┼22
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨2╘
- ╙╘┴ ╨2╘
- ╠─┴ ╚32
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨3╘
- ╙╘┴ ╨3╘
- ╠─┘ ]3 ;╘HIRD COLUMN
- ╠─┴ ├13
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨1╘
- ╙╘┴ ╨1╘
- ╠─┴ ╞23
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨2╘
- ╙╘┴ ╨2╘
- ╠─┴ ╔33
- >>> ╙═╒╠╘
- ├╠├
- ┴─├ ╨3╘
- ╙╘┴ ]3 ;╥OTATED ┌
- ╘┴╪
- ╠─┘ ┌─╔╓,╪ ;╘ABLE OF D/(Z+Z0)
- ;╬OW ┘ CONTAINS PROJECTION CONST
-
- ╠─┴ ╨1╘
- >>> ╙═╒╠╘┌
- ╠─╪ ┌╧╧═
- ├╨╪ #64
- ┬┼╤ ├╧╬╘╪
- ╙╘┘ ╘┼═╨1
- ╠─┘ ┌╧╧═
- >>> ╙═╒╠╘
- ╠─┘ ╘┼═╨1
- ├╧╬╘╪ ├╠├
- ┴─├ #64 ;╧FFSET THE COORDINATE
- ╙╘┴ ]1 ;╥OTATED AND PROJECTED
- ├═╨ ╠╧├╪═╔╬ ;╙EE IF IT IS A LOCAL MINIMUM
- ┬├╙ ╬╧╘╪═╔╬
- ╙╘┴ ╠╧├╪═╔╬
- ╬╧╘╪═╔╬ ├═╨ ╠╧├╪═┴╪
- ┬├├ ╬╧╘╪═┴╪
- ╙╘┴ ╠╧├╪═┴╪
-
- ╬╧╘╪═┴╪ ╠─┴ ╨2╘
- >>> ╙═╒╠╘┌
- ├╨╪ #64
- ┬┼╤ ├╧╬╘┘
- ╠─┘ ┌╧╧═
- >>> ╙═╒╠╘
- ├╧╬╘┘ ├╠├
- ┴─├ #64
- ╙╘┴ ]2 ;╥OTATED AND PROJECTED ┘
- ├═╨ ╠╧├┘═╔╬
- ┬├╙ ╬╧╘┘═╔╬
- ╙╘┴ ╠╧├┘═╔╬
- ╬╧╘┘═╔╬ ├═╨ ╠╧├┘═┴╪
- ┬├├ ╬╧╘┘═┴╪
- ╙╘┴ ╠╧├┘═┴╪
-
- ╬╧╘┘═┴╪ <<< ;┴LL DONE
-
- * ╠─┴ #<┼╧╥┬╒╞ ;╞IRST WE NEED TO CLEAR THE
- * ╙╘┴ ┬╒╞╞┼╥ ;┼╧╥ BUFFER
- * ╠─┴ #>┼╧╥┬╒╞
- * ╙╘┴ ┬╒╞╞┼╥+1
-
- ╠─┴ #0 ;╥ESET ┘MIN AND ┘MAX
- ╙╘┴ ╠╧├┘═┴╪
- ╙╘┴ ╠╧├╪═┴╪
- ╠─┴ #$╞╞
- ╙╘┴ ╠╧├┘═╔╬
- ╙╘┴ ╠╧├╪═╔╬
-
- ╥┼┴─╨╘╙ ╠─┘ ╔╬─┼╪
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨1╪
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨1┘
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨1┌
- ╔╬┘
- ─┼├ ├╧╒╬╘╨╘╙
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2╪
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2┘
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2┌
- ╔╬┘
- ─┼├ ├╧╒╬╘╨╘╙
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨3╪
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨3┘
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨3┌
- ╔╬┘
- ╙╘┘ ╔╬─┼╪
- >>> ╨╥╧╩┼├╘,╨1╪;╨1┘;╨1┌
- >>> ╨╥╧╩┼├╘,╨2╪;╨2┘;╨2┌
- >>> ╨╥╧╩┼├╘,╨3╪;╨3┘;╨3┌
-
- ╠─┴ ╚╔─┼
- ┬┼╤ :─╧╔╘
- ╠─┴ ╨2╪ ;╚IDDEN FACE CHECK
- ╙┼├
- ╙┬├ ╨1╪
- ╘┴┘ ;┘=(X2-X1)
- ╠─┴ ╨3┘
- ╙┼├
- ╙┬├ ╨2┘ ;┴=(Y3-Y2)
- >>> ╙═╒╠╘
- ╙╘┴ ╘┼═╨1
- ╠─┴ ╨3╪
- ╙┼├
- ╙┬├ ╨2╪
- ╘┴┘
- ╠─┴ ╨2┘
- ╙┼├
- ╙┬├ ╨1┘
- >>> ╙═╒╠╘
- ├═╨ ╘┼═╨1 ;╔F X1*Y2-Y1*X2 > 0 THEN FACE
- ┬═╔ :─╧╔╘ ;IS VISIBLE
- ─┼├ ├╧╒╬╘╨╘╙ ;╧THERWISE READ IN REMAINING
- ┬┼╤ :┴┬╧╥╘ ;POINTS AND RETURN
- :╨╧╧╨ ╔╬├ ╔╬─┼╪
- ╔╬├ ╔╬─┼╪
- ╔╬├ ╔╬─┼╪
- ─┼├ ├╧╒╬╘╨╘╙
- ┬╬┼ :╨╧╧╨
- :┴┬╧╥╘ ╥╘╙
-
- :─╧╔╘ ╠─┴ ╨1╪
- ╙╘┴ ╪1
- ╠─┴ ╨1┘
- ╙╘┴ ┘1
- ╠─┴ ╨2╪
- ╙╘┴ ╪2
- ╠─┴ ╨2┘
- ╙╘┴ ┘2
- ╩╙╥ ─╥┴╫
- ╠─┴ ╨2╪
- ╙╘┴ ╪1
- ╠─┴ ╨2┘
- ╙╘┴ ┘1
- ╠─┴ ╨3╪
- ╙╘┴ ╪2
- ╠─┴ ╨3┘
- ╙╘┴ ┘2
- ╩╙╥ ─╥┴╫
-
- ─┼├ ├╧╒╬╘╨╘╙
- ┬╬┼ ╨╧╠┘╠╧╧╨ ;╔S IT JUST A TRIANGLE?
- ╩═╨ ╨╧╠┘─╧╬┼
-
- ╨╧╠┘╠╧╧╨ ╠─┘ ╔╬─┼╪
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2╪
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2┘
- ╔╬┘
- ╠─┴ ╨╧╠┘╠╔╙╘,┘
- ╙╘┴ ╨2┌
- ╔╬┘
- ╙╘┘ ╔╬─┼╪
- >>> ╨╥╧╩┼├╘,╨2╪;╨2┘;╨2┌
-
- ╠─┴ ╨2╪
- ╙╘┴ ╪1
- ╠─┴ ╨2┘
- ╙╘┴ ┘1
- ╠─┴ ╨3╪
- ╙╘┴ ╪2
- ╠─┴ ╨3┘
- ╙╘┴ ┘2
- ╩╙╥ ─╥┴╫
-
- ╠─┴ ╨2╪
- ╙╘┴ ╨3╪
- ╠─┴ ╨2┘
- ╙╘┴ ╨3┘
- ─┼├ ├╧╒╬╘╨╘╙
- ┬┼╤ ╨╧╠┘─╧╬┼
- ╩═╨ ╨╧╠┘╠╧╧╨
- ╨╧╠┘─╧╬┼ ╠─┴ ╨1╪ ;├LOSE THE POLYGON
- ╙╘┴ ╪2
- ╠─┴ ╨1┘
- ╙╘┴ ┘2
- ╠─┴ ╨3╪
- ╙╘┴ ╪1
- ╠─┴ ╨3┘
- ╙╘┴ ┘1
- ╩╙╥ ─╥┴╫
- ╥╘╙
-
- ╘╪╘ '╙AME THING WE DO EVERY NIGHT, ╨INKY: '
- ╘╪╘ 'TRY TO TAKE OVER THE WORLD!'
-
-
- *-------------------------------
- * ╟ENERAL QUESTIONABLE-VALUE ERROR PROCEDURE
-
- *├╚╧╦┼ ╠─╪ #00
- *:╠╧╧╨ ╠─┴ :├╘┼╪╘,╪
- * ┬┼╤ :─╧╬┼
- * ╩╙╥ ├╚╥╧╒╘
- * ╔╬╪
- * ╩═╨ :╠╧╧╨
- *:─╧╬┼ ╥╘╙
- *:├╘┼╪╘ ╚┼╪ 0─ ;├╥
- * ╘╪╘ 'SOMETHING CHOKED :('
- * ╚┼╪ 0─00
- *
- ╘╪╘ '╬ARF!'
-
- *-------------------------------
- * ─RAWIN' A LINE. ┴ FAHN LAHN.
-
- *** ╙OME USEFUL MACROS
-
- ├╔╬╔╘ ═┴├ ;═ACRO TO INITIALIZE THE COUNTER
- ╠─┴ ]1 ;DX OR DY
- ╠╙╥
- <<< ;╘HE DX/2 MAKES A NICER LOOKING LINE
-
- ***** ═ACRO TO TAKE A STEP IN ╪
-
- ╪╙╘┼╨ ═┴├
- ╠─╪ ─╪ ;╬UMBER OF LOOP ITERATIONS
- >>> ├╔╬╔╘,─╪
- ╪╠╧╧╨ ╠╙╥ ├╚╒╬╦
- ┬┼╤ ╞╔╪├ ;╒PDATE COLUMN
- ╙┬├ ─┘
- ┬├├ ╞╔╪┘ ;╘IME TO STEP IN ┘
- ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ─╧╬┼ ╠─┴ ╧╠─╪ ;╨LOT THE LAST CHUNK
- ┼╧╥ ├╚╒╬╦
- ╧╥┴ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╥╘╙
-
- ╞╔╪├ ╨╚┴
- ╠─┴ ╧╠─╪
- ╧╥┴ (┬╒╞╞┼╥),┘ ;╨LOT
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╠─┴ #$╞╞ ;╒PDATE CHUNK
- ╙╘┴ ╧╠─╪
- ╙╘┴ ├╚╒╬╦
- ╠─┴ #$80 ;╔NCREASE THE COLUMN
- ┼╧╥ ┬╒╞╞┼╥
- ╙╘┴ ┬╒╞╞┼╥
- ┬╬┼ ├2
- ╔╬├ ┬╒╞╞┼╥+1
- ├2
- ╨╠┴
- ╙┬├ ─┘
- ┬├╙ ├╧╬╘
- ┴─├ ─╪
- ╔╞ ╔,]1 ;─O WE USE ╔╬┘ OR ─┼┘?
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ├╧╬╘ ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ╩═╨ ─╧╬┼
-
- ╞╔╪┘ ┴─├ ─╪
- ╨╚┴
- ╠─┴ ╧╠─╪
- ┼╧╥ ├╚╒╬╦
- ╧╥┴ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╠─┴ ├╚╒╬╦
- ╙╘┴ ╧╠─╪
- ╨╠┴
- ╔╞ ╔,]1 ;╒PDATE ┘
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ╥╘╙
- <<< ;┼ND OF ═ACRO XSTEP
-
- ***** ╘AKE A STEP IN ┘
-
- ┘╙╘┼╨ ═┴├
- ╠─╪ ─┘ ;╬UMBER OF LOOP ITERATIONS
- ┬┼╤ ─╧╬┼ ;╔F DY=0 IT'S JUST A POINT
- >>> ├╔╬╔╘,─┘
- ╙┼├
- ┘╠╧╧╨ ╨╚┴
- ╠─┴ ╧╠─╪
- ╧╥┴ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╨╠┴
- ╔╞ ╔,]1
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ╙┬├ ─╪
- ┬├├ ╞╔╪╪
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- ─╧╬┼ ╠─┴ ╧╠─╪
- ╧╥┴ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╥╘╙
-
- ╞╔╪╪ ┴─├ ─┘
- ╠╙╥ ╧╠─╪
- ╙┼├ ;╔MPORTANT!
- ┬┼╤ ╞╔╪├
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- ╩═╨ ─╧╬┼
-
- ╞╔╪├ ╨╚┴
- ╠─┴ #$80
- ╙╘┴ ╧╠─╪
- ┼╧╥ ┬╒╞╞┼╥
- ╙╘┴ ┬╒╞╞┼╥
- ┬╬┼ ├2
- ╔╬├ ┬╒╞╞┼╥+1
- ├2 ╨╠┴
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- ╩═╨ ─╧╬┼
- <<< ;┼ND OF ═ACRO YSTEP
-
- * ╘AKE AN X STEP IN THE ┼╧╥ BUFFER
- * ╘HE SOLE CHANGE IS TO USE ┼╧╥ INSTEAD OF ╧╥┴
-
- ┼╧╥╪╙╘┼╨ ═┴├
- ╠─╪ ─╪ ;╬UMBER OF LOOP ITERATIONS
- >>> ├╔╬╔╘,─╪
- ╪╠╧╧╨ ╠╙╥ ├╚╒╬╦
- ┬┼╤ ╞╔╪├ ;╒PDATE COLUMN
- ╙┬├ ─┘
- ┬├├ ╞╔╪┘ ;╘IME TO STEP IN ┘
- ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ─╧╬┼ ╠─┴ ╧╠─╪ ;╨LOT THE LAST CHUNK
- ┼╧╥ ├╚╒╬╦
- ┼╧╥ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╥╘╙
-
- ╞╔╪├ ╨╚┴
- ╠─┴ ╧╠─╪
- ┼╧╥ (┬╒╞╞┼╥),┘ ;╨LOT
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╠─┴ #$╞╞ ;╒PDATE CHUNK
- ╙╘┴ ╧╠─╪
- ╙╘┴ ├╚╒╬╦
- ╠─┴ #$80 ;╔NCREASE THE COLUMN
- ┼╧╥ ┬╒╞╞┼╥
- ╙╘┴ ┬╒╞╞┼╥
- ┬╬┼ ├2
- ╔╬├ ┬╒╞╞┼╥+1
- ├2
- ╨╠┴
- ╙┬├ ─┘
- ┬├╙ ├╧╬╘
- ┴─├ ─╪
- ╔╞ ╔,]1 ;─O WE USE ╔╬┘ OR ─┼┘?
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ├╧╬╘ ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ╩═╨ ─╧╬┼
-
- ╞╔╪┘ ┴─├ ─╪
- ╨╚┴
- ╠─┴ ╧╠─╪
- ┼╧╥ ├╚╒╬╦
- ┼╧╥ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╠─┴ ├╚╒╬╦
- ╙╘┴ ╧╠─╪
- ╨╠┴
- ╔╞ ╔,]1 ;╒PDATE ┘
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ─┼╪
- ┬╬┼ ╪╠╧╧╨
- ╥╘╙
- <<< ;┼ND OF ═ACRO XSTEP
-
-
- * ╘AKE A Y-STEP IN THE ┼╧╥-BUFFER
- * ├HANGES FROM ABOVE ARE: ONLY PLOT LAST PART OF EACH
- * VERTICAL CHUNK, DON'T PLOT LAST POINT, PLOT WITH ┼╧╥
-
- ┼╧╥┘╙╘┼╨ ═┴├
- ╠─╪ ─┘ ;╬UMBER OF LOOP ITERATIONS
- ┬┼╤ ─╧╬┼ ;╔F DY=0 IT'S JUST A POINT
- >>> ├╔╬╔╘,─┘
- ╙┼├
- *┘╠╧╧╨ ╨╚┴
- * ╠─┴ ╧╠─╪
- * ╧╥┴ (┬╒╞╞┼╥),┘
- * ╙╘┴ (┬╒╞╞┼╥),┘
- * ╨╠┴
- ┘╠╧╧╨ ╔╞ ╔,]1
- ╔╬┘
- ┼╠╙┼
- ─┼┘
- ╞╔╬
- ╙┬├ ─╪
- ┬├├ ╞╔╪╪
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- *─╧╬┼ ╠─┴ ╧╠─╪
- * ╧╥┴ (┬╒╞╞┼╥),┘
- * ╙╘┴ (┬╒╞╞┼╥),┘
- ─╧╬┼ ╥╘╙
-
- ╞╔╪╪ ┴─├ ─┘
- ╨╚┴ ;╫E ONLY PLOT THE LAST PART OF EACH CHUNK
- ╠─┴ ╧╠─╪
- ┼╧╥ (┬╒╞╞┼╥),┘
- ╙╘┴ (┬╒╞╞┼╥),┘
- ╨╠┴
- ╠╙╥ ╧╠─╪
- ╙┼├ ;╔MPORTANT!
- ┬┼╤ ╞╔╪├
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- ╩═╨ ─╧╬┼
-
- ╞╔╪├ ╨╚┴
- ╠─┴ #$80
- ╙╘┴ ╧╠─╪
- ┼╧╥ ┬╒╞╞┼╥
- ╙╘┴ ┬╒╞╞┼╥
- ┬╬┼ ├2
- ╔╬├ ┬╒╞╞┼╥+1
- ├2 ╨╠┴
- ─┼╪
- ┬╬┼ ┘╠╧╧╨
- ╩═╨ ─╧╬┼
- <<< ;┼ND OF ═ACRO YSTEP
- **** ╔NITIAL LINE SETUP
-
- ** ╘HE COMMENTED LINES BELOW ARE NOW TAKEN CARE OF BY THE
- ** CALLING ROUTINE.
- *─╥┴╫ >>> ═╧╓┼,╘╪1;╪1 ;═OVE STUFF INTO ZERO PAGE
- * >>> ═╧╓┼,╘╪2;╪2 ;╫HERE IT CAN BE MODIFIED
- * >>> ═╧╓┼,╘┘1;┘1
- * >>> ═╧╓┼,╘┘2;┘2
-
- ─╥┴╫ ╠─┴ ╞╔╠╠
- ┬╬┼ :╙┼╘┼╧╥
- >>> ╙┼╘┬╒╞
- ╩═╨ :╙┼╘╒╨
- :╙┼╘┼╧╥ ╠─┴ #<┼╧╥┬╒╞ ;╒SE ┼╧╥ BUFFER INSTEAD OF
- ╙╘┴ ┬╒╞╞┼╥ ;DISPLAY BUFFER FOR DRAWING
- ╠─┴ #>┼╧╥┬╒╞
- ╙╘┴ ┬╒╞╞┼╥+1
-
- :╙┼╘╒╨ ╙┼├ ;═AKE SURE X1<X2
- ╠─┴ ╪2
- ╙┬├ ╪1
- ┬├╙ :├╧╬╘
- ╠─┴ ┘2 ;╔F NOT, SWAP ╨1 AND ╨2
- ╠─┘ ┘1
- ╙╘┴ ┘1
- ╙╘┘ ┘2
- ╠─┴ ╪1
- ╠─┘ ╪2
- ╙╘┘ ╪1
- ╙╘┴ ╪2
-
- ╙┼├
- ╙┬├ ╪1 ;╬OW ┴=DX
- :├╧╬╘ ╙╘┴ ─╪
- ╠─╪ ╪1 ;╨UT X1 INTO ╪, NOW WE CAN TRASH ╪1
-
- ├╧╠╒═╬ ╘╪┴ ;╞IND THE FIRST COLUMN FOR ╪
- ╠╙╥
- ╠╙╥ ;╘HERE ARE X1/8 128 BYTE BLOCKS
- ╠╙╥ ;╫HICH MEANS X1/16 256 BYTE BLOCKS
- ╠╙╥
- ┬├├ :┼╓┼╬ ;╫ITH A POSSIBLE EXTRA 128 BYTE BLOCK
- ╠─┘ #$80 ;IF SO, SET THE HIGH BIT
- ╙╘┘ ┬╒╞╞┼╥
- ├╠├
- :┼╓┼╬ ┴─├ ┬╒╞╞┼╥+1 ;┴DD IN THE NUMBER OF 256 BYTE BLOCKS
- ╙╘┴ ┬╒╞╞┼╥+1
-
- ╙┼├
- ╠─┴ ┘2 ;├ALCULATE DY
- ╙┬├ ┘1
- ┬├╙ :├╧╬╘2 ;╔S Y2>Y1?
- ┼╧╥ #$╞╞ ;╧THERWISE DY=Y1-Y2
- ┴─├ #$01
- :├╧╬╘2 ╙╘┴ ─┘
- ├═╨ ─╪ ;╫HO'S BIGGER: DY OR DX?
- ┬├├ ╙╘┼╨╔╬╪ ;╔F DX, THEN...
- ╩═╨ ╙╘┼╨╔╬┘
-
- ╙╘┼╨╔╬╪ ╠─┘ ┘1
- ├╨┘ ┘2
- ╠─┴ ┬╔╘╨,╪ ;╪ CURRENTLY CONTAINS X1
- ╙╘┴ ╧╠─╪
- ╙╘┴ ├╚╒╬╦
- ┬├├ ╪╔╬├┘ ;─O WE STEP FORWARDS OR BACKWARDS IN ┘?
- ╩═╨ ╪─┼├┘
-
- ╪╔╬├┘ ╠─┴ ╞╔╠╠
- ┬┼╤ ╬╧╥═╪╔╬├
- >>> ┼╧╥╪╙╘┼╨,╔╬┘
- ╬╧╥═╪╔╬├ >>> ╪╙╘┼╨,╔╬┘
-
- ╪─┼├┘ ╠─┴ ╞╔╠╠
- ┬┼╤ ╬╧╥═╪─┼├
- >>> ┼╧╥╪╙╘┼╨,─┼┘
- ╬╧╥═╪─┼├ >>> ╪╙╘┼╨,─┼┘
-
- ╙╘┼╨╔╬┘ ╠─┘ ┘1
- ╠─┴ ┬╔╘╨,╪ ;╪=X1
- ╙╘┴ ╧╠─╪
- ╠╙╥ ;┘ DOESN'T USE CHUNKS
- ┼╧╥ ╧╠─╪ ;╙O WE JUST WANT THE BIT
- ╙╘┴ ╧╠─╪
- ├╨┘ ┘2
- ┬├╙ ┘─┼├┘
-
- ┘╔╬├┘ ╠─┴ ╞╔╠╠
- ┬┼╤ ╬╧╥═╔╬├
- >>> ┼╧╥┘╙╘┼╨,╔╬┘
- ╬╧╥═╔╬├ >>> ┘╙╘┼╨,╔╬┘
-
- ┘─┼├┘ ╠─┴ ╞╔╠╠
- ┬┼╤ ╬╧╥═─┼├
- >>> ┼╧╥┘╙╘┼╨,─┼┘
- ╬╧╥═─┼├ >>> ┘╙╘┼╨,─┼┘
-
-
- *-------------------------------
- * ├LEAN UP
-
- ├╠┼┴╬╒╨ ╠─┴ ╓═├╙┬ ;╙WITCH CHAR ROM BACK IN
- ┴╬─ #%11110101 ;DEFAULT
- ╙╘┴ ╓═├╙┬
-
- ╥╘╙ ;BYE!
-
- ╘╪╘ 'SPINAL CRACKER '
- ╘╪╘ 'SLJ 6/95'
-
- *-------------------------------
- * ╙ET UP BIT TABLE
-
- ─╙ ^ ;├LEAR TO END OF PAGE
- ;╙O THAT TABLES START ON A PAGE BOUNDARY
- ┬╔╘╨ ╠╒╨ 16 ;128 ┼NTRIES FOR ╪
- ─╞┬ %11111111
- ─╞┬ %01111111
- ─╞┬ %00111111
- ─╞┬ %00011111
- ─╞┬ %00001111
- ─╞┬ %00000111
- ─╞┬ %00000011
- ─╞┬ %00000001
- --^
-
- ╙╔╬ ;╘ABLE OF SINES, 120 BYTES
- ├╧╙ ┼╤╒ ╙╔╬+128 ;╘ABLE OF COSINES
- ;┬OTH OF THESE TRIG TABLES ARE
- ;CURRENTLY SET UP FROM ┬┴╙╔├
- ┌─╔╓ ┼╤╒ ├╧╙+128 ;─IVISION TABLE
- ╘═┴╘╚1 ┼╤╒ ┌─╔╓+384 ;═ATH TABLE OF F(X)=X*X/256
- ╘═┴╘╚2 ┼╤╒ ╘═┴╘╚1+512 ;╙ECOND MATH TABLE
- ╨╧╠┘╠╔╙╘ ┼╤╒ ╘═┴╘╚2+512 ;╠IST OF POLYGONS
-
- ========================================================================
- ╙ECOND ╙╔─ ├HIP ╔NSTALLATION
- ├OPYRIGHT 1988 ═ARK ┴. ─ICKENSON
-
- ╘HIS INFORMATION AND SOFTWARE IS ├╧╨┘╥╔╟╚╘┼─ AND MADE AVAILABLE ON A
- ╙╚┴╥┼╫┴╥┼ BASIS. ╘HIS FILE CAN BE FREELY COPIED AND DISTRIBUTED AS LONG
- AS IT IS NOT ╙╧╠─. ╘HIS INFORMATION CANNOT BE USED TO CONSTRUCT AND SELL A
- HARDWARE DEVICE WITHOUT RECEIVING PRIOR PERMISSION FROM THE AUTHOR. ╘HERE IS
- NOT A SET FEE FOR THE USE OF THIS INFORMATION. ╩UST SEND IN WHATEVER YOU FEEL
- THE INFORMATION IS WORTH.
-
- ╔F YOU HAVE ANY GRIPES, COMPLAINTS, SUGGESTIONS, ├╧═╨╠╔═┼╬╘╙ OR ─╧╬┴╘╔╧╬╙ OF
- ANY SORT PLEASE SEND THEM TO:
-
- ═ARK ─ICKENSON
- 600 ╙OUTH ╫EST ╙TREET
- ╬EVADA, ═ISSOURI 64772
-
- ┴DDING AN EXTRA ╙╔─ 6581/6582 CHIP
-
- ╘HIS IS NOT A PROJECT TO BE TACKLED BY THE SQEAMISH OR PEOPLE WHO ARE DEATHLY
- AFRAID OF OPENING THEIR COMPUTER JUST TO TAKE A PEEK INSIDE.
-
- ╬OW LET'S GET RID OF THE NASTY STUFF FIRST. ╬O LIABILITY IS ASSUMED WITH
- RESPECT TO THE USE OF THE FOLLOWING INFORMATION. ╔N OTHER WORDS IF YOU
- SCREW-UP TRYING TO INSTALL THIS MODIFICATION, THEN IT'S YOUR RESPONSABILITY.
-
- ┘╧╒ ─╧ ╘╚╔╙ ┴╘ ┘╧╒╥ ╧╫╬ ╥╔╙╦!!!!
-
- ╔F YOU DO NOT FEEL UP TO IT ╨╠┼┴╙┼ TAKE IT TO A ├OMMODORE REPAIR CENTER
- OR A REPAIR SERVICE THAT CAN WORK ON COMPUTERS AND LET THEM DO THE
- INSTALLATION. ╔ WILL WARN YOU THAT MOST ├OMMODORE ╥EPAIR ├ENTERS WILL NOT OR
- DO NOT LIKE TO DO THIS MODIFICATION. ╫HEN THEY DO, IT CAN BE EXPENSIVE. ╔F
- YOU BELONG TO A ╒SERS ╟ROUP, TELL THEM ABOUT THE PROJECT AND ASK IF THERE IS
- ANYONE THERE THAT COULD PERFORM THE OPERATION. ╘HIS MODIFICATION WILL ╬╧╘
- HURT THE COMPUTER IN ANY WAY, UNLESS IT IS INSTALLED ╫╥╧╬╟.
-
- ┘OU CAN MAKE YOUR OWN PIGGY BACK BOARD OR YOU CAN DO WHAT ╔ AM GOING TO
- DESCRIBE (SINCE IT IS A LITTLE HARD TO PUT A SCHEMATIC IN A TEXT FILE).
-
- ┘OU SHOULD GROUND YOURSELF WITH A STATIC GUARD WRISTBAND (SUCH AS WHAT
- ╥ADIO ╙HACK SELLS). ┼VEN THOUGH THE CHIP IS QUITE DURABLE, JUST THE RIGHT
- STATIC DISCHARGE CAN RUIN ALL OR PART OF THE ╙╔─ CHIP.
-
- ╞OR THOSE OF YOU THAT ARE NOT FAMILIER WITH THE WAY PINS ARE NUMBERED ON AN
- ╔├ CHIP HERE IS A SHORT EXPLANATION. ╧N ONE END OF THE ╔├ YOU SHOULD FIND A
- LITTLE NOTCH, LOOKING AT THE CHIP WITH THE NOTCH AT THE TOP THE NUMBERING GOES
- THIS WAY. ╘HE UPPER LEFT CORNER OF THE CHIP IS PIN 1 AND THEY ARE NUMBERED
- CONSECUTIVELY, COUNTER-CLOCKWISE AROUND THE CHIP. ╙OME CHIPS DO NOT HAVE A
- NOTCH IN ONE END, BUT INSTEAD DOT IS PLACED IN ONE OF THE CHIP CORNERS TO
- DESIGNATE THAT PIN 1 STARTS IN THAT LOCATION.
-
- NOTCH
- ----,,----
- 1-!. !-8
- 2-! DOT !-7
- 3-! !-6
- 4-! !-5
- ----------
-
-
- ╔ HAVE INCLUDED THE INFORMATION THAT IS NEEDED TO INSTALL THIS MODIFICATION
- ON THE ├OMMODORE 64, 64├ AND 128. ╔ HAVEN'T BEEN ABLE TO LOOK INSIDE THE
- 128─, SO ╔ CANNOT PROVIDE THE INFORMATION WITH ANY ACCURACY.
-
- ╘HERE ARE ╘╫╧ DIFFERENT 64├ CIRCUIT BOARDS AND BOTH USE ─╔╞╞┼╥┼╬╘ ╙╔─
- CHIPS. ┘OU CAN TELL THE DIFFERENCE BY OPENING THE 64├. ╔F YOU SEE A 64-PIN
- CHIP ON THE BOARD AND THE BOARD IS ONLY 5.5-6 INCHES WIDE THEN YOU HAVE THE
- NARROW BOARD 64├ AND MUST USE THE 9 VOLT 6582 ╙╔─ CHIP. ╘HE NUMBER OF THE
- CHIP IN THE 64├ NARROW IS AN 8520 AND IS THE SAME AS THE 6582.
-
- ----------------------------------
-
- ╨ARTS ├OMMODORE 64, 64├ (WIDE) & 128
-
- 1 - 6581 ╙╔─ CHIP FROM ╩AMCO OR ╦ASSARA ═ICROSYSTEMS
- 1 - 2╬2222 TRANSISTOR ╥ADIO ╙HACK 276-1617
- 2 - 220PF CAPACITORS ╥ADIO ╙HACK 272-124
-
- -----------------------------------
-
- ╨ARTS ├OMMODORE 64├ ╬ARROW ┬OARD
-
- 1 - 6582 ╙╔─ ├HIP ╞ROM ╩AMCO OR ╦ASSARA ═ICROSYSTEMS
- 1 - 2222┴ TRANSISTOR ╥ADIO ╙HACK 276-2009
- 2 - .022UF CAPACITORS ╥ADIO ╙HACK 272-1066
- 2 - 1K OHM 1/4 WATT RESISTORS ╥ADIO ╙HACK 271-1321
-
- -----------------------------------
-
- ╨ARTS 64, 64├ (ALL) & 128
-
- 2 - 1K OHM 1/4 WATT RESISTORS ╥ADIO ╙HACK 271-1321
- 1 - 1000 PF CAPACITOR ╥ADIO ╙HACK 272-126 LISTED AS .001 MF THIS IS
- THE SAME AS 1000PF
- 1 - 10K OHM 1/4 WATT RESISTOR ╥ADIO ╙HACK 271-1335
- 1 - 10 UF ELECTROLITIC CAPACITOR ╥ADIO ╙HACK 272-1025
- 1 - 5 INCH LENGTH OF WIRE
- 1 - 5 INCH LENGTH OF SHIELDED CABLE
- 1 - SURFACE MOUNT FEMALE ╥├┴ PLUG (THIS IS WHAT YOU NORMALLY FIND ON THE BACK
- OF YOUR STEREO.
-
-
- ╧N THE ├-64 AND 64├ (WIDE) THE ╙╔─ IS ╔├ ╒18 (THE ╔├ NUMBER WILL BE MARKED IN
- WHITE ON THE CIRCUIT BOARD). ╔T IS USUALLY LOCATED IN THE MIDDLE OF THE
- CIRCUIT BOARD, NEXT TO THE METAL VIDEO CHIP CASE OR UP BETWEEN AND JUST
- BELOW THE SERIAL AND MONITOR JACKS.
-
- ╧N THE ├-64├ (NARROW BOARD) THE ╙╔─ CHIP IS ╔├ ╒9. ╔T IS LOCATED IN THE
- MIDDLE OF THE BOARD, JUST A LITTLE TO THE RIGHT OF CENTER) AND CALLED 520.
-
- ╧N THE ├-128 THE ╙╔─ IS ╔├ ╒5. ╔T IS LOCATED AT THE BACK OF THE CIRCUIT
- BOARD JUST TO THE RIGHT OF THE METAL HOUSING FOR THE 40 AND 80 COLUMN VIDEO
- CHIPS.
-
- ╞IRST BEND OUT PINS 23, 24 AND 26 AND CUT THEM OFF OF THE 6581/6582 ╙╔─
- CHIP. ╘HESE ARE FOR THE TWO ANALOG AND ONE AUDIO INPUT LINES. ╘HEY WILL
- CAUSE PROBLEMS IF CONNECTED AND SINCE THEY WILL NOT BE USED IT IS BEST TO
- REMOVE THEM.
-
- ╬OW BEND OUT PINS 1, 2, 3, 4, 8, AND 27.
-
- ╙OLDER ONE OF THE 220PF CAPACITORS (64├ NARROW USES .022 UF) TO PINS 1
- AND 2 THEN SOLDER THE OTHER 220PF (64├ NARROW - .022UF) CAPACITOR TO PINS 3
- AND 4. ╘HE CAPACITORS CONTROL THE UPPER AND LOWER FREQUENCY RANGE AND
- FILTERS OF THE ╙╔─ CHIP.
-
- ╘HE REASON ╔ AM USING 220PF CAPACITORS IS BECAUSE OF PROBLEMS WITH THE
- FILTERS IN THE ╙╔─ CHIP. ╘HE ├-64 FIRST CAME OUT WITH 2200PF CAPACITORS, BUT
- THEY WERE CHANGED TO 470PF. ╘HE REASON FOR THIS WAS BECAUSE THE FILTERS OF
- THE ╙╔─ VARY FROM CHIP TO CHIP AND USING 2200PF CAUSED A LOT OF THEM TO SOUND
- MUFFELED WHEN THE FILTERS WERE ON. ╔ HAVE FOUND THAT BY LOWERING THE
- CAPACITOR VALUE TO 220 PF HELPS EVEN MORE. ╔F YOU WISH, YOU CAN USE 470S IF
- YOU FEEL IT WOULD BE BETTER, BUT ─╧ ╬╧╘ USE 2200PF.
-
- ╘HE 6582 ╙╔─ CHIP FOR THE 64├ NARROW MUST USE THE .022UF CAPACITORS, AS THE
- FILTER RANGE IS MUCH DIFFERENT.
-
- ╙OLDER ONE END OF YOUR WIRE TO PIN 8 OF THE ╙╔─ CHIP. ╘HIS IS FOR THE CHIP
- SELECT LINE. ╫E WILL CONNECT THIS TO THE CARTRIDGE PORT. ╘HIS TELLS THE
- COMPUTER WHERE IN MEMORY THE CHIP RESIDES (DESCRIBED LATER).
-
- ╬OW SOLDER THE REMAINING PINS (EXCLUDING THE ONES WE HAVE BENT OUT
- AND/OR REMOVED 1, 2, 3, 4, 8, 23, 24, 26 AND 27) TO THE SID CHIP CURRENTLY IN
- YOUR COMPUTER. ┘OU MAY HAVE TO BEND THOSE PINS INWARD JUST A LITTLE FOR THEM
- TO GET A GOOD GRIP ON THE ╙╔─ CHIP. ┬E VERY CAREFUL NOT LEAVE THE SOLDERING
- IRON ON THE CHIP ╘╧╧ LONG AS YOU COULD RUIN ┬╧╘╚ ╙╔─ CHIPS. ╔ WOULD PUT SOME
- HEAT SINK (SILICON GREASE) BETWEEN THE TWO CHIPS BEFORE SOLDERING THEM
- TOGETHER. ╘HIS WILL PROVIDE BETTER HEAT DISPERSAL ON THE BOTTOM CHIP.
-
- ╬OW THAT YOU HAVE THE CHIPS SOLDERED TOGETHER (PLACE THE ╙╔─ CHIPS BACK IN
- THE SOCKET IF YOU REMOVED THEM), SOLDER THE WIRE FROM PIN 8 (ON THE ╙╔─ CHIP)
- TO PIN 7 OF THE CARTRIDGE PORT ON THE BACK OF THE COMPUTER. ╙ET THE COMPUTER
- INFRONT OF YOU LIKE TO ARE GETTING READY TO TYPE, WITH THE BACK OF THE
- COMPUTER AWAY FROM YOU. ╠OOK AT THE CARTRIDGE PORT (LOCATED IN THE UPPER
- RIGHT CORNER OF THE CIRCUIT BOARD). ┘OU WILL SEE TWO ROWS OF PINS CONNECTING
- THE CARTRIDGE PORT TO THE CIRCUIT BOARD. ┘OU WANT THE ROW OF PINS CLOSEST TO
- THE FRONT OF THE COMPUTER. ╬OW, COUNT THE PINS STARTING AT THE ╠┼╞╘ SIDE AND
- COUNTING TO THE RIGHT. ┘OU WANT TO SOLDER THE WIRE FROM PIN 8 OF THE EXTRA
- ╙╔─ CHIP TO PIN NUMBER 7 OF THE CARTRIDGE PORT. ╘HIS IS THE SAME PLACE ON ALL
- OF THE MODELS ├-64, 64├ AND 128.
-
- ╘HIS WILL TELL THE COMPUTER THAT THE EXTRA ╙╔─ CHIP IS AT ADDRESS $─┼00 HEX
- OR 56832 DECIMAL. ┘OU WILL ACCESS IT JUST LIKE YOU WOULD THE REGULAR SID
- CHIP BUT STARTING AT THIS ADDRESS.
-
- ╔ AM NO LONGER DESCRIBING HOW TO CONNECT FOR ADDRESS $─╞00. ╘HIS
- ADDRESS CAUSES PROBLEMS WITH THE ╥┴═ ┼XPANSION ╒NITS AND NUMEROUS OTHER
- CARTRIDGES. ╞ROM NOW ON ADDRESS $─┼00 IS THE ╧╬╠┘ ADDRESS FOR THE ╙╔─ CHIP.
-
- ╬OW PARTIALLY REASSEMBLE YOUR COMPUTER (BE CAREFUL THAT NOTHING SHORTS OUT
- THE PINS STILL STICKING OUT). ╘URN THE COMPUTER ON AND LOAD THE PLAYER
- PROGRAM PROVIDED AND TELL IT TO LOAD IN '╘┼╙╘'. ╔F YOU GET SOUND THEN SO FAR
- SO GOOD. ╘URN OFF THE COMPUTER AND DISASSEMBLE THE CASE.
-
- ─RILL A HOLE IN THE BACK END OF THE COMPUTER JUST LARGE ENOUGH TO ANCHOR
- THE ╥├┴ PLUG. ╘HEN SOLDER THE CENTER WIRE OF THE SHIELDED CABLE TO THE
- CENTER POST OF THE ╥├┴ PLUG. ╔NSERT THE WIRE THROUGH THE HOLE YOU HAVE
- JUST DRILLED AND ANCHOR THE PLUG TO THE CASE. ╬OW SOLDER THE GROUND WIRE TO
- THE GROUND TAB ON THE ╥├┴ PLUG.
-
- ╚ERE COMES THE DIFFICULT PART TO EXPLAIN. ╘HIS IS THE COUPLING CIRCUIT
- FOR THE AUDIO OUTPUT. ╚ERE IS A ROUGH SCHEMATIC.
-
-
- ╨IN 27 ON 12VOLTS DC,
- 9VOLTS 64├ (NARROW)
- ╙╔─ CHIP RESISTOR
- !--. 10K OHM !COLLECTOR
- 27!----.--/!/!/--.-----╧ 2N2222 OR 2222┴
- --' ! ! !EMITTER
- ! ! !
- <RESISTOR ! !
- >1K ! ! +
-
- ===========================================================================
- ╙╧╠╓╔╬╟ ╠┴╥╟┼ ╙┘╙╘┼═╙ ╧╞ ╠╔╬┼┴╥ ┼╤╒┴╘╔╧╬╙ ╧╬ ┴ ├64 ╫╔╘╚╧╒╘ ═┼═╧╥┘
- BY ┴LAN ╩ONES (ALAN.JONES@QCS.ORG)
-
- ╧╦, NOW THAT ╔ HAVE YOUR ATTENTION, ╔ LIED. ┘OU CAN'T SOLVE DENSE
- LINEAR SYSTEMS OF EQUATIONS BY DIRECT METHODS WITHOUT USING MEMORY TO
- STORE THE PROBLEM DATA. ╚OWEVER, ╔'LL COME BACK TO THIS MEMORY FREE
- ASSERTION LATER. ╘HE MAIN PURPOSE OF THIS ARTICLE IS TO RESCUE A
- USEFULL NUMERICAL ALGORITHM, "╤UARTERSOLVE", AND ALSO TO PROVIDE A BRIEF
- LOOK AT THE ├╧═┴╠ PROGRAMMING LANGUAGE AND ┬╠┴╙ ROUTINES.
-
- ╠INEAR SYSTEMS OF EQUATIONS, ┴(,)*X()=B(), WHERE ┴ IS A SQUARE MATRIX
- AND X AND B ARE VECTORS (OR ARRAYS), MUST OFTEN BE SOLVED FOR X IN THE
- SOLUTION OF A VARIETY OF PROBLEMS. ╘HE SIZE OR DIMENSION OF THE PROBLEM
- IS N AND JUST STORING ┴ REQUIRES 5*N*N BYTES OF MEMORY, ASSUMING ├64/128
- 5 BYTE REAL VARIABLES. ╘HE PREFERED SOLUTION METHOD IS A FORM OF
- ╟AUSSIAN ┼LIMINATION WHICH REQUIRES 1/3 N*N*N MULTIPLICATIONS. ╔'LL
- IGNORE THE ADDITIONAL N*N AND N MULTIPLIES. ╞OR LARGE PROBLEMS OUR ├64
- HAS TWO SERIOUS LIMITATIONS, SMALL MEMORY SIZE AND SLOW FLOATING POINT
- ARITHMETIC. ╨ROBLEMS WITH N=10 CAN BE COMPUTED EASILY. ╨ROBLEMS WITH
- N=100 WILL REQUIRE 100 TIMES MORE MEMORY AND 1000 TIMES MORE COMPUTING
- TIME. ╘HE COMPUTING TIME IS NOT A REAL PROBLEM. ╔ DON'T MIND LETTING
- MY COMPUTER RUN WHILE ╔ WATCH A MOVIE, SLEEP, OR GO ON A TRIP.
- ├ALCULATING OR SETTING UP THE PROBLEM MAY TAKE MUCH LONGER THAN ITS
- SOLUTION ANYWAY. ┴VAILABLE MEMORY IS THE PRACTICAL LIMITING FACTOR.
- ┴FTER WE USE UP AVAILABLE ╥┴═ WE HAVE TO RESORT TO OTHER ALGORITHMS THAT
- WILL USE THE DISK DRIVE TO MOVE DATA IN AND OUT OF THE COMPUTER. ╘HE
- 1541 DRIVE IS PARTICULARLY SLOW AND ╔ WOULD NOT WANT TO SUBJECT IT TO
- UNDUE WEAR AND TEAR.
-
- ╚OW BIG A PROBLEM DO WE NEED TO BE ABLE TO SOLVE? ╔N MANY CASES THE
- PROBLEM ITSELF WILL FIX N AND THERE IS NO WAY TO REDUCE IT. ╔N OTHER
- CASES YOU MIGHT BE MODELING A REAL CONTINUOUS PROBLEM WITH A DISCRETE
- NUMBER OF ELEMENTS. ╬ SHOULD BE INFINITY BUT FOR PROBLEM SOLUTION N=50
- MIGHT BE BIG ENOUGH. ├ONSIDER CALCULATING THE AERODYNAMIC POTENTIAL
- FLOWFIELD AROUND A BODY OF REVOLUTION. ┘OU COULD FIX POINTS ON THE
- SURFACE OF THE BODY (A MERIDIAN) AND HAVE A SERIES OF SORT LINE SEGMENTS
- MAKE UP ELEMENTS TO APPROXIMATE THE SHAPE. ╘HE LAGER N IS THE CLOSER
- THE SMOOTH SHAPE IS APROXIMATED AND THE MORE ACCURATE THE COMPUTED
- SOLUTION BECOMES. N=100 MIGHT BE A GOOD CHOICE FOR A SIMPLE SHAPE. ╫E
- COULD ALSO USE A "HIGHER ORDER" MENTHOD. ╔N THIS CASE WE CAN SUBSTITUTE
- A CURVED LINE ELEMENT FOR THE STRAIGHT LINE SEGMENT. ├ALCULATING THE
- MATRIX ELEMENTS WILL BE MORE DIFFICULT BUT N=40 CURVED ELEMENTS MIGHT
- GIVE A MORE ACCURATE SOLUTION THAN 100 FLAT ELEMENTS. ┴NOTHER
- CONSIDERATION IS THE RESOLUTION OF THE SOLUTION. ┘OU MIGHT WANT TO PLOT
- THE SOLUTION ON THE 200 X 320 PIXEL HI-RES ├64 SCREEN. 40 POINTS MIGHT
- BE TOO COARSE AND 320 MIGHT BE OVERKILL. ╫E MIGHT ALSO NEED TO
- CALCULATE THE SLOPE OR DERIVATIVES FROM THE CALCULATED SOLUTION WHICH
- WILL REQUIRE MORE CLOSELY SPACED SOLUTION POINTS. ╘HERE ARE OFTEN
- CHOICES THAT YOU CAN MAKE IN MODELING A SYSTEM AND SELECTING A SOLUTION
- ALGORITHM SO THAT A PROBLEM CAN BE SOLVED WITHIN THE LIMITS OF A ├64.
- ╘HERE ARE OFTEN INTERESTING TRADEOFFS IN MEMORY REQUIREMENTS AND
- EXECUTION SPEED.
-
- ╚OW BIG A PROBLEM CAN WE SOLVE WITH A ├64? ╒SING ╤UARTERSOLVE WITH
- ASSEMBLY LANGUAGE WE CAN PROBABLY DO N=200 OR MORE. ╔F WE ARE GOING TO
- STORE THE PROBLEM DATA ON A SINGLE 1541 DISKETTE AND READ IT IN A ROW AT
- TIME WE CAN ONLY DO N=182 OR SO. ┴CTUALLY ╔ THINK N SHOULD BE WELL
- UNDER 100. ─IFFERENT OPERATING SYSTEMS AND LANGUAGES LIMIT THE AMOUNT
- OF USEABLE ╥┴═; ┬┴╙╔├ 40╦, ├╧═┴╠ 2.0 30╦, ╟┼╧╙ 23╦, THE INITIAL DISK
- LOADED ├╧═┴╠ 0.14 10╦... ╙OLVING A LINEAR SYSTEM MAY ONLY BE A SMALL
- SUBPROBLEM INSIDE A LARGE APPLICATION PROGRAM. ╘HE IDEA IS TO BE ABLE
- TO SOLVE REASONABLE SIZED PROBLEMS USING YOUR PREFERED COMPUTING
- ENVIRONMENT WITHOUT HAVING TO DO A LOT OF CHAINING OR LOADING OF
- SEPARATE PROGRAMS. ╤UARTERSOLVE CAN FREE UP A LOT OF MEMORY FOR OTHER
- ROUTINES OR ALLOW N TO BE DOUBLED.
-
- ╙╨┼┼─
-
- ╘HERE ARE A FEW THINGS THAT WE CAN DO TO SPEED UP THE CALCULATIONS.
- ╞IRST WE CAN SELECT A FAST PROGRAMMING LANGUAGE. ╔ PREFERE ├╧═┴╠ 2.0
- WHICH IS A FAST THREE PASS INTERPRETER. ╒SING AN ASSEMBLER COULD BE THE
- FASTEST AND PROVIDE THE MOST USEABLE MEMORY. ┴ TRUE COMPILER SUCH AS ├
- OR ╨ASCAL COULD ALSO BE A GOOD CHOICE. ┬┴╙╔├ IS A POOR CHOICE EXCEPT
- THAT IT IS BUILT IN AND FREE. ╔N MOST CASES EXECUTION CAN BE SPED UP
- WITH SOME MACHINE LANGUAGE ROUTINES LIKE THE ┬╠┴╙ (┬ASIC ╠INEAR ┴LGEBRA
- ╙UBROUTINES). ├ALCULATION SPEED IS MEASURED IN ╞╠╧╨╙/SEC (╞LOATING
- ╨OINT ╧╨ERATION╙) WHERE, C(I#,J#):=C(I#,J#) + A(I#,K#)*B(K#,J#) IS THE
- OPERATION. ╔T IS ONE ╞╨ MULTIPLY, ONE ╞╨ ADD, AND SOME INDEXING
- OVERHEAD. ╫ITH SOME INTERPRETERS THE INDEXING AND INTERPRETING OVERHEAD
- CAN FAR EXCEED THE ACTUAL ╞╨ MULTIPLY TIME. ╫ITH ASSEMBLED CODE THE ╞╨
- MULTIPLY TIME SHOULD DOMINATE. ╔ USE A ═╠ LEVEL 1 ┬╠┴╙ PACKAGE WITH
- ├╧═┴╠ 2.0. ╞OR EXAMPLE:
-
- C(I#,╩#):+SDOT(N#,A(I#,1),1,B(1,J#),SDB#)
- ╞╧╥ K#:=1 TO N# DO C(I#,J#):+A(I#,K#)*B(K#,J#)
-
- BOTH CALCULATE THE SAME THING, A DOT PRODUCT WITH N# ╞╠╧╨╙. ╞OR LARGE
- N# ON A ├64 THE ┬╠┴╙ APPROACH ABOUT 320 ╞╠╧╨╙/SEC., ╘HE OVERHEAD OF
- CALLING THE PROCEDURE FROM THE INTERPRETER IS ABOUT THE EQUIVALENT OF 4
- ╞╠╧╨╙. ╧F COURSE MODERN COMPUTER PERFORMANCE IS MEASURED IN
- ═EGA╞╠╧╨╙/SEC. WITH 8 BYTE REALS (SUPER COMPUTERS RUN HUNDREDS OR
- THOUSANDS OF ═╞╠╧╨╙/SEC.). ╘HEY ALSO INFLATE THE PERFORMANCE BY
- COUNTING THE MULTIPLY AND ADD AS TWO ╞╠╧╨╙. ╔N HIS ARTICLE ╔ USE THE
- "OLD FLOPS" OR NUMBER OF MULTIPLIES.
-
- ╔T MAY ALSO BE POSSIBLE TO CODE 6502 ╞╨ ARITHMETIC ROUTINES USING LOOKUP
- TABLES THAT MAY PERFORM FASTER THAN THE BUILT IN ROUTINES. ╫E COULD
- ALSO USE THE ├╨╒ IN THE DISK DRIVES TO DO DISTRIBUTED PROCESSING. ┬UT
- THIS IS BEYOND THE SCOPE OF THIS ARTICLE.
-
- ╙╧╠╒╘╔╧╬ ═┼╘╚╧─╙
-
- ├ONSIDER THE FOLLOWING CHOICES FOR NUMERICAL SOLUTION ALGORITHMS:
-
- ═┼╘╚╧─ ═┼═╧╥┘ ╞╠╧╨╙
- ╟AUSSIAN ┼LIMINATION N*N 1/3 N*N*N
- ├HOLESKY ─ECOMPOSITION 1/2 N*N 1/6 N*N*N
- ╤╥ DECOMPOSITION N*N 2/3 N*N*N
- ╤╥ UPDATING 1/2 N*N 2 N*N*N
- ╟AUSS-╩ORDAN N*N 1/2 N*N*N
- ╤UARTERSOLVE 1/4 N*N 1/2 N*N*N
-
-
- ╟AUSSIAN ┼LIMINATION IS THE PREFERED METHOD WHEN ENOUGH MEMORY IS
- AVAILABLE. ╔N MODERN TERMINOLOGY THIS IS ╠╒ DECOMPOSITION WHERE ┴ IS
- DECOMPOSED OR FACTORED INTO A LOWER TRIANGULAR MATRIX AND AN UPPER
- TRIANGULAR MATRIX. ╨ARTIAL PIVOTING OF ROWS OR COLUMNS IS AN ADDITIONAL
- COMPLICATION OFTEN REQUIRED FOR A STABLE SOLUTION. ┴FTER THE ╠╒
- DECOMPOSTION YOU CAN READILY SOLVE FOR ANY NUMBER OF RIGHT HAND SIDE
- VECTORS IN N*N FLOPS EACH. ╔N ADDITION YOU CAN CALCULATE MATRIX
- CONDITION NUMBER ESTIMATES AND USE ITERATIVE IMPROVEMENT TECHNIQUES.
- ╘HE ╠╒ DECOMPOSITION IS DONE IN PLACE OVERWRITING THE PROBLEM MATRIX ┴.
-
- ├HOLESKY ─ECOMPOSITION IS A SPECIALIZED VERSION OF ╟AUSSIAN ┼LIMINATION
- FOR SYMETRIC POSITIVE DEFINITE MATRICES ONLY. ╙INCE ┴ IS SYMETRIC WE
- ONLY NEED N*(N+1)/2 MEMORY STORAGE LOCATIONS. ╘HE ╠ AND ╒ TRIANGULAR
- MATRICES ARE SIMPLY TRANSPOSES OF THE OTHER SO ONLY ONE NEEDS TO BE
- STORED AND IS COMPUTED IN PLACE OVERWRITING THE ORIGINAL STORAGE USED
- FOR ┴. ╬O PIVOTING IS REQUIRED. ╘HIS ALGORITHM CANNOT SOLVE GENERAL
- NONSYMETRIC PROBLEMS AND IS INCLUDED ONLY FOR COMPARISON.
-
- ╤╥ DECOMPOSITION FACTORS ┴ INTO AN ORTHOGONAL MATRIX ╤ AND A TRIANGULAR
- MATRIX ╥. ╤╥ DECOMPOSITION IS VERY STABLE AND CAN BE PERFORMED WITHOUT
- PIVOTING. ╙INCE ╤ IS ORTHOGONAL ITS INVERSE IS JUST ╤ TRANSPOSE. ╘O
- SOLVE THE LINEAR SYSTEM WE MULTIPLY THE RIGHT HAND SIDE VECTOR BY ╤
- TRANSPOSE THEN SOLVE THE TRIANGULAR SYSTEM ╥. ╤ IS COMPUTED IN A
- SPECIAL COMPACT FORM AND STORED IN THE SPACE BELOW ╥. ╘HE DECOMPOSITION
- IS DONE IN PLACE IN THE STORAGE USED FOR ┴, PLUS AN ADDITIONAL N STORAGE
- LOCATIONS. ╤╥ DECOMPOSITION REQUIRES ABOUT TWICE AS MANY FLOPS AS
- ╟AUSSIAN ┼LIMINATION.
-
- ╘HERE IS A VARIATION OF THE ╤╥ SOLUTION KNOWN AS ╤╥ UPDATING. ╘HE
- PROBLEM IS SOLVED A ROW AT A TIME. ┴ ╥OW OF ┴ CAN BE READ IN FROM DISK
- STORAGE OR CALCULATED AS NEEDED. ╧NLY ╥ NEEDS TO BE STORED IN MAIN
- MEMORY, N*(N+1)/2 MEMORY LOCATIONS. ╥ IS INITIALY THE IDENTITY MATRIX
- AND IS UPDATED AS EACH ROW OF ┴ AND ITS RIGHT HAND SIDE ELEMENT ARE
- PROCESSED. ╤ IS NOT STORED, BUT THE RIGHT HAND SIDE VECTOR IS
- SEQUENTIALY MULTIPLIED BY ╤ TRANSPOSE. ┴FTER ALL N ROWS HAVE BEEN
- PROCESSED THE SOLUTION IS FOUND BY SIMPLY SOLVING THE TRIANGULAR SYSTEM
- ╥. ╙INCE THIS METHOD ONLY NEEDS HALF AS MUCH MEMORY STORAGE AS ╠╒
- DECOMPOSITION, WE CAN SOLVE PROBLEMS 40% LARGER IN A LIMITED MEMORY
- SPACE. ╚OWEVER, THE COST IN FLOPS IS HIGH. ┴CTUALLY ╤╥ UPDATING IS
- BEST USED FOR SOLVING LARGE OVERDETERMINED LEAST SQUARES PROBLEMS.
-
- ╟AUSS-╩ORDAN IS A VARIATION OF ╟AUSSIAN ┼LIMINATION THAT REDUCES ┴ TO
- THE ╔DENTITY MATRIX INSTEAD OF TO ╠╒ FACTORS. ┬Y APPLYING THE SAME
- TRANSFORMATIONS TO TO THE RIGHT HAND SIDE THAT REDUCE ┴ TO THE IDENTITY
- MATRIX, THE RIGHT HAND SIDE BECOMES THE SOLUTION AT COMPLETION.
- ╨IVOTING IS REQUIERED. ╟AUSS-╩ORDAN REQUIRES ABOUT 50% MORE FLOPS THAN
- ╟AUSSIAN ┼LIMINATION AND MOST CODES USE N*N MEMORY STORAGE. ╙INCE THE
- ╠╒ FACTORS ARE NOT COMPUTED WE CAN'T SOLVE ADDITIONAL RIGHT HAND SIDE
- VECTORS LATER, OR ESTIMATE THE MATRIX CONDITION NUMBER, OR USE ITERATIVE
- IMPROVEMENT TECHNIQUES. ╔T WILL SOLVE MULTIPLE RIGHT HAND SIDES THAT
- ARE AVAILABLE FROM THE START.
-
- ╤UARTERSOLVE IS A CLEVER IMPLEMENTATION OF ╟AUSS-╩ORDAN(?) THAT SOLVES
- THE PROBLEM A ROW AT A TIME LIKE ╤╥ UPDATING BUT ONLY REQUIRES 1/4 N*N
- MEMORY STORAGE. ╫ITH FIXED AVAILABLE MEMORY ╤UARTERSOLVE CAN SOLVE A
- PROBLEM TWICE AS LARGE AS ╟AUSSIAN ┼LIMINATION BUT WITH A MODEST
- PERFORMANCE PENALTY. ╙OLVING A 2N PROBLEM WITH ╤UARTERSOLVE WOULD TAKE
- 12 TIMES LONGER (INSTEAD OF 8) THAN ╟AUSSIAN ┼LIMINATION ON A SIZE N
- PROBLEM.
-
- ═Y RECOMMENDATION IS TO USE ╟AUSSIAN ELIMINATION FOR SOLVING DENSE
- GENERAL SYSTEMS OF LINEAR EQUATIONS WHEN ENOUGH MAIN MEMORY IS AVAILABLE
- AND SWITCH TO ╤UARTERSOLVE FOR LARGER PROBLEMS. ╞OR SOLVING HUGE
- PROBLEMS REQUIERING EXTERNAL STORAGE A BLOCKED VERSION OF ╤╥
- DECOMPOSITION MIGHT WORK BEST. ├HOLESKY DECOMPOSITION SHOULD BE USED
- FOR SYMETRIC POSITIVE DEFINITE PROBLEMS. ╠ARGE PROBLEMS ARE OFTEN
- SPARSE, CONTAINING LOTS OF ZEROS THAT NEED NOT BE STORED. ╙PECIALIZED
- CODE EXISTS FOR SOLVING MANY SPARCE PROBLEMS, PARTICULARLY BANDED
- MATRICES, AND MANY OF THESE METHODS CAN BE USED ON A ├64. ├ODES FOR
- SOLVING UNSTRUCTURED SPARCE PROBLEMS ARE NOT VERY SUITABLE FOR THE ├64
- SINCE THEY ARE COMPLEX AND REDUCE THE AMOUNT OF MEMORY AVAILABLE FOR
- SOLVING THE PROBLEM. ╚OWEVER, LARGE SPARCE PROBLEMS CAN ALSO BE SOLVED
- ON THE ├64 BY ITERATIVE METHODS SUCH AS ╟AUSS-╙IEDEL AND ├ONJUGATE
- ╟RADIENT ALGORITHMS.
-
- ╤╒┴╥╘┼╥╙╧╠╓┼
-
- ╤UARTERSOLVE IS A USEFUL METHOD FOR SOLVING GENERAL DENSE SYSTEMS OF
- LINEAR EQUATIONS THAT ╔ DISCOVERED ALMOST BY ACCIDENT WHILE DOING RANDOM
- RESEARCH IN THE LIBRARY. ╔ HAVE NOT SEEN ANY RECENT TEXTS OR PAPERS
- MENTIONING THIS ALGORITHM. ╔ HAVE NOT SEEN ANY REFERENCE TO IT IN THE
- ├64 LITERATURE EITHER. ┴T LEAST ONE OLDER TEXT MENTIONED IT IN PASSING
- SAYING THAT THE CODE WAS TOO LONG OR COMPLEX. ╘HIS IS A VALID POINT
- SINCE USUALY THE CODE SIZE DIRECTLY SUBTRACTS FROM THE PROBLEM STORAGE.
- ╘HE CODE IS LONGER THAN THE ╟AUSSIAN ┼LIMINATION CODE BUT IN MY
- IMPLEMENTATION IT ONLY TAKES ABOUT 2╦ OF MAIN MEMORY STORAGE AND IT IS A
- REAL ADVANTAGE ON THE ├64. ╫ITH A ├64 WE CAN ALSO PUT THE ENTIRE CODE
- IN AN ┼╨╥╧═ ON A CARTRIDGE SO THE CODE SIZE IS OF LITTLE CONCERN.
-
- ╔ FOUND ╤UARTERSOLVE IN ╥EF. 1 (╥. ┴. ┌AMBERDINO, 1974), WHICH CREDITED
- THE ALGORITHM TO ╥EF. 2 (┴. ╧RDEN, 1960). ╔ AM A LITTLE UNEASY
- DESCRIBING THE ALGORITHM SINCE ╔ HAVE NOT SEEN ╥EF. 2 OR ANALYZED THE
- ALGORITHM. ╔ HAVE CODED THE ALGORITHM, TESTED IT, AND USED IT TO SOLVE
- SOME LARGE PROBLEMS ON A ├64, UP TO N=90. ┌AMBARDINO MAKES TWO
- INTERESTING STATEMENTS IN ╥EF 1. "╘HE NUMBER OF ARITHMETIC OPERATIONS
- IS THE SAME AS FOR THE ╟AUSSIAN ┼LIMINATION METHOD." ╔ AM REASONABLY
- SURE FROM THE DESCRIPTION THAT HE MEANT ╟AUSS-╩ORDAN WHICH REQUIRES
- ABOUT 50% MORE ARITHMETIC THAN ╟AUSSIAN ┼LIMINATION. ┴FTER PROCESSING
- THE ITH ROW ONLY I(N-I) STORAGE LOCATIONS ARE REQUIRED TO STORE THE
- REDUCED MATRIX. ═AX[I(N-I)] = N*N/4. ╘HIS MAXIMUM MEMORY REQUIREMENT
- OCCURS AT I = N/2. ┴S I INCREASES FURTHER MEMORY REQUIRED IS REDUCED.
- ┴LTHOUGH N*N/4 MEMORY LOCATIONS MUST BE ALLOCATED AND DIMENSIONED IN AN
- ARRAY AT THE START, ╤UARTERSOLVE ALWAYS USES THE FIRST PORTION OF THE
- ARRAY CONTINUOUSLY AND DOES NOT FREE UP MEMORY IN HOLES SCATTERED
- THROUGHOUT THE ARRAY. ╘HE ├ LANGUAGE COULD POSSIBLY USE "HEAP STORAGE"
- AND RELEASE THE MEMORY FOR ANY OTHER USE AS THE PROCEDURE ADVANCES.
-
- ╬OW BACK TO MY INITIAL MEMORY FREE CLAIM. ╘HE LARGE PROBLEM THAT ╔
- ACTUALLY WANTED TO SOLVE WAS: ┴*X=B, ┬*X=R, FOR R GIVEN B AND THE SQUARE
- MATRICES ┴ AND ┬. ┼LEMENTS OF ┴ AND ┬ ARE MOST EFFICIENTLY CALCULATED
- AT THE SAME TIME. ╔ COULD WRITE ┬ TO THE DRIVE AND READ IT BACK IN
- AFTER X IS COMPUTED TO CALCULATE R, BUT ╔ ACTUALLY WANTED TO SOLVE THIS
- REPEATEDLY INSIDE ANOTHER LOOP AND ╔ DID NOT WANT TO READ AND WRITE TO A
- LOUSY 1541 THAT MUCH. ╒SING ╟AUSSIAN ELIMINATION WOULD REQUIRE 2N*N
- STORAGE. ╒SING ╤UARTERSOLVE COULD REQUIRE 1.25N*N STORAGE. ╚OWEVER,
- ONLY N*N STORAGE IS NEEDED, THAT FOR ┬. ┴T THE ITH STEP THE ITH ROW OF
- ┴ AND ┬ ARE CALCULATED. ╘HE ROW OF ┴ IS PROCESSED INTO THE THE N*N
- DIMENSIONED ARRAY ┬ FILLING IT FROM THE FRONT. ╘HE CORRESPONDING ROW OF
- ┬ IS STORED IN THE SAME ARRAY ┬ FILLING FROM FROM THE END OF ARRAY ┬.
- ┴S THE PROCESS CONTINUES ╤UARTERSOLVE "DISSUSES" ARRAY ┬ SO THAT ROWS OF
- ┬ NEVER OVERWRITE STORAGE NEEDED BY ╤UARTERSOLVE. ┴T THE END WE HAVE
- COMPUTED X AND ALL OF ┬ IS STORED IN THE ARRAY ┬. ╙IMPLE
- MULTIPLICATION PRODUCES R. ╙O ╔ CAN SAY WITH PRIDE, AT THE EXPENSE OF
- HONESTY, THAT ╔ HAVE SOLVED ┴*X=B WITHOUT ANY ADDITIONAL MEMORY STORAGE
- FOR ┴.
-
- ╨╥╧├ SLV(N#,NR#,I#,╥┼╞ A(),╥┼╞ C(),╥┼╞ B(,),SDB#,╥┼╞ SW#(),╥┼╞ FAIL#) ├╠╧╙┼─
- // ╘HIS ROUTINE SOLVES A SYSTEM OF EQUATIONS USING THE QUARTERSOLVE
- // ALGORITHM WITH PARTIAL PIVOTING.
- // ╔T IS CALLED A "LINE AT A TIME" AND USES ONLY
- // 0.25*NN MEMORY LOCATIONS WHICH ENABLES LARGER PROBLEMS TO BE SOLVED.
- // ╘HE ╠╒ FACTORIZATION IS NOT AVAILABLE, NOR A CONDITION ESTIMATE.
- // N# IS THE DIMENSION OF THE PROBLEM
- // NR# IS THE NUMBER OF RIGHT HAND VECTORS TO BE SOLVED FOR.
- // B(,) IS THE RIGHT HAND SIDE COLUMNS
- // SDB# IS THE SECOND DIMENSION OF THE ARRAY B(,)
- ╒╙┼ BLAS
- ╒╙┼ STRINGS
- Q#:=I#-1; M#:=N#-Q#; MM1#:=M#-1; FAIL#:=╘╥╒┼; IP1#:=I#+1
- ╔╞ I#=1 ╘╚┼╬ //INITIALIZE PIVOT ARRAY
- ╞╧╥ J#:=1 ╘╧ N# ─╧ SW#(J#):=J#
- ┼╬─╔╞
- ╞╧╥ J#:=1 ╘╧ Q# ─╧ //ADJUST FOR PREVIOUS PIVOTING
- K#:=SW#(J#)
- ╫╚╔╠┼ K#<J# ─╧ K#:=SW#(K#)
- ╔╞ K#>J# ╘╚┼╬ SWAP'REAL(C(J#),C(K#))
- ┼╬─╞╧╥ J#
- ╞╧╥ J#:=I# ╘╧ N# ─╧ C(J#):-SDOT(Q#,C(1),1,A(J#-Q#),M#)
- P#:=Q#+ISAMAX#(M#,C(I#),1)
- R:=┴┬╙(C(P#))
- ╔╞ R=0 ╘╚┼╬ ╥┼╘╒╥╬
- FAIL#:=╞┴╠╙┼
- ╔╞ P#<>I# ╘╚┼╬
- SWAP'REAL(C(I#),C(P#))
- SWAP'INTEGER(SW#(I#),SW#(P#))
- SSWAP(Q#,A(1),M#,A(P#-Q#),M#)
- ┼╬─╔╞
- R:=1/C(I#)
- ╔╞ MM1#<>0 ╘╚┼╬ SSCAL(MM1#,R,C(IP1#),1)
- ╞╧╥ J#:=1 ╘╧ NR# ─╧ B(I#,J#):=R*(B(I#,J#)-SDOT(Q#,C(1),1,B(1,J#),SDB#))
- ╞╧╥ K#:=1 ╘╧ NR# ─╧ SAXPY(Q#,-B(I#,K#),A(1),M#,B(1,K#),SDB#)
- ╔╞ MM1#>0 ╘╚┼╬
- T#:=1
- ╞╧╥ J#:=1 ╘╧ Q# ─╧
- R:=A(T#); T#:+1
- SCOPY(MM1#,A(T#),1,A(T#-J#),1)
- SAXPY(MM1#,-R,C(IP1#),1,A(T#-J#),1)
- T#:+MM1#
- ┼╬─╞╧╥ J#
- SCOPY(MM1#,C(IP1#),1,A(MM1#*Q#+1),1)
- ┼╠╙┼ //UNSCRAMBLE SOLUTION FROM PIVOTING
- ╞╧╥ J#:=1 ╘╧ NR# ─╧
- ╞╧╥ K#:=1 ╘╧ N# ─╧ C(SW#(K#)):=B(K#,J#)
- SCOPY(N#,C(1),1,B(1,J#),SDB#)
- ┼╬─╞╧╥ J#
- ┼╬─╔╞
- ┼╬─╨╥╧├ SLV
- //
- N#:=8; SDRH#:=1; NRH#:=1; NR#:=1
- // A IS OF DIMENSION N*N/4
- ─╔═ A(16), B(N#), RHS(N#,NRH#), SW#(N#)
- ╞╧╥ I#:=1 ╘╧ N# ─╧
- ╞╧╥ J#:=1 ╘╧ N# ─╧ B(J#):=2297295/(I#+J#-1)
- S:=0
- ╞╧╥ J#:=N# ╘╧ 1 ╙╘┼╨ -1 ─╧ S:+B(J#)
- RHS(I#,1):=S
- SLV(N#,NR#,I#,A(),B(),RHS(,),SDRH#,SW#(),FAIL#)
- ╔╞ FAIL# ╘╚┼╬
- ╨╥╔╬╘ "SINGULARITY DETECTED AT I=";I#
- ╙╘╧╨
- ┼╬─╔╞
- ┼╬─╞╧╥ I#
- ╞╧╥ J#:=1 ╘╧ N# ─╧ ╨╥╔╬╘ RHS(J#,1);
- ┼╬─
-
- ╘HE ╤UARTERSOLVE ALGORITHM IS PRESENTED HERE AS A ├╧═┴╠ 2.0 PROCEDURE
- "SLV". ├╧═┴╠ IS PRETTY MUCH A DEAD LANGUAGE AND ╔ DON'T EXPECT ANYONE
- TO RUN THIS CODE. ╚OWEVER, ├╧═┴╠ IS A STRUCTURED ALGORITHMIC LANGUAGE
- THAT IS EASY TO READ. ┘OU CAN READILY TRANSLATE IT INTO THE PROGRAMMING
- LANGUAGE OF YOUR CHOICE. ╙LV IS CODED AS A ├╠╧╙┼─ PROCEDURE AS A
- PERSONAL MATTER OF STYLE. ┴N OPEN PROCEDURE WOULD EXECUTE FASTER. ╘HE
- ARRAYS ARE PASSED BY ╥┼╞┼╥┼╬├┼ AND DO NOT ALLOCATE ADDITIONAL LOCAL
- STORAGE. ╘HE MAIN PROGRAM IS JUST AN EXAMPLE FOR TESTING. ╔T CALLS SLV
- N TIMES TO SOLVE THE LINEAR SYSTEM. ╘HE TEST PROBLEM SOLVES A SCALED
- ╚ILBERT MATRIX WHICH IS ILL CONDITIONED. ╔N THE ABSENCE OF ROUNDOFF
- ERROR THE SOLUTION SHOULD BE A VECTOR OF ONES. ╔ USUALLY DIMENSION A()
- TO N#*(N#+1)/4. ╙LV IS PRESENTED IN ITS FULL GENERALITY, BUT YOU MAY
- WANT TO MAKE SOME SIMPLIFICATIONS.
-
- ╙LV CAN HANDLE MULTIPLE RIGHT HAND SIDE VECTORS WITH THE TWO DIMENSIONAL
- ARRAY B(,) IN MOST APPLICATIONS YOU WILL ONLY USE A SINGLE VECTOR,
- NR#=1, AND YOU CAN MAKE SOME SIMPLIFICATIONS BY JUST USING A ONE
- DIMENSIONAL ARRAY.
-
- ╨IVOTING ALSO COMPLICATES THE CODE. ╨ROBLEMS WHICH ARE POSITIVE
- DEFINITE, OR DIAGONALLY DOMINANT, OR SOMETIMES JUST WELL CONDITIONED
- CAN BE SAFELY SOLVED WITHOUT PIVOTING. ╙TRIPPING OUT THE PIVOTING CODE
- IS STRAIGHT FORWARD AND WILL SHORTEN THE CODE AND SPEED EXECUTION.
-
- ┴NYTHING FOLLOWING // IS A COMMENT AND CAN BE DELETED FROM YOUR RUNNING
- CODE.
-
- ╔N ├╧═┴╠ 2.0 YOU CAN ALSO "PROTECT" THE CODE WHICH WILL STRIP OUT
- COMMENTS AND OTHER INFORMATION TO MAKE A SHORTER RUNNING VERSION.
-
- ╘HE REMAINING DISCUSSION WILL CONCERN ├╧═┴╠ 2.0 AND THE ┬╠┴╙.
-
- ├╧═┴╠ 2.0
-
- ├╧═┴╠ 2.0 IS AN EXCELLENT PROGRAMMING LANGUAGE FOR THE ├64/128 AND ╔
- CAN'T DESCRIBE ALL OF ITS VIRTUES HERE. ╔T HAS ONE SERIOUS LIMITATION.
- ╔T DOES NOT USE "CONTINUATION" LINES, SO LINE LENGTH IS LIMITED. ╘HIS
- IS MOST RESTRICTIVE IN FUNCTION AND PROCEDURE LINES WHERE IT LIMITS THE
- NUMBER OF PARAMETERS THAT CAN BE PASSED. ╠INE LENGTH IS LIMITED TO 80
- CHARACTERS. ╚OWEVER, IF YOU USE A SEPARATE TEXT EDITOR OR WORD
- PROCESSOR YOU CAN ENTER 120 CHARACTER LINES. ├OMAL WILL ACTUALLY
- EXECUTE TOKENIZED LINES UP TO 256 CHARACTERS SO THE LIMITATION IS REALLY
- IN THE EDITOR RATHER THAN ├╧═┴╠. ╨ROCEDURE AND VARIABLE NAMES CAN BE
- QUITE LONG IN ├OMAL, BUT ARE KEPT SHORT BECAUSE OF THE LINE LENGTH
- LIMITATION. "╤UARTERSOLVE" WAS SHORTENED TO "SLV" FOR THIS REASON.
-
- A:+T IS A SHORTER FASTER VERSION A:=A+T, AND A:-T IS A SHORTER FASTER
- VERSION OF A:=A-T. ╘HIS IS MOST USEFULL WHEN "A" IS AN ARRAY ELEMENT OR
- AN INTEGER.
-
- ├OMAL 2.0 SUPPORTS ═╠ PACKAGES. ┴ PACKAGE IS A COLLECTION OF FUNCTIONS
- OR PROCEDURES THAT CAN BE CALLED AND EXECUTED. ┴ PACKAGED CAN BE ╥╧══┼─
- AND STORED IN ┼╨╥╧═ ON THE ├OMAL 2.0 CARTRIDGE. ┴ PACKAGE CAN ALSO BE
- LOADED FROM DISK AND WILL NORMALLY BE STORED IN A ╥┴═ LOCATION THAT
- ├╧═┴╠ DOES NOT USE FOR NORMAL PROGRAMS. ╠╔╬╦ "FILENAME" WILL LOAD AND
- LINK THE ═╠ PACKAGE TO A ├OMAL PROGRAM. ╔T WILL STAY ATTACHED TO THE
- PROGRAM WHEN THE PROGRAM IS SAVED AND LOADED, UNLESS IT IS MARKED AS
- ╥╧══┼─. ╘HE ENTIRE SLV PROCEDURE COULD BE CODED IN ASSEMBLY LANGUAGE
- AND BE PLACED IN A PACKAGE. ╘HE SLV PROCEDURE USES TWO PACKAGES,
- STRINGS AND BLAS. ╘HE COMMAND ╒╙┼ PACKAGENAME MAKES ALL OF THE
- FUNCTIONS AND PROCEDURES OF THE PACKAGE KNOWN. ┴LTERNATIVELY, YOU COULD
- PLACE THE ╒╙┼ PACKAGENAME COMMAND IN THE MAIN PROGRAM AND PUT ╔═╨╧╥╘
- PROCEDURENAME INSIDE ALL OF THE CLOSED PROCEDURES THAT CALL
- PROCEDURENAME.
-
- ╙LV CALLS THE SWAP'REAL AND SWAP'INTEGER PROOCEDURES FROM THE STRINGS
- PACKAGE. ╘HE STRINGS PACKAGE IS A ╥╧══┼─ PACKAGE ON THE ╙UPER ├HIP ╥╧═.
-
- ╔T DOES EXACTLY WHAT IT SAYS, E.G. SWAP'REAL(A,B) IS THE SAME AS:
- T:=A; A:=B; B:=T.
-
- ╙LV CALLS THE SDOT, ISAMAX#, SSWAP, SSCAL, SAXPY, AND SCOPY ROUTINES
- FROM THE BLAS PACKAGE. ╘HE BLAS PACKAGE IS ╠╔╬╦ED TO THE PROGRAM, BUT
- IT COULD, AND SHOULD, BE PLACED ON ┼╨╥╧═.
-
- ┬ASIC ╠INEAR ┴LGEBRA ╙UBROUTINES, ┬╠┴╙
-
- ╘HE ┬╠┴╙ WERE ORIGINALLY WRITTEN FOR THE ╞ORTRAN LANGUAGE TO SPEED
- EXECUTION AND STREAMLINE CODE USED FOR SOLVING LINEAR ALGEBRA AND OTHER
- MATRIX PROBLEMS. ╘HE ╠╔╬╨┴├╦ ROUTINES, ╥EF. 3, USE THE ┬╠┴╙ AND ARE
- PERHAPS THE BEST KNOWN. ╘HE IDEA IS THAT THE ┬╠┴╙ ROUTINES WILL BE
- HIGHLY OPTIMIZED FOR A PARTICULAR COMPUTER, CODED IN ═╠ OR A ╚IGH ╧RDER
- ╠ANGUAGE. ╙OME OPERATING SYSTEMS EVEN INCLUDE ┬╠┴╙ LIKE ROUTINES.
- ╫RITING FAST EFFICIENT PROGRAMS IS THEN A SIMPLE MATTER OF SELECTING THE
- BEST SOLUTION ALGORITHM AND CODING IT IN A MANNER THAT MAKES BEST USE OF
- THE BLAS ROUTINES. ╘HERE ARE BLAS ROUTINES FOR SINGLE PRECISION, DOUBLE
- PRECISION, AND COMPLEX NUMBERS. ╘HE LEVEL 1 ┬╠┴╙ PERFORM OPERATIONS ON
- ROWS OR COLUMNS OF AN ARRAY AND TYPICALY DO N SCALAR OPERATIONS
- REPLACING THE INNER MOST LOOP OF CODE. ╘HERE ARE ALSO LEVEL 2 ┬╠┴╙ THAT
- PERFORM N*N OPERATIONS AND ╠EVEL 3 ┬╠┴╙ THAT PERFORM N*N*N OPERATIONS.
- ╬ICHOLAS ╚IGHAM HAS CODED MOST OF THE SINGLE PRECISION LEVEL 1 BLAS
- ROUTINES AND PUT THEM IN A ├OMAL 2.0 PACKAGE. ╘HE ├OMAL BLAS PACKAGE IS
- INCLUDED ON THE ╨ACKAGES ╠IBRARY ╓OLUME 2 DISK. ╔ AM NOT AWARE OF ═╠
- BLAS ROUTINES CODED FOR ANY OTHER ├64/128 LANGUAGES ALTHOUGH THIS IS
- CERTAINLY POSSIBLE AND RECOMMENDED.
-
- ╘HE ├OMAL BLAS ROUTINES BEHAVE EXACTLY THE SAME WAY THAT THE ╞ORTRAN
- BLAS ROUTINES DO EXCEPT THAT ╞ORTRAN CAN PASS THE STARTING ADDRESS OF AN
- ARRAY WITH JUST "A", WHILE ├OMAL REQUIRES "A(1)". ╘HE ├OMAL BLAS WILL
- ALLOW YOU PASS AN ARRAY, BY REFERENCE, OF SINGLE OR MULTIPLE DIMENSIONS
- AND START FROM ANY POSITION IN THE ARRAY. ╔F YOU CODE THE BLAS ROUTINES
- AS ORDINARY ├OMAL ROUTINES YOU HAVE TO PASS ADDITIONAL PARAMETERS AND
- HAVE SEPARATE ROUTINES FOR SINGLE DIMENSIONED ARRAYS AND TWO DIMENSIONAL
- ARRAYS. ╬OTE ALSO THAT ╞ORTRAN STORES TWO DIMENSIONAL ARRAYS BY
- COLUMNS, AND ├OMAL (LIKE MANY OTHER LANGUAGES) STORES TWO DIMENSIONAL
- ARRAYS BY ROWS. ╔F YOU TRANSLATE CODE BETWEEN ╞ORTRAN AND ├OMAL USING
- BLAS ROUTINES YOU WILL HAVE TO CHANGE THE INCREMENT VARIABLES.
-
- ╞ORTRAN ├OMAL
- DIMENSION C(N), A(ILDA,ISDA) ─╔═ C(N#), A(LDA#,SDA#)
- SCOPY(N,C,1,A(I,1),ILDA) SCOPY(N#,C(1),1,A(I#,1),1)
- SCOPY(N,C,1,A(1,J),1) SCOPY(N#,C(1),1,A(1,J#),SDA#)
-
- ╘HE FIRST SCOPY COPIES ARRAY C INTO THE ITH ROW OF ARRAY A. ╘HE SECOND
- SCOPY COPIES ARRAY C INTO THE JTH COLUMN OF ARRAY A.
-
- ╘HIS IS WHAT SCOPY DOES IN ╞ORTRAN:
-
- SUBROUTINE SCOPY(N,SX,INCX,SY,INCY)
- REAL SX(1),SY(1)
- IX=1
- IY=1
- DO 10 I = 1,N
- SY(IY) = SX(IX)
- IX = IX + INCX
- IY = IY + INCY
- 10 CONTINUE
- RETURN
- END
-
- ╘HE ├OMAL ┬╠┴╙ DOES EXACTLY THE SAME THING. ╔F CODED ENTIRELY IN ├╧═┴╠
- RATHER THAN AS A PACKAGE IT WOULD HAVE TO BE DIFFERENT. ╘HE CALL WOULD
- CHANGE.
-
- SCOPY(N#,C(1),1,A(1,J#),SDA#) WOULD HAVE TO BECOME,
- SCOPY(N#,C(),1,1,A(,),1,J#,SDA#,SDA#) AND THE ├OMAL PROCEDURE MIGHT BE:
-
- ╨╥╧├ SCOPY(N#, ╥┼╞ X(), IX#, INCX#, ╥┼╞ Y(,), IY#, JY#, SDY#, INCY#) ├╠╧╙┼─
- IYINC#:=INCY# ─╔╓ SDY# //ASSUMING Y IS DIMENSIONED Y(?,SDY#)
- JYINC#:=INCY# ═╧─ SDY#
- ╞╧╥ I#=1 ╘╧ N# ─╧
- Y(IY#,JY#):=X(IX#)
- IX#:+INCX#; IY#:+IYINC#; JY#:+JYINC#
- ┼╬─╞╧╥
- ┼╬─╨╥╧├ SCOPY
-
- ╬OTE THAT MORE INFORMATION HAS TO BE PASSED TO THE PROCEDURE AND USED
- THAT THE ═╠ BLAS PICKS UP AUTOMATICALLY. ┴LSO WE WOULD NEED SEPARATE
- PROCEDURES TO HANDLE EVERY COMBINATION OF SINGLE AND MULTI DIMENSIONAL
- ARRAYS. ╘HE ├OMAL ═╠ BLAS ARE INDEED WONDERFUL. ╞OR SPEED
- CONSIDERATIONS THIS SHOULD ALSO BE LEFT AS AN OPEN PROCEDURE OR BETTER
- YET JUST USE IN LINE CODE.
-
- ╚ERE IS A VERY SIMPLIFIED DESCRIPTION OF WHAT EACH OF THE ROUTINES IN
- THE ├OMAL ┬╠┴╙ PACKAGE DOES.
-
- SUM:=SASUM(N#,X(1),1) ╥ETURNS SUM OF ABSOLUTE VALUES IN X().
- SUM:=0
- ╞╧╥ I#:=1 ╘╧ N# ─╧ SUM:+┴┬╙(X(I#))
-
- SAXPY(N#,SA,X(1),1,Y(1),1) ┴DD A MULTIPLE OF X() TO Y().
- ╞╧╥ I#:=1 ╘╧ N# ─╧ Y(I#):+SA*X(I#)
-
- PROD:=SDOT(N#,X(1),1,Y(1),1) ╥ETURNS DOT PRODUCT OF X() AND Y().
- PROD:=0
- ╞╧╥ I#:=1 ╘╧ N# ─╧ PROD:+X(I#)*Y(I#)
-
- SSWAP(N#,X(1),1,Y(1),1) ╙WAPS X() AND Y().
- ╞╧╥ I#:=1 ╘╧ N# ─╧ T:=X(I#); X(I#):=Y(I#); Y(I#):=T
-
- SCOPY(N#,X(1),1,Y(1),1) ├OPY X() TO Y().
- ╞OR I#:=1 ╘╧ N# ─╧ Y(I#):=X(I#)
-
- MAX#:=ISAMAX#(N,X(1),1) ╥ETURNS INDEX OF THE ELEMENT OF X() WITH THE
- LARGEST ABSOLUTE VALUE.
- T:=0; MAX#:=1
- ╞╧╥ I#:=1 ╘╧ N#
- ╔╞ ┴┬╙(X(I#))>T ╘╚┼╬ T:=┴┬╙(X(I#)); MAX#:=I#
- ┼╬─╞╧╥ I#
-
- SSCAL(N#,SA,X(1),1) ╙CALE X() BY A CONSTANT SA.
- ╞╧╥ I#:=1 ╘╧ N# ─╧ X(I#):=SA*X(I#)
-
- SNRM2(N#,X(1),1) ╥ETURNS THE 2 NORM OF X().
- NORM2:=0
- ╞╧╥ I#:=1 ╘╧ N# ─╧ NORM2:+X(I#)*X(I#)
- NORM2:=╙╤╥(NORM2)
-
- SROT(N#,X(1),1,Y(1),1,C,S) ┴PPLY ╟IVENS ROTATION.
- ╞╧╥ I#:=1 ╘╧ N# ─╧
- T:=C*X(I#) + S*Y(I#)
- Y(I#):=S*X(I#) + C*Y(I#)
- X(I#):=T
- ┼╬─╞╧╥ I#
-
-
- ┬EAR IN MIND THAT EACH OF THESE SIMPLE EXAMPLES CAN BE MORE COMPLEX AS
- WAS GIVEN FOR SCOPY. ┘OU NOW HAVE ENOUGH INFORMATION TO WRITE YOUR OWN
- ┬╠┴╙ ROUTINES IN ═╠ OR THE PROGRAMMING LANGUAGE OF YOUR CHOICE, OR TO
- EXPAND THE ┬╠┴╙ ROUTINE CALLS IN SLV TO ORDINARY IN LINE CODE.
-
- ┘OU CAN ALSO APPLY THE ┬╠┴╙ ROUTINES IN CREATIVE WAYS BESIDES JUST
- OPERATING ON ROWS OR COLUMNS. ╞OR EXAMPLE YOU COULD CREATE THE IDENTITY
- MATRIX WITH:
-
- ─╔═ A(N#,N#)
- A(1,1):=1; A(1,2):=0
- SCOPY(N#*N#-2,A(1,2),0,A(1,3),1) // ZERO THE REST OF THE MATRIX
- SCOPY(N#-1,A(1,1),0,A(2,2),N#+1) // COPY ONES TO THE DIAGONAL.
-
- ╥EFERENCES
-
- 1. ┌AMBARDINO, ╥. ┴., "╙OLUTIONS OF ╙YSTEMS OF ╠INEAR ┼QUATIONS WITH
- ╨ARTIAL ╨IVOTING AND ╥EDUCED ╙TORAGE ╥EQUIREMENTS", ╘HE ├OMPUTER ╩OURNAL
- ╓OL. 17, ╬O. 4, 1974, PP. 377-378.
-
- 2. ╧RDEN ┴., "═ATRIX ╔NVERSION AND ╥ELATED ╘OPICS BY ─IRECT ═ETHODS",
- IN ═ATHEMATICAL ═ETHODS FOR ─IGITAL ├OMPUTERS, ╓OL. 1, ┼DITED BY ┴.
- ╥ALSTON AND ╚. ╫ILF, ╩OHN ╫ILEY AND ╙ONS ╔NC., 1960.
-
- 3. ─ONGARRA, ╩. ╩., ═OELER, ├. ┬., ┬UNCH, ╩. ╥., ╙TEWART, ╟. ╫.,
- ╠INPACK ╒SERS' ╟UIDE, ╙╔┴═ ╨RESS, ╨HILADELPHIA, 1979.
-
-