home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / CHACKING10A.ARC / ISSUE10-A
Encoding:
Text File  |  2019-04-13  |  206.5 KB  |  5,683 lines

  1.  
  2.                    ########
  3.              ##################
  4.          ######            ######
  5.       #####
  6.     #####  ####  ####      ##      #####   ####  ####  ####  ####  ####   #####
  7.   #####    ##    ##      ####    ##   ##   ##  ###     ##    ####  ##   ##   ##
  8.  #####    ########     ##  ##   ##        #####       ##    ## ## ##   ##
  9. #####    ##    ##    ########  ##   ##   ##  ###     ##    ##  ####   ##   ##
  10. #####  ####  ####  ####  ####  #####   ####  ####  ####  ####  ####   ######
  11. #####                                                                     ##
  12.  ######            ######            ╔SSUE #10
  13.    ##################              ╩UNE 30, 1995
  14.        ########
  15.  
  16. ---------------------------------------------------------------------(V1.5)---
  17. ┼DITOR'S ╬OTES
  18. BY ├RAIG ╘AYLOR
  19.  
  20. ╘HIS IS MY LAST ISSUE OF ├OMMODORE ╚ACKING (HAVING FINALLY GOTTEN OUT THE
  21. DOOR, BUT ╔ COULDN'T BREAK TRADITION AND GET IT OUT ON TIME :-) ). ╔'M HAVING
  22. TO GIVE IT UP BECAUSE ╔'VE GRADUALLY LOST INTEREST IN ├OMMODORE COMPUTERS OVER
  23. THE YEARS AND WITH THE SEARCH FOR A JOB (ANYONE WANNA HIRE A CSC GRADUATE?)
  24. AND AS ╔ GET OLDER ╔ SEEM TO HAVE LESS AND LESS TIME.
  25.  
  26. ╔'M GONNA BE HANDING THE REIGNS OF ├OMMODORE ╚ACKING OVER TO ╩IM ┬RAIN, WHO IS
  27. A VERY ACTIVE MEMBER OF THE ├OMMODORE ╔NTERNET COMMUNITY. ╚E WILL ALSO BE
  28. RUNNING A MAILSERVER THAT WILL TAKE THE PLACE OF MINE (═INE WILL BECOME
  29. UNAVAILABLE AFTER ╩ULY 1ST AND WILL SEND POINTERS TO ╩IM ┬RAIN'S MAILSERVER).
  30.  
  31. ╔T'S BEEN INTERESTING TO WATCH THE ├OMMODORE COMPUTERS EVOLVE, TAKE OFF LIKE A
  32. ROCKET AND THEN HAVE ├OMMODORE GO INTO LIQUIDATION. ├OMMODORE COMPUTERS HAVE
  33. BEEN AND STILL ARE, (WITH SOME EXCEPTIONS - 1541 HEAD-BANGING COMES TO MIND),
  34. TECHNOLOGICALLY SOUND.  ╞OR A "HACKING" MACHINE THEY'RE WONDERFUL.
  35.  
  36. ═Y EMAIL ADDRESS HAS CHANGED TO DUCK@NANDO.NET. ╔ PERIODICALLY STILL CHECK
  37. MAIL AT DUCK@PEMBVAX1.PEMBROKE.EDU BUT ONLY EVERY 2 WEEKS OR SO. ╔ AM STILL
  38. GOING TO TRY TO BE IN THE ├OMMODORE COMMUNITY BUT TIME WILL GOVERN MY ABILITY
  39. TO DO THAT. ╔'M GOING TO MISS EDITING THIS RAG....
  40.  
  41. ┴ND HERE IS ╩IM ┬RAIN:
  42.  
  43. ═AIL ╙ERVER ├HANGES:
  44.  
  45. ╫ITH ╔SSUE 10, THE ADDRESS FOR THE ├OMMODORE ╚ACKING MAIL SERVER HAS CHANGED.
  46. ╘HE NEW ADDRESS IS BRAIN@MAIL.MSEN.COM  ╘HE COMMANDS ARE THE SAME AS BEFORE.
  47. ╬OT ALL OF THE FILES HAVE BEEN MOVED YET, SO PLEASE EMAIL THE ADMINISTRATOR
  48. (╩IM ┬RAIN, BRAIN@MAIL.MSEN.COM) IF A FILE YOU NEED IS NOT ON THE NEW SITE.
  49.  
  50. ╚OWDY:
  51. ╚OWDY, MY NAME IS ╩IM ┬RAIN, AND ╔ WILL BE TAKING OVER THE POSITION OF
  52. EDITOR FOR ├OMMODORE ╚ACKING STARTING WITH ╔SSUE 11.  ╙OME OF YOU MAY KNOW
  53. ME AS THE ├OMMODORE ╘RIVIA ├ONTEST ADMINISTRATOR, THE ╒╙┼╬┼╘ NEWSGROUP
  54. COMP.SYS.CBM ╞┴╤ ═ANITAINER, OR THE KEEPER OF A ├OMMODORE ╔NFORMATION
  55. ╫╫╫ ╙ITE AT HTTP://WWW.MSEN.COM/▐BRAIN/CBMHOME.HTML.  ╫HEREVER YOU HAVE
  56. HEARD OF ME FROM, OR EVEN IF YOU HAVEN'T, ╔ WILL STATE THAT ╔ PLAN ON
  57. HANDLING ├OMMODORE ╚ACKING IN THE FOLLOWING WAY.  ╘HE NEXT ISSUE WILL
  58. POSSIBLY LOOK DIFFERENT COSMETICALLY, AS ╔ EDIT SOMEWHAT DIFFERENTLY THAN
  59. ├RAIG, BUT THE CONTENT AND BASIC LAYOUT WILL REMAIN THE SAME.  ╘HE TYPES
  60. OF MATERIAL WILL NOT CHANGE, AND THE STRUCTURE FOR SUBMITTING ARTICLES WILL
  61. CHANGE ONLY IN THE ADDRESS TO MAIL THEM TO: BRAIN@MAIL.MSEN.COM.  ╚OWEVER,
  62. ╔ DO HAVE A FEW CHANGES IN MIND:
  63.  
  64. 1) ╘RY TO STABILIZE THE ISSUE GENERATION SO THAT ├OMMODORE ╚ACKING WILL
  65.    BECOME A QUARTERLY PUBLICATION.
  66.  
  67. 2) ┴TTEMPT A FULLY "╚╘═╠"IZED VERSION OF THE MAGAZINE, WHILE STILL PROVIDING A
  68.    TEXT VERSION.
  69.  
  70. 3) ╨URSUE THE POSSIBILITY OF PROVIDING A PRINTED VERSION OF THESE ISSUES
  71.    FOR THOSE WHO HAVE NO ONLINE ACCESS TO THEM.
  72.  
  73. 4) ┼NCOURAGE ╒SER ╟ROUPS AND OTHER ├┬═ RELATED ORGANIZATIONS TO CARRY THIS
  74.    MAGAZINE FOR THEIR MEMBERS.
  75.  
  76. ╙O, AGAIN ╔ SAY HOWDY.  ┴S ALWAYS, ├OMMODORE ╚ACKING WILL ACCEPT YOUR
  77. ARTICLES AT ANY TIME, SO PLEASE HELP US KEEP THIS QUALITY MAGAZINE RUNNING.
  78. ╔F YOU HAVE ANY QUESTIONS OR COMMENTS ABOUT THE CHANGE IN EDITORSHIP, THE
  79. POSSIBLE CHANGES, OR OTHER MATTERS, PLEASE FEEL FREE TO DROP ME A NOTE.
  80. ╔ LOOK FORWARD TO HEARING FROM YOU AND PUBLISHING YOUR ARTICLES.
  81.  
  82. ╩IM ┬RAIN
  83. BRAIN@MAIL.MSEN.COM
  84. ===========================================================================
  85. ╠EGAL ═UMBO-╩UMBO
  86.  
  87. ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN WHOLE,
  88. FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL AUTHORS FOR
  89. PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPARATELY. ┴ CHARGE OF NO
  90. GREATER THAN 5 ╒╙ DOLLARS OR EQUIVLENT MAY BE CHARGED FOR LIBRARY SERVICE /
  91. DISKETTTE COSTS FOR THIS "NET-MAGAZINE".
  92.  
  93. -------------------------------------------------------------------------------
  94.  
  95. ╨LEASE NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS ╞╘╨
  96. FROM CCNGA.UWATERLOO.CA (AMONG OTHERS) UNDER /PUB/CBM/HACKING.MAG AND VIA A
  97. MAILSERVER WHICH DOCUMENTATION CAN BE OBTAINED BY SENDING MAIL TO
  98. "BRAIN@MAIL.MSEN.COM" WITH A SUBJECT LINE OF "MAILSERVER" AND THE
  99. LINES OF "HELP" AND "CATALOG" IN THE BODY OF THE MESSAGE.
  100.  
  101. -------------------------------------------------------------------------------
  102. ╔N ╘HIS ╔SSUE:
  103.  
  104. ├OMMODORE ╘RIVIA
  105.  
  106. ╘RIVIA ┼DITION #13-18 ARE IN THIS ARTICLE.  ┴S YOU MAY KNOW, THESE QUESTIONS
  107. FORM PART OF A CONTEST IN WHICH THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY
  108. VARIOUS PRIZE DONATORS). ╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE
  109. ENJOY.  ╘RY YOUR HAND AT ├OMMODORE TRIVIA!!
  110.  
  111. ┬╞╠╔ - ╬EW GRAPHICS MODES 2
  112.  
  113. ╞╠╔ GAVE US MORE COLOR TO THE SCREEN, ┴╞╠╔ INCREASED THE HORIZONTAL
  114. RESOLUTION AND COLOR SELECTION BY USING THE HIRES MODE.  ┬╞╠╔ STANDS
  115. FOR '┬IG ╞╠╔' AND GIVES US 400 LINES INSTEAD OF THE USUAL TWO
  116. HUNDRED.  ┴╞╠╔ AND ┬╞╠╔ CAN BE COMBINED, BUT WE ARE NOT GOING INTO
  117. THAT.
  118.  
  119. ═AKING STABLE RASTER ROUTINES (├64 AND ╓╔├-20)
  120.  
  121. ╔N THIS ARTICLE, ╔ DOCUMENT TWO METHODS OF CREATING STABLE RASTER
  122. ROUTINES ON ├OMMODORE COMPUTERS.  ╘HE PRINCIPLES APPLY FOR MOST 8-BIT
  123. COMPUTERS, NOT ONLY ├OMMODORES, BUT RASTER EFFECTS ARE VERY RARELY
  124. SEEN ON OTHER COMPUTERS.
  125.  
  126. ┴ ─IFFERANT ╨ERSPECTIVE - ╨ART ╔╔╔.
  127.  
  128. ┘ES!!!  ╔T'S YET ANOTHER ARTICLE ON 3─ GRAPHICS!  ┼VEN IF YOU
  129. HAVEN'T BEEN FOLLOWING THIS SERIES, YOU CAN USE THIS PROGRAM.  ╘HIS
  130. TIME AROUND WE WILL WRITE A COMPLETELY GENERAL POLYGON PLOTTER --
  131. IF YOU CAN TYPE BASIC DATA STATEMENTS, YOU CAN CREATE A THREE-DIMENSIONAL
  132. OBJECT OUT OF POLYGONS AND ROTATE AND PROJECT IT TO YOUR HEART'S CONTENT.
  133. ╞OR THE MORE TECHNICALLY INCLINED WE WILL LOOK AT OPTIMIZATIONS TO THE
  134. LINE ROUTINE, ┼╧╥-BUFFER FILLING, AND MORE!  ┘OW!
  135.  
  136. ╙ECOND ╙╔─ ├HIP ╔NSTALLATION
  137.  
  138. ╘HIS ARTICLE DESCRIBES HOW TO ADD A SECOND SID CHIP FOR USE IN ╙ID╨LAYER AND
  139. OTHER PROGRAMS. ┴S ALWAYS, BE EXTRA CAREFUL WHEN MAKING MODIFICATIONS TO YOUR
  140. COMPUTER.
  141.  
  142. ╙OLVING ╠ARGE ╙YSTEMS OF ╠INEAR ┼QUATIONS ON A ├64 ╫ITHOUT ═EMORY
  143.  
  144. ╧╦, NOW THAT ╔ HAVE YOUR ATTENTION, ╔ LIED.  ┘OU CAN'T SOLVE DENSE
  145. LINEAR SYSTEMS OF EQUATIONS BY DIRECT METHODS WITHOUT USING MEMORY TO
  146. STORE THE PROBLEM DATA.  ╚OWEVER, ╔'LL COME BACK TO THIS MEMORY FREE
  147. ASSERTION LATER.  ╘HE MAIN PURPOSE OF THIS ARTICLE IS TO RESCUE A
  148. USEFULL NUMERICAL ALGORITHM, "╤UARTERSOLVE", AND ALSO TO PROVIDE A BRIEF
  149. LOOK AT THE ├╧═┴╠ PROGRAMMING LANGUAGE AND ┬╠┴╙ ROUTINES.
  150.  
  151. ╘HE ╫ORLD OF ╔╥├ - ┴ ╬EW ╠IFE FOR THE ├64/128
  152.  
  153. ╔'VE HEARD PEOPLE TALKING ABOUT ╔╥├. ╫HAT IS IT? ╫HY IS IT USEFUL TO ME AS A
  154. ├OMMODORE USER? ┬ILL "├OOLHAND" ╠UECK EXPLAINS THE HOWS AND WHYS IN THIS
  155. ARTICLE.
  156.  
  157. ╙WIFT╠INK-232 ┴PPLICATION ╬OTES (VERSION 1.0B)
  158.  
  159. ╘HIS INFORMATION IS MADE AVAILABLE FROM A PAPER DOCUMENT PUBLISHED BY ├═─,
  160. WITH ├═─'S PERMISSION.
  161.  
  162. ─ESIGN AND ╔MPLEMENTATION OF A ╙IMPLE/┼FFICIENT ╒PLOAD/─OWNLOAD ╨ROTOCOL
  163.  
  164. ╘HIS ARTICLE DETAILS HOW TO IMPLEMENT A CUSTOM UPLOAD/DOWNLOAD PROTOCOL THAT
  165. IS FASTER THAN MOST OF THE ONES COMMON TO THE ├64/128 COMPUTERS.
  166.  
  167. ─ESIGN AND ╔MPLEMENTATION OF A '╥EAL' ╧PERATING ╙YSTEM FOR THE 128: ╨ART ╔╔
  168.  
  169. ╘HERE HAS BEEN A SLIGHT CHANGE IN PLANS.  ╔ ORIGINALLY INTENDED THIS
  170. ARTICLE TO GIVE THE DESIGN OF A THEORETICAL DISTRIBUTED MULTITASKING
  171. MICROKERNEL OPERATING SYSTEMFOR THE ├128.  ╔ HAVE DECIDED TO GO A
  172. DIFFERENT ROUTE: TO TAKE OUT THE DISTRIBUTED COMPONENT FOR NOW AND IMPLEMENT
  173. A REAL MULTITASKING MICROKERNEL ╧╙ FOR A SINGLE MACHINE AND EXTEND THE SYSTEM
  174. TO BE DISTRIBUTED LATER.  ╘HE IMPLEMENTATION SO FAR IS, OF COURSE, ONLY IN
  175. THE PROTOTYPE STAGE AND THE APPLICATION FOR IT IS ONLY A DEMO.  ╨ART ╔╔╔ OF
  176. THIS SERIES WILL EXTEND THIS DEMO SYSTEM INTO, PERHAPS, A USABLE DISTRIBUTED
  177. OPERATING SYSTEM.
  178. ========================================================================
  179. ╘RIVIA
  180. BY ╩IM ┬RAIN (BRAIN@MAIL.MSEN.COM)
  181.  
  182. ╫ELL, SUMMER IS UPON THE ┬RAIN HOUSEHOLD, AND THINGS ARE MOVING AT A FAST
  183. CLIP AT THE HOUSE.  ╚OWEVER, THE TRIVIA STILL KEEPS COMING.  ╔ APPRECIATE
  184. ALL THE PEOPLE WHO CONTRIBUTE TO THE TRIVIA AND ALL THE PEOPLE WHO TAKE
  185. PART IN THE MONTHLY CONTEST.  ╔ HAVE COLLECTED ╘RIVIA ┼DITION #13-18 IN THIS
  186. ARTICLE.  ┴S YOU MAY KNOW, THESE QUESTIONS FORM PART OF A CONTEST IN WHICH
  187. THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY VARIOUS PRIZE DONATORS).
  188. ╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE ENJOY.
  189.  
  190. ┴S THE SUMMER MONTHS START UP, NEWS ON THE TRIVIA INCLUDES:
  191.  
  192. 1) ╔ NOW HAVE ACCESS TO SOME MORE ORPHAN MACHINES (├65, ├116), SO EXPECT
  193.    SOME TRIVIA QUESTIONS ON THOSE MODELS.
  194.  
  195. 2) ╘HE NEW HOME NOW HAS A NUMBER OF MACHINES SET UP, SO TESTING ANSWERS TO
  196.    THE TRIVIA IS EVEN EASIER.  ╔ AM STILL TRYING TO GET THE OLD ╨┼╘
  197.    MACHINES IN HOUSE, BUT THE OTHERS ARE HERE.
  198.  
  199. 3) ╘HE ├OMMODORE ╫ORLD ╫IDE ╫EB ╨AGES (HTTP://WWW.MSEN.COM/▐BRAIN/CBMHOME.HTML)
  200.    THAT ╔ MAINTAIN AND PLACE THE TRIVIA ON CAUGHT THE EYE OF ╒╙┴ ╘ODAY AND
  201.    THE ╨HEONIX ╟AZETTE.  ╔ WAS INTERVIEWED FOR BOTH ARTICLES.  ╠OOK IN THE
  202.    ╩UNE 20TH EDITION OF ╒╙┴ ╘ODAY FOR THE SEGMENT, AND POSSIBLY A PICTURE OF
  203.    ╩IM ┬RAIN AND THE MACHINES HE USES TO CREATE THE TRIVIA.
  204.  
  205. ┴S ALWAYS, ╔ WELCOME ANY QUESTIONS (WITH ANSWERS), AND ENCOURAGE PEOPLE
  206. TO ENTER THEIR RESPONSES TO THE TRIVIA, NOW AT #18.
  207.  
  208.  
  209. ╩IM.
  210.  
  211.  
  212. ╘HE FOLLOWING ARTICLE CONTAINS THE ANSWERS TO THE ─ECEMBER EDITION OF TRIVIA
  213. ($0├0 - $0├╞), THE QUESTIONS AND ANSWERS FOR ╩ANUARY ($0─0 - $0─╞),
  214. ╞EBRUARY ($0┼0 - $0┼╞), ═ARCH ($0╞0 - $0╞╞), ┴PRIL ($100 - $10╞), AND THE
  215. QUESTIONS FOR THE ═AY EDITION ($110 - $11╞).  ┼NJOY THEM!
  216.  
  217.  
  218.    ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #13 FOR ─ECEMBER, 1994
  219.  
  220. ╤ $0├0) ╘HE EARLY 1541 DRIVES USED A MECHANISM DEVELOPED BY ______.  ╬AME
  221.         THE COMPANY.
  222.  
  223. ┴ $0├0) ┴LPS.
  224.  
  225. ╤ $0├1) ╧N LATER MODELS, ├OMMODORE SUBSEQUENTLY CHANGED MANUFACTURERS
  226.         FOR THE 1541 DRIVE MECHANISM.  ╬AME THE NEW MANUFACTURER.
  227.  
  228. ┴ $0├1) ╬EWTRONICS.
  229.  
  230. ╤ $0├2) ╫HAT IS THE MOST OBVIOUS DIFFERENCE(S).  (╧NLY ONE DIFFERENCE IS
  231.         NECESSARY)
  232.  
  233. ┴ $0├2) ┴LPS:        PUSH-TYPE LATCH, ROUND ╠┼─.
  234.         ╬EWTRONICS:  LEVER-TYPE LATCH, RECTANGULAR ╠┼─.
  235.  
  236. ╤ $0├3) ╧N ├OMMODORE ┬┴╙╔├ ╓2.0, WHAT ANSWER DOES THE FOLLOWING GIVE:
  237.         ╨╥╔╬╘ (╙╤╥(9)=3)
  238.  
  239. ┴ $0├3) 0.  ┴CCORDING TO ├OMMODORE ┬┴╙╔├, THE ANSWER SHOULD BBY -1, WHICH
  240.         IS THE ┬┴╙╔├ VALUE OF ╘╥╒┼.  ╚OWEVER, THE ABOVE EQUATION IS ╬╧╘
  241.         TRUE.  ─OING ╨╥╔╬╘ ╙╤╥(9) YIELDS 3, BUT DOING ╨╥╔╬╘ (╙╤╥(9)-3)
  242.         YIELDS 9.31322575┼-10 (├64).  ╘HIS ANOMALY CAN BE ATTRIBUTED TO
  243.         ROUNDOFF ERRORS IN THE FLOATING POINT MATH ROUTINES IN ├OMMODORE ┬┴╙╔├.
  244.  
  245. ╤ $0├4) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION) WHAT DOES ┬ EQUAL AFTER THE FOLLOWING
  246.         RUNS: ├=0:┬=├=0
  247.  
  248. ┴ $0├4) ┬ = -1.  ╘HE SECOND STATEMENT IS THE ONE TO LOOK AT.  ╘HE SECOND
  249.         EQUALS SIGN IS TREATED AS A COMPARISON, WHILE THE FIRST IS TREATED
  250.         AS A ASSIGNMENT.  ┬ GETS SET TO THE OUTCOME OF THE COMPARISON, WHICH
  251.         IS ╘╥╒┼ (-1).
  252.  
  253. ╤ $0├5) ╘HE FIRST ╨┼╘ CASSETTE DECKS WERE ACTUALLY _______ BRAND CASSETTE
  254.         PLAYERS, MODIFIED FOR THE ╨┼╘ COMPUTERS.  ╬AME THE COMAPNY.
  255.  
  256. ┴ $0├5) ╙ANYO. ╙PECIFICALLY, ═ODEL ═1540┴.  ╫HAT A MODEL NUMBER!
  257.  
  258. ╤ $0├6) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION), WHAT HAPPENS IF THE FOLLOWING
  259.         PROGRAM IS RUN:
  260.  
  261.         10 ╩=0
  262.         20 ╔╞ ╩=0 ╟╧ ╘╧ 40
  263.         30 ╨╥╔╬╘ "╩<>0"
  264.         40 ╨╥╔╬╘ "╩=0"
  265.  
  266. ┴ $0├6) ╧N ┬┴╙╔├ 2.0 OR GREATER:
  267.  
  268.    ?╙┘╬╘┴╪  ┼╥╥╧╥ ╔╬ 20
  269.         ╥┼┴─┘.
  270.  
  271.         ╧N ┬┴╙╔├ 1.0:  (FOUND ON THE ╨┼╘ 2001 SERIES)
  272.  
  273.         ╩=0
  274.         ╥┼┴─┘.
  275.  
  276.         ┬┴╙╔├ 1.0 TOTALLY IGNORED SPACES, SO LINE 20 BECAME "╔╞╩=0╟╧╘╧40".
  277.         ╘HAT STATEMENT WOULD BE CORRECTLY PARSED, SICNE IT CONTAINS THE "╟╧╘╧"
  278.         KEYWORD.
  279.  
  280.         ╚OWEVER, ON ┬┴╙╔├ 2.0 OR GREATER, SPACES WEREN'T IGNORED SO
  281.         COMPLETELY, AND THE "╘╧" IN "╟╧ ╘╧" WOULD BE TOKENIZED SEPARATELY, SO
  282.         SOME CODE WAS ADDED TO ┬┴╙╔├ TO CHECK TO "╟╧".  ┴S THE CODE THAT
  283.         ACCEPTS ╟╧╘╧ AS A SPECIAL CASE FOR ╘╚┼╬ AFTER AN ╔╞ STATEMENT WASN'T
  284.         PATCHED THIS WAY, THE ABOVE FAILS, BECAUSE ╟╧ IS NOT A VALID KEYWORD
  285.         AFTER ╔╞.  ╘HE STATEMENT ╙╚╧╒╠─ WORK CORRECTLY, BUT DOES NOT BECAUSE
  286.         OF THIS FAILURE TO FIX THE ╔╞ COMMAND PARSING.
  287.  
  288.         ╧N ┬┴╙╔├ 2.0 OR GREATER, SUBSTITUTING THE FOLLOWING LINE FOR LINE 20
  289.         WILL CAUSE THE PROGRAM TO WORK:
  290.  
  291.         20 ╔╞ ╩=0 ╘╚┼╬ ╟╧ ╘╧ 40
  292.  
  293. ╤ $0├7) ╔N QUESTION $068, WE LEARNED HOW ╩ACK ╘RAMIEL FIRST HAPPENED UPON THE
  294.         NAME "├╧══╧─╧╥┼".  ┴CCORDING TO THE STORY, THOUGH, IN WHAT COUNTRY
  295.         WAS HE IN WHEN HE FIRST SAW IT?
  296.  
  297. ┴ $0├7) ╟ERMANY.
  298.  
  299. ╤ $0├8) ╧N THE ├OMMODORE USER PORT CONNECTOR, HOW MANY EDGE CONTACTS ARE
  300.         THERE?
  301.  
  302. ┴ $0├8) 24.  ╘WO ROWS OF 12 CONTACTS EACH.
  303.  
  304. ╤ $0├9) ╧N MOST ├OMMODORE COMPUTERS, A LOGICAL ┬┴╙╔├ SCREEN LINE CAN CONTAIN
  305.         UP TO 80 CHARACTERS.  ╧N WHAT ├OMMODORE COMPUTER(S) IS THIS NOT TRUE?
  306.  
  307. ┴ $0├9) ┴CCORDING TO ├OMMODORE DOCUMENTATION, A _PHYSICAL_ SCREEN LINE IS
  308.         DEFINED AS ONE SCREEN LINE OF CHARACTERS.  ┴ _LOGICAL_ SCREEN LINE IS
  309.         DEFINED AS HOW MANY _PHYSICAL_ LINES CAN BE CHAINED TOGETHER TO
  310.         CREATE A VALID ┬┴╙╔├ PROGRAM LINE.
  311.  
  312.         ╫ITH THAT IN MIND, MOST ├OMMODORE COMPUTERS CHOSE A _LOGICAL_
  313.         SCREEN LINE THAT WAS A MULTIPLE OF THE SCREEN WIDTH.  ╘HIS WORKS FINE
  314.         FOR 40 AND 80 COLUMN SCREENS, BUT WHAT DO WE DO WITH THE ╓╔├-20, WITH
  315.         ITS 22 COLUMN SCREEN.  ╙OLUTION:  MAKE THE _LOGICAL_ LINE LENGTH EQUAL
  316.         TO 4 _PHYSICAL_ LINES, OR 88 COLUMNS.
  317.  
  318.         ╫HEN THE ├OMMDORE 128 WAS INTRODUCED, THE NUMBER ROSE TO 160
  319.         CHARACTERS, WHICH IS 4 _PHYSICAL_ LINES IN 40 COLUMN MODE, OR
  320.         2 _PHYSICAL_ LINES IN 80 COLUMN MODE.  ╚OWEVER, YOU CAN ONLY TAKE
  321.         ADVANTAGE OF THIS IN 128 MODE.  64 MODE IS LIMITED TO 80 CHARACTERS.
  322.  
  323.         ╘O ADD TO ALL THIS CONFUSION, A VALID ┬┴╙╔├ PROGRAM LINE (IN MEMORY)
  324.         CAN ACTUALLY BE 255 (TOKENIZED) CHARACTERS LONG, BUT CREATING SUCH
  325.         A LONG LINE CANNOT BE DONE FROM THE BUILT-IN EDITOR IN DIRECT MODE.
  326.  
  327.         ╘HE ┴MIGA┬┴╙╔├, AVAILABLE ON THE ┴MIGA, ALSO DOES NOT HAVE THE 80
  328.         COLUMN LINE LIMIT.  ╚OWEVER, THAT ┬┴╙╔├ IS ╙╧╧╧ MUCH DIFFERENT THAT
  329.         ╔ AM NOT SURPRISED.  ╘HE OLDER ├┬═ ┬┴╙╔├S, ON THE OTHER HAND, WERE
  330.         ALL DERIVATIVES OF THE ORIGINAL ╠EVEL 1 ┬┴╙╔├ FOR THE ╨┼╘.
  331.  
  332. ╤ $0├┴) ╔F A FILE IS SAVED TO A ├OMMODORE ─ISK ─RIVE WITH THE FOLLOWING
  333.         CHARACTERS: CHR$(65);CHR$(160);CHR$(66), WHAT WILL THE DIRECTORY
  334.         ENTRY LOOK LIKE?
  335.  
  336. ┴ $0├┴) ╘HE FILENAME WILL SHOW UP AS "┴"┬, WITH THE '┬' SHOWING UP TO THE
  337.         RIGHT OF THE '"' MARK.  ╘HIS COULD BE USED TO MAKE PROGRAM LOADING
  338.         EASIER.  ┴ FILE THAT SHOWED UP AS "FILENAME",8,1 COULD BE LOADED
  339.         BY SIMPLY HITTING SHIFT-RUN/STOP ON THAT LINE.
  340.  
  341. ╤ $0├┬) ╫HAT IS THE MAXIMUM LENGTH (IN CHARACTERS) OF A ├┬═ DATASETTE
  342.         FILENAME?
  343.  
  344. ┴ $0├┬) ╥EFERENCES ╔ HAVE ON HAND SAY 128 CHARACTERS.  ╚OWEVER, THE ACTUAL
  345.         CODE ON THE 8032 AND THE ├64 ACTS AS THOUGH 187 CHARACTERS CAN
  346.         ACTUALLY BE SENT (TAPE BUFFER-5 CONTROL BYTES = 192-5=187).  ╘HE
  347.         REFERENCES THAT CLAIM 128 CHARACTERS ARE ╬ICK ╚AMPSHIRE'S
  348.         _╘HE ╓╔├ ╥EVEALED_ AND _╘HE ╨┼╘ ╥EVEALED_.  ┴╬YONE CARE TO LAY
  349.         THIS ONE TO REST?
  350.  
  351. ╤ $0├├) ╚OW MANY KEYS ARE ON A STOCK ├OMMODORE 64 KEYBOARD?
  352.  
  353. ┴ $0├├) 66 KEYS.  ╘HIS IS THE SAME NUMBER AS FOUND ON THE ╓╔├-20 AND THE
  354.         ├OMMODORE 16.
  355.  
  356. ╤ $0├─) ├OMMODORE ┬┴╙╔├ USES KEYWORD "TOKENS" TO SAVE PROGRAM SPACE.  ╘OKEN
  357.         129 BECOMES "╞╧╥".  ╫HAT TWO TOKENS EXPAND TO INCLUDE A LEFT
  358.         PARENTHESIS AS WELL AS A ┬┴╙╔├ KEYWORD?
  359.  
  360. ┴ $0├─) ╘┴┬( (163) AND ╙╨├( (166).
  361.  
  362. ╤ $0├┼) ╘HERE ARE 6 WIRES IN THE ├OMMODORE SERIAL BUS.  ╬AME THE 6 WIRES.
  363.  
  364. ┴ $0├┼) 1) ╙ERIAL /╙╥╤╔╬
  365.         2) ╟╬─
  366.         3) ╙ERIAL ┴╘╬ ╔╬/╧╒╘
  367.         4) ╙ERIAL ├╠╦ ╔╬/╧╒╘
  368.         5) ╙ERIAL ─┴╘┴ ╔╬/╧╒╘
  369.         6) /╥┼╙┼╘
  370.  
  371. ╤ $0├╞) ╧N THE ├OMMODORE DATASETTE CONNECTOR, HOW MANY LOGICAL CONNECTIONS ARE
  372.         THERE?
  373.  
  374. ┴ $0├╞) 6. ╧PPOSING PINS ON THE CONNECTOR ARE HOOKED TOGETHER ELECTRICALLY.
  375.  
  376.  
  377.    ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #14 FOR ╩ANUARY, 1995
  378.  
  379. ╤ $0─0) ╚OW MANY KEYS WERE THERE ON THE "ORIGINAL" ╨┼╘ AND WHAT WAS SPECIAL
  380.         ABOUT THEM?
  381.  
  382. ┴ $0─0) THE ORIGINAL ╨┼╘ HAD 73 CALCULATOR-STYLE KEYS THAT WERE LAID OUT
  383.         IN A RECTANGULAR MATRIX, NOT TYPEWRITER-STYLE.
  384.  
  385. ╤ $0─1) ╚OW DO YOU PRODUCE THE "HIDDEN" MESSAGE(S) ON THE ├OMMODORE 128?
  386.  
  387. ┴ $0─1) ╙┘╙ 32800,123,45,6.  ╘HE SCREEN WILL CLEAR, AND THE SOFTWARE
  388.         AND HARDWARE DEVELOPERS ON THE 128 PROJECT WILL BE NAMED.
  389.  
  390.         ╘HE EXACT TEXT IS AS FOLLOWS:
  391.  
  392. [╥╓╙]   ┬ROUGHT TO YOU BY...
  393.  
  394. ╙OFTWARE:
  395.  ╞RED ┬OWEN
  396.  ╘ERRY ╥YAN
  397.  ╓ON ┼RTWINE
  398.  
  399. ╚ERDWARE:
  400.  ┬IL ╚ERD
  401.  ─AVE ╚AYNIE
  402.  ╞RANK ╨ALAIA
  403.  
  404. [╥╓╙]╠INK ARMS,DON'T MAKE THEM.
  405.  
  406. ╤ $0─2) ╚OW MUCH MEMORY DID THE "ORIGINAL" ╨┼╘ SHOW ON BOOTUP?
  407.  
  408. ┴ $0─2) ╘HE "ORIGINAL" ╨┼╘ CAME IN TWO CONFIGURATIONS, 4╦ AND 8╦, SO:
  409.  
  410.           ╘HE ╨┼╘ 2001-4 HAD 3071 BYTES.
  411.           ╘HE ╨┼╘ 2001-8 HAD 7167 BYTES.
  412.  
  413. ╤ $0─3) ╫E ALL KNOW THE "REBOOT" SYS FOR THE 64 IS SYS 64738, BUT WHO KNOWS
  414.         THE SAME SYS LOCATION TO REBOOT THE ├┬═ 8032?
  415.  
  416. ┴ $0─3) SYS 64790
  417.  
  418. ╤ $0─4) ╫HICH COMPUTER(S) BEEPED AT BOOTUP?  (═AY BE MORE THAN ONE, BUT ONLY
  419.         ONE REQUIRED)
  420.  
  421. ┴ $0─4) ╔ KNOW SOME OF THESE ARE CORECT, BUT THE SHEER SIZE OF THE
  422.         LIST PREVENTS ME FROM CHECKING THEM ┴╠╠ OUT.
  423.  
  424.         ╞┴╘ 40╪╪ SERIES
  425.         80╪╪ SERIES
  426.         ╨├-10  (╔ SUSPECT A NUMBER OF ╔┬═ CLONES DID, AND THESE THINGS HAVE
  427.                 NO CONSISTENT NAMING CONVENTION ACROSS COUNTRY BOUNDARIES.)
  428.         ╨├-20
  429.         ┴MIGA 1000
  430.         ╙╨9000 (╙UPER╨┼╘)
  431.  
  432. ╤ $0─5) ╚OW MUCH MEMORY DID THE ├┬═ 8032 SHOW ON BOOTUP?
  433.  
  434. ┴ $0─5) 31743 BYTES.
  435.  
  436. ╤ $0─6) ├ERTAIN ├OMMODORE COMPUTERS PROVIDED EMTPY ┼╨╥╧═ SOCKETS ON THE
  437.         MOTHERBOARD.  ╟IVE ME THE NUMBER OF EMPTY SOCKETS ON THE FOLLOWING
  438.         MACHINES:
  439.  
  440.         A)  ├┬═ 30╪╪.
  441.         B)  ├┬═ 8╪╪╪.
  442.         C)  ├┬═ ├128.
  443.         D)  ╨LUS/4.
  444.  
  445. ┴ $0─6) A)  3 SOCKETS.
  446.         B)  2 SOCKETS.
  447.         C)  1 SOCKET.
  448.         D)  1 SOCKET.
  449.  
  450. ╤ $0─7) ╔N ╟ERMANY, THE ├┬═ 8032 CAME WITH A 4K┬ ┼╨╥╧═ FOR THE ┼╪╪╪ AREA,
  451.         WHILE THE ╒╙ VERSION ONLY HAD A 2K┬ ┼╨╥╧═.  ╫HY?
  452.  
  453. ┴ $0─7) ╘HE ╟ERMAN VERSION HAD ADDITIONAL KEYBAORD DRIVERS FOR UMLAUT
  454.         CHARACTERS AND DEAD KEYS.
  455.  
  456. ╤ $0─8) ╫HO PUBLISHED THE FIRST ╨┼╘ MEMORY MAP IN THE "╨┼╘ ╟AZETTE"?
  457.  
  458. ┴ $0─8) ╬ONE OTHER THAN THE INFAMOUS ╩IM ┬UTTERFIELD.
  459.  
  460. ╤ $0─9) ╫HICH IS FASTER TO MOVE THE SURSOR ON A ╨┼╘/├┬═ OR ├64: ╙┘╙ OR
  461.         ╨╥╔╬╘?
  462.  
  463. ┴ $0─9) ╨╥╔╬╘ IS FASTER, SINCE THE SYS APPROACH MUST PROCESS THE POKES
  464.         BEFORE THE SYS, WHICH ARE VERY SLOW.
  465.  
  466. ╤ $0─┴) ╧N THE ┴MIGA 1000, WHERE ARE THE SIGNATURES OF THE FIRST ┴MIGA
  467.         DEVELOPERS LOCATED?
  468.  
  469. ┴ $0─┴) ╔NSIDE THE TOP CASE OF THE ┴MIGA (1000).
  470.  
  471.         ╘HERE IS AN INTERESTING FOOTNOTE TO THIS QUESTION.  ╔T SEEMS
  472.         THAT AT LEAST SOME ORIGINAL ┴MIGA MACHINES WERE LABELED AS
  473.         ┴MIGA (WITH NU NUMBER).  ╘HEN, AT SOME LATER POINT, THE NUMBER WAS
  474.         ADDED.  ╔N ADDITION, ├OMMODORE PRODUCED SOME ┴MIGA 1000 MACHINES
  475.         WITHOUT THE SIGNATURES, BUT MOST HAD THE TELLTALE HANDWRITING ON
  476.         THE INSIDE OF THE CASE.
  477.  
  478. ╤ $0─┬) ╧N THE 6502, WHAT DOES THE ACCUMULATOR CONTAIN AFTER THE FOLLOWING
  479.         IS EXECUTED:
  480.  
  481.         LDA #$AA
  482.         SED
  483.         ADC #01
  484.  
  485. ┴ $0─┬) ┴SSUME CARRY WAS CLEAR.  ╔F SO, THEN $11 IS THE CORRECT ANSWER.
  486.  
  487. ╤ $0─├) ╫HAT IS THE MODEL NUMBER OF THE ╒╙ ╬╘╙├ ╓╔├-╔╔ CHIP?
  488.  
  489. ┴ $0─├) ╔TS FIRST NUMBER WAS 6567, AND THAT IS THE NUMBER MOST PEOPLE KNOW
  490.         IT BY, BUT ├OMMODORE PRODUCED A ╓╔├-╔╔ USING A NEW MANUFACTURING
  491.         PROCESS THAT WAS NUMBERED THE 8562.
  492.  
  493. ╤ $0──) ╫HAT IS THE ┼UROPEAN ╨┴╠ ╓╔├-╔╔ CHIP'S MODEL NUMBER?
  494.         (╬OT SURE IF THAT'S ITS RIGHTFUL TERM, BUT ╔ HOPE YOU UNDERSTAND).
  495.  
  496. ┴ $0──) ╙AME HERE.  ╘HE PART NUMBER 6569 IS THE MOST REMEMBERED NUMBER, BUT
  497.         AN 8565 WILL WORK AS WELL.
  498.  
  499. ╤ $0─┼) ┴SSUME YOU HAVE TWO COMPUTERS, ONE WITH EACH OF THE ABOVE CHIPS INSIDE.
  500.         ╫HICH CHIP DRAWS MORE PIXELS ON THE SCREEN PER SECOND?
  501.  
  502. ┴ $0─┼) ╬OTE, FOR THE PURPOSES OF THE CALCULATION ╔ AM PERFORMING, "PIXELS"
  503.         REFERS TO PICTURE ELEMENTS THAT CAN BE ADDDRESS AND MODIFIED USING
  504.         NORMAL ╓╔├ MODES, SO THERE ARE 320*200 "PIXELS" ON BOTH THE ╨┴╠
  505.         AND ╬╘╙├ SCREENS.  (╔ PROBABLY SHOULD HAVE STATED THIS, BUT IT IS
  506.         TOO LATE NOW.)  ┴LSO, THE SCREEN REFRESH RATES USED IN THE
  507.         CALCULATIONS ARE THOSE DEFINED BY THE RESPECTIVE TELEVISION
  508.         STANDARDS (60╚Z ╒.╙., 50╚Z ┼UROPEAN), EVEN THOUGH THE ACTUAL
  509.         FREQUENCIES ARE OFF BY A SMALL PERCENTAGE. (FOR EXAMPLE, THE ACTUAL
  510.         50╚Z REFRESH RATE ON ┼UROPEAN ╓╔├-╔╔ CHIPS WAS CALCULATES AS
  511.         50.124567╚Z BY ┴NDREAS ┬OOSE)
  512.  
  513.         ╙O, THE ╨┴╠ DRAWS 320*200*50 PIXELS PER SECOND = 3200000 PIXELS/S
  514.         ╬╘╙├ DRAWS 320*200*60 PIXELS PER SECOND = 3840000 PIXLES/S
  515.  
  516.         ╬OW, SOME PEOPLE THOUGHT ╔ MEANT THE WHOLE SCREEN, NOT JUST THE
  517.         DISPLAY AREA PROVIDED BY THE ╓╔├-╔╔ CHIP.  ╫ELL, ╔ AM NOT SURE
  518.         EXACTLY YOU CALCULATE PIXELS ON A SCREEN, SINCE THE NUMBERS COULD
  519.         VARY FROM DISPLAY TO DISPLAY, BUT IF WE MEASURE IN SCANLINES:
  520.  
  521.         ╨┴╠ = 312 SCANLINES * 50 = 15600 SCANLINES/S
  522.         ╬╘╙├ = 262 SCANLINES * 60 = 15720 SCANLINES/S
  523.  
  524.         ╘HE ╬╘╙├ MACHINES WINS BOTH WAYS.
  525.  
  526. ╤ $0─╞) ╔N ├OMMODORE ┬┴╙╔├, WHICH STATEMENT EXECUTES FASTER:
  527.  
  528.         A = 2--2
  529.  
  530.         OR
  531.  
  532.         A = 2+2
  533.  
  534. ┴ $0─╞) B IS THE CORRECT ANSWER, AND THERE ARE A COUPLE OF REASONS WHY:
  535.  
  536.         1) 2--2 TAKES LONGER TO PARSE IN THE ┬┴╙╔├ INTERPRETER.
  537.         2) ├OMMODORE ┬┴╙╔├ SUBTRACTS BY COMPLEMENTING THE SIGN OF THE
  538.            SECOND NUMBER AND ADDING.  ╘HIS INCURS EXTRA TIME.
  539.  
  540.         ╘HERE ARE EVEN MORE SUBTLE ONES, BUT ╔ LEAVE THEM AS AN
  541.         EXERCISE FOR THE READER.  ╙END ME YOUR REASON WHY.
  542.  
  543.  
  544.    ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #15 FOR ╞EBRUARY, 1995
  545.  
  546. ╤ $0┼0) ╫HAT IS THE DIFFERENCE(S) BETWEEN THE ╬EWTRONICS 1541 AND THE 1541├?
  547.         (ONLY ONE DIFFERENCE IS NEEDED)
  548.  
  549. ┴ $0┼0) (╟EORGE ╨AGE, A NOTED AUTHORITY ON ├┬═ ─RIVES, INDICATED THAT ├OMMODORE
  550.         MADE THIS A TOUGH QUESTION TO ANSWER.)  ┬Y THE TIME THE 1541├ WAS
  551.         INTRODUCED, ├OMMODORE THREW A NUMBER OF DRIVES TOGETHER AND CALLED
  552.         THEM 1541├S.  ╘HE THEORETICAL 1541├ EXHIBITED THE FOLLOWING
  553.         FEATURES:
  554.  
  555.         ╬O HEAD BANGING, AND OTHER PROBLEMS FIXED BY MODIFIED ╥╧═S.
  556.         ├ASE COLOR MATCHES ├64├ AND ├128 COMPUTERS.
  557.  
  558. ╤ $0┼1) ╫HAT HAPPENS WHEN YOU TYPE 35072121 IN DIRECT MODE ON THE ├64 AND
  559.         HIT RETURN?
  560.  
  561. ┴ $0┼1) ╙IMPLE ANSWER:  ═OST LIKELY, THE SCREEN CLEARS AND THE WORD ╥┼┴─┘.
  562.         IS PRINTED AT SCREEN TOP.  ╘HIS IS THE BEHAVIOR SEEN WHEN PRESSING
  563.         ╥╒╬-╙╘╧╨/╥┼╙╘╧╥┼.  ┴LTERNATELY, NOTHING COULD HAPPEN, OR THE COMPUTER
  564.         COULD LOCK UP.
  565.  
  566.         ╔NVOLVED ANSWER:  ╘HERE IS A BUG IN ┬┴╙╔├ 2.0.  ┼ASILY FIXED, BUT
  567.         DESTINED TO LIVE LIFE IMMORTAL.  (LONG)
  568.  
  569.         ╘HE BUG IS IN THE ╨┼╘╙├╔╔ NUMBER TO BINARY CONVERSION ROUTINE AT
  570.         $A69B (╠╔╬╟┼╘).  ╘HE ROUTINE BASICALLY READS IN A CHARACTER FROM THE
  571.         LINE, MULTIPLIES A PARTIAL RESULT BY 10 AND ADDS THE NEW CHARACTER
  572.         TO THE PARTIAL RESULT.  ╚ERE IS A CODE SNIPPET:
  573.  
  574.         A96A     RTS
  575.         A96B     LDX #$00  ; ZERO OUT PARTIAL RESULT
  576.         A96D     STX $14
  577.         A96F     STX $15
  578.         A971     BCS $A96A ; NOT A NUMBER, RETURN
  579.         A973     SBC #$2F  ; ╨┼╘╙├╔╔ TO BINARY
  580.         A975     STA $07
  581.         A977     LDA $15   ; GET HI BYTE OR PARTIAL RESULT
  582.         A979     STA $22
  583.         A97B     CMP #$19  ; PARTIAL > 6399
  584.         A97D     BCS $A953 ; YES, GOTO ERROR
  585.         A97F     LDA $14   ; LOAD LO BYTE OF RESULT
  586.         A981     ASL       ; LO*2
  587.         A982     ROL $22   ; HI*2 + C
  588.         A984     ASL       ; LO*2
  589.         A985     ROL $22   ; HI*2 + C
  590.         A987     ADC $14   ; COMPLETE LO*5
  591.         A989     STA $14
  592.         A98B     LDA $22
  593.         A98D     ADC $15   ; COMPLETE HI*5
  594.         A98F     STA $15
  595.         A991     ASL $14   ; LO*2 COMPLETE LO*10
  596.         A993     ROL $15   ; HI*2 COMPLETE HI*10
  597.         A995     LDA $14
  598.         A997     ADC $07   ; ADD NEW CHAR
  599.         A999     STA $14
  600.         A99B     BCC $A99F ; DID LO OVERFLOW?
  601.         A99D     INC $15   ; YES, INC HI
  602.         A99F     JSR $0073 ; GET NEXT CHAR
  603.         A9A2     JMP $A971 ; GO THROUGH IT AGAIN.
  604.  
  605.         ╘HE PROBLEM IS AT $A97D.  WHEN THE PARTIAL RESULT IS GREATER THAN 6399,
  606.         (IF PARTIAL > 6399, THEN NEW PARTIAL RESULT WILL BE OVER 63999)
  607.         THE ROUTINE NEEDS TO GET TO $AF08 TO PRINT AN ERROR, BUT CAN'T DUE TO
  608.         BRANCH RESTRICTIONS.  ╚OWEVER, A BRANCH THAT WILL GET THERE IS IN THE
  609.         PRECEDING FUNCTION, WHICH HANDLES THE ╧╬ ╟╧╘╧/╟╧╙╒┬ KEYWORDS ($A94B,
  610.         ╧╬╟╧╘╧).
  611.  
  612.         ╙O, THE ┬┴╙╔├ WRITERS JUST BRANCHED TO THE CODE IN ╧╬╟╧╘╧; SPECIFICALLY
  613.         $A953:
  614.  
  615.         A94B     JSR $B79E
  616.         A94E     PHA
  617.         A94F     CMP #$8D  ; IS THE KEYWORD ╟╧╙╒┬ ($8D)
  618.         A951     BEQ $A957 ; YES
  619.         A953     CMP #$89  ; IS THE KEYWORD ╟╧╘╧ ($89)
  620.         A955     BNE $A8E8 ; NO, PRINT ╙┘╬╘┴╪ ┼╥╥╧╥.
  621.         A957     ...       ; HANDLE ╧╬ ╟╧╘╧/╟╧╙╒┬
  622.  
  623.         ╘HIS CODE IS CHECKING TO MAKE SURE THE ╧╬ (VAR) IS FOLLOWED WITH A
  624.         ╟╧╘╧ OR ╟╧╙╒┬ KEYWORD.
  625.  
  626.         ╘HE ╠╔╬╟┼╘ ERROR HANDLER BRANCHES TO $A953, WHICH COMPARES
  627.         .┴ (WHICH HOLDS HI BYTE OF PARTIAL RESULT) TO $89.  ╬ORMALLY, THIS
  628.         FAILS, AND THE NORMAL ╙┘╬╘┴╪ ┼╥╥╧╥ CODE IS REACHED THROUGH THE BRANCH
  629.         TO $A8E8.  ╚OWEVER, FOR PARTIAL RESULTS OF THE FORM $89╪╪, THE CHECK
  630.         SUCCEEDS, AND ┬┴╙╔├ TRIES TO EXECUTE AN ╧╬ ╟╧╘╧/╟╧╙╒┬ CALL.
  631.  
  632.         ┬Y THE WAY, IT IS NO COINCIDENCE THAT THIS ERROR OCCURS ON 35072121,
  633.         SINCE ONE OF THE PARTIAL RESULTS IS $8900 (HI BYTE IS $89). ╔N FACT,
  634.         350721 WILL ACHIEVE THE SAME RESULT.
  635.  
  636.         ╔F THE CHECK SUCCEEDS, THE CODE LIMPS ALONG UNTIL $A96A:
  637.  
  638.         A969     PLA       ; COMPLEMENT TO $A94E
  639.         A96A     RTS       ; RETURN
  640.  
  641.         ┬UT WE NEVER EXECUTED $A94E, THE PUSH, SO THE STACK IS NOW
  642.         MESSED UP.  ╙INCE THE STACK HELD $9E, $79, $A5 BEFORE THE ╨╠┴,
  643.         (╘HE STACK COULD HOLD OTHER VALUES, BUT ╔ ALWAYS SAW THESE)
  644.         THE ╥╘╙ GETS ADDRESS $A579 TO RETURN TO, WHICH USUALLY HOLDS A ┬╥╦
  645.         OPCODE.  ╘HE BREAK HANDLER IS INVOKED, AND THE SCREEN CLEARS WITH THE
  646.         ╥┼┴─┘. AT THE TOP.
  647.  
  648.         ╬OW, THE ┬┴╙╔├ 2.0 AUTHORS WERE JUSTIFIED IN REUSING THE ERROR
  649.         HANDLER CODE IN ╧╬╟╧╘╧ FOR ╠╔╬╟┼╘, BUT THEY CALCULATED THE BRANCH
  650.         OFFSET WRONG, ACCORDING TO MY TESTS.  ╔F YOU HAVE THE ╠╔╬╟┼╘ ERROR
  651.         HANDLER BRANCH TO $A955, ALL THESE TROUBLES DISAPPEAR.  ┘OU CAN
  652.         VERIFY THIS PROCEDURE WITH THE FOLLOWING ┬┴╙╔├ PROGRAM ON A 64:
  653.  
  654.         10 FOR T=57344 TO 65535:POKE T,PEEK(T):NEXT
  655.         20 FOR T=40960 TO 49151:POKE T,PEEK(T):NEXT
  656.         30 POKE 43390, 214
  657.         40 POKE 1, PEEK(1) AND 254
  658.  
  659.         ╩UST TO BE COMPLETE, THIS ERROR OCCURS WHEN A 6 DIGIT OR GREATER LINE
  660.         NUMBER IS ENTERED AND THE FIRST 6 DIGITS INDICATE A NUMBER IN THE
  661.         RANGE 35072-35327 ($8900-$89FF).  ┴LSO, IT APPEARS THE ERROR OCCURS
  662.         ON THE ╓╔├-20, BUT ╔ DIDN'T COMPLETELY VERIFY IT.  ╔T WOULD BE
  663.         INTERESTING TO NOTE IF THE ERROR IS FOUND ON ALL VERSION OF ├┬═ ┬┴╙╔├.
  664.  
  665.         ╫HEW, WHAT A MOUTHFUL.
  666.  
  667. ╤ $0┼2) ╔F A ╙╔─ CHIP IS PRODUCING A "SAWTOOTH WAVEFORM", DOES THE WAVEFORM LOOK
  668.  
  669.         LIKE:
  670.  
  671.         A) "/▄/▄/▄/▄"  OR
  672.         B) "▄\▄\▄\▄\"  ?
  673.  
  674. ┴ $0┼2) A IS THE CORRECT ANSWER.
  675.  
  676. ╤ $0┼3) ╧N ┬┴╙╔├ 2.0, WHAT SPECIAL PRECAUTION(S) MUST ONE TAKE WHEN WORKING WITH
  677.  
  678.         RELATIVE FILES? (ONLY ONE IS NEEDED)
  679.  
  680. ┴ $0┼3) ┬ECAUSE ┬┴╙╔├ 2.0 DOESN'T HANDLE POSITIONING IN RELATIVE FILES QUITE
  681.         RIGHT, ONE MUST POSITION THE RELATIVE FILE POINTER BEFORE ┴╬─ ┴╞╘┼╥
  682.         A READ OR WRITE TO A RELATIVE FILE.
  683.  
  684. ╤ $0┼4) ╫HAT INCOMPATIBILITY EXISTED BETWEEN ├128 ╥EV. 0 ╥╧═╙ AND THE ╥┼╒?
  685.  
  686. ┴ $0┼4) ╧╦, ╔ ADMIT IT.  ╔ PLACED THIS ANSWER AND ITS DISCUSSION SOMEWHERE
  687.         IN MY STORE OF INFORMATION, AND IT MUST HAVE FALLEN BEHIND THE
  688.         CABINET, BECAUSE ╔ CANNOT FIND IT.  ╔ WILL POST AN ANSWER TO THIS
  689.         AS SOON AS ╔ CAN FIND IT, BUT THE ANSWERS REALLY MUST GO OUT, AS
  690.         THEY HAVE BEEN HELD UP LONG ENOUGH.
  691.  
  692. ╤ $0┼5) ╫HAT CAN TRIGGER AN ╬═╔ INTERRUPT? (COUNT ALL SOURCES ON ONE CHIP AS
  693.         ONE)
  694.  
  695. ┴ $0┼5) ╘HE FOLLOWING SOURCES CAN TRIGGER AN ╬═╔ INTERRUPT:
  696.  
  697.         1) ╘HE EXPANSION PORT.
  698.         2) ├╔┴ #2.
  699.         3) ╘HE ╥┼╙╘╧╥┼ KEY.
  700.   
  701. ╤ $0┼6) ╫HAT CAN TRIGGER AN ╔╥╤ INTERRUPT? (COUNT ALL SOURCES ON ONE CHIP AS
  702.         ONE)
  703.  
  704. ┴ $0┼6) ╘HE FOLLOWING SOURCES CAN TRIGGER AN ╔╥╤ INTERRUPT:
  705.  
  706.         1) ╘HE ╓╔├-╔╔ CHIP.
  707.         2) ├╔┴ #1.
  708.         3) ╘HE EXPANSION PORT.
  709.  
  710. ╤ $0┼7) ╫HERE IS THE ╥╧═ IN A 1541 LOCATED IN THE 64╦ MEMORY MAP?
  711.  
  712. ┴ $0┼7) ╘HE ╥╧═ IS LOCATED FROM $├000 TO $╞╞╞╞, YET THE ╥╧═ CODE DOES NOT
  713.         BEGIN UNTIL $├100.
  714.  
  715. ╤ $0┼8) ╫HICH ╓╔┴ ON THE 1541 IS HOOKED TO THE READ/WRITE HEAD?
  716.  
  717. ┴ $0┼8) ╓╔┴ #2, LOCATED IN MEMORY FROM $1├00 TO $1├0┼.
  718.  
  719. ╤ $0┼9) ╔N THE ├OMMODORE ─╧╙, WHAT BIT IN THE FILE TYPE BYTE DENOTES A "LOCKED"
  720.         FILE?
  721.  
  722. ┴ $0┼9) BIT 6.
  723.  
  724. ╤ $0┼┴) ╔F FILES ARE "LOCKED" UNDER ├OMMODORE ─╧╙, UNDER WHAT CONDITION(S) MAY
  725.         THE FILE BE CHANGED?
  726.  
  727. ┴ $0┼┴) ─EPENDING ON THE FILE, THE FOLLOWING OPERATIONS CAN BE DONE ON A
  728.         LOCKED FILE:
  729.  
  730.         1) ╥ENAME WILL CHANGE FILE NAME, ALTHOUGH NOT CONTENTS OF FILE.
  731.         2) ╥ANDOM ACCESS CAN BE USED TO ALTER FILE.
  732.         3) ╞ORMATTING THE DISK WILL ALTER THE FILE. (DUH!)
  733.         4) ╙AVE-WITH-REPLACE (@0:) WILL REPLACE FILE AND UNLOCK IT.
  734.         5) ╧PENING FILE IN APPEND MODE WILL ALLOW IT TO BE CHANGED, AND
  735.            UNLOCK IT.
  736.         6) ╧PENING A RELATIVE FILE AND ADDING OR CHANGING A RECORD WILL
  737.            SUCCEED AND UNLOCK FILE.
  738.  
  739. ╤ $0┼┬) ╚OW BIG CAN A PROGRAM FILE BE ON A 1541 OR SIMILAR?
  740.  
  741. ┴ $0┼┬) ╘HE FILE CAN BE AS LARGE AS A SEQUENTIAL FILE, SINCE BOTH ARE STORED
  742.         IN THE SAME WAY: 168656 BYTES.  ╚OWEVER, SINCE A PROGRAM CONTAINS ITS
  743.         LOAD ADDRESS AS BYTES 0 AND 1, THE LARGEST PROGRAM SIZE IS 168654
  744.         BYTES.
  745.  
  746. ╤ $0┼├) ╒NDER ┬┴╙╔├ 2.0, HOW DOES ONE OPEN A RANDOM ACCESS FILE ON A DISK
  747.         DRIVE?
  748.  
  749. ┴ $0┼├) ╥ANDOM ACCESS (OR DIRECT ACCESS) FILES ARE A MISNOMER.  ╫HAT YOU
  750.         REALLY DOING IS OPENING THE DISK FOR READING AND WRITING.  ┘OU NEED
  751.         TWO OPEN COMMAND TO ACCESS A RANDOM FILE: (ASSUME DRIVE 8)
  752.  
  753.         OPEN 15,8,15     AND
  754.  
  755.         OPEN 1,8,4,"#1" WILL OPEN A RANDOM ACCESS FILE USING BUFFER 1.
  756.         OPEN 1,8,4,"#" WILL OPEN A RANDOM ACCESS FILE USING THE FIRST
  757.         AVAILABLE BUFFER
  758.  
  759.         ╬OW, BY USING ┬-╥, ┬-╫, ┬-┴ OR THEIR REPLACEMENTS, YOU CAN WRITE
  760.         DATA TO SECTORS ON THE DISK.
  761.  
  762.         ╬OTE THAT ╥ANDOM ACCESS FILES ARE DIFFERENT FROM RELATIVE FILES.
  763.  
  764. ╤ $0┼─) ┴ FILE THAT HAS A '*' IMMEDIATELY BEFORE THE FILETYPE IS CALLED
  765.         A _________ FILE.
  766.  
  767. ┴ $0┼─) A SPLAT FILE.  ╘HIS IS ITS CORRECT TERM, BELIEVE IT OR NOT.
  768.  
  769. ╤ $0┼┼) ╫E KNOW THE 1541 AND SIMILAR DRIVES HAVE 5 INTERNAL BUFFER AREAS, BUT
  770.         HOW MANY DOES AN 8050 DRIVE HAVE?
  771.  
  772. ┴ $0┼┼) ╙INCE THE 8050 HAS TWICE THE ON-BOARD ╥┴═ (4K┬), IT HAS 16 BUFFERS, BUT
  773.         ONLY 13 ARE AVAILABLE.  (┴LL ├┬═ DRIVES USE ONE BUFFER FOR ZERO-PAGE
  774.         MEMORY, ONE FOR STACK MEMORY, AND ONE FOR TEMPORARY VARIABLES.)
  775.  
  776. ╤ $0┼╞) ╧N A "SAVE-WITH-REPLACE", WHERE IS THE LOCATION OF THE FIRST TRACK AND
  777.         SECTOR OF THE NEW COPY OF THE PROGRAM SAVED IN THE DIRECTORY ENTRY FOR
  778.         THE OLD COPY?
  779.  
  780. ┴ $0┼╞) ╘HE NEW FIRST TRACK IS STORED AT LOCATION 26, AND THE NEW FIRST SECTOR
  781.         IS STORED AT LOCATION 27.  ╘HESE VALUES ARE COPIED TO THEIR
  782.         CORRECT LOCATIONS AFTER THE SAVE IS COMPLETED.
  783.  
  784.  
  785.    ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #16 FOR ═ARCH, 1995
  786.  
  787. ╤ $0╞0) ╫HAT SIZE MATRIX OF PIXELS COMPRISES A CHARACTER ON A ╨┼╘ 2001
  788.         COMPUTER?
  789.  
  790. ┴ $0╞0) ╘HE MATRIX WAS 8 BY 8.
  791.  
  792. ╤ $0╞1) ╚OW MANY BYTES DID THE OPENING SCREEN ON A ├┬═ 4016 SHOW AS
  793.         AVAILABLE FOR USE BY ┬┴╙╔├?
  794.  
  795. ┴ $0╞1) 15359 BYTES FREE.
  796.  
  797. ╤ $0╞2) ╘HE CHARACTER SET THAT PRODUCES UPPERCASE LETTERS ON UNSHIFTED KEYS
  798.         IS THE ________________ CHARACTER SET.
  799.  
  800. ┴ $0╞2) "STANDARD MODE".
  801.  
  802. ╤ $0╞3) ╘HE CHARACTER SET THAT PRODUCES LOWERCASE LETTERS ON UNSHIFTED KEYS
  803.         IS THE ________________ CHARACTER SET.
  804.  
  805. ┴ $0╞3) "ALTERNATE MODE"
  806.  
  807. ╤ $0╞4) ╘O GET TO THE SET MENTIONED IN $╞2, WHAT CHARACTER CODE WOULD BE
  808.         PRINTED TO THE SCREEN?
  809.  
  810. ┴ $0╞4) CHR$(142)
  811.  
  812. ╤ $0╞5) ╫HAT CHARACTER CODE WOULD ONE PRINT TO THE SCREEN TO INVOKE THE
  813.         CHARARACTER SET IN $╞3?
  814.  
  815. ┴ $0╞5) CHR$(14)
  816.  
  817. ╤ $0╞6) ╔F ONE DOES ╠╔╙╘ 60-100, WILL LINE 100 GET "LISTED"?
  818.  
  819. ┴ $0╞6) ┘ES.  ╘HE ABOVE TRANSLATES AS: ╠╔╙╘ 60 THROUGH TO AND INCLUDING 100.
  820.  
  821. ╤ $0╞7) ╘HE ABBREVIATION FOR THE ┬┴╙╔├ 4.0 COMMAND "├╧╠╠┼├╘" IS ________.
  822.  
  823. ┴ $0╞7) CO╠. "├" "╧" "╙╚╔╞╘-╠".  ╞OR THOSE WHO ARE INTERESTED, THE
  824.         ├╧╠╠┼├╘ COMMAND IS ANALOGOUS TO THE ╓┴╠╔─┴╘┼ OPERATION.
  825.  
  826. ╤ $0╞8) ╫HEN YOU USE A SUBSCRIPTED VARIABLE IN ┬┴╙╔├, HOW MANY ELEMENTS
  827.         ARE CREATED BY DEFAULT IF NO ─╔═ STATEMENT IS ISSUED?
  828.  
  829. ┴ $0╞8) 11 ELEMENTS.  ┴(0) - ┴(10).  ┴LMOST EVERYONE WHO HAS EVER PROGRAMMED
  830.         IN ├OMMODORE ┬┴╙╔├ HAS SEEN THE "┬┴─ ╙╒┬╙├╥╔╨╘" ERROR WHEN THEY TRY
  831.         TO USE THE 12TH ELEMENT IN A UN-─╔═ENSIONED ARRAY.
  832.  
  833. ╤ $0╞9) ╚OW LARGE IS THE KEYBOARD BUFFER IN ├┬═ COMPUTERS?
  834.  
  835. ┴ $0╞9) 10 BYTES.  ╙INCE THIS AREA COULD BE ╨╧╦┼D TO, MANY BOOT PROGRAMS
  836.         WOULD POKE CHARACTERS INTO THIS BUFFER TO SIMULATE KEYPRESSES.
  837.  
  838. ╤ $0╞┴) ╧N THE ├OMMODORE 1581, HOW LARGE IS A PHYSICAL SECTOR IN BYTES?
  839.  
  840. ┴ $0╞┴) ┴ PHYSICAL SECTOR IS 512 BYTES IN LENGTH.  ╔NTERNALLY, THE 1581
  841.         CREATES 2 256 "LOGICAL" SECTORS IN A PHYSICAL SECTOR, TO MAINTAIN
  842.         COMPATIBILITY WITH OLDER ├OMMODORE DRIVES.
  843.  
  844. ╤ $0╞┬) ┘OU'LL FIND ┬┴╙╔├ 3.5 ON THE _____________ LINE OF ├┬═ COMPUTERS.
  845.  
  846. ┴ $0╞┬) ╘HE ╪64 SERIES.  ╘HAT INCLUDES THE ├OMMODORE 16, THE ├OMMODORE 116,
  847.         AND THE ├OMMODORE ╨LUS/4.
  848.  
  849. ╤ $0╞├) ╧N THE ├OMMODORE 1351 MOUSE, WHAT REGISTERS IN THE ├OMMODORE
  850.         COMPUTER WOULD THE ╪ AND ┘ PROPORTIONAL INFORMATION BE READ
  851.         FROM?
  852.  
  853. ┴ $0╞├) ┼VEN THOUGH YOU ARE LOOKING FOR DIGITAL INFORMATION (HOW FAR THE
  854.         MOUSE HAS TRAVELED SINCE THE LAST MOVEMENT IN A PARTICULAR AXIS),
  855.         THE INFORMATION IS READ FROM THE "PADDLE" OR POTENTIOMETER (╨╧╘)
  856.         REGISTERS.  ╧N THE ├64, THE ╨╧╘ REGISTERS ARE PART OF THE ╙╔─
  857.         CHIP, AND ARE AT 54297 ($─419) FOR ╨╧╘╪, AND 54298 ($─41┴) FOR
  858.         ╨╧╘┘.
  859.  
  860. ╤ $0╞─) ╫HAT IS THE MAXIMUM SIZE OF A SEQUENTIAL FILE ON A 1581 DRIVE?
  861.  
  862. ┴ $0╞─) 802640 BYTES.
  863.  
  864. ╤ $0╞┼) ╫HAT FLAW EXISTS IN THE EARLY ├OMMODORE 1670 MODEMS?
  865.  
  866. ┴ $0╞┼) ╫HEN THE 1670 MODEM WAS FIRST INTRODUCED, IT POWERED UP IN AUTO-
  867.         ANSWER MODE, WHICH MEANS IT WOULD ANSWER INCOMING CALLS AFTER
  868.         THE PHONG RANG.  ┘OU COULD TURN THIS FEATURE OFF THROUGH SOFTWARE
  869.         CONTROL, BUT IF THE POWER WAS RESET, THE MODEM WOULD ANSWER THE
  870.         PHONE.  ╙O MANY PEOPLE COMPLAINED TO ├OMMODORE THAT ├┬═ REVISED
  871.         THE 1670 TO INCLUDE AN EXTRA ─╔╨ SWITCH THAT TURNED THIS FEATURE
  872.         OFF.
  873.  
  874. ╤ $0╞╞) ╫HAT IS THE MODEL NUMBER OF THE FIRST MODEM FOR THE ╓╔├ AND ├64?
  875.  
  876. ┴ $0╞╞) ╘HE 1600 MANUAL DIAL/MANUAL ANSWER 0-300 BPS MODEM.  ╘HE AUTHOR
  877.         OWNS ONE, AND USED IT FOR MANY YEARS.  ╘O OPERATE, YOU MUST USE
  878.         A PHONE WITH A DETACHABLE HANDSET CORD.  ┘OU DIALED THE NUMBER
  879.         ON THE PHONE, WAITED FOR THE ANSWER, UNPLUGGED THE HANDSET, AND
  880.         PLUGGED THE CORD INTO THE 1600.  ┴ SWITCH TOGGLED BETWEEN USING
  881.         ORIGINATE OR ANSWER FREQUENCIES.  ╘HE 1600 WAS MANUFACTURED BY
  882.         ┴NCHOR ┴UTOMATION FOR ├OMMODORE.  (┴S AN ASIDE, THIS UNIT CLAIMED
  883.         300 BPS, BUT ╔ NEVER COULD GET 300 TO WORK WELL.  ═OST OF MY
  884.         TELECOMMUNICATIONS HAPPENED AT 150 BPS.)
  885.  
  886.  
  887. -------├OMMODORE ╘RIVIA ┼DITION #17 ╤UESTIONS AND ┴NSWERS (┬┼╟╔╬)--------
  888.  
  889. ╤ $100) ╧N THE ═╧╙ ╘ECHNOLOGY'S ╦╔═-1, HOW MANY KEYS WERE ON THE KEYPAD?
  890.  
  891. ┴ $100) 23 KEYS.  ╘HE KEYPAD HAS ROOM FOR 24, BUT ONE SPOT IS TAKEN BY
  892.         A SWITCH THAT PUTS THE SYSTEM INTO SINGLE-STEP MODE.  ╔NTERESTINGLY,
  893.         SOME PICTURES HAVE THE SWITCH ON THE UPPER LEFT, SOME ON THE UPPER
  894.         RIGHT.
  895.  
  896. ╤ $101) ╘HE ╦╔═-1 KEYPAD HAD THE COMMON 0-9┴-╞ KEYS ON THE KEYPAD, BUT
  897.         ALSO HAD SOME SPECIAL KEYS.  ╬AME THEM.
  898.  
  899. ┴ $101) ╟╧ (╟O) ┼XECUTES AN INSTRUCTION AND DISPLAYS THE ADDRESS OF NEXT,
  900.         ╙╘ (╙TOP) ╙TOPS EXECUTION OF PROGRAM AND RETURN CONTROL TO MONITOR,
  901.         ╥╙ (╥ESET),
  902.         ┴─ (┴DDRESS) ┴DDRESS ENTRY MODE,
  903.         ─┴ (─ATA) ─ATA ENTRY MODE,
  904.         ╨├ (╨ROGRAM ├OUNTER) ─ISPLAYS AND RESTORES PROGRAM COUNTER TO VALUES
  905.                              IN ╨├╠ AND ╨├╚,
  906.         +  (╔NCREMENT) ╔NCREMENTS THE ADDRESS WITHOUT CHANGING THE ENTRY MODE.
  907.  
  908. ╤ $102) ╘HE ╦╔═-1 WAS A SET OF MODULES THAT COULD BE PLUGGED TOGETHER TO
  909.         EXPAND THE SYSTEM.  ┼ACH MODULE HAD A MODEL NUMBER.  ╫HAT WAS THE
  910.         MODEL NUMBER OF THE ╦╔═-1 MOTHERBOARD?
  911.  
  912. ┴ $102) ╘HE ╦╔═-4.
  913.  
  914. ╤ $103) ╧N THE 1525 LINE OF PRINTERS, IF YOU WANTED TO CREATE THE FOLLOWING
  915.         GRAPHIC, WHAT BYTES WOULD YOU SEND TO THE PRINTER AFTER TURNING ON
  916.         GRAPHICS MODE?
  917.  
  918.         ****
  919.         *  *
  920.         *  *
  921.         *  *
  922.         *  *
  923.         *  *
  924.         ****
  925.  
  926. ┴ $103) ╔ GUESS ╔ SHOULD HAVE STIPULATED THAT THIS IS A BITMAP.  ┴╙├╔╔ JUST
  927.         HAS A FEW LIMITATIONS.  ┴NYWAY, THE CORRECT BYTES TO SEND ARE:
  928.         255, 193, 193, 255.  ┘OU GOT THESE BY ASSIGNING EACH BIT IN A COLUMN
  929.         A VALUE, AND ADDING 128 TO THE RESULT FOR EACH COLUMN.
  930.  
  931. ╤ $104) ╫HAT IS THE HORIZONTAL RESOLUTION OF THE 1525 LINE OF PRINTERS?
  932.  
  933. ┴ $104) ├HARACTER RESOLUTION:   80 CHARS, OR 10 CHARS/INCH (CPI).
  934.         ╟RAPHICS RESOLUTION:    480 DOTS, OR 60 DOTS/INCH (DPI).
  935.  
  936. ╤ $105) ╧N ├OMMODORE DRIVES, EXPLAIN THE DIFFERENCE BETWEEN THE ┬-╥ COMMAND
  937.         AND THE ╒1 COMMAND.
  938.  
  939. ┴ $105) ╘HE TWO COMMANDS READ IN DATA FROM A DISK SECTOR.  ╚OWEVER, THE
  940.         ╒1 COMMAND ALWAYS READS A FULL SECTOR (255 BYTES).  ╘HE ┬-╥
  941.         COMMAND READS THE NUMBER OF BYTES SPECIFIED IN THE FIRST BYTE OF
  942.         THE SECTOR.  ╔F THE FIRST BYTE IS A 15, ┬-╥ WILL READ 15 BYTES
  943.         FROM THE SECTOR.  (╞ROM THE 1581 MANUAL)
  944.  
  945. ╤ $106) ╧N THE ├OMMODORE 1541 DRIVE, WHAT DOES THE ╒: COMMAND DO?
  946.  
  947. ┴ $106) ╘HIS COMMAND HAS BEEN TRADITIONALLY USED TO RESET ├OMMODORE DRIVES,
  948.         INCLUDING THE ├┬═ 1541.  ╚OWEVER, SOME EARLY VERSIONS OF THE ─RIVE
  949.         ─╧╙ DID NOT CORRECTLY HANDLE THIS COMMAND.  ╔N THESE VERSIONS, THE
  950.         DRIVE AND COMPUTER FAILED TO COMPLETE THE COMMAND TRANSACTION
  951.         SUCCESSFULLY, AND WHAT LOOKED LIKE A HUNG MACHINE RESULTED.
  952.         ├OMMODORE LATER FIXED THIS PROBLEM.  ╔F ╒: SEEMS TO NOT WORK ON
  953.         YOUR DRIVE, TRY ╒; INSTEAD.
  954.  
  955. ╤ $107) ╫HAT DOES THE FIRST ROUTINE IN THE 1541 DRIVE ╥╧═ ACTUALLY DO?
  956.  
  957. ┴ $107) ╘HE FUNCTION, CALLED ╙┼╘╠─┴ AND RESIDING AT $├100, TURNS ON THE
  958.         DRIVE ACTIVE ╠┼─ FOR THE CURRENT DRIVE.  ╘HE ROUTINE LOADS THE
  959.         CURRENT DRIVE FROM $7╞ AND SETS BIT 3 OF ─╙╦├╬╘ ($1├00).
  960.  
  961. ╤ $108) ╚OW MANY FILES WILL A 1581 DISK DRIVE HOLD?
  962.  
  963. ┴ $108) 296 FILES.  ╬OTE THAT IT IS NOT A MULTIPLE OF 144.
  964.  
  965. ╤ $109) ├OMMODORE 1581 DRIVES HAVE A SPECIAL "AUTOBOOT" FEATURE THAT ENABLES
  966.         THE DRIVE TO LOAD AND RUN A PROGRAM OFF A DISK UPON DRIVE BOOTUP.
  967.         ╫HAT IS THE REQUIRED NAME OF THE FILE?
  968.  
  969. ┴ $109) ├╧╨┘╥╔╟╚╘ ├┬═ 86
  970.  
  971. ╤ $10┴) ╫HAT FILETYPE MUST THE FILE MENTIONED IN $109 BE?
  972.  
  973. ┴ $10┴) ╒╙╥.
  974.  
  975. ╤ $10┬) ╘O POWER UP A 1351 MOUSE IN "JOYSTICK MODE", WHAT MUST THE USER DO?
  976.  
  977. ┴ $10┬) ╔F ONE DEPRESSES THE RIGHT MOUSE BUTTON DURING POWER-UP, THE 1351
  978.         WILL BEHAVE JUST LIKE A JOYSTICK.
  979.  
  980. ╤ $10├) ─ESCRIBE THE CONTENTS OF THE ╨╧╘╪ OR ╨╧╘┘ REGISTERS WHEN USING A
  981.         1351 MOUSE.
  982.  
  983. ┴ $10├) ┼ACH REGISTER HOLDS THE SAME TYPE OF INFORMATION, JUST FOR A
  984.         SEPARATE AXIS, SO WE WILL DESCRIBE JUST ONE REGISTER:
  985.  
  986.         ┬IT:   ╞UNCTION
  987.  
  988.         7      ─ON'T CARE
  989.         6-1    ═OUSE AXIS POSITION MOD 64.
  990.         0      ╬OISE ┬IT. (CHECK THIS BIT TO SEE WHETHER MOUSE HAS MOVED)
  991.  
  992. ╤ $10─) ├OMMODORE COMPUTERS TYPICALLY USE MOST OF ZERO PAGE FOR TEMPORARY
  993.         VARIABLES AND OTHER ITEMS.  ╚OWEVER, BOTH THE ╓╔├-20 AND THE 64
  994.         RESERVE 4 BYTES FOR USER PROGRAMS THAT NEED ZERO PAGE MEMORY.  ╫HERE
  995.         ARE THESE LOCATIONS?
  996.  
  997. ┴ $10─) $╞┬-$╞┼ (251-254).  ╔ AM NOT SURE THESE WERE "RESERVED" FOR
  998.         PROGRAMMERS AS MUCH AS THEY WERE JUST NOT UTILIZED BY THE
  999.         ├┬═ PROGRAMMERS.
  1000.  
  1001. ╤ $10┼) ╬AME THE 16 COLORS AVAILABLE ON THE 64.
  1002.  
  1003. ┴ $10┼) ┬LACK
  1004.         ╫HITE
  1005.         ╥ED
  1006.         ├YAN (╠IGHT ┬LUE-╟REEN)
  1007.         ╨URPLE
  1008.         ╟REEN
  1009.         ┬LUE
  1010.         ┘ELLOW
  1011.         ╧RANGE
  1012.         ┬ROWN
  1013.         ╠IGHT ╥ED
  1014.         ─ARK ╟RAY (╟RAY 1)
  1015.         ═EDIUM ╟REY (╟RAY 2)
  1016.         ╠IGHT ╟REEN
  1017.         ╠IGHT ┬LUE
  1018.         ╠IGHT ╟RAY (╟RAY 3)
  1019.  
  1020. ╤ $10╞) ┬OTH THE ╓╔├-20 AND THE ├64 EMULATE THE OPERATION OF THE 6551 ╒┴╥╘.
  1021.         ╚OW MANY "MOCK 6551" REGISTERS ARE MAPPED INTO THE MEMORY MAP?
  1022.  
  1023. ┴ $10╞) 5, FROM $293-$297 (659-663).  ╘HE REGISTER CONTENTS:
  1024.  
  1025.         $293   6551 ├ONTROL ╥EGISTER
  1026.         $294   6551 ├OMMAND ╥EGISTER
  1027.         $295-6 6551 ╒SER ─EFINED ┬AUD ╥ATE VALUE.
  1028.         $297   6551 ╙TATUS ╥EGISTER
  1029.  
  1030.  
  1031. ------------├OMMODORE ╘RIVIA ┼DITION #18 ╤UESTIONS (┬┼╟╔╬)--------------
  1032.  
  1033. ╤ $110) ╫HAT IS THE NAME OF THE COMPANY THAT RECENTLY PURCHASED THE
  1034.         LIQUIDATED ├OMMODORE ASSETS?
  1035.  
  1036. ╤ $111) ┴T ONE TIME, ├OMMODORE ATTEMPTED TO MANUFACTURE A DUAL DRIVE
  1037.         VERSION OF THE 1571 CALLED THE 1572.  ╞OR WHAT TECHNICAL REASON
  1038.         DID IT UTIMATELY FAIL?
  1039.  
  1040. ╤ $112) ╧VER WHAT COMPUTER SYSTEM DID A ╒SER ╟ROUP SUE ├OMMODORE AND WIN?
  1041.  
  1042. ╤ $113) ╔N $103, THE QUESTION ASKED HOW TO CREATE A GRAPHIC OF A SMALL BOX
  1043.         ON THE 1525.  ╔N THIS QUESRTION, WE HAVE MADE A DIFFERENT DESIGN.
  1044.         ╔F YOU WANTED TO CREATE THE FOLLOWING GRAPHIC USING INDIVIDUAL
  1045.         DOTS ON THE PRINTER, WHAT BYTES WOULD YOU SEND TO THE PRINTER AFTER
  1046.         TURNING ON GRAPHICS MODE?
  1047.  
  1048.          **     * *
  1049.         *       ***
  1050.         *   **  ***
  1051.         *   * * * *
  1052.          ** **  * *
  1053.             * *
  1054.             **
  1055.  
  1056. ╤ $114) (╙OME ├65 QUESTIONS)  ╚OW MANY ╙╔─ CHIPS DOES THE THE DEVELOPMENT
  1057.         ├OMMODORE 65 MACHINE CONTAIN?
  1058.  
  1059. ╤ $115) ╫HAT ├╨╒ DOES THE ├OMMODORE 65 USE?
  1060.  
  1061. ╤ $116) ╫HAT IS THE ALTERNATE NAME FOR THE ├OMMODORE 65?
  1062.  
  1063. ╤ $117) ╚OW MANY PROCESSORS DOES THE INTERNAL 1581-COMPATIBLE DRIVE
  1064.         ON THE ├65 CONTAIN?
  1065.  
  1066. ╤ $118) ╔N THE TRADITION OF NAMING CERTIAN ╔├S AFTER FAMOUS CARTOON
  1067.         CHARACTERS, ONE OF THE ╔├S IN THE ├65 IS NAMED AFTER A ╫ARNER
  1068.         ┬ROTHERS CARTOON CHARACTER.  ╫HICH ONE?
  1069.  
  1070. ╤ $119) ╫HAT VERSION OF ┬┴╙╔├ IS INCLUDED ON THE ├OMMODORE 65 IN ├65 MODE?
  1071.  
  1072. ╤ $11┴) ╚OW MANY ╔/╧ PORTS DOES A ├OMMODORE 65 CONTAIN?
  1073.  
  1074. ╤ $11┬) ╫HAT COMMON ├OMMODORE 64 ╔/╧ PORT DOES THE ├65 ╬╧╘ HAVE?
  1075.  
  1076. ╤ $11├) ╚OW MANY FUNCTION KEYS ARE ON A ├OMMODORE 65?
  1077.  
  1078. ╤ $11─) ╫HAT ├┬═ DISK DRIVE ─╧╙ WAS USED AS THE TEMPLATE FOR THE INTERNAL
  1079.         ├65 DRIVE ─╧╙?
  1080.  
  1081. ╤ $11┼) ╫HAT RESOLUTION OF TEXT SCREEN DOES THE ├65 POWER UP IN? (╨LEASE
  1082.         GIVE ANSWERS IN CHARACTERS).
  1083.  
  1084. ╤ $11╞) ╫HAT DISTINGUISHING NON-TEXTUAL CHARACTERISTIC IN THE ├65 IS NOT
  1085.         PRESENT IN OTHE ├OMMODORE 8-BIT COMPUTERS?
  1086.  
  1087. ╘HE INFORMATION IN THIS BETWEEN THE LINES MARKED BY (┬┼╟╔╬) AND (┼╬─)
  1088. IS COPYRIGHT 1995 BY ╩IM ┬RAIN.  ╨ROVIDED THAT THE INFORMATION
  1089. BETWEEN THE (┬┼╟╔╬) AND (┼╬─) LINES IS NOT CHANGED EXCEPT TO CORRECT
  1090. TYPOGRAPHICAL ERRORS, THE SO MARKED COPYRIGHTED INFORMATION MAY BE
  1091. REPRODUCED IN ITS ENTIRETY ON OTHER NETWORKS OR IN OTHER MEDIUMS.  ╞OR
  1092. MORE INFORMATION ABOUT USING THIS FILE, PLEASE CONTACT THE ADDRESS
  1093. SHOWN BELOW.
  1094.  
  1095. ╩IM ┬RAIN
  1096. BRAIN@MAIL.MSEN.COM
  1097. 602 ╬ORTH ╠EMEN
  1098. ╞ENTON, ═╔  48430
  1099. (810) 737-7300 X8528
  1100.  
  1101. ╙OME ARE EASY, SOME ARE HARD, TRY YOUR HAND AT:
  1102.     ├OMMODORE ╘RIVIA #18!
  1103. ========================================================================
  1104. ┬╞╠╔ - ╬EW GRAPHICS MODES 2
  1105. BY ╨ASI '┴LBERT' ╧JALA <ALBERT@CS.TUT.FI>
  1106.  
  1107. ╧NE DAY ╔ WAS WATCHING SOME DEMOS THAT USED LINECRUNCH ROUTINES FOR
  1108. WHOLE-SCREEN MULTICOLOR-GRAPHICS UPSCROLLERS.  ╔ ALREADY HAD MY
  1109. THEORIES ABOUT HOW AND WHY LINECRUNCH WORKED, BUT BECAUSE ╔ HAD NOT
  1110. USED IT ANYWHERE, THE DETAILS WERE A BIT VAGUE.  ╔N FACT, ╔ HAVE
  1111. MANY TIMES ACCIDENTALLY CREATED LINECRUNCH EFFECTS WHEN TRYING TO DO
  1112. SOMETHING ELSE WITH $─011.  ╨ROBABLY EVERY DEMO CODER HAS.
  1113.  
  1114. ┬UT YOU LEARN BY DOING.  ╔ HAD THE IDEA OF USING LINECRUNCH FOR ╞╠╔
  1115. INSTEAD OF A SIMPLE MULTICOLOR PICTURE AS IT ALWAYS SEEMED TO BE
  1116. USED.  ╚OWEVER, THIS HAS PROBABLY BEEN DONE BEFORE AND BECAUSE ╔
  1117. DON'T LIKE TO DO THINGS THAT HAVE BEEN DONE BEFORE, ╔ DECIDED TO USE
  1118. LINECRUNCH TO SHOW A TWO-SCREEN-TALL ╞╠╔ PICTURE.
  1119.  
  1120.  
  1121. _╠INECRUNCH ┬ASICS_
  1122.  
  1123. ╞OR THOSE NOT FAMILIAR WITH LINECRUNCH ROUTINES:  LINECRUNCH IS USED
  1124. TO SCROLL THE SCREEN ╒╨╫┴╥─╙ BY CONVINCING ╓╔├-╔╔ THAT IT HAS
  1125. ALREADY SHOWED MORE CHARACTER ROWS THAN IT IN REALITY HAS SHOWN.
  1126. ╙URPRISINGLY (OR THEN, MAYBE NOT :) THIS CONSISTS OF FIDDLING WITH
  1127. $─011.  ╘HE TIMING IS CRITICAL AS ALWAYS.
  1128.  
  1129. ╠INECRUNCH WORKS BY SETTING $─011 EQUAL THE LINE BEFORE THE CURRENT
  1130. LINE AND ╓╔├-╔╔ WILL HAPPILY THINK THAT IT IS TIME TO MOVE ON TO THE
  1131. NEXT CHARACTER ROW - ADD 40 TO THE VIDEO MATRIX COUNTER, 320 TO THE
  1132. GRAPHICS MEMORY COUNTER AND BE READY TO START A BAD LINE.  ╧R, MAYBE
  1133. '╬╧╘ TO GO BACK TO THE CURRENT ROW' WOULD BE A MORE SUITABLE
  1134. DESCRIPTION.  (╨ROGRAMMING ╓╔├-╔╔ IS SLOWLY BECOMING A SCIENCE.)
  1135.  
  1136. ╘HE REQUIRED TIMING ALSO DOES NOT CAUSE BAD LINES SO THAT YOU CAN
  1137. SKIP ANOTHER LINE IMMEDIATELY ON THE SUCCESSIVE LINE.  ╔N ADDITION,
  1138. LINES CAN BE SKIPPED ONLY AFTER THE FIRST CHARACTER ROW AND HALF OF
  1139. THE SECOND CHARACTER ROW HAVE BEEN DISPLAYED.  ╘HIS HAS SOMETHING TO
  1140. DO WITH THE WAY ╓╔├-╔╔ DECIDES WHEN THERE IS A BAD LINE.
  1141.  
  1142. ┬ECAUSE LINECRUNCH CAUSES ╓╔├-╔╔ TO SKIP ROWS, IT WILL RUN OUT OF
  1143. VIDEO MATRIX AND COLOR MEMORY (AND GRAPHICS MEMORY) BEFORE REACHING
  1144. THE END OF THE SCREEN.  ╚OWEVER, ╓╔├-╔╔ DOES NOT STOP DISPLAYING THE
  1145. GRAPHICS NOR DOES IT RESET THE INTERNAL COUNTERS.  ╘HE COUNTERS KEEP
  1146. ON RUNNING AND WRAP AROUND INSTEAD.
  1147.  
  1148. ╬ORMALLY, WHEN ╓╔├-╔╔ IS DISPLAYING THE LAST CHARACTER ROW, IT IS
  1149. SHOWING THE MEMORY FROM OFFSETS $3C0 TO $3E7.  ╔F ╓╔├-╔╔ HAS SKIPPED
  1150. ONE CHARACTER ROW, IT IS DISPLAYING FROM $3E8 TO $40F INSTEAD.  ┬UT,
  1151. THERE ARE ONLY 10 BITS FOR THE VIDEO MATRIX COUNTER (0..1023), SO IT
  1152. WRAPS AROUND TO ZERO AFTER $3FF.  ╘HIS MEANS THAT THE BEGINNING OF
  1153. THE VIDEO MATRIX IS DISPLAYED AT THE BOTTOM OF THE SCREEN.  ╘HE
  1154. CHARACTER ROWS BECOME SHIFTED BY 24 CHARACTER POSITIONS TO THE RIGHT
  1155. BECAUSE THERE WERE ORIGINALLY 24 UNUSED MEMORY LOCATIONS AT THE END
  1156. OF THE MEMORY (1000..1023).  (╘O BE HONEST, SPRITE IMAGE POINTERS
  1157. ARE NOT UNUSED MEMORY, BUT THEY ARE NOT USED WITH NORMAL ╞╠╔.)
  1158.  
  1159.          ____________________    ____________________
  1160.         ▄ABCDEFGHIJKLMNOPQRST▄  ▄ABCDEFGHIJKLMNOPQRST▄
  1161.         ▄                    ▄  ▄--------------------▄ <- ╙KIPPED ROW
  1162.         :                    :  :                    :
  1163.         :                    :  :                    :
  1164.         :                    :  :                    :
  1165.         ▄                    ▄  ▄NORMALLY LAST LINE  ▄
  1166.         ▄NORMALLY LAST LINE  ▄  ▄╪╪╪╪╪╪╪╪┌┌┌┌ABCDEFGH▄
  1167.         └--------------------'  └--------------------'
  1168.                                 ╪ = UNUSED MEM      (1000..1015)
  1169.                                 ┌ = SPRITE POINTERS (1016..1023)
  1170.  
  1171.         ╞IGURE 1: ╠INECRUNCH
  1172.  
  1173.  
  1174. ╘HE SAME THING HAPPENS FOR COLOR MEMORY BECAUSE IT USES THE SAME
  1175. COUNTER FOR ADDRESSING THE MEMORY (IN FACT, COLOR MEMORY ACCESS AND
  1176. CHARACTER DATA ACCESS ARE PERFORMED SIMULTANEOSLY, 12 BITS AT A
  1177. TIME).  ╘HE GRAPHICS MEMORY BEHAVES THE SAME WAY, EXCEPT THAT THE
  1178. COUNTER HAS THREE BITS MORE AND IT COUNTS AT EIGHT TIMES THE SPEED,
  1179. SO THAT IT WRAPS AT THE EXACT SAME TIME AS THE OTHER COUNTER.
  1180.  
  1181. ╘HE FIRST CHARACTER ROW CAN'T BE USED FOR LINECRUNCH AND THE SECOND
  1182. ONE IS ALSO LOST IN THE PROCESS.  ╘HE FIRST USABLE LINE TO DISPLAY
  1183. IS THE THIRD CHARACTER ROW.  ╚OWEVER, THOSE TWO LOST ROWS CAN STILL
  1184. BE USED AS AN EXTENSION AT THE END OF THE FIRST SCREEN.  ┘OU MUST
  1185. NOTICE, HOWEVER, THAT THE ALIGNMENT HAS BEEN CHANGED.  ┴FTER THESE
  1186. TWO ROWS HAVE BEEN DISPLAYED, THE VIDEO BANK IS SWITCHED TO GET NEW
  1187. FRESH DATA ON THE SCREEN.
  1188.  
  1189.  
  1190. _┬ACK TO ┬╞╠╔_
  1191.  
  1192. ╫RAPPED DATA IS NOTHING DIFFICULT TO WORK WITH.  ╔T IS JUST THE
  1193. MATTER OF WRITING THE RIGHT CONVERSION PROGRAM.  ┴LSO, THE NORMAL
  1194. ╞╠╔ ROUTINE CAN BE USED, WE JUST HAVE TO MAKE SURE ╓╔├ ALWAYS HAS
  1195. THE RIGHT BANK VISIBLE - SIMPLE ╠─┴ BANK,X:STA $──00 CAN ACCOMPLISH
  1196. THAT.  ╘HE MORE DIFFICULT ASPECT IS TO MAKE THE DISPLAY FREELY
  1197. LOCATABLE.  ╫E HAVE 32 KILOBYTES OF GRAPHICS DATA, THIS IS THE MAIN
  1198. REASON WE CAN'T EVEN THINK ABOUT USING COPYING.  ╠INECRUNCH COMBINED
  1199. WITH THE BAD LINE DELAYING TECHNIQUE WILL DO THE JOB MUCH MORE
  1200. NICELY.
  1201.  
  1202. ╞IGURE 2 SHOWS THE PRINCIPLES.  ╘O MAKE THINGS SIMPLER ╔ HAVE CHOSEN
  1203. LOCATION 0 TO MEAN THAT THE TOP OF THE PICTURE IS VISIBLE, 1 MEANS
  1204. THAT THE PICTURE IS SCROLLED ONE LINE UPWARDS AND SO ON.  ╫E CAN SEE
  1205. THAT LINECRUNCH IS NOT USED AT ALL FOR THE LOCATION 0.  ╘O MAKE THE
  1206. PICTURE START AT THE SAME POINT WHETHER LINECRUNCH HAS CRUNCHED
  1207. LINES OR NOT WE COMPENSATE THE NON-LOST RASTER LINES BY DELAYING THE
  1208. NEXT BAD LINE.  ╫HEN THE LOCATION IS N*8 (N=0,1,2..), THE SUM OF THE
  1209. LINECRUNCHED AND DELAYED LINES IS CONSTANT - THE GRAPHICS DISPLAY
  1210. ALWAYS STARTS AT THE SAME POINT.
  1211.  
  1212. ╘HEN HOW DO WE DEAL WITH THE LOCATION VALUES THAT ARE NOT EVENLY
  1213. DIVIDABLE BY EIGHT ?  ╬OW, LETS ASSUME THAT THE LOCATION IS ╠, AND
  1214. WE HAVE ├, WHICH IS THE LOCATION DIVIDED BY EIGHT (├ = ╠/8), AND ╥,
  1215. WHICH IS THE REMAINDER (╥ = ╠%8).  ╘O MAKE THE PICTURE SCROLL TO THE
  1216. RIGHT POSITION, WE NEED TO DELAY THE BAD LINE LESS THAN BEFORE - ╥
  1217. LINES LESS FOR LOCATION ╠ THAN FOR LOCATION ├*8.  ┼.G.  FOR LOCATION
  1218. 2 WE DELAY THE BAD LINE TWO LINES LESS THAN FOR LOCATION 0.  ╘HIS
  1219. ALSO SHOWS THAT WE NEED 7 LINES MORE THAN IS NEEDED FOR TO
  1220. COMPENSATE FOR THE LINECRUNCH.
  1221.  
  1222. ─ETERMINING THE NUMBER OF LINECRUNCH LINES IS A RECURSIVE PROCESS,
  1223. BECAUSE WHEN YOU USE MORE LINECRUNCH LINES, THAT DECREASES THE
  1224. NUMBER OF LINES YOU HAVE AVAILABLE FOR THE DISPLAY AND YOU NEED
  1225. BIGGER RANGE FOR THE LOCATION VALUE.  ╘HE LINECRUNCH CAN BE STARTED
  1226. AFTER 12 LINES, AND WE NEED AT LEAST 7 LINES TO USE THE SOFT
  1227. Y-SCROLL.  ╘HIS MAKES 181 LINES AVAILABLE FOR THE DISPLAY
  1228. ORIGINALLY.
  1229.  
  1230. ┬ECAUSE WE NEED TO SHOW 400 LINES OF GRAPHICS, WE WOULD NEED
  1231. (400-181)/8=28 LINECRUNCH LINES.  ╚OWEVER, THIS IN TURN REDUCES THE
  1232. NUMBER OF LINES WE HAVE FOR GRAPHICS TO 181-28=153 AND WE NEED
  1233. (400-153)/8=31 LINECRUNCH LINES.  ┴GAIN, 181-31 IS 150.  ╫E GET
  1234. (400-150)/8=32 AND THERE IT FINALLY CONVERGES AND WE HAVE 149 LINES
  1235. FOR GRAPHICS, WHICH MAKES LOCATION VALUES 0..251 VALID.
  1236.  
  1237.  
  1238. ╠OCATION        0       1       2  ..   8       9  ..   251
  1239.  
  1240.                 ___________________..   ___________..   ________
  1241.                 ___________________..   ___________..   ________
  1242. ╠INECRUNCH      -------------------..   ___________..
  1243.                 ^       ^       ^
  1244.                 ▄       ▄       ▄       ^       ^
  1245.                 ▄       ▄       ▄       ▄       ▄
  1246. ┬AD LINE DELAYED▄       ▄       ▄       ▄       ▄
  1247.                 ▄       ▄       ▄       ▄       ▄       ========
  1248.                 ▄       ▄       V       ▄       ▄       244
  1249.                 ▄       V       ___..   ▄       V       :
  1250.                 V       ________0       V       ___..   :
  1251. ╟FX ┼NABLED     ________0_______1__..   ________8__..   250_____
  1252.                 0       1       2       8       9       251
  1253.                 1       2       3       9       10      252
  1254.                 2       3       4       10      11      253
  1255.                 3       4       5       11      12      254
  1256.                 4       5       6       12      13      255
  1257.                 5       6       7       13      14      256
  1258.                 6       7       8       14      15      257
  1259.                 7       8       9       15      16      258
  1260.                 :       :       :       :       :       :
  1261.                 :       :       :       :       :       :
  1262.                 148     149     150..   156     157..   399
  1263.  
  1264.         ╞IGURE 2: ╠INECRUNCH AND ─═┴ DELAY IN ┬╞╠╔
  1265.                   (╟RAPHICS LINES NOT IN SCALE)
  1266.  
  1267.  
  1268. _├LIPPING ADDED_
  1269.  
  1270. ╬OW WE CAN SCROLL THE PICTURE TO ANY LOCATION WE WANT, BUT THE TOP
  1271. OF THE PICTURE IS NOT CLIPPED AND IT IS VERY ANNOYING TO WATCH.  ╫E
  1272. NEED TO ENABLE THE GRAPHICS AT THE SAME POINT REGARDLESS OF THE
  1273. Y-SCROLL VALUE.  ╘HE ANSWER IS IN THE EXTENDED COLOR MODE (┼├═).
  1274.  
  1275. ╫HEN BOTH ┼├═ AND MULTICOLOR MODE (═├═) ARE SELECTED, ╓╔├-╔╔ WILL
  1276. TURN THE DISPLAY TO BLACK.  ╘HIS IS BECAUSE THERE IS A CONFLICTING
  1277. SITUATION AND IT JUST CAN'T DECIDE WHICH COLOR SCHEME TO USE.  ╘HE
  1278. VIDEO ACCESSES WILL CONTINUE TO HAPPEN JUST LIKE BEFORE, THE DATA IS
  1279. JUST NOT DISPLAYED.  ╫HEN THE ┼├═ BIT IS CLEARED AGAIN, THE NORMAL
  1280. MULTICOLOR GRAPHICS IS SHOWN.
  1281.  
  1282. ╙O, WE SET THE ┼├═ BIT AND START TO DISPLAY THE FIRST EIGHT LINES OF
  1283. THE ╞╠╔.  ┬ECAUSE THE ╞╠╔ ROUTINE ALREADY WRITES TO $─011, WE JUST
  1284. MAKE SURE THE ┼├═ BIT IS SET IN THE FIRST ╥ NUMBER OF WRITES TO
  1285. $─011 AND ZERO IN ALL OTHER.
  1286.  
  1287. ╘HE VIEWER IS NOW 'COMPLETE'.  ┘OU CAN TAKE A LOOK AT THE CODE BELOW
  1288. OR YOU CAN GET ├64╟FX1_4.LHA AND SEE IT IN ACTION YOURSELF AND NOT
  1289. JUST RELY ON MY WORD.  ╘HE PACKAGE INCLUDES CONVERTER PROGRAMS FOR
  1290. ┬╞╠╔, ╞╠╔ AND ╦OALA (┴╬╙╔-├), COUPLE OF EXAMPLE PICTURES AND VIEWERS
  1291. FOR ╨┴╠ AND ╬╘╙├ MACHINES.
  1292.  
  1293. -╨ASI '┴LBERT' ╧JALA    ALBERT@CS.TUT.FI
  1294.  
  1295. --------------------------------------------------------------------------
  1296.  
  1297. ┬╞╠╔ VIEWER PROGRAM FOR ╨┴╠ MACHINES
  1298.  
  1299. ╒╨╧╙   = $├00   ; TEMPORARY AREA FOR TABLES
  1300. ┬┴╬╦   = $─00   ;  ╒╨╧╙ FOR LINECRUNCH, ┬┴╬╦ FOR ╞╠╔ BANK SELECT
  1301. ╥┴╙╘┼╥ = 29     ; WHERE TO POSITION THE SPRITE -> ╔╥╤ 20 LINES LATER
  1302. ─╒══┘  = $╞╞╞   ; DUMMY LOCATION FOR TIMING PURPOSES
  1303. ╞╠╔╙┌  = 19-1   ; VISIBLE ╞╠╔ SIZE IN CHARACTER ROWS - 1
  1304.  
  1305. *= $810
  1306.         ╙┼╔
  1307.         ╠─┴ #$7╞:╙╘┴ $─├0─      ; ╔╥╤ SETUP
  1308.         ╠─┴ #1:╙╘┴ $─01┴
  1309.         ╙╘┴ $─015:╙╘┴ ╦┼┘╫+1
  1310.         ╠─┴ #<╔╥╤:╙╘┴ $314
  1311.         ╠─┴ #>╔╥╤:╙╘┴ $315
  1312.         ╠─┴ #╥┴╙╘┼╥:╙╘┴ $─001:├╠├:┴─├ #20:╙╘┴ $─012
  1313.         ╠─┴ #0:╙╘┴ $─017
  1314.         ╠─┴ #0:╙╘┴ 2
  1315.         ╩╙╥ ╬┼╫╨╧╙              ; ╔NIT THE ╞╠╔ ROUTINES
  1316.         ╠─┴ #$┴:╙╘┴ $─011       ; ┬LANK SCREEN
  1317.         ╠─╪ #23                 ; ╔NIT TABLES
  1318. ┬╠╧╧╨   ╠─┴ #$94:╙╘┴ ┬┴╬╦,╪
  1319.         ╠─┴ #$96:╙╘┴ ┬┴╬╦+24,╪
  1320.         ─┼╪:┬╨╠ ┬╠╧╧╨
  1321.         ╠─╪ #15
  1322. ╠╧╧╨0   ╠─┴ ┘╔╬╔╘,╪:┴╬─ #$77    ; ├HANGE TO $37 TO BETTER SEE THE
  1323.         ╙╘┴ ╒╨╧╙,╪              ;  WORKINGS OF THE ROUTINES
  1324.         ╙╘┴ ╒╨╧╙+16,╪
  1325.         ╙╘┴ ╒╨╧╙+32,╪
  1326.         ─┼╪:┬╨╠ ╠╧╧╨0
  1327.  
  1328.         ╠─┴ #$34:╙╘┴ 1          ; ├OPY TO THE LAST VIDEO BANK
  1329.         ╠─┴ #$80:╙╘┴ ╙╥├+2      ; FROM $8000-$┬╞╞╞ TO $├000-$╞╞╞╞
  1330.         ╠─┴ #$├0:╙╘┴ ─╙╘+2
  1331.         ╠─╪ #0:╠─┘ #$40
  1332. ╙╥├     ╠─┴ $8000,╪
  1333. ─╙╘     ╙╘┴ $├000,╪
  1334.         ╔╬╪:┬╬┼ ╙╥├
  1335.         ╔╬├ ╙╥├+2:╔╬├ ─╙╘+2
  1336.         ─┼┘:┬╬┼ ╙╥├
  1337.         ╠─┴ #$37:╙╘┴ 1
  1338.  
  1339.         ╠─╪ #0                  ; ╔NIT COLOR MEMORY
  1340. ╠╨      ╠─┴ $3├00,╪:╙╘┴ $─800,╪ ; ┴LL 1024 BYTES ARE USED
  1341.         ╠─┴ $3─00,╪:╙╘┴ $─900,╪ ;  - SOME EVEN TWICE!
  1342.         ╠─┴ $3┼00,╪:╙╘┴ $─┴00,╪
  1343.         ╠─┴ $3╞00,╪:╙╘┴ $─┬00,╪
  1344.         ╔╬╪:┬╬┼ ╠╨
  1345.         ╠─┴ $─├0─:├╠╔
  1346.  
  1347. ╦┼┘╫    ╠─╪ #0:┬╬┼ ╦┼┘╫         ; ╫AIT FOR SPACE TO BE PRESSED
  1348.         ╙┼╔                     ; ╙YSTEM TO NORMAL
  1349.         ╠─┴ #$37:╙╘┴ 1
  1350.         ╩╙╥ $╞─┴3
  1351.         ╠─┴ #$97:╙╘┴ $──00
  1352.         ╩╙╥ $┼5┴0
  1353.         ╠─┘ #3
  1354. ╔╥╤╠    ╠─┴ $╞─30,┘:╙╘┴ $314,┘
  1355.         ─┼┘:┬╨╠ ╔╥╤╠
  1356.  
  1357.         ╠─╪ #0:╠─┴ #1           ; ├LEAR COLOR MEMORY
  1358. ├╠╠     ╙╘┴ $─800,╪:╙╘┴ $─900,╪
  1359.         ╙╘┴ $─┴00,╪:╙╘┴ $─┬00,╪
  1360.         ╔╬╪:┬╬┼ ├╠╠
  1361.         ├╠╔:╥╘╙
  1362.  
  1363. ┘╔╬╔╘   ┬┘╘ $78,$79,$7┴,$7┬,$7├,$7─,$7┼,$7╞
  1364.         ┬┘╘ $78,$79,$7┴,$7┬,$7├,$7─,$7┼,$7╞
  1365.  
  1366. *=*-<*+256
  1367.  
  1368. ╔╥╤     ╠─┴ #$18:╙╘┴ $─016:╠─╪ #0:╠─┴ #$5┴
  1369.         ╔╬├ ─╒══┘:─┼├ ─╒══┘             ; ╙YNCHRONIZATION
  1370.         ╙╘╪ $─020:╙╘╪ $─021:╙╘┴ $─011
  1371.  
  1372.         ╠─┴ #$15:╙╘┴ $─018
  1373.         ╠─┴ #$97:╙╘┴ $──00
  1374.         ╠─╪ #44                 ; ╫AIT FOR THE 4TH LINE
  1375. ╠╠      ─┼╪:┬╨╠ ╠╠:╬╧╨
  1376.         ╠─╪ #0
  1377.  
  1378. ╠╧╧╨3   ╬╧╨                     ; ╠INECRUNCH-PART ROUTINE
  1379.         ╠─┴ ╒╨╧╙+6,╪:╔╬├ ─╒══┘:╙╘┴ $─011
  1380.         ╬╧╨:╬╧╨:╔╬├ ─╒══┘
  1381.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1382.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1383.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1384.         ╔╬╪
  1385. ┼1      ├╨╪ #$10:┬╬┼ ╠╧╧╨3      ; ╙KIP THAT MANY CHARACTER ROWS-4
  1386.         ┬╔╘ $┼┴
  1387. ╠╧╧╨4   ╠─┴ ╒╨╧╙,╪:╔╬├ ─╒══┘:╙╘┴ $─011
  1388.         ╬╧╨:╬╧╨:╬╧╨:╔╬├ ─╒══┘
  1389.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1390.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1391.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨:╠─┴ #0
  1392.         ╔╬╪
  1393. ┼2      ├╨╪ #$1╞:┬╬┼ ╠╧╧╨4      ; ─ELAY ─═┴ UNTIL WE ARE AT THE
  1394.                                 ;  'SAME PLACE' EACH TIME
  1395.  
  1396.         ╠─┴ #0:╙╘┴ $─020        ; ╬OW WAIT FOR THE BAD LINE AND START ╞╠╔
  1397.         ┬╔╘ $┼┴:╬╧╨
  1398.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1399.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1400.         ╬╧╨:╬╧╨:╬╧╨:╬╧╨
  1401. ┬0      ╠─┴ #$92:╙╘┴ $──00:╬╧╨  ; ╘HE RIGHT VIDEO BANK
  1402.  
  1403.         ; ╫AIT FOR 0-7 LINES TO SET THE ┼├═ MODE OFF
  1404.         ;  (MAKES THE GRAPHICS VISIBLE)
  1405.  
  1406. ╞0      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$08:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1407. ╞1      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$18:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1408. ╞2      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$28:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1409. ╞3      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$38:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1410. ╞4      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$48:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1411. ╞5      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$58:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1412. ╞6      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$68:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1413. ╞7      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$78:╙╘┴ $─018
  1414.         ╠─╪ #╞╠╔╙┌:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1415.  
  1416.         ; ─O ╞╠╔ 18 MORE CHARACTER ROWS
  1417.  
  1418. ╞8      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$08:╙╘┴ $─018
  1419. ┬1      ╠─┴ ┬┴╬╦,╪:╙╘┴ $──00:┬╔╘ $┼┴
  1420. ╞9      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$18:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1421. ╞┴      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$28:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1422. ╞┬      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$38:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1423. ╞├      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$48:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1424. ╞─      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$58:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1425. ╞┼      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$68:╙╘┴ $─018:╬╧╨:╬╧╨:╬╧╨:╬╧╨:┬╔╘ $┼┴
  1426. ╞╞      ╠─┴ #0:╙╘┴ $─011:╠─┴ #$78:╙╘┴ $─018:╬╧╨:╬╧╨:─┼╪:┬═╔ ┼╞╠╔:╩═╨ ╞8
  1427. ┼╞╠╔    ╬╧╨
  1428.         ╠─┴ #$╞├
  1429. ╫╠      ├═╨ $─012:┬╬┼ ╫╠
  1430.         ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘
  1431.         ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘:╔╬├ ─╒══┘
  1432.          ╔╬├ ─╒══┘:╔╬├ ─╒══┘:╙╘┴ $─020
  1433.  
  1434.         ╩╙╥ ╬┼╫╨╧╙      ; ╒PDATE THE LOCATION
  1435.         ╩╙╥ ├╚╨╧╙       ; ├HANGE TO A NEW LOCATION
  1436.         ╠─┴ $─├01:┴╬─ #$10:┬╬┼ ╧╓3      ; ├HECK FOR THE SPACE BAR
  1437.         ╠─┴ #0:╙╘┴ ╦┼┘╫+1
  1438. ╧╓3     ╠─╪ #$53:╙╘╪ $─011:╔╬├ $─019:╩═╨ $┼┴81
  1439.  
  1440. ╬┼╫╨╧╙  ╠─┴ #0          ; ╔NIT THE ╔╥╤ ROUTINE FOR THIS POSITION
  1441.         ╠╙╥:╠╙╥:╠╙╥:├╠├:┴─├ #4:╙╘┴ ┼1+1
  1442.         ╠─┴ #7:╙┼├:╙┬├ ╬┼╫╨╧╙+1:┴╬─ #7:╘┴╪:╘┴┘:├╠├:┴─├ #35:╙╘┴ ┼2+1
  1443.         ╠─┴ ╒╨╧╙+3+7,┘:─┼╪:┬═╔ ╩0:┴╬─ #$3╞
  1444. ╩0      ╙╘┴ ╞7+1:┴╬─ #$3╞:╙╘┴ ╞╞+1
  1445.         ╠─┴ ╒╨╧╙+3+6,┘:─┼╪:┬═╔ ╩1:┴╬─ #$3╞
  1446. ╩1      ╙╘┴ ╞6+1:┴╬─ #$3╞:╙╘┴ ╞┼+1
  1447.         ╠─┴ ╒╨╧╙+3+5,┘:─┼╪:┬═╔ ╩2:┴╬─ #$3╞
  1448. ╩2      ╙╘┴ ╞5+1:┴╬─ #$3╞:╙╘┴ ╞─+1
  1449.         ╠─┴ ╒╨╧╙+3+4,┘:─┼╪:┬═╔ ╩3:┴╬─ #$3╞
  1450. ╩3      ╙╘┴ ╞4+1:┴╬─ #$3╞:╙╘┴ ╞├+1
  1451.         ╠─┴ ╒╨╧╙+3+3,┘:─┼╪:┬═╔ ╩4:┴╬─ #$3╞
  1452. ╩4      ╙╘┴ ╞3+1:┴╬─ #$3╞:╙╘┴ ╞┬+1
  1453.         ╠─┴ ╒╨╧╙+3+2,┘:─┼╪:┬═╔ ╩5:┴╬─ #$3╞
  1454. ╩5      ╙╘┴ ╞2+1:┴╬─ #$3╞:╙╘┴ ╞┴+1
  1455.         ╠─┴ ╒╨╧╙+3+1,┘:─┼╪:┬═╔ ╩6:┴╬─ #$3╞
  1456. ╩6      ╙╘┴ ╞1+1:┴╬─ #$3╞:╙╘┴ ╞9+1
  1457.         ╠─┴ ╒╨╧╙+3+0,┘:─┼╪:┬═╔ ╩7:┴╬─ #$3╞
  1458. ╩7      ╙╘┴ ╞0+1:┴╬─ #$3╞:╙╘┴ ╞8+1
  1459.         ╠─┴ #$96:╙╘┴ ┬0+1:╠─┴ #199:╙┼├:╙┬├ ╬┼╫╨╧╙+1:┬├├ ╧╓2
  1460.         ╠╙╥:╠╙╥:╠╙╥:├╠├:┴─├ #5:╙╘┴ ┬1+1
  1461.         ╥╘╙
  1462. ╧╓2     ╠─┴ #0:╙╘┴ ┬1+1:╠─╪ #$94:╙╘╪ ┬0+1:╥╘╙
  1463.  
  1464. ├╚╨╧╙   ╠─╪ ╬┼╫╨╧╙+1
  1465.         ╠─┴ $─├00:╘┴┘           ; ╟ET JOYSTICK
  1466.         ┴╬─ #$10:┬╬┼ ─╔╥        ; ╔F NO BUTTON PRESSED
  1467.         ╘┘┴:┴╬─ #1:┬┼╤ ╒╨       ; ╔F JOY UP
  1468.         ╘┘┴:┴╬─ #2:┬┼╤ ─╧╫╬     ; ╔F JOY DOWN
  1469.         ╥╘╙
  1470. ─╔╥     ╠─┴ #0:┬┼╤ ╒╨
  1471. ─╧╫╬    ─┼╪:├╨╪ #$╞╞:┬╬┼ ─╧╦
  1472.         ╠─╪ #0:╙╘╪ ─╔╥+1        ; ├HANGE DIRECTION
  1473. ─╧╦     ╙╘╪ ╬┼╫╨╧╙+1:╥╘╙
  1474. ╒╨      ╔╬╪:├╨╪ #$╞─:┬├├ ╒╧╦    ; 251(LOCATIONS)+149(VISIBLE)=400
  1475.         ╠─╪ #$╞├:╙╘╪ ─╔╥+1      ; ├HANGE DIRECTION
  1476. ╒╧╦     ╙╘╪ ╬┼╫╨╧╙+1:╥╘╙
  1477.  
  1478.  
  1479. --------------------------------------------------------------------------
  1480.  
  1481. ╘HE ┬╞╠╔ FILE FORMAT:
  1482.  
  1483.                         ╞ILE            ┬╞╠╔ ─ISPLAY
  1484.         ╠INES           ╧FFSET          ╧FFSET          ╠INES     ╙IZE
  1485. ├OLORS  0-1.3           0..55           944..999        22.7-24   56
  1486.   ╔     1.3-2           56..79          -                         24
  1487.         2-24            80..999         0..919          0-22      920
  1488.         24-24.7         1000..1023      920..943        22-22.7   24
  1489.  
  1490.   ╔╔    0-1.3           0..55           1968..2024      49.3-50.6 56
  1491.         1.3-24.7        56..1023        1000..1967      24-49.3   968
  1492.  
  1493.  
  1494. ╟FX     0-1.3           0..447          7552..7999      22.7-24   448
  1495.   ╔     1.3-2           448..639        -                         192
  1496.         2-24            640..7999       0..7359         0-22      7360
  1497.         24-24.7         8000..8191      7360..7551      22-22.7   192
  1498.  
  1499.   ╔╔    0-1.3           0..447          15744..16192    49.3-50.6 448
  1500.         1.3-24.7        448..8191       8000..15743     24-49.3   7744
  1501.  
  1502. ========================================================================
  1503. ═AKING STABLE RASTER ROUTINES (├64 AND ╓╔├-20)
  1504. BY ═ARKO ═AKELA (═ARKO.═AKELA@╚╒╘.╞╔)
  1505.  
  1506. ╨REFACE
  1507.  
  1508. ╘OO MANY GRAPHICAL EFFECTS, ALSO CALLED RASTER EFFECTS, HAVE BEEN
  1509. CODED IN A VERY SLOPPY WAY.  ╞OR INSTANCE, IF THERE ARE ANY COLOR BARS
  1510. ON THE SCREEN IN A GAME OR DEMO, THE COLORS OFTEN JITTER A BIT,
  1511. E.G. THEY ARE NOT STABLE.  ┴ND ALSO, IT IS FAR TOO EASY TO MAKE
  1512. VIRTUALLY ANY DEMO CRASH BY HITTING THE ╥ESTORE KEY, OR AT LEAST CAUSE
  1513. VISUAL DISTORTIONS ON THE SCREEN.
  1514.  
  1515. ┴S LATE AS A YEAR AGO ╔ STILL HADN'T CODED A STABLE RASTER INTERRUPT
  1516. ROUTINE MYSELF.  ┬UT THEN ╔ HAD TO DO IT, SINCE ╔ WAS RESEARCHING THE
  1517. VIDEO CHIP TIMING DETAILS TOGETHER WITH MY ╟ERMAN FRIEND ┴NDREAS
  1518. ┬OOSE.  ╔T WAS ASHAMING THAT WE HAD THE SAME LEVEL OF KNOWLEDGE WHEN
  1519. IT CAME TO THE HARDWARE, BUT HE WAS THE ONLY OF US WHO HAD WRITTEN A
  1520. STABLE RASTER ROUTINE.  ╫ELL, FINALLY ╔ MADE ME TO START CODING.  ╔
  1521. USED THE SAME DOUBLE-INTERRUPT IDEA AS ┴NDREAS USED IN HIS ROUTINE.
  1522.  
  1523. ┴FTER A COUPLE OF ERRORS MY ROUTINE WORKED, AND ╔ UNDERSTOOD HOW IT
  1524. WORKS EXACTLY.  (╘HIS IS SOMETHING THAT SEPARATES US NORMAL CODERS
  1525. FROM DEMO PEOPLE: ╘HEY OFTEN CODE BY INSTINCT; BY PATCHING THE ROUTINE
  1526. UNTIL IT WORKS, WITHOUT KNOWING EXACTLY WHAT IS HAPPENING.  ╘HAT'S WHY
  1527. DEMOS OFTEN RELY ON WEIRD THINGS, LIKE CRASH IF THE MEMORY IS NOT
  1528. INITIALIZED PROPERLY.)
  1529.  
  1530. ╔N THIS ARTICLE, ╔ DOCUMENT TWO METHODS OF CREATING STABLE RASTER
  1531. ROUTINES ON ├OMMODORE COMPUTERS.  ╘HE PRINCIPLES APPLY FOR MOST 8-BIT
  1532. COMPUTERS, NOT ONLY ├OMMODORES, BUT RASTER EFFECTS ARE VERY RARELY
  1533. SEEN ON OTHER COMPUTERS.
  1534.  
  1535.  
  1536. ┬ACKGROUND
  1537.  
  1538. ╫HAT ARE RASTER EFFECTS?  ╘HEY ARE EFFECTS, WHERE YOU CHANGE THE
  1539. SCREEN APPEARANCE WHILE IT IS BEING DRAWN.  ╞OR INSTANCE, YOU CAN SET
  1540. THE SCREEN COLOR TO WHITE IN THE TOP OF THE SCREEN, AND TO BLACK IN
  1541. THE MIDDLE OF THE SCREEN.  ╔N THAT WAY, YOU WILL GET A PICTURE WHOSE
  1542. TOP HALF IS WHITE AND BOTTOM HALF BLACK.  ╬ORMALLY SUCH EFFECTS ARE
  1543. IMPLEMENTED WITH INTERRUPT ROUTINES THAT ARE EXECUTED SYNCHRONIZED
  1544. WITH THE SCREEN REFRESH.
  1545.  
  1546. ╘HE VIDEO CHIP ON THE ├OMMODORE 64 AND MANY OTHER VIDEOCHIPS HAVE A
  1547. SPECIAL INTERRUPT FEATURE CALLED THE ╥ASTER INTERRUPT.  ╔T WILL
  1548. GENERATE AN ╔╥╤ IN THE BEGINNING OF A SPECIFIED RASTER LINE.  ╧N OTHER
  1549. COMPUTERS, LIKE THE ╓╔├-20, THERE IS NO ╥ASTER INTERRUPT, BUT YOU CAN
  1550. GENERATE THE INTERRUPTS WITH A TIMER, PROVIDED THAT THE TIMER AND THE
  1551. VIDEOCHIP ARE CLOCKED FROM THE SAME SOURCE.
  1552.  
  1553. ┼VEN IF THE PROCESSOR GETS AN INTERRUPT SIGNAL AT THE SAME POSITION ON
  1554. EACH VIDEO FRAME, IT WON'T ALWAYS BE EXECUTING THE FIRST INSTRUCTION
  1555. OF THE INTERRUPT ROUTINE AT THE SAME SCREEN POSITION.  ╘HE ╬═╧╙ 6502
  1556. MACHINE INSTRUCTIONS CAN TAKE 2 TO 9 MACHINE CYCLES TO EXECUTE, AND IF
  1557. THE MAIN PROGRAM CONTAINS INSTRUCTIONS OF VERY VARYING LENGTHS, THE
  1558. BEGINNING POSITION OF THE INTERRUPT CAN JUMP BETWEEN 7 DIFFERENT
  1559. POSITIONS.  ╘HIS IS WHY YOU NEED TO SYNCHRONIZE THE RASTER ROUTINE
  1560. WHEN DOING SERIOUS EFFECTS.
  1561.  
  1562. ┴LSO, EXECUTING THE INTERRUPT SEQUENCE WILL TAKE 7 ADDITIONAL CYCLES,
  1563. AND THE INTERRUPT SEQUENCE WILL ONLY START AFTER THE CURRENT
  1564. INSTRUCTION IF THE INTERRUPT ARRIVED AT LEAST TWO CYCLES BEFORE THE
  1565. END OF THE CURRENT INSTRUCTION.  ╔T IS EVEN POSSIBLE THAT AN INTERRUPT
  1566. ARRIVES WHILE INTERRUPTS ARE DISABLED AND THE PROCESSOR IS JUST
  1567. STARTING TO EXECUTE A ├╠╔ INSTRUCTION.  ┴LAS, THE PROCESSOR WILL NOT
  1568. JUMP TO THE INTERRUPT RIGHT AFTER THE ├╠╔, BUT IT WILL EXECUTE THE
  1569. NEXT INSTRUCTION BEFORE JUMPING TO IT.  ╘HIS IS NATURAL, SINCE THE ├╠╔
  1570. TAKES ONLY TWO CYCLES.  ┬UT ANYWAY, THIS IS ONLY A CONSTANT IN OUR
  1571. EQUATION, AND ACTUALLY OUT OF THE SCOPE OF THIS ARTICLE.
  1572.  
  1573. ╚OW TO SYNCHRONIZE A RASTER INTERRUPT ROUTINE?  ╘HE ONLY WAY IS TO
  1574. CHECK THE CURRENT SCREEN POSITION AND DELAY APPROPRIATELY MANY CYCLES.
  1575. ╘HERE ARE SEVERAL WAYS OF DOING THIS, SOME OF WHICH ARE VERY AWFUL AND
  1576. INEFFICIENT.  ╘HE UGLIEST WAYS OF DOING THIS ON THE ├OMMODORE 64 ╔
  1577. KNOW ARE BUSY-WAITING SEVERAL RASTER LINES AND POLLING THE RASTER LINE
  1578. VALUE, OR USING THE ╠IGHT PEN FEATURE, WHICH WILL FAIL IF THE USER
  1579. PRESSES THE FIRE BUTTON ON ╩OYSTICK PORT 1.  ╚ERE ╔ WILL PRESENT TWO
  1580. WAYS, BOTH VERY ELEGANT IN MY OPINION.
  1581.  
  1582.  
  1583. ╒SING AN AUXILIARY TIMER
  1584.  
  1585. ╧N THE ╓╔├-20, THERE IS NO ╥ASTER INTERRUPT FEATURE IN THE VIDEO CHIP.
  1586. ┴LL YOU CAN DO IS TO USE A TIMER FOR GENERATING RASTER INTERRUPTS.
  1587. ┴ND IF YOU USE TWO TIMERS RUNNING AT A CONSTANT PHASE DIFFERENCE, YOU
  1588. CAN GET FULL SYNCHRONIZATION.  ╘HE FIRST TIMER GENERATES THE RASTER
  1589. INTERRUPT, AND THE SECOND TIMER, THE AUXILIARY TIMER, TELLS THE RASTER
  1590. ROUTINE WHERE IT IS RUNNING.  ┴CTUALLY YOU COULD EVEN USE THE FIRST
  1591. TIMER ALSO FOR THE CHECKING, BUT THE CODE WILL LOOK NICER IN THE WAY ╔
  1592. WILL BE PRESENTING NOW.  ┬ESIDES, YOU CAN USE THE AUXILIARY TIMER IDEA
  1593. EVEN WHEN REAL RASTER INTERRUPTS ARE AVAILABLE.
  1594.  
  1595. ╘HE MAJOR DRAWBACK OF USING AN AUXILIARY TIMER IS INITIALIZING IT.
  1596. ╘HE INITIALIZATION ROUTINE MUST SYNCHRONIZE WITH THE SCREEN, THAT IS,
  1597. WAIT FOR THE BEGINNING OF THE WANTED RASTER LINE.  ╘O ACCOMPLISH THIS,
  1598. THE ROUTINE MUST FIRST WAIT FOR A RASTER LINE THAT OCCURS A BIT
  1599. EARLIER.  ┴BOUT THE ONLY WAY TO DO THIS IS WITH A LOOP LIKE
  1600.  
  1601.                 ╠─┴ #VALUE
  1602.         LOOP    ├═╨ RASTER
  1603.                 ┬╬┼ LOOP
  1604.  
  1605. ╧NE ROUND OF THIS LOOP WILL TAKE 4+3=7 CYCLES TO EXECUTE, ASSUMING
  1606. THAT ABSOLUTE ADDRESSING IS BEING USED.  ╘HE LOOP WILL BE FINISHED IF
  1607. THE RASTER REGISTER CONTAINS THE WANTED VALUE WHILE THE PROCESSOR
  1608. READS IT ON THE LAST CYCLE OF THE ├═╨ INSTRUCTION.  ╘HE RASTER
  1609. REGISTER CAN ACTUALLY HAVE CHANGED ALREADY ON THE FIRST CYCLE OF THE
  1610. ┬╬┼ INSTRUCTION ON THE PREVIOUS RUN OF THE LOOP, THAT IS 7 CYCLES
  1611. EARLIER!
  1612.  
  1613. ┬ECAUSE OF THIS, THE ROUTINE MUST POLL THE RASTER REGISTER FOR SEVERAL
  1614. RASTER LINES, ALWAYS CONSUMING ONE CYCLE MORE IF THE RASTER REGISTER
  1615. CHANGED TOO EARLY.  ┴S THE SYNCHRONIZATION CAN BE OFF AT MOST BY 7
  1616. CYCLES, A LOOP OF 7 RASTER REGISTER VALUE CHANGES WOULD DO, BUT ╔ MADE
  1617. THE LOOP A BIT LONGER IN MY ╓╔├-20 ROUTINE.  (╫ELL, ╔ HAVE TO ADMIT IT,
  1618. ╔ WAS TOO LAZY TO MAKE IT WORK ONLY WITH 7 ROUNDS.)
  1619.  
  1620. ┴FTER THE INITIALIZATION ROUTINE IS FULLY SYNCHRONIZED THE SCREEN, IT
  1621. CAN SET UP THE TIMER(S) AND INTERRUPTS AND EXIT.  ╘HE AUXILIARY TIMER
  1622. IN MY ╓╔├-20 DEMO ROUTINE IS SEVERAL DOZENS OF CYCLES AFTER THE
  1623. PRIMARY TIMER, SEE THE SOURCE CODE FOR COMMENTS.  ╔T IS ARRANGED SO
  1624. THAT THE AUXILIARY TIMER WILL BE AT LEAST 0 WHEN IT IS BEING READ IN
  1625. THE RASTER ROUTINE.  ╘HE RASTER ROUTINE WILL WAIT AS MANY EXTRA CYCLES
  1626. AS THE AUXILIARY TIMER READS, HOWEVER AT MOST 15 CYCLES.
  1627.  
  1628.  
  1629. ╒SING DOUBLE RASTER INTERRUPT
  1630.  
  1631. ╧N THE ├OMMODORE 64, ╔ HAVE NEVER SEEN THE AUXILIARY TIMER SCHEME
  1632. BEING USED.  ┴CTUALLY ╔ HAVEN'T SEEN IT BEING USED ANYWHERE, ╔ WAS
  1633. PROBABLY THE FIRST ONE WHO MADE A STABLE RASTER INTERRUPT ROUTINE ON
  1634. THE ╓╔├-20.  ╔NSTEAD, THE DOUBLE INTERRUPT METHOD IS BECOMING THE
  1635. STANDARD ON THE ├64 SIDE.
  1636.  
  1637. ╘HE DOUBLE INTERRUPT METHOD IS BASED ENTIRELY ON THE ╥ASTER INTERRUPT
  1638. FEATURE OF THE VIDEO CHIP.  ╔N THE FIRST RASTER INTERRUPT ROUTINE, THE
  1639. PROGRAM SETS UP ANOTHER RASTER INTERRUPT ON A FURTHER LINE, CHANGES
  1640. THE INTERRUPT VECTOR AND ENABLES INTERRUPTS.
  1641.  
  1642. ╔N THE PLACE WHERE THE SECOND RASTER INTERRUPT WILL OCCUR, THERE WILL
  1643. BE 2-BYTE INSTRUCTIONS IN THE FIRST INTERRUPT ROUTINE.  ╔N THIS WAY,
  1644. THE BEGINNING OF THE NEXT RASTER INTERRUPT WILL BE OFF AT MOST BY ONE
  1645. CYCLE.  ╙OME CODERS MIGHT NOT CARE ABOUT THIS ONE CYCLE, BUT IF YOU
  1646. CAN DO IT RIGHT, WHY WOULDN'T YOU DO IT RIGHT UNTIL THE END?
  1647.  
  1648. ┴T THE BEGINNING OF THE SECOND RASTER INTERRUPT ROUTINE, YOU WILL READ
  1649. THE RASTER LINE COUNTER REGISTER AT THE POINT WHERE IT IS ABOUT TO
  1650. CHANGE.  ╫HEN THE RASTER ROUTINE IS BEING EXECUTED, THERE ARE TWO
  1651. POSSIBILITIES: ┼ITHER THE RASTER COUNTER HAS JUST CHANGED, OR IT WILL
  1652. CHANGE ON THE NEXT CYCLE.  ╙O, YOU JUST NEED TO COMPARE IF THE
  1653. REGISTER CHANGED ONE CYCLE TOO EARLY OR NOT, AND DELAY A CYCLE WHEN
  1654. NEEDED.  ╘HIS IS EASILY ACCOMPLISHED WITH A BRANCH TO THE NEXT ADDRESS.
  1655.  
  1656. ╧F COURSE, SOMEWHERE IN YOUR SECOND RASTER INTERRUPT ROUTINE YOU MUST
  1657. RESTORE THE ORIGINAL RASTER INTERRUPT POSITION AND SET THE INTERRUPT
  1658. VECTOR TO POINT TO THE FIRST INTERRUPT ROUTINE.
  1659.  
  1660.  
  1661. ┴PPLYING IN PRACTICE
  1662.  
  1663. ╔ ALMOST FORGOT MY COMPLAINTS ABOUT DEMOS CRASHING WHEN YOU ACTIVELY
  1664. HIT THE ╥ESTORE KEY.  ╧N THE ╓╔├-20, YOU CAN DISABLE ╬═╔ INTERRUPTS
  1665. GENERATED BY THE ╥ESTORE KEY, AND ON THE ├64, YOU CAN GENERATE AN ╬═╔
  1666. INTERRUPT WITH THE ├╔┴2 TIMER AND LEAVE THE ╬═╔-LINE LOW, SO THAT NO
  1667. FURTHER HIGH-TO-LOW TRANSITIONS WILL BE RECOGNIZED ON THE LINE.  ╘HE
  1668. EXAMPLE PROGRAMS DEMONSTRATE HOW TO DO THIS.
  1669.  
  1670. ╙O FAR, THIS ARTICLE HAS BEEN PRETTY THEORETICAL.  ╘O APPLY THESE
  1671. RESULTS IN PRACTICE, YOU MUST DEFINITELY KNOW HOW MANY ├╨╒ CLOCK
  1672. CYCLES THE VIDEO CHIP CONSUMES WHILE DRAWING A SCAN LINE.  ╘HIS IS
  1673. FAIRLY EASY TO MEASURE WITH A TIMER INTERRUPT, IF YOU PATCH THE
  1674. INTERRUPT HANDLER SO THAT IT CHANGES THE SCREEN COLOR ON EACH RUN.
  1675. ╙ET THE TIMER INTERVAL TO ╠╔╬┼╙*├╧╠╒═╬╙ CYCLES, WHERE ╠╔╬┼╙ IS THE
  1676. AMOUNT OF RASTER LINES AND ├╧╠╒═╬╙ IS YOUR GUESS FOR THE AMOUNT OF
  1677. CLOCK CYCLES SPENT IN A RASTER LINE.
  1678.  
  1679. ╔F YOUR GUESS IS RIGHT, THE COLOR WILL ALWAYS BE CHANGED IN THE SAME
  1680. SCREEN POSITION (NEGLECTING THE 7-CYCLE JITTER).  ╫HEN ADJUSTING THE
  1681. TIMER, REMEMBER THAT THE TIMERS ON THE 6522 ╓╔┴ REQUIRE 2 CYCLES FOR
  1682. RE-LOADING, AND THE ONES ON THE 6526 ├╔┴ NEED ONE EXTRA CYCLE.  ╦EEP
  1683. TRYING DIFFERENT TIMER VALUES UNTIL YOU THE SCREEN COLOR CHANGES AT
  1684. ONE FIXED POSITION.
  1685.  
  1686. ├OMMODORE USED SEVERAL DIFFERENT VALUES FOR ╠╔╬┼╙ AND ├╧╠╒═╬╙ ON ITS
  1687. VIDEOCHIPS.  ╘HEY NEVER MANAGED TO MAKE THE SCREEN REFRESH RATE
  1688. EXACTLY 50 OR 60 ╚ERTZ, BUT THEY DIDN'T HESITATE TO CLAIM THAT THEIR
  1689. COMPUTERS COMPLY WITH THE ╨┴╠-┬ OR ╬╘╙├-═ STANDARDS.  ╔N THE FOLLOWING
  1690. TABLES ╔ HAVE GATHERED SOME INFORMATION OF SOME ├OMMODORE VIDEO CHIPS.
  1691.  
  1692.  
  1693.   ╬╘╙├-═ SYSTEMS:
  1694.  
  1695.             ├HIP      ├RYSTAL  ─OT      ╨ROCESSOR ├YCLES/ ╠INES/
  1696.     ╚OST    ╔─        FREQ/╚Z  CLOCK/╚Z CLOCK/╚Z  LINE    FRAME
  1697.     ------  --------  -------- -------- --------- ------- ------
  1698.     ╓╔├-20  6560-101  14318181  4090909   1022727      65    261
  1699.     ├64     6567╥56┴  14318181  8181818   1022727      64    262
  1700.     ├64     6567╥8    14318181  8181818   1022727      65    263
  1701.  
  1702.   ╠ATER ╬╘╙├-═ VIDEO CHIPS WERE MOST PROBABLY LIKE THE 6567╥8.  ╬OTE
  1703.   THAT THE PROCESSOR CLOCK IS A 14TH OF THE CRYSTAL FREQUENCY ON ALL
  1704.   ╬╘╙├-═ SYSTEMS.
  1705.  
  1706.   ╨┴╠-┬ SYSTEMS:
  1707.  
  1708.             ├HIP      ├RYSTAL  ─OT      ╨ROCESSOR ├YCLES/ ╠INES/
  1709.     ╚OST    ╔─        FREQ/╚Z  CLOCK/╚Z CLOCK/╚Z  LINE    FRAME
  1710.     ------  --------  -------- -------- --------- ------- ------
  1711.     ╓╔├-20  6561-101   4433618  4433618   1108405      71    312
  1712.     ├64     6569      17734472  7881988    985248      63    312
  1713.  
  1714.   ╧N THE ╨┴╠-┬ ╓╔├-20, THE CRYSTAL FREQUENCY IS SIMULTANEOUSLY THE DOT
  1715.   CLOCK, WHICH IS ┬╘╫ A 4TH OF THE CRYSTAL FREQUENCY USED ON THE ├64.
  1716.   ╧N THE ├64, THE CRYSTAL FREQUENCY IS DIVIDED BY 18 TO GENERATE THE
  1717.   PROCESSOR CLOCK, WHICH IN TURN IS MULTIPLIED BY 8 TO GENERATE THE
  1718.   DOT CLOCK.
  1719.  
  1720.   ╘HE BASIC TIMINGS ARE THE SAME ON ALL 6569 REVISIONS, AND ALSO ON
  1721.   ANY LATER ├64 AND ├128 VIDEO CHIPS.  ╔F ╔ REMEMBER CORRECTLY, THESE
  1722.   VALUES WERE THE SAME ON THE ├16 VIDEOCHIP ╘┼─ AS WELL.
  1723.  
  1724. ╬OTE THAT THE DOT CLOCK IS 4 TIMES THE PROCESSOR CLOCK ON THE ╓╔├-20,
  1725. AND 8 TIMES THAT ON THE ├64.  ╘HAT IS, ONE PROCESSOR CYCLE IS HALF A
  1726. CHARACTER WIDE ON THE ╓╔├-20, AND A FULL CHARACTER ON A ├64.  ╔ DON'T
  1727. HAVE EXACT MEASUREMENTS OF THE ╓╔├-20 TIMING, BUT IT SEEMS THAT WHILE
  1728. THE ╓╔├-20 VIDEOCHIPS DRAW THE CHARACTERS ON THE SCREEN, IT FIRST
  1729. READS THE CHARACTER CODE, AND THEN, ON THE FOLLOWING VIDEO CYCLE, THE
  1730. APPEARANCE ON THE CURRENT CHARACTER LINE.  ╘HERE ARE NO BAD LINES,
  1731. LIKE ON THE ├64, WHERE THE CHARACTER CODES (AND COLORS) ARE FETCHED ON
  1732. EVERY 8TH RASTER LINE.
  1733.  
  1734. ╘HOSE ONES WHO GOT UPSET WHEN ╔ SAID THAT ├OMMODORE HAS NEVER MANAGED
  1735. TO MAKE A FULLY ╨┴╠-┬ OR ╬╘╙├-═ COMPLIANT 8-BIT COMPUTER SHOULD TAKE A
  1736. CLOSER LOOK AT THE "╠INES/FRAME" COLUMNS.  ╔F THAT DOES NOT CONVINCE
  1737. YOU, CALCULATE THE RASTER LINE RATE AND THE SCREEN REFRESH RATE FROM
  1738. THE VALUES IN THE TABLE AND SEE THAT THEY DON'T COMPLY WITH THE
  1739. STANDARDS.  ╘O CALCULATE THE LINE RATE, DIVIDE THE PROCESSOR CLOCK
  1740. FREQUENCY BY THE AMOUNT OF CYCLES PER LINE.  ╘O GET THE SCREEN REFRESH
  1741. RATE, DIVIDE THAT FREQUENCY BY THE AMOUNT OF RASTER LINES.
  1742.  
  1743.  
  1744. ╘HE ├ODE
  1745.  
  1746. ╧╦, ENOUGH THEORY AND BACKGROUND.  ╚ERE ARE THE TWO EXAMPLE PROGRAMS,
  1747. ONE FOR THE ╓╔├-20 AND ONE FOR THE ├64.  ╔N ORDER TO FULLY UNDERSTAND
  1748. THEM, YOU NEED TO KNOW THE EXACT EXECUTION TIMES OF ╬═╧╙ 6502
  1749. INSTRUCTIONS.  (┴LL 8-BIT ├OMMODORE COMPUTERS USE THE ╬═╧╙ 6502
  1750. PROCESSOR CORE, EXCEPT THE ├65 PROTOTYPE, WHICH USED A INFERIOR ├═╧╙
  1751. VERSION WITH ALL NICE POORLY-DOCUMENTED FEATURES REMOVED.)  ┘OU SHOULD
  1752. CHECK THE 64DOC DOCUMENT, AVAILABLE ON MY ╫╫╫ PAGES AT
  1753. HTTP://WWW.HUT.FI/▐MSMAKELA/CBM/EMUL/X64/64DOC.HTML, OR VIA ╞╘╨ AT
  1754. FTP.FUNET.FI:/PUB/CBM/DOCUMENTS/64DOC.  ╔ CAN ALSO E-MAIL IT TO YOU ON
  1755. REQUEST.
  1756.  
  1757. ┴LSO, ╔ HAVE WRITTEN A COMPLETE DESCRIPTION OF THE VIDEO TIMING ON THE
  1758. 6567╥56┴, 6567╥8 AND 6569 VIDEO CHIPS, WHICH COULD MAYBE BE TURNED
  1759. INTO ANOTHER ├=╚ACKING ARTICLE.  ╘HE DOCUMENT IS CURRENTLY PARTIALLY
  1760. IN ┼NGLISH AND PARTIALLY IN ╟ERMAN.  ╘HE ┼NGLISH PART IS AVAILABLE
  1761. FROM FTP.FUNET.FI AS /PUB/CBM/DOCUMENTS/PAL.TIMING, AND ╔ CAN SEND
  1762. COPIES OF THE ╟ERMAN PART (SCREEN RESOLUTION, SPRITE DISTURBANCE
  1763. MEASUREMENTS, AND MORE PRECISE TIMING INFORMATION) VIA E-MAIL.
  1764.  
  1765. ╘HE CODE IS WRITTEN FOR THE ─┴╙═ ASSEMBLER, OR MORE PRECISELY FOR A
  1766. EXTENDED ┴╬╙╔ ├ PORT OF IT MADE BY ╧LAF ╙EIBERT.  ╘HIS EXCELLENT
  1767. CROSS-ASSEMBLER IS AVAILABLE AT FTP.FUNET.FI IN /PUB/CBM/PROGRAMMING.
  1768.  
  1769. ╞IRST THE RASTER DEMO FOR THE ╓╔├-20.  ╬OTE THAT ON THE ╓╔├-20, THE
  1770. $9004 REGISTER CONTAINS THE UPPER 8 BITS OF THE RASTER COUNTER.  ╙O,
  1771. THIS REGISTER CHANGES ONLY ON EVERY SECOND LINE.  ╔ HAVE TESTED THE
  1772. PROGRAM ON MY 6561-101-BASED ╓╔├-20, BUT NOT ON AN ╬╘╙├-═ SYSTEM.
  1773.  
  1774. ╔T WAS HARD TO GET IN CONTACT WITH ╬╘╙├-═ ╓╔├-20 OWNERS.  ─ANIEL
  1775. ─ALLMANN, WHO HAS A ╬╘╙├-═ ╓╔├-20, ALTHOUGH HE LIVES IN ╟ERMANY, RAN
  1776. MY TEST TO DETERMINE THE AMOUNT OF CYCLES PER LINE AND LINES PER FRAME
  1777. ON THE 6560-101.  ╒NFORTUNATELY, THE SECOND ╓╔┴ OF HIS ╓╔├-20 IS
  1778. PARTIALLY BROKEN, AND BECAUSE OF THIS, THIS PROGRAM DID NOT WORK ON
  1779. HIS COMPUTER.  ├RAIG ┬RUCE RAN THE PROGRAM ONCE, AND HE REPORTED THAT
  1780. IT ALMOST WORKED.  ╔ CORRECTED A LITTLE BUG IN THE CODE, SO THAT NOW
  1781. THE DISPLAY SHOULD BE STABLE ON AN ╬╘╙├-═ SYSTEM, TOO.  ┬UT THE ACTUAL
  1782. RASTER EFFECT, SIX 16*16-PIXEL BOXES CENTERED AT THE TOP BORDER, ARE
  1783. VERY LIKELY TO BE OFF THEIR POSITION.
  1784.  
  1785.  
  1786.   PROCESSOR 6502
  1787.  
  1788. ╬╘╙├    = 1
  1789. ╨┴╠     = 2
  1790.  
  1791. ;╙┘╙╘┼═ = ╬╘╙├  ; 6560-101: 65 CYCLES PER RASTER LINE, 261 LINES
  1792. ╙┘╙╘┼═  = ╨┴╠   ; 6561-101: 71 CYCLES PER RASTER LINE, 312 LINES
  1793.  
  1794. #IF ╙┘╙╘┼═ & ╨┴╠
  1795. ╠╔╬┼╙ = 312
  1796. ├┘├╠┼╙_╨┼╥_╠╔╬┼ = 71
  1797. #ENDIF
  1798. #IF ╙┘╙╘┼═ & ╬╘╙├
  1799. ╠╔╬┼╙ = 261
  1800. ├┘├╠┼╙_╨┼╥_╠╔╬┼ = 65
  1801. #ENDIF
  1802. ╘╔═┼╥_╓┴╠╒┼ = ╠╔╬┼╙ * ├┘├╠┼╙_╨┼╥_╠╔╬┼ - 2
  1803.  
  1804.   .ORG $1001    ; FOR THE UNEXPANDED ╓IC-20
  1805.  
  1806. ; ╘HE ┬┴╙╔├ LINE
  1807.  
  1808. BASIC:
  1809.   .WORD 0$      ; LINK TO NEXT LINE
  1810.   .WORD 1995    ; LINE NUMBER
  1811.   .BYTE $9┼     ; ╙┘╙ TOKEN
  1812.  
  1813. ; ╙┘╙ DIGITS
  1814.  
  1815.   .IF (* + 8) / 10000
  1816.   .BYTE $30 + (* + 8) / 10000
  1817.   .ENDIF
  1818.   .IF (* + 7) / 1000
  1819.   .BYTE $30 + (* + 7) % 10000 / 1000
  1820.   .ENDIF
  1821.   .IF (* + 6) / 100
  1822.   .BYTE $30 + (* + 6) % 1000 / 100
  1823.   .ENDIF
  1824.   .IF (* + 5) / 10
  1825.   .BYTE $30 + (* + 5) % 100 / 10
  1826.   .ENDIF
  1827.   .BYTE $30 + (* + 4) % 10
  1828. 0$:
  1829.   .BYTE 0,0,0   ; END OF ┬┴╙╔├ PROGRAM
  1830.  
  1831. START:
  1832.   LDA #$7F
  1833.   STA $912E     ; DISABLE AND ACKNOWLEDGE INTERRUPTS
  1834.   STA $912D
  1835.   STA $911E     ; DISABLE ╬═╔S (╥ESTORE KEY)
  1836.  
  1837. ;SYNCHRONIZE WITH THE SCREEN
  1838. SYNC:
  1839.   LDX #28       ; WAIT FOR THIS RASTER LINE (TIMES 2)
  1840. 0$:
  1841.   CPX $9004
  1842.   BNE 0$        ; AT THIS STAGE, THE INACCURACY IS 7 CLOCK CYCLES
  1843.                 ; THE PROCESSOR IS IN THIS PLACE 2 TO 9 CYCLES
  1844.                 ; AFTER $9004 HAS CHANGED
  1845.   LDY #9
  1846.   BIT $24
  1847. 1$:
  1848.   LDX $9004
  1849.   TXA
  1850.   BIT $24
  1851. #IF ╙┘╙╘┼═ & ╨┴╠
  1852.   LDX #24
  1853. #ENDIF
  1854. #IF ╙┘╙╘┼═ & ╬╘╙├
  1855.   BIT $24
  1856.   LDX #21
  1857. #ENDIF
  1858.   DEX
  1859.   BNE *-1       ; FIRST SPEND SOME TIME (SO THAT THE WHOLE
  1860.   CMP $9004     ; LOOP WILL BE 2 RASTER LINES)
  1861.   BCS *+2       ; SAVE ONE CYCLE IF $9004 CHANGED TOO LATE
  1862.   DEY
  1863.   BNE 1$
  1864.                 ; NOW IT IS FULLY SYNCHRONIZED
  1865.                 ; 6 CYCLES HAVE PASSED SINCE LAST $9004 CHANGE
  1866.                 ; AND WE ARE ON LINE 2(28+9)=74
  1867.  
  1868. ;INITIALIZE THE TIMERS
  1869. TIMERS:
  1870.   LDA #$40      ; ENABLE ╘IMER ┴ FREE RUN OF BOTH ╓╔┴S
  1871.   STA $911B
  1872.   STA $912B
  1873.  
  1874.   LDA #<╘╔═┼╥_╓┴╠╒┼
  1875.   LDX #>╘╔═┼╥_╓┴╠╒┼
  1876.   STA $9116     ; LOAD THE TIMER LOW BYTE LATCHES
  1877.   STA $9126
  1878.  
  1879. #IF ╙┘╙╘┼═ & ╨┴╠
  1880.   LDY #7        ; MAKE A LITTLE DELAY TO GET THE RASTER EFFECT TO THE
  1881.   DEY           ; RIGHT PLACE
  1882.   BNE *-1
  1883.   NOP
  1884.   NOP
  1885. #ENDIF
  1886. #IF ╙┘╙╘┼═ & ╬╘╙├
  1887.   LDY #6
  1888.   DEY
  1889.   BNE *-1
  1890.   BIT $24
  1891. #ENDIF
  1892.  
  1893.   STX $9125     ; START THE ╔╥╤ TIMER ┴
  1894.                 ; 6560-101: 65 CYCLES FROM $9004 CHANGE
  1895.                 ; 6561-101: 77 CYCLES FROM $9004 CHANGE
  1896.   LDY #10       ; SPEND SOME TIME (1+5*9+4=55 CYCLES)
  1897.   DEY           ; BEFORE STARTING THE REFERENCE TIMER
  1898.   BNE *-1
  1899.   STX $9115     ; START THE REFERENCE TIMER
  1900.  
  1901. POINTERS:
  1902.   LDA #<IRQ     ; SET THE RASTER ╔╥╤ ROUTINE POINTER
  1903.   STA $314
  1904.   LDA #>IRQ
  1905.   STA $315
  1906.   LDA #$C0
  1907.   STA $912E     ; ENABLE ╘IMER ┴ UNDERFLOW INTERRUPTS
  1908.   RTS           ; RETURN
  1909.  
  1910. IRQ:
  1911. ; IRQ (EVENT)   ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
  1912. ; PHA           ; 3
  1913. ; TXA           ; 2
  1914. ; PHA           ; 3
  1915. ; TYA           ; 2
  1916. ; PHA           ; 3
  1917. ; TSX           ; 2
  1918. ; LDA $0104,X   ; 4
  1919. ; AND #XX       ; 2
  1920. ; BEQ           ; 3
  1921. ; JMP ($314)    ; 5
  1922.                 ; ---
  1923.                 ; 38 TO 45 CYCLES DELAY AT THIS STAGE
  1924.  
  1925.   LDA $9114     ; GET THE ╬═╔ TIMER ┴ VALUE
  1926.                 ; (42 TO 49 CYCLES DELAY AT THIS STAGE)
  1927. ; STA $1E00     ; UNCOMMENT THESE IF YOU WANT TO MONITOR
  1928. ; LDY $9115     ; THE REFERENCE TIMER ON THE SCREEN
  1929. ; STY $1E01
  1930.   CMP #8        ; ARE WE MORE THAN 7 CYCLES AHEAD OF TIME?
  1931.   BCC 0$
  1932.   PHA           ; YES, SPEND 8 EXTRA CYCLES
  1933.   PLA
  1934.   AND #7        ; AND RESET THE HIGH BIT
  1935. 0$:
  1936.   CMP #4
  1937.   BCC 1$
  1938.   BIT $24       ; WASTE 4 CYCLES
  1939.   AND #3
  1940. 1$:
  1941.   CMP #2        ; SPEND THE REST OF THE CYCLES
  1942.   BCS *+2
  1943.   BCS *+2
  1944.   LSR
  1945.   BCS *+2       ; NOW IT HAS TAKEN 82 CYCLES FROM THE BEGINNING OF THE ╔╥╤
  1946.  
  1947. EFFECT:
  1948.   LDY #16       ; PERFORM AMAZING VIDEO EFFECT
  1949.   LDA $900F
  1950.   TAX
  1951.   EOR #$F7
  1952. 0$:
  1953.   STA $900F
  1954.   STX $900F
  1955.   STA $900F
  1956.   STX $900F
  1957.   STA $900F
  1958.   STX $900F
  1959.   STA $900F
  1960.   STX $900F
  1961.   STA $900F
  1962.   STX $900F
  1963.   STA $900F
  1964.   STX $900F
  1965.   PHA
  1966.   PLA
  1967. #IF ╙┘╙╘┼═ & ╨┴╠
  1968.   PHA
  1969.   PLA
  1970.   NOP
  1971. #ENDIF
  1972. #IF ╙┘╙╘┼═ & ╬╘╙├
  1973.   BIT $24
  1974. #ENDIF
  1975.   NOP
  1976.   DEY
  1977.   BNE 0$        ; END OF AMAZING VIDEO EFFECT
  1978.  
  1979.   JMP $EABF     ; RETURN TO NORMAL ╔╥╤
  1980.  
  1981.  
  1982. ┴ND AFTER YOU HAVE RECOVERED FROM THE SCHOCK OF SEEING A ╓╔├-20
  1983. PROGRAM, HERE IS AN EXAMPLE FOR THE ├64.  ╔T DOES ALSO SOMETHING
  1984. NOTEWORTHY; IT REMOVES THE SIDE BORDERS ON A NORMAL SCREEN WHILE
  1985. DISPLAYING ALL EIGHT SPRITES.  ╫ELL, IT CANNOT REMOVE THE BORDERS ON
  1986. BAD LINES, AND THE BAD LINES LOOK PRETTY BAD.  ┬UT ╔ COULD USE THE
  1987. PROGRAM FOR WHAT ╔ WANTED: ╔ MEASURED THE SPRITE DISTORTIONS ON ALL
  1988. VIDEOCHIP TYPES ╔ HAD AT HAND.  (╞┘╔: THE SPRITES 0-2 GET DISTORTED AT
  1989. THE VERY RIGHT OF THE SCREEN, AND THE SPRITES 6 AND 7 ARE INVISIBLE AT
  1990. THE VERY LEFT OF THE SCREEN.  ┘OU WILL NEED A MONITOR WITH HORIZONTAL
  1991. SIZE CONTROLS TO WITNESS THESE EFFECTS.)
  1992.  
  1993. ╘HIS PROGRAM IS REALLY ROBUST, IT INSTALLS ITSELF NICELY TO THE
  1994. INTERRUPT ROUTINE CHAIN.  ╔T EVEN HAS AN ENTRY POINT FOR DEINSTALLING
  1995. ITSELF.  ┬UT IN ITS ROBUSTNESS IT USES SELF-MODIFYING CODE TO STORE
  1996. THE ORIGINAL INTERRUPT ROUTINE ADDRESS. :-)
  1997.  
  1998. ╘HE CODE ALSO RELIES ON THE PAGE BOUNDARIES IN BEING WHERE THEY ARE.
  1999. ╘HE CYCLES ARE COUNTED SO THAT THE BRANCHES "IRQLOOP" MUST TAKE 4
  2000. CYCLES.  ╔F THE "IRQLOOP" COMES TO THE SAME ├╨╒ PAGE WITH THE BRANCH
  2001. INSTRUCTIONS, YOU MUST ADD ONE CYCLE TO THE LOOP IN A WAY OR ANOTHER.
  2002. ╫HEN CODING THE ROUTINE, ╔ NOTICED AGAIN HOW STUPID ASSEMBLY CODING
  2003. CAN BE, ESPECIALLY CONDITIONAL ASSEMBLING.  ╔N A MACHINE LANGUAGE
  2004. MONITOR YOU HAVE FAR BETTER CONTROL ON PAGE BOUNDARIES.  ┬╘╫, YOU
  2005. MIGHT WONDER WHY ╔ DISABLE THE ╥ESTORE KEY IN A SUBROUTINE AT THE END
  2006. AND NOT IN THE BEGINNING OF THE PROGRAM.  ╫ELL, THE ROUTINE WAS SO
  2007. LONG THAT IT WOULD HAVE AFFECTED THE "IRQLOOP" PAGE BOUNDARIES.  ┴ND ╔
  2008. DIDN'T WANT TO RISK THE MODIFIED PROGRAMS WORKING ON ALL THREE
  2009. DIFFERENT VIDEOCHIP TYPES ON THE FIRST TRY.
  2010.  
  2011.  
  2012. ╔N THE CODE, THERE ARE SOME COMMENTS THAT DOCUMENT THE VIDEO TIMING,
  2013. LIKE THIS ONE:
  2014.  
  2015. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  2016. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  2017. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  2018. ;          ^ NOW WE ARE HERE
  2019.  
  2020. ╘HE TWO VERTICAL BARS "▄" DENOTE OPTIONAL CYCLES.  ╧N ╨┴╠-┬ SYSTEMS
  2021. (63 CYCLES PER LINE), THEY ARE NOT PRESENT.  ╧N 6567╥56┴, WHICH HAS 64
  2022. CYCLES PER LINE, THERE IS ONE ADDITIONAL CYCLE ON THIS POSITION, AND
  2023. THE 6567╥8 HAS TWO ADDITIONAL CYCLES THERE.
  2024.  
  2025. ╘HE NUMBERS 0 THROUGH 7 ARE SPRITE POINTER FETCHES (FROM THE END OF
  2026. THE CHARACTER MATRIX, E.G. THE TEXT SCREEN), THE "S" CHARACTERS DENOTE
  2027. SPRITE IMAGE FETCHES, THE "R"S ARE MEMORY REFRESH, AND THE "G" ARE
  2028. GRAPHICS FETCHES.  ╘HE TWO IDLE VIDEO CHIP CYCLES ARE MARKED WITH "-".
  2029. ╧N THE PROCESSOR TIMING LINE, THE "=" SIGNS SHOW HALTED ├╨╒, "X" MEANS
  2030. FREE BUS, AND "╪" MEANS THAT THE PROCESSOR WILL BE HALTED AT ONCE,
  2031. UNLESS IT IS PERFORMING WRITE CYCLES.
  2032.  
  2033.   PROCESSOR 6502
  2034.  
  2035. ; ╙ELECT THE VIDEO TIMING (PROCESSOR CLOCK CYCLES PER RASTER LINE)
  2036. ├┘├╠┼╙ = 65     ; 6567╥8 AND ABOVE, ╬╘╙├-═
  2037. ;├┘├╠┼╙ = 64    ; 6567╥5 6┴, ╬╘╙├-═
  2038. ;├┘├╠┼╙ = 63    ; 6569 (ALL REVISIONS), ╨┴╠-┬
  2039.  
  2040. CINV = $314
  2041. CNMI = $318
  2042. RASTER = 52     ; START OF RASTER INTERRUPT
  2043. M = $FB         ; ZERO PAGE VARIABLE
  2044.  
  2045.   .ORG $801
  2046. BASIC:
  2047.   .WORD 0$      ; LINK TO NEXT LINE
  2048.   .WORD 1995    ; LINE NUMBER
  2049.   .BYTE $9┼     ; ╙┘╙ TOKEN
  2050.  
  2051. ; ╙┘╙ DIGITS
  2052.  
  2053.   .IF (* + 8) / 10000
  2054.   .BYTE $30 + (* + 8) / 10000
  2055.   .ENDIF
  2056.   .IF (* + 7) / 1000
  2057.   .BYTE $30 + (* + 7) % 10000 / 1000
  2058.   .ENDIF
  2059.   .IF (* + 6) / 100
  2060.   .BYTE $30 + (* + 6) % 1000 / 100
  2061.   .ENDIF
  2062.   .IF (* + 5) / 10
  2063.   .BYTE $30 + (* + 5) % 100 / 10
  2064.   .ENDIF
  2065.   .BYTE $30 + (* + 4) % 10
  2066.  
  2067. 0$:
  2068.   .BYTE 0,0,0   ; END OF ┬┴╙╔├ PROGRAM
  2069.  
  2070. START:
  2071.   JMP INSTALL
  2072.   JMP DEINSTALL
  2073.  
  2074. INSTALL:        ; INSTALL THE RASTER ROUTINE
  2075.   JSR RESTORE   ; ─ISABLE THE ╥ESTORE KEY (DISABLE ╬═╔ INTERRUPTS)
  2076. CHECKIRQ:
  2077.   LDA CINV      ; CHECK THE ORIGINAL ╔╥╤ VECTOR
  2078.   LDX CINV+1    ; (TO AVOID MULTIPLE INSTALLATION)
  2079.   CMP #<IRQ1
  2080.   BNE IRQINIT
  2081.   CPX #>IRQ1
  2082.   BEQ SKIPINIT
  2083. IRQINIT:
  2084.   SEI
  2085.   STA OLDIRQ    ; STORE THE OLD ╔╥╤ VECTOR
  2086.   STX OLDIRQ+1
  2087.   LDA #<IRQ1
  2088.   LDX #>IRQ1
  2089.   STA CINV      ; SET THE NEW INTERRUPT VECTOR
  2090.   STX CINV+1
  2091. SKIPINIT:
  2092.   LDA #$1B
  2093.   STA $D011     ; SET THE RASTER INTERRUPT LOCATION
  2094.   LDA #RASTER
  2095.   STA $D012
  2096.   LDX #$E
  2097.   CLC
  2098.   ADC #3
  2099.   TAY
  2100.   LDA #0
  2101.   STA M
  2102. 0$:
  2103.   LDA M
  2104.   STA $D000,X   ; SET THE SPRITE ╪
  2105.   ADC #24
  2106.   STA M
  2107.   TYA
  2108.   STA $D001,X   ; AND ┘ COORDINATES
  2109.   DEX
  2110.   DEX
  2111.   BPL 0$
  2112.   LDA #$7F
  2113.   STA $DC0D     ; DISABLE TIMER INTERRUPTS
  2114.   STA $DD0D
  2115.   LDX #1
  2116.   STX $D01A     ; ENABLE RASTER INTERRUPT
  2117.   LDA $DC0D     ; ACKNOWLEDGE ├╔┴ INTERRUPTS
  2118.   LSR $D019     ; AND VIDEO INTERRUPTS
  2119.   LDY #$FF
  2120.   STY $D015     ; TURN ON ALL SPRITES
  2121.   CLI
  2122.   RTS
  2123.  
  2124. DEINSTALL:
  2125.   SEI           ; DISABLE INTERRUPTS
  2126.   LDA #$1B
  2127.   STA $D011     ; RESTORE TEXT SCREEN MODE
  2128.   LDA #$81
  2129.   STA $DC0D     ; ENABLE ╘IMER ┴ INTERRUPTS ON ├╔┴ 1
  2130.   LDA #0
  2131.   STA $D01A     ; DISABLE VIDEO INTERRUPTS
  2132.   LDA OLDIRQ
  2133.   STA CINV      ; RESTORE OLD ╔╥╤ VECTOR
  2134.   LDA OLDIRQ+1
  2135.   STA CINV+1
  2136.   BIT $DD0D     ; RE-ENABLE ╬═╔ INTERRUPTS
  2137.   CLI
  2138.   RTS
  2139.  
  2140. ; ┴UXILIARY RASTER INTERRUPT (FOR SYNCRONIZATION)
  2141. IRQ1:
  2142. ; IRQ (EVENT)   ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
  2143. ; PHA           ; 3
  2144. ; TXA           ; 2
  2145. ; PHA           ; 3
  2146. ; TYA           ; 2
  2147. ; PHA           ; 3
  2148. ; TSX           ; 2
  2149. ; LDA $0104,X   ; 4
  2150. ; AND #XX       ; 2
  2151. ; BEQ           ; 3
  2152. ; JMP ($314)    ; 5
  2153.                 ; ---
  2154.                 ; 38 TO 45 CYCLES DELAY AT THIS STAGE
  2155.   LDA #<IRQ2
  2156.   STA CINV
  2157.   LDA #>IRQ2
  2158.   STA CINV+1
  2159.   NOP           ; WASTE AT LEAST 12 CYCLES
  2160.   NOP           ; (UP TO 64 CYCLES DELAY ALLOWED HERE)
  2161.   NOP
  2162.   NOP
  2163.   NOP
  2164.   NOP
  2165.   INC $D012     ; ┴T THIS STAGE, $D012 HAS ALREADY BEEN INCREMENTED BY ONE.
  2166.   LDA #1
  2167.   STA $D019     ; ACKNOWLEDGE THE FIRST RASTER INTERRUPT
  2168.   CLI           ; ENABLE INTERRUPTS (THE SECOND INTERRUPT CAN NOW OCCUR)
  2169.   LDY #9
  2170.   DEY
  2171.   BNE *-1       ; DELAY
  2172.   NOP           ; ╘HE SECOND INTERRUPT WILL OCCUR WHILE EXECUTING THESE
  2173.   NOP           ; TWO-CYCLE INSTRUCTIONS.
  2174.   NOP
  2175.   NOP
  2176.   NOP
  2177. OLDIRQ = * + 1  ; ╨LACEHOLDER FOR SELF-MODIFYING CODE
  2178.   JMP *         ; ╥ETURN TO THE ORIGINAL INTERRUPT
  2179.  
  2180. ; ═AIN RASTER INTERRUPT
  2181. IRQ2:
  2182. ; IRQ (EVENT)   ; 7 + 2 OR 3 CYCLES OF LAST INSTRUCTION (9 OR 10 TOTAL)
  2183. ; PHA           ; 3
  2184. ; TXA           ; 2
  2185. ; PHA           ; 3
  2186. ; TYA           ; 2
  2187. ; PHA           ; 3
  2188. ; TSX           ; 2
  2189. ; LDA $0104,X   ; 4
  2190. ; AND #XX       ; 2
  2191. ; BEQ           ; 3
  2192. ; JMP (CINV)    ; 5
  2193.                 ; ---
  2194.                 ; 38 OR 39 CYCLES DELAY AT THIS STAGE
  2195.   LDA #<IRQ1
  2196.   STA CINV
  2197.   LDA #>IRQ1
  2198.   STA CINV+1
  2199.   LDX $D012
  2200.   NOP
  2201. #IF ├┘├╠┼╙ - 63
  2202. #IF ├┘├╠┼╙ - 64
  2203.   NOP           ; 6567╥8, 65 CYCLES/LINE
  2204.   BIT $24
  2205. #ELSE
  2206.   NOP           ; 6567╥56┴, 64 CYCLES/LINE
  2207.   NOP
  2208. #ENDIF
  2209. #ELSE
  2210.   BIT $24       ; 6569, 63 CYCLES/LINE
  2211. #ENDIF
  2212.   CPX $D012     ; ╘HE COMPARISON CYCLE IS EXECUTED ├┘├╠┼╙ OR ├┘├╠┼╙+1 CYCLES
  2213.                 ; AFTER THE INTERRUPT HAS OCCURRED.
  2214.   BEQ *+2       ; ─ELAY BY ONE CYCLE IF $D012 HADN'T CHANGED.
  2215.                 ; ╬OW EXACTLY ├┘├╠┼╙+3 CYCLES HAVE PASSED SINCE THE INTERRUPT.
  2216.   DEX
  2217.   DEX
  2218.   STX $D012     ; RESTORE ORIGINAL RASTER INTERRUPT POSITION
  2219.   LDX #1
  2220.   STX $D019     ; ACKNOWLEDGE THE RASTER INTERRUPT
  2221.   LDX #2
  2222.   DEX
  2223.   BNE *-1
  2224.   NOP
  2225.   NOP
  2226.   LDA #20       ; SET THE AMOUNT OF RASTER LINES-1 FOR THE LOOP
  2227.   STA M
  2228.   LDX #$C8
  2229. IRQLOOP:
  2230.   LDY #2
  2231.   DEY
  2232.   BNE *-1       ; DELAY
  2233.   DEC $D016     ; NARROW THE SCREEN (EXACT TIMING REQUIRED)
  2234. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  2235. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  2236. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  2237. ;          ^ NOW WE ARE HERE
  2238.   STX $D016     ; EXPAND THE SCREEN
  2239. #IF ├┘├╠┼╙ - 63
  2240. #IF ├┘├╠┼╙ - 64
  2241.   BIT $24       ; 6567╥8
  2242. #ELSE
  2243.   NOP           ; 6567╥56┴
  2244. #ENDIF
  2245. #ELSE
  2246.   NOP           ; 6569
  2247. #ENDIF
  2248.   DEC M
  2249.   BMI ENDIRQ
  2250.   CLC
  2251.   LDA $D011
  2252.   SBC $D012
  2253.   AND #7
  2254.   BNE IRQLOOP   ; ╘HIS INSTRUCTION TAKES 4 CYCLES INSTEAD OF 3,
  2255.                 ; BECAUSE THE PAGE BOUNDARY IS CROSSED.
  2256. BADLINE:
  2257.   DEC M
  2258.   NOP
  2259.   NOP
  2260.   NOP
  2261.   NOP
  2262.   DEC $D016
  2263. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  2264. ;SSSSSSSSSS    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC   ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  2265. ;==========X╪╪╪========================================▄▄***====== ╨HI-2 6510
  2266. ;          ^ WE ARE HERE
  2267.   STX $D016
  2268. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  2269. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  2270. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  2271. ;          ^ ^^- WE ARE HERE (6569)
  2272. ;          ▄ \- OR HERE (6567╥56┴)
  2273. ;          \- OR HERE (6567╥8)
  2274.   LDY #2
  2275.   DEY
  2276.   BNE *-1
  2277.   NOP
  2278.   NOP
  2279. #IF ├┘├╠┼╙ - 63
  2280. #IF ├┘├╠┼╙ - 64
  2281.   NOP           ; 6567╥8, 65 CYCLES/LINE
  2282.   NOP
  2283.   NOP
  2284. #ELSE
  2285.   BIT $24       ; 6567╥56┴, 64 CYCLES/LINE
  2286. #ENDIF
  2287. #ELSE
  2288.   NOP           ; 6569, 63 CYCLES/LINE
  2289. #ENDIF
  2290.   DEC M
  2291.   BPL IRQLOOP   ; ╘HIS IS A 4-CYCLE BRANCH (PAGE BOUNDARY CROSSED)
  2292. ENDIRQ:
  2293.   JMP $EA81     ; RETURN TO THE AUXILIARY RASTER INTERRUPT
  2294.  
  2295. RESTORE:        ; DISABLE THE ╥ESTORE KEY
  2296.   LDA CNMI
  2297.   LDY CNMI+1
  2298.   PHA
  2299.   LDA #<NMI     ; ╙ET THE ╬═╔ VECTOR
  2300.   STA CNMI
  2301.   LDA #>NMI
  2302.   STA CNMI+1
  2303.   LDX #$81
  2304.   STX $DD0D     ; ┼NABLE ├╔┴ 2 ╘IMER ┴ INTERRUPT
  2305.   LDX #0
  2306.   STX $DD05
  2307.   INX
  2308.   STX $DD04     ; ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
  2309.   LDX #$DD
  2310.   STX $DD0E     ; ├AUSE AN INTERRUPT.
  2311. NMI = * + 1
  2312.   LDA #$40      ; ╥╘╔ PLACEHOLDER
  2313.   PLA
  2314.   STA CNMI
  2315.   STY CNMI+1    ; RESTORE ORIGINAL ╬═╔ VECTOR (ALTHOUGH IT WON'T BE USED)
  2316.   RTS
  2317.  
  2318.  
  2319. ┬INARIES
  2320.  
  2321. ╚ERE ARE THE PROGRAMS IN UUENCODED FORMAT.  ╞IRST THE ╓╔├-20 PROGRAMS:
  2322.  
  2323. ├OLOR BOXES FOR THE ╓╔├-20, ╬╘╙├-═ VERSION (PROBABLY DISTORTED DISPLAY):
  2324.  
  2325. BEGIN 644 COPPER.6560
  2326. ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─)"2┬
  2327. ═%<╦0_<╘$─+└└┬-#╦╩4"-&┘&-*┘&╔0┌)"├1:1├2:1╚└:(╘/╘─)(╪┼─:└*┬-#]
  2328. ═├┴61╩6╥-%└.╔$(╘5└┌╟└├2┌18*╘4─<─(─└1(:"─'╥020!"0─*0/)└╦└└╠└!*
  2329. ═╠└"@$*╘/─*╔)]╪╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/
  2330. ,─$┴╚)"3╩┬-#43+_╩
  2331. END
  2332.  
  2333.  
  2334. ├OLOR BOXES FOR THE ╓╔├-20, ╨┴╠-┬ VERSION:
  2335.  
  2336. BEGIN 644 COPPER.6561
  2337. ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─╚┴├*
  2338. ═╘/╫-!)"╨└(├0[:┼└├1╬1├2╬1╩8:┬5╚╘6─8╘╞─:└'┬-#]┌╬╩.)9&@"╚├0_8╪5
  2339. ═─:┼╩├10#╩1"-%0.╔╨(╘╬─6"═%)')")└$2&@╔!\─$─└0─)"─#╥0*╨└+└└2╦└└
  2340. ═╚!"═#┘"╩2?>-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘!(
  2341. +:$┴╚┌╬╩(╘--,╧^╩.
  2342. END
  2343.  
  2344.  
  2345. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, ╨┴╠-┬ VERSION:
  2346.  
  2347. BEGIN 644 RASTER.63
  2348. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  2349. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  2350. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  2351. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  2352. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌┬0─[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
  2353. ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,",8╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
  2354. ═╘*└"┬-#]┌╬╦╩╤╧╠0╙4╥!┌╩╘8└┌╨9└╘┬╔0╚╘8└┌─)├1─#╚╚&.#=╓┬└(╪%╫>┬.
  2355. 1!-╓┬╫8╪.╫:┼└:(╘8└╪╨9└╓└8
  2356. END
  2357.  
  2358.  
  2359. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥56┴ VERSION
  2360. (VERY OLD ╬╘╙├-═ ├64S):
  2361.  
  2362. BEGIN 644 RASTER.64
  2363. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'@╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  2364. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  2365. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  2366. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  2367. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╦╩[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
  2368. ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,"08╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
  2369. ═╘*└"┬-#]┌╬╚─),;[$,╤,@>╩═&└.╠&0-(╩4.-&└.╔"8╘9└┌*!├@╫=╚@".!=╫╚
  2370. 2├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
  2371. END
  2372.  
  2373. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥8 AND ABOVE
  2374. (NOT TOO OLD ╬╘╙├-═ ├64S AND ALL ├128S)
  2375.  
  2376. BEGIN 644 RASTER.65
  2377. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@(0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  2378. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  2379. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  2380. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  2381. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╚─).╨2╘/└└╥╠╩.$═"┬└8╪9╘*("╥═#]
  2382. ═┌╬╩╔%(7[╚╠┬@└╚├0_<╪6╘(╪6╘"0─╤╧╠╨)1┬═$=#═$═└╔!]#─╤╧╧╩┌╬╦╩╙┴;0
  2383. ═├┴;0╚└*(╘/╫╩┌╬╦╩┌╠;[$,╔,@>╩═&└.╠&0-(╩4:-&└.╔"8╘9└┌*!├@╫=╚@".
  2384. 5!=╫╚├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
  2385. END
  2386.  
  2387.  
  2388. ╘HAT WAS ALL, FOLKS!  ╔ HOPE YOU LEARNED SOMETHING FROM THIS ARTICLE.
  2389. ╞EEL FREE TO E-MAIL ME AT ═ARKO.═AKELA@╚╒╘.╞╔, SHOULD ANYTHING REMAIN
  2390. UNCLEAR.
  2391.  
  2392. ========================================================================
  2393. ┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔╔
  2394. BY ╙TEPHEN ╩UDD --- SJUDD@NWU.EDU
  2395.    ╟EORGE ╘AYLOR --- AA601@CFN.CS.DAL.CA
  2396.  
  2397.         ╫HEW!  ╫HAT A BUSY TIME IT'S BEEN -- RESEARCH TO GET DONE,
  2398. CONFERENCES, CLASSES... BETWEEN GETTING THINGS DONE AND BLOWING OTHER
  2399. THINGS OFF, ╔ ONE DAY REFLECTED FOR A MOMENT AND REALIZED THAT ╔ HAD
  2400. THREE DAYS LEFT TO GET THE NEXT ARTICLE TOGETHER FOR ├=╚ACKING!  ╙O
  2401. EVERYTHING HAS BEEN SLAPPED TOGETHER AT THE LAST MINUTE, AND ╔ HOPE
  2402. YOU'LL FORGIVE ANY BUGS OR UNCLEAR CONCEPTS.
  2403.                 >>> ┴╬┼├─╧╘┼ ┴╠┼╥╘ <<<
  2404.         ┴ND THAT REMINDS ME: ╔ JUST GOT ╩IFFY─╧╙ AND AN ╞─-2000 DRIVE --
  2405. WHAT A WONDERFUL DEVICE.  ╔ HAVE A 1.6 MEGABYTE DISK FORMATTED INTO
  2406. THREE PARTITIONS.  ╘HE FIRST CONTAINS MY ═ERLIN 128 ASSEMBLER, THE
  2407. SECOND IS SOME 4000 BLOCKS LARGE AND ╔ USE IT FOR ALL MY VARIOUS
  2408. VERSIONS OF CODE WHILE DEBUGGING, AND THE THIRD IS MAYBE 1000 BLOCKS,
  2409. AND CONTAINS ONLY FINISHED CODE -- NO MORE SWAPPING DISKS, NO MORE
  2410. DELETING OLD VERSIONS THAT ╔ HOPE ╔ DON'T NEED TO MAKE ROOM ON THE
  2411. DISK.  ┴LSO, WHEN ╔ INSTALLED ╩IFFY─╧╙ ╔ FOUND A SERIOUS BUG IN MY
  2412. 128─ -- A CRICKET, DEAD AMONG THE ╔├'S.
  2413.  
  2414.         ╘HIS TIME WE WILL COVER A LOT OF GROUND WHICH ISN'T SO MUCH
  2415. CUTTING-EDGE AS IT IS VERY USEFUL.  ╠ET'S FACE IT: CUBES ARE GETTING
  2416. MORE THAN A LITTLE DULL.  ┴ WORTHY END GOAL IS TO HAVE A COMPLETELY
  2417. GENERAL ROUTINE FOR PLOTTING A SERIES OF POLYGONS -- THAT IS, YOU SUPPLY
  2418. A LIST OF (X,Y,Z) COORDINATES FROM WHICH THE PROGRAM CAN FORM A LIST OF
  2419. POLYGONS.  ╘HESE POLYGONS MAY THEN BE DISPLAYED IN 2─, ROTATED, MAGNIFIED,
  2420. FILLED, ETC.  ┴ND, MUCH TO MY THREE-DAY ASTONISHMENT, THAT IS EXACTLY
  2421. WHAT WE ARE GOING TO DO.
  2422.         ┬UT FIRST, A LITTLE EXCURSION.  ╧NE THING WE ARE OF COURSE ALWAYS
  2423. THINKING ABOUT IS OPTIMIZATION POSSIBILITIES: IN THE SHOWER, WHILE
  2424. SLEEPING/DREAMING, OUT ON DATES, ETC.  ╙O, WHERE TO BEGIN?  ╘HE BIGGEST
  2425. CYCLE HOGS IN THE PROGRAM ARE LINE DRAWING AND FACE FILLING -- WELL,
  2426. FILLING FACES IS PRETTY STRAIGHTFORWARD.  ╫HAT ABOUT LINE DRAWING?
  2427.         ╫ELL, ONE DOWNER OF THE ROUTINE IS THAT EVERY SINGLE PIXEL IS
  2428. PLOTTED.  ┬UT AS WE KNOW, ON A COMPUTER ANY GIVEN LINE IS MADE UP OF
  2429. SEVERAL SMALLER VERTICAL AND HORIZONTAL LINES -- WOULDN'T IT BE NEAT
  2430. IF WE COULD THINK OF A WAY TO PLOT THESE LINE CHUNKS ALL AT ONCE,
  2431. INSTEAD OF A PIXEL AT A TIME?
  2432.         ╚ECK YES IT WOULD!  ╙O HERE WE GO:
  2433.  
  2434. ╬EAT-O ┼NHANCED ├HUNKY ╠INE ─RAWING ╥OUTINE
  2435. -------------------------------------------
  2436.  
  2437.         ╞IRST WE NEED TO BE IN THE RIGHT MINDFRAME.  ╠ET'S SAY YOU'RE
  2438. DRAWING A LINE WHERE YOU MOVE THREE PIXELS IN X BEFORE IT'S TIME TO TAKE
  2439. A STEP IN Y.  ╔NSTEAD OF PLOTTING ALL THREE PIXELS IT WOULD OF COURSE
  2440. BE MUCH MORE EFFICIENT TO JUST STICK A NUMBER LIKE %00011100 IN THE
  2441. DRAWING BUFFER.  ┬UT SOMEHOW WE NEED TO KEEP TRACK OF A) HOW LARGE THE
  2442. CHUNK NEEDS TO BE, AND B) WHERE EXACTLY THE CHUNK IS.
  2443.         ╔N THE ABOVE EXAMPLE, WE STARTED AT A PARTICULAR X-VALUE:
  2444.  
  2445.         %00010000
  2446.  
  2447. AND WE WANT TO KEEP ADDING ONES TO THE RIGHT OF THE STARTING POINT; THREE,
  2448. TO BE EXACT.  ╚MMM... WE NEED TO SOMEHOW ROTATE THE STARTING BIT IN A WAY
  2449. THAT LEAVES A TRAIL OF ONES BEHIND IT.  ═AYBE ROTATE AND ╧╥┴ WITH THE
  2450. ORIGINAL BIT?  ┬UT WHAT HAPPENS WHEN YOU TAKE A STEP IN ┘?
  2451.         ╬O, WE NEED SOMETHING FAR SNEAKIER.  ╠ET'S SAY THAT INSTEAD OF
  2452. %00010000 WE START WITH
  2453.  
  2454.         X = %00011111
  2455.  
  2456. ╬OW, WITH EACH STEP IN THE X DIRECTION, WE DO AN ARITHMETIC SHIFT ON X.  ╙O
  2457. AFTER ONE STEP WE HAVE
  2458.  
  2459.         X = %00001111
  2460.  
  2461. AND AFTER TWO STEPS
  2462.  
  2463.         X = %00000111
  2464.  
  2465. AND AT THE THIRD STEP OF COURSE
  2466.  
  2467.         X = %00000011
  2468.  
  2469. ╬OW IT IS TIME TO TAKE A STEP IN ┘.  ┬UT NOW LOOK: IF WE ┼╧╥ X WITH ITS
  2470.  
  2471. ORIGINAL VALUE XOLD = %00011111, WE GET
  2472.  
  2473.         X ┼╧╥ XOLD = %00011100
  2474.  
  2475. WHICH IS EXACTLY THE CHUNK WE WANTED.  ═OREOVER, X STILL REMEMBERS WHERE IT
  2476. IS, SO WE DON'T HAVE TO DO ANYTHING SPECIAL EACH TIME A STEP IS TAKEN IN
  2477. THE Y-DIRECTION.
  2478.  
  2479.         ╙O HERE IS THE ALGORITHM FOR DRAWING A LINE IN THE X-DIRECTION:
  2480.  
  2481.         INITIALIZE X, DX, ETC.
  2482.         XOLD = X
  2483.         TAKE A STEP IN X: ╠╙╥ ╪
  2484.         HAVE WE HIT THE END OF A COLUMN?  ╔F SO, THEN PLOT AND CHECK ON Y
  2485.         IS IT TIME TO TAKE A STEP IN Y?
  2486.         IF NOT, TAKE ANOTHER STEP IN X
  2487.         IF IT IS, THEN LET A=X ┼╧╥ XOLD
  2488.                        PLOT A INTO THE BUFFER
  2489.                        LET XOLD=X
  2490.         KEEP ON GOING UNTIL WE'RE FINISHED
  2491.  
  2492.         ╘HIS SIMPLE MODIFICATION GIVES US A SUBSTANTIAL SPEED INCREASE --
  2493. ON THE OLD FILLED HIRES CUBE3D PROGRAM, ╔ MEASURED A GAIN OF ONE FRAME PER
  2494. SECOND.  ╬OT EARTH-SHATTERING, BUT NOT BAD EITHER!  ╫HEN FACES ARE NOT
  2495. FILLED, THE DIFFERENCE IS OF COURSE MUCH MORE NOTICABLE.
  2496.         ╘HERE ARE A FEW THINGS TO BE CAREFUL OF.  ╘HERE WAS A BUG IN THE
  2497. OLD ROUTINE WHEN THE LINE WAS A SINGLE POINT.  ╔N THAT CASE DX=DY=0, AND
  2498. THE PROGRAM WOULD DRAW A VERTICAL LINE ON THE SCREEN.  ╘HERE ARE PROBABLY
  2499. SOME OTHER THINGS TO BE CAREFUL OF, BUT SINCE ╔ WROTE THIS PART OF THE
  2500. CODE THREE MONTHS AGO ╔ REALLY DON'T REMEMBER ANY OF THEM!
  2501.         ╘HIS TAKES CARE OF HORIZONTAL LINE CHUNKS -- WHAT ABOUT VERTICAL
  2502. CHUNKS?  ╫ELL, BECAUSE OF THE WAY POINTS ARE PLOTTED THERE IS NOTHING
  2503. WE CAN DO ABOUT THEM.  ┬UT, AS WE SHALL SOON SEE, IF WE USE AN ┼╧╥-BUFFER
  2504. TO FILL FACES WE WILL BE FORCED TO TAKE CARE OF THE VERTICAL CHUNKS!
  2505.  
  2506. ╟ENERAL ╨OLYGON ╥OUTINE
  2507. -----------------------
  2508.  
  2509.         ╬OW WE CAN BEGIN THINKING ABOUT A GENERAL POLYGON ROUTINE.  ╞IRST
  2510. WE NEED A LIST OF SETS OF POINTS, WHERE EACH SET CORRESPONDS TO A
  2511. POLYGON.  ╘HE FIRST NUMBER IN A SET COULD BE THE NUMBER OF (X,Y,Z) POINTS
  2512. IN THAT SET, AND THE POINTS COULD THEN FOLLOW.  ╙O A TRIANGLE COULD
  2513. BE GIVEN BY THE DATA SET:
  2514.  
  2515.         3 -1 0 0 0 1 0 1 0 0
  2516.  
  2517. ╘HIS WOULD BE A TRIANGLE WITH VERTICES AT (-1,0,0), (0,1,0), AND (1,0,0).
  2518. ╫E CAN MASH A BUNCH OF THESE SETS TOGETHER, BUT SOMEHOW WE HAVE TO KNOW
  2519. WHEN WE'VE HIT THE END -- FOR THIS WE CAN USE A ZERO, SINCE WE DON'T
  2520. WANT TO PLOT POLYGONS WITH ZERO POINTS IN THEM.
  2521.         ╞OR THAT MATTER, HOW MANY POINTS SHOULD THERE BE IN A POLYGON?
  2522. ╘HERE MUST BE AT LEAST THREE, OTHERWISE IT MAKES NO SENSE.  ╙INCE WE
  2523. WANT OUR POLYGONS TO BE CLOSED, THE COMPUTER SHOULD BE SMART ENOUGH TO
  2524. CONNECT THE LAST POINT TO THE FIRST POINT -- IN OUR TRIANGLE ABOVE,
  2525. THE COMPUTER WOULD JOIN (-1,0,0) TO (0,1,0), (0,1,0) TO (1,0,0), AND
  2526. (1,0,0) TO (-1,0,0).
  2527.         ╬OW THAT WE HAVE A POLYGON, WE WANT TO ROTATE IT.  ┘OU WILL
  2528. RECALL THAT WE HAVE CALCULATED A ROTATION MATRIX ═, WHICH ACTS ON
  2529. POINTS.  ╙O WE NEED APPLY OUR ROTATION TRANSFORM TO EACH OF THE
  2530. POINTS IN THE POLYGON, I.E. MULTIPLY ═ TIMES EACH POINT OF THE
  2531. POLYGON.  ╞URTHERMORE, WE NEED TO PROJECT EACH OF THESE POINTS.
  2532.         ╒H-OH: MATRIX MULTIPLICATION.  ╔N THE PAST WE HAVE AVOIDED THIS
  2533. ISSUE BY PUTTING THE VERTICES OF OUR CUBE AT 1 OR -1.  ╙O WE NEED TO
  2534. USE OUR MULTIPLICATION ROUTINE FROM LAST TIME.  ┬UT WAIT!  ┴S YOU RECALL,
  2535. THE LAST PROGRAM USED A SPECIALLY MODIFIED MULTIPLICATION TABLE.  ╘O GET
  2536. A WIDER RANGE OF NUMBERS TO MULTIPLY WE WILL NEED ANOTHER SET OF
  2537. MULTIPLICATION TABLES -- NO BIG WHOOP.
  2538.         ╬OW, IF YOU REVIEW THE MULTIPLICATION ROUTINE FROM LAST TIME,
  2539. IT ADDS TWO NUMBERS AND SUBTRACTS TWO NUMBERS.  ╫HAT KINDS OF NUMBERS
  2540. WILL WE BE DEALING WITH?  ╘HE MATRIX ELEMENTS VARY BETWEEN -64..64.
  2541. ╘HIS THEN FIXES OUR RANGE OF POLYGON COORDINATES FROM -64..64.  ╫HY?
  2542. ╔F THE MATRIX ELEMENT IS 64, AND WE MULTIPLY IT BY 64, THE MULTIPLICATION
  2543. ROUTINE WILL ADD 64 AND 64 AND GET 128, WHICH IS RIGHT ON THE EDGE OF
  2544. OUR MULTIPLICATION TABLE.
  2545.         ├AN WE IMPROVE THIS ROTATION PROCESS IN ANY WAY?  ╔N FACT, WE CAN
  2546. CUT DOWN ON THE NUMBER OF MULTIPLICATIONS (I.E. DO EIGHT OR EVEN SEVEN
  2547. INSTEAD OF NINE MULTIPLICATIONS).  ╚OWEVER, THERE IS A FAIR AMOUNT OF
  2548. OVERHEAD INVOLVED IN DOING SO, AND OUR MULTIPLY ROUTINE IS FAST ENOUGH
  2549. THAT THE EXTRA OVERHEAD AND COMPLEXITY REALLY GAIN US VERY LITTLE IN ALL
  2550. BUT THE MOST COMPLICATED OF POLYGONS.  ╔N OTHER WORDS, ╔ DIDN'T BOTHER.
  2551.  
  2552.         ╫HAT ABOUT HIDDEN FACES?  ┴GAIN, FROM LAST TIME YOU MAY RECALL
  2553. THAT A METHOD WAS DESCRIBED WHICH USED THE CROSS-PRODUCT OF THE PROJECTED
  2554. VECTORS.  ╚OW DO WE IMPLEMENT THIS IN THE PROGRAM?  ╫ELL, IF WE TAKE
  2555. THE FIRST THREE POINTS OF THE POLYGON, WE HAVE TWO VECTORS.  ╠ET'S SAY
  2556. THESE POINTS ARE ╨1 ╨2 AND ╨3.  ╘HEN ╓1=╨1-╨2 AND ╓2=╨3-╨2 ARE TWO
  2557. VECTORS IN THE PLANE OF THE POLYGON WHICH ARE CONNECTED AT THE POINT ╨2
  2558. (THIS ANALYSIS WILL OF COURSE ONLY WORK IF THE POLYGON LIES IN SOME PLANE).
  2559. ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT, THE SIGN WILL BE POSITIVE OR
  2560. NEGATIVE, AND THIS WILL TELL US IF THE POLYGON IS VISIBLE.
  2561.         ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT?  ┴BSOLUTELY.
  2562. V1 X V2 = -V2 X V1.  ╫HAT IT REALLY BOILS DOWN TO IS HOW YOU DEFINE THE
  2563. POINTS IN YOUR POLYGON.  ╙PECIFICALLY, WHAT ORDER THEY ARE IN.  ╨OINTS
  2564. THAT ARE SPECIFIED IN A CLOCKWISE MANNER WILL GIVE A FACE POINTING IN
  2565. THE OPPOSITE DIRECTION OF A POLYGON WITH THE SAME POINTS SPECIFIED IN
  2566. A COUNTER-CLOCKWISE ORDER.  ╔N MY PROGRAM, THE POLYGONS MUST BE ENTERED
  2567. IN COUNTER-CLOCKWISE ORDER (WITH YOU FACING THE POLYGON) FOR HIDDEN
  2568. FACES TO WORK THE WAY YOU WANT THEM TO ;-).
  2569.  
  2570.         ╧NE OTHER NEAT THING TO HAVE IS THE ABILITY TO ZOOM IN AND OUT.
  2571. ╫E KNOW FROM THE VERY FIRST ARTICLE THAT ZOOMING CORRESPONDS TO MULTIPLYING
  2572. THE PROJECTED POINTS BY A NUMBER, SO THAT'S WHAT WE'LL DO.  ╘HE MULTIPLICATION
  2573. ROUTINE RETURNS ┴=┴*┘/64, SO A ZOOM FACTOR OF 64 WOULD BE LIKE MULTIPLYING
  2574. THE POINT BY ONE.  ┴LL THE PROGRAM DOES IS MULTIPLY THE PROJECTED POINTS
  2575. BY A NUMBER ZOOM, UNLESS ZOOM=64, IN WHICH CASE THE PROGRAM SKIPS THE
  2576. ZOOM MULTIPLY.  ┬E WARNED!  ╬O CHECKS OF ANY SORT ARE MADE IN THE PROGRAM,
  2577. SO YOU CAN ZOOM AT YOUR OWN RISK!
  2578.  
  2579.         ╘HE IMPORTANT THINGS TO REMEMBER ARE: WHEN ENTERING POLYGONS,
  2580. MAKE SURE THE NUMBERS RANGE FROM -64 TO 64, AND THAT YOU ENTER POINTS
  2581. IN COUNTERCLOCKWISE.  ╧UR TRIANGLE EXAMPLE ABOVE REALLY SHOULD HAVE BEEN
  2582. ENTERED AS, SAY,
  2583.  
  2584.         3 -64 0 0 64 0 0 0 64 0
  2585.  
  2586. ╞ILLED ╞ACES -- ╒SING AN ┼╧╥ BUFFER
  2587. -----------------------------------
  2588.  
  2589.         ╫ELL WE STILL HAVE ONE THING LEFT, WHICH WAS ALLUDED TO IN THE
  2590. PREVIOUS ARTICLE: USING ┼╧╥ TO MAKE A FILLED FACE.  ╙OME POSSIBLE
  2591. DIFFICULTIES WERE RAISED, BUT WHEN YOU PLOT A SINGLE POLYGON AT A
  2592. TIME, THE PROBLEM BECOMES VASTLY SIMPLIFIED.
  2593.         ╞IRST ╔ SHOULD PERHAPS REMIND YOU WHAT EXCLUSIVE-OR IS: EITHER
  2594. ┴ OR ┬, BUT NOT BOTH.  ╙O 1 ┼╧╥ 0 = 1, AS DOES 0 ┼╧╥ 1, BUT 0 ┼╧╥ 0 = 0
  2595. AND 1 ┼╧╥ 1 = 0.  ┴S A SIMPLE INTRODUCTION TO USING THIS FOR FILLING
  2596. FACES, CONSIDER THE FOLLOWING PIECE OF THE DRAWING BUFFER:
  2597.  
  2598.         00001011 ═1
  2599.         00000000 ═2
  2600.         00000001 ═3
  2601.         00001010 ═4
  2602.  
  2603. ╠ETS SAY WE MOVE DOWN MEMORY, ┼╧╥ING AS WE GO.  ╠ET ═2 = ═1 ┼╧╥ ═2.  ╘HEN
  2604. LET ═3 = ═2 ┼╧╥ ═3.  ╘HEN LET ═4 = ═3 ┼╧╥ ═4.  ╧UR LITTLE PIECE OF MEMORY
  2605. IS NOW:
  2606.  
  2607.         00001011 ═1
  2608.         00001011 ═2
  2609.         00001010 ═3
  2610.         00000000 ═4
  2611.  
  2612. ╫HAT JUST HAPPENED?  ╔MAGINE THAT THE ORIGINAL MEMORY WAS A SERIES OF
  2613. PIECES OF LINE SEGMENTS.  ╫E HAVE JUST FILLED IN THE AREA BETWEEN THE
  2614. TWO LINE SEGMENTS, LIKE MAGIC!
  2615.         ╔F YOU STILL AREN'T GETTING IT, DRAW A LARGE SECTION OF MEMORY,
  2616. AND THEN DRAW AN OBJECT IN IT, LIKE A TRIANGLE, OR A TRAPAZOID, AND
  2617. ┼╧╥ THE MEMORY BY HAND, STARTING FROM THE TOP AND MOVING DOWNWARDS.
  2618.         ┼╧╥ FLIPS BITS.  ╔F YOU START WITH A ZERO, IT STAYS ZERO UNTIL
  2619. IT HITS A ONE.  ╔T WILL THEN STAY ONE UNTIL IT HITS ANOTHER ONE.  ╙O
  2620. YOU CAN SEE THAT IF YOU HAVE AN OBJECT BOUNDED BY ONES, ┼╧╥ING
  2621. SUCCESSIVE MEMORY LOCATIONS WILL AUTOMAGICALLY FILL THE OBJECT.
  2622.         ╥IGHT?  ╫ELL, WE HAVE TO BE CAREFUL.  ╧NE MAJOR PROBLEM IS
  2623. A VERTICAL LINE:
  2624.  
  2625.         1                       1
  2626.         1       GOES TO         0
  2627.         1                       1
  2628.         1                       0
  2629.  
  2630. ╬OT ONLY IS THE RESULTANT LINE DASHED, BUT IF THERE ARE AN ODD NUMBER OF
  2631. POINTS IN THE LINE SEGMENT, THE LAST ONE WILL HAPPILY MOVE DOWNWARDS IN
  2632. MEMORY, AND GIVE YOU A MUCH LONGER VERTICAL LINE THAN YOU EXPECTED!  ╙INCE
  2633. ANY LINE WITH SLOPE GREATER THAN ONE IS MADE UP OF A SERIES OF LINE
  2634. SEGMENTS, THIS IS A MAJOR CONSIDERATION.
  2635.         ┴NOTHER PROBLEM ARISES WITH SINGLE POINTS: A ONE JUST SITTING ALL
  2636. BY ITSELF WILL ALSO GENERATE A NICE STREAK DOWN YOUR DRAWING AREA.
  2637.         ╔F YOU THINK ABOUT IT, WHAT WE IDEALLY WANT TO HAVE IS AN OBJECT
  2638. THAT AT ANY GIVEN VALUE OF X THERE ARE EXACTLY TWO POINTS, ONE DEFINING
  2639. THE TOP OF THE OBJECT, AND THE OTHER DEFINING THE BOTTOM.  ╘HIS GIVES US
  2640. THE INSIGHT TO SOLVE THE ABOVE TWO PROBLEMS.
  2641.         ╞IRST LET'S THINK ABOUT VERTICAL LINES.  ╔N PRINCIPLE WE COULD
  2642. PLOT THE FIRST AND LAST ENDPOINTS OF EACH VERTICAL LINE CHUNK, BUT THAT
  2643. IS EXACTLY WHAT WE DON'T WANT!  ╥EMEMBER THAT THESE ARE CLOSED POLYGONS,
  2644. WHICH MEANS THAT THERE ARE _TWO_ LINES WE NEED TO THINK ABOUT.  ╔F ╔
  2645. PLOT JUST A SINGLE POINT IN EACH VERTICAL LINE SEGMENT, THERE MUST
  2646. BE ANOTHER POINT SOMEHWERE, EITHER ABOVE OR BELOW IT, FROM ANOTHER
  2647. LINE SEGMENT, WHICH WILL CLOSE THE POINT TO ┼╧╥-FILLING.  ╥EMEMBER, WE
  2648. WANT EXACTLY TWO POINTS AT EACH VALUE OF X: ONE WILL COME FROM THE
  2649. LINE, AND THE OTHER WILL COME FROM THE OTHER LINE WHICH MUST LIE ABOVE
  2650. OR BELOW THE CURRENT ONE.
  2651.         ╞URTHERMORE, WITH ANY CONVEX POLYGON THERE ARE EXACTLY TWO
  2652. LINES WHICH COME TOGETHER AT EACH VERTEX OF THE POLYGON.  ╘HIS MEANS
  2653. THAT THERE ARE ONLY CERTAIN CASES WHICH WE NEED TO WORRY ABOUT.
  2654. ╞OR INSTANCE, TWO LINES MIGHT JOIN IN ANY OF THE FOLLOWING WAYS:
  2655.  
  2656.         \                  /    \    /
  2657.          \                /      \  /
  2658.           \_____    _____/        \/  ETC.
  2659.  
  2660. ╔F YOU DRAW OUT THE DIFFERENT CASES INVOLVING VERTICAL LINES, YOU CAN SEE
  2661. THAT YOU HAVE TO BE CAREFUL ABOUT PLOTTING THE LINES.  ╧NE TRICKY ONE
  2662. IS WHERE TWO VERTICAL LINES WITH DIFFERENT SLOPES OVERLAP AT THE POINT
  2663. OF INTERSECTION.
  2664.         ╙O AFTER STARING AT THESE PICTURES FOR A WHILE, YOU CAN FIND
  2665. A CONSISTENT METHOD WHICH SOLVES THESE DIFFICULTIES.  ┴S LONG AS YOU
  2666. FOLLOW THE FOLLOWING RULES, THE PROBLEMS ALL DISAPPEAR; THE LINE ROUTINE
  2667. NEEDS TO BE MODIFIED SLIGHTLY:
  2668.  
  2669.         1) ╫HEN PLOTTING A VERTICAL LINE (I.E. BIG STEPS IN ┘ DIRECTION),
  2670.            DON'T PLOT THE ENDPOINTS (I.E. X1,Y1 AND X2,Y2).
  2671.         2) ╫HEN PLOTTING A VERTICAL LINE, CONSISTENTLY PLOT EITHER THE
  2672.            FIRST PART OF EACH CHUNK OR THE LAST PART OF EACH CHUNK
  2673.            (EXCLUDING THE ENDPOINTS OF COURSE).  ╔N OTHER WORDS, ONLY
  2674.            PLOT A POINT WHEN YOU TAKE A STEP IN X, AND THEN PLOT ONE
  2675.            AND ONLY ONE POINT.
  2676.  
  2677. ╬OW ╔ DEDUCED THESE BY STARING AT PICTURES FOR A FEW HOURS AND TRYING
  2678. DIFFERENT THINGS LIKE TOP/BOTTOM OF CHUNK, LEFT/RIGHT, FIRST/LAST, ETC.
  2679. ┘OU CAN SEE THAT IN SOME CASES THIS ENSURES THAT ONLY ONE POINT APPEARS
  2680. ON A GIVEN LINE SEGMENT.  ┬UT TO ME THE ONLY WAY TO CONVINCE YOURSELF
  2681. THAT THIS REALLY DOES WORK IS TO DRAW A BUNCH OF PICTURES, AND TRY IT
  2682. OUT!  ┘OU HAVE CASES WHERE TWO VERTICAL LINES INTERSECT, AND WHERE
  2683. A VERTICAL LINE INTERSECTS A HORIZONTAL LINE.
  2684.         ┬UT THERE IS STILL ONE THING WHICH WE HAVE FORGOTTEN -- THE
  2685. CASE OF A SINGLE POINT.  ╘HIS CAN HAPPEN IN, FOR INSTANCE, A POINTY
  2686. TRIANGLE, POINTING IN THE X-DIRECTION.  ╚OW DO WE FIX THIS?  ┬Y
  2687. SIMPLY AVOIDING THE POINT: IN THE LINE DRAWING ROUTINE, USE ┼╧╥
  2688. TO PLOT THE POINTS INSTEAD OF ╧╥┴.  ╙INCE VERTICAL LINES SKIP THE
  2689. ENDPOINTS, VERTICAL-HORIZONTAL INTERSECTIONS ARE ╧╦.  ╚ORIZONTAL-
  2690. HORIZONTAL INTERSECTIONS WILL FORCE THE POINT OF INTERSECTION TO
  2691. BE ZERO.
  2692.         ╒H-OH, WHAT ABOUT INTERSECTIONS LIKE -----*------.  ╤UITE FRANKLY
  2693. ╔ JUST THOUGHT OF IT, AND ╔ THINK MY PROGRAM WILL FAIL ON INTERSECTIONS
  2694. LIKE THESE.  ─RAT.  ╫ELL, THAT JUST GIVES US SOMETHING FOR NEXT TIME!
  2695.         ╧NE OTHER THING NEEDS TO BE MENTIONED: FOR ┼╧╥-FILLING TO BE USEFUL
  2696. YOU NEED TO DRAW THE POLYGON IN A SPECIAL BUFFER, AND THEN ┼╧╥ THIS BUFFER
  2697. INTO THE MAIN DISPLAY BUFFER.  ╔F YOU TRY TO ┼╧╥ THE DISPLAY BUFFER DIRECTLY
  2698. YOU ARE GOING TO HAVE A WHOLE HEAP OF TROUBLE, SUCH AS THE CONCERNS RAISED
  2699. LAST TIME.
  2700.         ╞INALLY, THIS GIVES A SIMPLE WAY OF FILLING WITH PATTERNS INSTEAD
  2701. OF BORING MONOCOLOR.  ╔NSTEAD OF ┼╧╥ (┼╧╥┬╒╞),┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ YOU CAN
  2702. USE ┼╧╥ (┼╧╥┬╒╞),┘ : ┴╬─ ╨┴╘╘┼╥╬,┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ (AS LONG AS YOU
  2703. PRESERVE THE ORIGINAL ┼╧╥ (┼╧╥┬╒╞),┘).
  2704.  
  2705.         ╫ELL ╔ AM EXTREMELY TIRED AND ╔ HOPE ├RAIG HASN'T SENT OUT ├=╚ACKING
  2706. WITHOUT ME!  ╔ HOPE YOU HAVE FUN PLAYING WITH THE PROGRAM, AND ╔ WOULD BE
  2707. VERY INTERESTED IN SEEING ANY NEAT GEOMETRIC SHAPES YOU MIGHT DESIGN!
  2708.  
  2709. ╨ROGRAM NOTES:
  2710. --------------
  2711.  
  2712.         - ╚IDDEN FACES DEFAULTS TO "ON".  ╔F YOU ENTER A SHAPE AND A BLACK
  2713.           SCREEN COMES UP, HIT 'H' TO TURN OFF HIDDEN FACES (YOU PROBABLY
  2714.           ENTERED THE POLYGON CLOCKWISE).
  2715.         - ╘HERE IS NO PATTERN FILLING -- JUST SIMPLE ┼╧╥ WITH A TWIST:
  2716.           THE ┼╧╥ BUFFER IS ┼╧╥'D INTO THE DRAWING BUFFER.
  2717.         - ┘OU MIGHT START HOSING MEMORY IF YOU ZOOM TOO LARGE.
  2718.  
  2719. ╙╠╩ 6/15/95
  2720.  
  2721. ┴DDENDUM
  2722. --------
  2723. ╙TEPHEN ╩UDD SJUDD@NWU.EDU
  2724.  
  2725.         ╠AST TIME WE PUT A CIRCLE INTO THE 2─ GRAPHICS TOOLBOX.  ├HRIS
  2726. ═C┬RIDE HAS POINTED SOMETHING OUT TO ME ABOUT THE ALGORITHM, WHICH MAKES
  2727. IT COMPLETE.  ┴S YOU MAY RECALL, THE ALGORITHM GAVE A VERY SQUARISH
  2728. CIRCLE FOR SMALL RADII.  ├HRIS TOLD ME THAT SETTING THE INITIAL COUNTER
  2729. VALUE TO ╥/2, INSTEAD OF ╥, GAVE A PERFECT CIRCLE.  ╫HAT IS GOING ON?
  2730. ╔F YOU RECALL THE ALGORITHM, WE ARE COMPUTING A FRACTIONAL QUANTITY,
  2731. AND WHEN THAT QUANTITY BECOMES LARGER THAN ONE, WE DECREASE ╪.  ╫OULDN'T
  2732. IT BE A WHOLE LOT SMARTER TO ROUND OFF THAT FRACTION INSTEAD OF
  2733. TRUNCATE IT?  ╧F COURSE IT WOULD, AND THAT IS WHAT STARTING THE COUNTER
  2734. AT ╥/2 DOES.
  2735.         ╙O, TO UPDATE THE PREVIOUS ALGORITHM, ┴ SHOULD BE INITIALIZED TO
  2736. ╥/2 INSTEAD OF ╥, WHICH MEANS THAT WE CHANGE
  2737.  
  2738.         ╠─┴ ╥
  2739.  
  2740. TO
  2741.  
  2742.         ╠─┴ ╥
  2743.         ╠╙╥
  2744.  
  2745. FOR A PERFECT CIRCLE EVERY TIME.
  2746.  
  2747. BEGIN 666 CUBE3D3.2.S
  2748. ═ ' ╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘╩╚*"@╚*"@╚*"@
  2749. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'-415!(14┌@:┼5$1*"@╚*"@╚*"@
  2750. ═╚*"@╚*"@╚*"@*@╘╩╚&=%3╒)'1:!╘05┼,3╒*@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
  2751. ═╚'-405)4140┌╚#<╧,3$╧.32@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&9)3─┼32$5$.╩ ╫
  2752. ═+╙$┘+╙─╘╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@8╘]-4$╤%5$5$.╩ ╤,┬\╤-╥\┘
  2753. ═-*"@╚*"@*@╘╩╚%8╙+├"@8╘]-4$╤%5$5$.╩ ╙+╙(╨+╙─╒╚*"@╚*"@*@╘╩╚%8╙
  2754. ═+├&@8╘]-4$╤%5$5$.╩ ╓+╙$╘+╙─╒╚*"@╚*"@*@╘╩╚%8╙+├*@8╘]-4$╤%5$5$
  2755. ═.╩ ╓+╙$╒+╙─╒╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  2756. ═╚*"@*@╘╩╚'=%3$╨╠╚$┼&╚$%,3*!'3╘53╚%=%3$╥@5$┴)4┌"@*@╘╩╚%!23╘=2
  2757. ═04╓@5╘┼,3*!23╒1!5$6@0:!#54)%+╩"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  2758. ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@*┌!╬15>@04┘$╚&┼-4%)/5─5$(:"@╚*"@
  2759. ═*@╘╩╚&┘/5┌!7251(╚$9!4╒1%4╩!23╒5424┘%4╥╥@╚*"@*@╘╩╚$┴)1$1%3╩!3
  2760. ═55)&04-%4╥╥@1─┼,3$5$╚*"@╚*"@*@╘╩╚$9!0╘53+*!!3─2@15┴44─&@5$]0
  2761. ═╚%-%0╒)%5*"@*@╘╩╚%1%6%2@34534╘%'15,┴╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
  2762. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├"@*┌!╞05-4
  2763. ═╚$-(54┘+6:!,24┘%╚*"@╚*"@*@╘╩╚%)/551)3─4╬╚*"@╚*"@╚*"@╚*"@╚*"@
  2764. ═╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙
  2765. ═+├&@*┌!╟14┘%4─%,╚%!/3%┼'3╘┌@4$╤/5*"@*@╘╩╚%=)5$┬@2$┼$1$5.╚$9!
  2766. ═0╘53╚"┴╪+5!23╘150╒0╔*@╘╩╚$%.1*!:3╘]-╚$9%05154─4╬╚*"@╚*"@╚*"@
  2767. ═╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├*@
  2768. ═*┌!┼;╫(═0┼5&1─52╚$9)3$╤)3─>@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  2769. ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(25.@4%)/1╒)!3:!)4┌!)3┼1%3─1%1*!43┌"@
  2770. ═*@╘╩╚$%#0╘]-4$%.6:!42$6@05)424-,1:!)3╩"@╚*"@*@╘╩╚&,]:$%#2╘┼.
  2771. ═1╥╥@:┼5.+╩ ┘-:!)4╒-512┌@╚*"@*@╘╩╚&9/4╩!$151!24╤3╚$].╚%1(25.@
  2772. ═4%)/1╒)!32╥@*@╘╩╚%)%042@5$┴%╚$%25$┼#3$4┴╚*"@╚*"@╚*"@╚*"@*@╘╩
  2773. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'=2251%╚%1/╚%53
  2774. ═(:"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  2775. ═╚*"@╚*"@*@╘╩╚&╒94╘5,1╩!72$5.╚%┼/54┘'╚$1)1*"@╚*"@╚*"@*@╘╩╚$5!
  2776. ═1╘523%╞@1┼)%455%3┼2@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&1/0╒1/4╩!!3─2@<╘%)
  2777. ═3┼0╠╚$%.1*!(14%21*"@*@╘╩╚$=214%4╚&%21╒5-14┘4╚*"@╚*"@╚*"@╚*"@
  2778. ═╚*"@*@╘╩╚*!┴0─]55*!)5*!!3─2@04)/550┌╚$)55*"@╚*"@*@╘╩╚*!%5─52
  2779. ═34]21:"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&-!346@3╒54╚$)9╚%1(1:!3
  2780. ═04╒%╚&1/3╒*@╚*"@*@╘╩╚$%3╚$┼.╚&╞@5╘5.5"┌@╚*"@╚*"@╚*"@╚*"@╚*"@
  2781. ═*@╘╩╚*"@╚"╓@<┼5"04┼9052@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@
  2782. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(3╒5'2*!╔╚%-014%+╚%=)5$┬@
  2783. ═5$┴%╚*"@╚*"@*@╘╩╚%1/3─=515.@3╘:@345.╚$%.1*!/1╩!!3─=,15.@*@╘╩
  2784. ═╚$%.1*!(059%╚$┘/5*!,3╒9%+*!╔╚$%-╚*"@╚*"@*@╘╩╚$)%0╘]-1:!!4┌!3
  2785. ═3╒5.1$┼.1┌!"4─%34╥╥@3╒*@*@╘╩╚$&@5$┼.2╘╤)3─>@0╒┼-0─%,+╩"@╚*"@
  2786. ═╚*"@╚*"@*@╘╩╚*"@╚"╓@,:!├3╒))3┼1(24%.4┌ ╤,┌"@╚*"@╚*"@*@╘╩╚*"@
  2787. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚' ╬<╥┌@=$┴)4┌!705.@
  2788. ═5╒))5%1%3╩!54╘┼.1┌"@*@╘╩╚*"@╚*"@;4523$┼.╚#$╥."┌@╚*"@╚*"@╚*"@
  2789. ═╚*"@*@╘╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘-(&]╥9╥ ─
  2790. ═.# ╨, ╘-*╩!├3╘┘35$%.5%,-#6)╒9╞8╤(&5╤=2 ─,╙ ╨," [9─┼24╒2@0╘┴!
  2791. ═4─%#5$52╚%-%5 ╒┬=69╞,┬!┼<74@)#,╪,# @.╫-%0╘].1*!#2$%204-415*@
  2792. ═4╘54#65╧<╞)╒9┬!┼<74@)#0╨,# @.╓5╧<┬╒"549&15(-8╟5╞9╞5╥(&5╤=2 ─
  2793. ═83,@.╫!215-534%"3%╞@5$┴%╚%1!4$6@5╘].)╒2@0─6@4┼5.3─┼.1╨╒╪,2!┼
  2794. ═<74@)&9┬(#═╨3╘┼.5%.@1─]2╚$1205=)3─>@0:!,24┘%#7─╤(&5╤=2 ─9╞,@
  2795. ═.╫1(15-%╚%╔%4─^@4$%'1:!!1$1215-315,->#(@97%╒("1╞9" [1$].)╒2@
  2796. ═0╘].1─╤)0╒2@5╘┼42*!┬87-╔8╨╒┘,┬!┼<74@)&9┼#6]╠9'@@97%╒("1╞9 ╒├
  2797. ═:'5╬:╥!┼<74@)&9┼#61╪(&5╤=2 ─-├<@.╫1(25.@25.@4╘┴!4─5$╚%=)5$┬@
  2798. ═=#&@0─5,3╒<-9'─@97%╒("0╓. ╒╘96╒╨,2!┼<74@)&9┬(#═╧1╩!#3╒524╘4╠
  2799. ═╚$-/54╤$╚$-/3─9,24-4╚%=)5$┬@6#$-=&5═<#(@97%╒("1╞8╥ [=$5-4$]2
  2800. ═05)9╚%9!4─┼!0─╤%4╨╒┌=&5═<"!┼<74@)# ╥(#═╒4╘5$╚$9/4╩!"549&15*@
  2801. ═4╒=!4"┌@╚&1/3┬=4╚%1/54-(+@╒┌,2!┼<74@)#(╥(#═╒4╘5$╚$)9╚$╒!5$┬@
  2802. ═4─]55$┼.10╒┌,┬!┼<74@)#(╘(#═─3╘╪╟5*!43╒5#2*!42$531:!%251(15(┴
  2803. ═#7╚╙(&5╤=2 ─,├8->├0@97%╒("0╥. ╒╦(&5╤=2 ─8├8@.╓-/3┼-404┘4╚%53
  2804. ═142@1─]2╚$┴)1$1%3@╘@(" [4╒521─%#1:!$151%0╒1)3╘┌@+:!$3╘╪╟5*!4
  2805. ═3╒5#2 ╒╚:61┼(&5╤=2 ─8├4@.╓%21:!355)&04-%4┌!(241$14╪_#69╔;&╨@
  2806. ═97%╒("0╒," [85)%╚%=%╚%5324┘'╚&5╧<┬╒&24╤,/╨╒┴;╞=═87@@97%╒(#$╥
  2807. ═," [=$┴%4─6@05)%╚#(╩4$─╧04┘'34%8╚$%.1╘╤%4╨╘-*╩!╓:6,-#79═8╫-┬
  2808. ═(&5╤=2 ─9# ╤. ╒┬:╓=╬9"!┼<74@)&0╨,├ -8╞]╥9&5╥(&5╤=2 ─9# ╥,0╒╙
  2809. ═<╫1┴<╟0@97%╒(#$╙-#0@.╒)/5┌ ┘╚$┼.╚%-#4─5%3╩!-14╒/4┼╞@052@,3 ╥
  2810. ═- ╘-#2╩@:╘523─%,#0╒├:')╧=70@97%╒("1╞9╞0╥#6=┼=&┼╬(&5╤=2 ─9╞9┼
  2811. ═- ╘-*╩!╙3╘╒%╚%9!4─┼!0─╤%4╨╘-9╓╤╧8╟┴═:6╪@/2 ─,╓8@.╫1(15-%╚$%2
  2812. ═1:!54╘5$╚$┼.╚$-,14%224┘'╚%1(10╒╟;&]┬>&╒┴>" ]("0╘," [1%)!5╘┼.
  2813. ═1┌ ╚1╘╤/0─%,*:!"549&15(-9╓╤╧8╟┼═:6╪@/2 ─-#$-9╓╤╧8╟┼═87@@/2 ─
  2814. ═-#(-;&]├>&╒╔;┬ ]("0╒-╥ [=$┴%4╘6@05)%╚%53142@24┌@0╘╤%05))3─>@
  2815. ═5$┴%#6╤╧8╫┴═87@@/2 ─-3@@.╓5╧<╩ ╚3$]#04╨╔╚$)51─9%4@╒╠;╓-┘;6┼╬
  2816. ═(#╘@)#4┘#6╤╧8╫┼═87@@/2 ─-├ -<#%╪(#╘@)#─╥(#═╘2$531:!!4─6@5$5-
  2817. ═4$]205)9╚%-43╒)!1╘4-<#%┘(#╘@)#─╙(#═╒4╘5$╚$┼.╚%!,3╒1424┘'╚%1(
  2818. ═1:!04─]*14-424].#7 ╤>┬ ]("0┘- ╒╨,╟@@/2 ─.34@.╫1(15╞@05)%╚$┴%
  2819. ═4─6@4╘^@5$┴!5*!710╒╨,╟─@/2 ─.38@.╘1/3┬=4╚$┴!5─6@5$^@4─5#04╤#
  2820. ═54╤!5$6@5$┴%32╪-<#)┌(#╘@)&%┼#7 ╙>" ]("1┴9┬ [=$┴%6:!-04═%╚$╤)
  2821. ═1─6@14%362╪-<#-┘(#╘@)&(╨#7 ╙>┬ ]("1┬,2 [=╘┴9╚$%21:!93╒6@3$]/
  2822. ═2╘┼.1┌!!5*!-1:!,24═%╚%1(050_#7 ╤=" ]("1┬,┬ [9$].)╒2@64]5╚%12
  2823. ═55-4╚$╒%/╨╒╨,╟0@/2 ─8├,-<#-╘(#╘@)&(╘(#═╚059)3─>@04┘/5$┴%4╩!#
  2824. ═2$┼,1*!705-.)╒2@35╞@241%02╪-:6┘─97@@/2 ─-3$-8╓]╒;╟1╨=',@/2 ─
  2825. ═-3(->╞]╧;2 ]("0╫,2 [>─]/3:!&04-43╒(-9'-╪(#╘@)#8╤(#═─<╫┬@25.@
  2826. ═5$┴%╚$┼.0╒)%345.5*!&3╒(-(" @.╒)/5$%424┘'╚$%23╒5.1*!8#61╙>2 ]
  2827. ═("0╓,┬ [<╘┼-24╤!4╩!&3╒*@9'-┘+*!─<╫╚-9'-┌(#╘@)#8╙#7-╪(#╘@)#8╘
  2828. ═(#═╘2$531:!!4─6@5$┴%╚$%#5%5!3*!!3─=,15.@24┌@6*!9╚$%.1*!:#7-┘
  2829. ═(#╘@)#8╒#7-┌(#╘@)#8╓#70╤(#╘@)#8╫(#═╘2$531:!!4─6@55-%1*!)3╩!4
  2830. ═2$6@4─]4051)3╘╪-=#(@/2 ─-├@-=#,@/2 ─-├─@.╫-%1:!42$6@05)424-,
  2831. ═1:!&3╒*@34]21:!$151!24╤3#70╘(#╘@)#9┴#70╒(#╘@)#9┬#70╓(#╘@)#9├
  2832. ═#70╫(#╘@)#9─#70╪(#╘@)#9┼#70┘(#╘@)#9╞#70╤," ]("0╫, ╒┴,3$@/2 ─
  2833. ═834@.╫1(15-%╚$%21:!42$6@14╤%345.5%.@3╘:@5$┴%╚%)/5$%424].╚$╒!
  2834. ═5%))6 ╒┬,3(@/2 ─838@.╫┴┘>@╒├,3,@/2 ─83<-9#(╤(#╘@)&$╪(#═╘2$6@
  2835. ═3┼5-0─52╚$1%3─]415.@*%)/5╥╤#3╘╤534╪╔#64╥,┬ ]("1┴.0╒╞,├,@/2 ─
  2836. ═86$-9╙,╤(#╘@)&%┬#6@╙,┬ ]("1┴8╨╒╔,╙,@/2 ─860-#0╘╩*┬╩@;4%#4─]3
  2837. ═#0╒═;╫9┼(&╒┴8╨╘@;&1┴(%╘╤#2!╙=&$@73(-(#╨\/ ╘-9╓5╘:╓5┘(&╒┴8╥ @
  2838. ═.╫=!252@1─]2╚$&@2╘594%)%4╒,-=╓%╔="!╩<╫(@9╓5╘:6╪-(&-═<" ├,# -
  2839. ═(&)┼<2!╫86┼╘#2 \/#╨-#61┼8╟5╟(&╒┴8╥ @.╫!224┘4╚$&@0╘┴!4─%#5$52
  2840. ═#2!─;┌ ╨╚* [9$].)╒2@05-314╒"3$4-#2!╠9&&@(╒╘╤#2!╩<╫*@8╓┴╥;╫5╘
  2841. ═#2!├;&─-(#╪^/┬!╟971╦97─@.╓%.1*!704┼4╚%1/╚$-/3┼1)3┼5%#2!├;7 @
  2842. ═(╥=3)╥ [;5╞@4╘5#4─5#5*!35╘┼40╘┬@2╘59#2!┬;╞4@;#$-(&╔╙<┬!├;&5┴
  2843. ═;╟5╨#2!╩;7 @9&]╬90╒╠,2!├;7 @(╥=8)╥ [;5╞@4╘5#4─54╚$%"3╒)4╚$═%
  2844. ═60╘@8╞┘┼(&1╧;╞4-(&╔═<"!├;&5┴;╟5╨#2!╞:6╪-9&]╬92 \/#╨-#61┼8╟5╟
  2845. ═82!═86,-(&1╧╚# -(&╤─82!=,0╘@<╫1┴(#$╨,├0-(&9╔;@╒─;╓┘┼82 \/#╨-
  2846. ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#0╘@;&1┴(",─,# -
  2847. ═('-╘82!┬:╓=╬9 ╘@<╫1┴(&)╧<╞1┼<@╘@;&1┴('9═8╫-┬#2!┴;╞0@(╥4╨,# ╨
  2848. ═,3$╤,2 [<╘-2145.╚$╒%34]26:!43┌ ╤,#(╘#2!╧<╞$@(╥4╨,# ╤,# ╨, ╘@
  2849. ═<╫1┴('9═8╫-┬#0╘@;&1┘(",╨, ╘@;&1┴(",\='1┼>'0-('-╘82!╘96╒╨,0╘@
  2850. ═;&1┴(",^='1┼>'0-('-╘82!╘96╒╨,@╘@:╞╒╨('1╔=&╤┼#71╘97┴╘(&┴┼>" ┘
  2851. ═,╙ ╒,3$╤,3$╤(#═#3$5!4╩!30╒)%14╪╠╚%=(251%+*!#4┼-2╚$1.#2!╘>'0@
  2852. ═)┌"@╚*"@╚*"@╚*"@╚*!#54)%,╘2@5├,╬,┬<╠,$0╠,$0-('1╪=" ╟╚*"@╚*"@
  2853. ═╚*"@╚*"@╚*"@╚*"@0┼─╟+#!$#2!╚97@@.68@.╘-904╪-('1╪=" ╟╚*"@╚%-4
  2854. ═15!(14┌@2┼5$1"<-(&┴┼>" ┘.0╘@='┴╘(">@╚*"@1╘5/4─=%╚%1!64╤/4┬<╠
  2855. ═,$0╠,$0-(&┴┼>" ┘8@╘@='┴╘(">@╚$-(14-+╚$]55*!42$6@2─%.+╩ ┘-:!)
  2856. ═4╒-51:!/1┬<╠,$0-(&┴┼>" ┘-@╘@='┴╘(">@╚$,]2$%#2╘┼.1╥<-(&┴┼>" ┘
  2857. ═8@╘@='┴╘(">@1─]2╚$╒/4─6@1$5404┼,4╥$╟+#!$#2!╚97@@,&0╤9#%─.64╤
  2858. ═,@╘@='┴╘("=&,2]&,┬<╠.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!8+5)/5$%424].
  2859. ═)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&,╥]&-"<╠.3(-('1╪=" ╟╚"╓@24┘#
  2860. ═+╘1%0┌!9+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&-2]&-┬<╠
  2861. ═.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!:+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤
  2862. ═,@╘@='┴╘(">@1├>@╚"<╠.3(-('1╪=" ╟╚"╓@4─53150╟+#!$#2!╚97@@,60╤
  2863. ═9#$╥#2!╘>'0@)┌ ╦+╥╓@)╥╨┘,@╘@='┴╘(">@+:!:3╘]-╚$┼.+╘]55"<╠,$0-
  2864. ═(&┴┼>" ╤9#%─,3(-('1╪=" ╟╚*!(╚* ╟+#─╥#2!╘>'0@)┌ ═╚%1/1╘=,1:!(
  2865. ═241$14┌@4╒521─%#15,╟+#!$#2!╚97@@,60╤9#$╥#2!╘>'0@)╒-004-%)╥╨┘
  2866. ═,@╘@='┴╘(">@+:!43╘='3$6@4╒521─%#1:!&24╤,24┘')╥╨╨1"╨╨1 ╘@='┴╘
  2867. ═(">@╚%!215-3╚%&@5$^@455)5"<╠,$0-(&┴┼>" ╨9# ╒#2!╘>'0@)┌"@╚*"@
  2868. ═╚%!215-3╚$%.6:!+15╞@5$^@0─5'24╪╟+#!$#2!╚97@@,# -=&┼╘;&4@;&1┴
  2869. ═("┴╘96╒╨,2─╠>0╘@8╞5╤(#╔├;╓┘╘#2!╩<╫(@8╓┴╥;╫5╘#2!╔;╟─-(&)╬92!╘
  2870. ═:71╠90╘@:6┘├('1┼;7 ╥#2!╩;7 @=&┼╘;&4-.╞-╧;╟0@/├╪^(&=┼=&═┼>0╘-
  2871. ═*┬╚╩*╩!╙152@55"@5$%"3$53*#\╔#0╘╩╚'1!0─╤%4┌!!4─6@0╒524─5.5$╤9
  2872. ═╚%-%5*!54*!)3╩!┬87-╔8╨╘╩╚$%.1*!"6:!42$6@05-314╒"3$52+@╘-=&%┬
  2873. ═;&5╙(&╤─82 ├/╟1═871╚,0╘@<╫1┴('╚╤*╙$-('-╘82!┌,┬╠╤#2!╠9&$@(╙┘╘
  2874. ═;6%╘:#(-('-╘82!┌,╥╠╤#2!╙=&$@>├0╦,0╘-*┬╚╩*╩!├3$5!4╩!30╒)%14┌@
  2875. ═04┘$╚%-%5*!54* ┬0─┼434%0(@╒╙971╒<"!╠9&$@(╥0╨,2 [=╘┴)5$4-('-╘
  2876. ═82 ─9# ╥,2 [=$┴)4┌!)4┌!$3╘┘%╚%-/╚%1(052@3╘╤$15(-(&╤─82 ├,30╫
  2877. ═(#═-04-(24┘%4┌!724╤,╚%-%5*!54 ╘@:╟-╥(&-╚<╞]╒= ╘@;&1┴(",─,# @
  2878. ═.╘-/4┼)%0╒1,60╘@<╫1┴("1─,#(╤#2!╠9&$@(╙╤╙<╫1┴<╟0-(&%─8╥ ├,3(@
  2879. ═.╫1(1:!'3╘%,╚$┼3╚%1/╚$-%3┼1%4╩!42$6@1╒)!4$┴)0╒,-('-╘82!╘96╒╨
  2880. ═,2 [8╘],54╒.╚#$╥#2!╠9&$@(╙┘╙<╫1┴<╟0@.╫)/5┌ ┘#2!╙=&$@=&5═<#$╦
  2881. ═,2 [<╫-╘87)╘╚%!/24┘44┌!43┌!23╒>@.0╘@;&1┴(",╨, ╘@;&1┘(",╨, ╘@
  2882. ═;&1╪(",╨," [6*!724╤,╚$-/54┘4╚#$╓╚%)/5╒.@1─]2╚%53#2!├;&,-#3╔╠
  2883. ═;╓]╨('-╘82 ╚=&5═<#$╔+'─-(&┼╬>0╘@861├(",╤-@╘@8╞-├(#╔╠;╓]╨#2!├
  2884. ═;&,-(&╤─82!╘96╒╨,0╘@861├(",╘," [;─5%1*!43┌!!1$2@-#"@5$^@5$┴%
  2885. ═╚$)!4╘6@4$])3┼1%4@╘@<╫1┴('1┼;7 ╤(#═╘3┌!*54╒0╚%1/╚%1(1:!.15┴4
  2886. ═╚%)/5╨╘@;&1┴('1┼;7 ╤*╙$-(&%─8╥ ├,# @.╫1!2╘6@0╘%21:!/1╩!#05)2
  2887. ═2453#2!╙=&$@=&5═<#$╦,0╘@;&1┘(",╨, ╘@:6┘╪#2!╘>&$@(#═╪╚$┼3╚$%,
  2888. ═4╘^@04┌@24┘$15┬@24┘43┌!42$6@0╘┴!4─%#5$52╚$┘534)%4@╘@8╫!╪(",╤
  2889. ═-@╘@8╞┘┼(#╔╠;╓]╨(#═╬145$╚%1/╚$1/╚$┼4╚#$╓╚%1)3453#0╘╩*┬╚╩╚&-,
  2890. ═14%2╚$)51─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^
  2891. ═8╟5╞9├$-('-╘82!┬=69╞97(╦,0╘@;&1┘(",─,# -(&╤─>" ├,├0@.╓%34╒5-
  2892. ═24┘'╚$%,3*!42%)%1:!"549&15)3╚$%210╘@;&1┴(",─,# @.╘)!0╘╠═5$\═
  2893. ═0─%#2╨╘┌8╞╤╧;╫ @<╫1┴("┴┬=69╞97(╔+'─-(&┼╬>0╘@8╞┘┼(#╔┬;&]╧< ╘@
  2894. ═:6┘├(&)╒9╞9┼<┬╠╤#2!─97@-(&)╬92 ┌8╞╤╧;╫ -#2╚╩*┬╩@<╘54╚%50╚$)5
  2895. ═1─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^8╟5╞9├$-
  2896. ═('-╘82!┬=69╞97(╦,0╘@<╫1┴('╔╘96╒╨(#═:5$5-4*!724╤,╚$╒!2╘6@3$┼&
  2897. ═1:!324╒03$6@1─]2╚%53#2!╠9&$@=╞╒├<╓(-(&%╬9" ├)3$╤,3$╨,# ╤(#═╙
  2898. ═5$%25*!(15)%╚%-/╚%1(052@4╒=!4*!"549&15)3╚%=)3$╥@5╘]22┌!224=(
  2899. ═5 ╘@;╫)┴(",┼,# ╨,#$╤,3 -('-╘82!╓;6-╙8@╘-*┬╚╩*╩!╙152@55"@24┘)
  2900. ═5$┼!3*!604╤515,-#6┼╬:70@;&1┴(",╨, ╘@<╫1┴(&╤╧8╫┴═:6╪-('-╘82!╠
  2901. ═;╓-╪;6%╪#2!╙=&$@;&]├>6╒╔;@╘@<╫1┴(&╤╧8╫┼═87@-('-╘82!╟;&]┬>&╒╔
  2902. ═;@╘@<╫1┴(&=╠;╓)┘;6┼╬#2!╙=&$@9╓╤╧8╟┴═87@-('-╘82!╟;&]┬>6╒┴> ╘@
  2903. ═<╫1┴(&1╙> ╘@<╫1┴(&1╙>0╘@<╫1┴(&1╙>@╘@<╫1┴('-╪#2!╙=&$@<╫─-('-╘
  2904. ═82!╙>@╘@<╫1┴(&9╔;&╨-(&╤─82 ├,#$-('-╘82!╚:61┼#2!╠9&$@(╙8╘#2!╙
  2905. ═=&$@>╞]╧;0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘-*╩!═
  2906. ═04┼.╚$╤/3╒ -#2╚╩*┬╩@9╘54╚$═%65!215-3#0╒═86┼╬#2!├;&─-:╫!╥97-╙
  2907. ═(&╔╙<┬!╟971╔;@╘@8╓╒╨(",╤,╙,@.╓8╤/╨╘@8╞┘┼(#╔╞,@╘@;&1┴(&1╙> ╘@
  2908. ═8╓╒╨("-┴;╞=═87@╧,┬ [;─^@34]21:!42$%.╚%!)#2!┬97$@.╞-╧;╟0╤#2!╔
  2909. ═;╞,@9'-╪(#═/5$┴%4┼=)4╘6@24┘#4─5!4╘6@6"╒23╒1!5$┼/3@╘@:╞╒╨(#╔├
  2910. ═;╓┘╘#3╔╞,┬!├;7 @(╙$╙-╥ [9├(_#2!┬;╞4@.╞8╙#2!╠9&$@9'-╪#2!┬97$@
  2911. ═.╞-╧;╟0╤#2!─96,@9'-╪#2!╩;7 @.╞-╧;╟0-.╞8╙(&-═<" ├,3,╘#2!┬;╞4@
  2912. ═.╞8╘#2!╠9&$@9'-┘#2!├;7 @(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@
  2913. ═9'-┘(#═╔3─-214%31:!9+5)/5$%424].#2!╩;7 @.╞-╧;╟0-.╞8╘(&-═<" ├
  2914. ═,3,╪#2!┬;╞4@.╞8╒#2!╠9&$@9'-┘#2!┬97$@.╞-╧;╟0╤#2!─96,@9'-┘#2!╩
  2915. ═;7 @.╞-╧;╟0-.╞8╒(&-═<" ├,3,╒#2!┬;╞4@.╞8╓#2!╠9&$@9'-┌#2!├;7 @
  2916. ═(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@9'-┌(#═:+5)/5$%424].#2!╩
  2917. ═;7 @.╞-╧;╟0-.╞8╓(&-═<" ├,3,┘#2!┬;╞4@.╞8╫#2!╠9&$@9'-┌#2!┬97$@
  2918. ═.╞-╧;╟0╤#2!─96,@9'-┌#2!╩;7 @.╞-╧;╟0-.╞8╫(&-═<" ├,3,╓#2!┬;╞4@
  2919. ═.╟!╠=7,-(&╔═<"!╔;╞┼╘#3╔├;╓┘╘,2!╩;7 @.╞-╧;╟0-.╟!╠=7,@8╓╒╨(",╟
  2920. ═*╥<-(&)╬92 ┌;6┼╬=7,-(&┼╬8╥!┌;╓]═(#═┬04@╠╚%=(3┌!.145$4┌!%4┼)/
  2921. ═4╩!#2$5#2╘┼.1╙\-(&┼╬8╥!┌;╓]═#2!╩;7 @.╞-╧;╟0-.╞╒╔;╟5╙(&-═<" ├
  2922. ═)╥╘╟#2!┬;╞4@.╞@-(&1┼8╥!┌;╓]═#2!─96,@>╞]╧;0╘@8╟!╠(#╔├;╓┘╘#2!╔
  2923. ═;╞,@>╞]╧;0╘@:6┘├('╔╧;╓╘-(&╔═<" ┌8╓]╬= ╘┌:"!├;7 @(╥=()╨╘@8╞┘┼
  2924. ═(#╔╙<&%├90╘@;&1┴(&┴╔9&4-(&5╧<┬ ├)# ╤#2!╙=&$@:&┼─90╘@:╞╒╨(#╔├
  2925. ═;╓┘╘#3╔╙<&%├92!├;7 @(╥>@)╨╘@8╞┘┼(#╔╤#2!╠9&$@9╞┼╠; ╘@96]╥(",─
  2926. ═,#$-('-╘82!╞:6╤╠#2!╩;7 @.╞-╧;╟0-.╟$@8╓╒╨(",╟42<@.╒&@455)5%,-
  2927. ═(&)╬92 ┌8╓]╬= ╘@:╞╒╨(&-╠96%╬=7 -#3╔├;╓┘╘('-┼:2 @.╫-0145$╚%1(
  2928. ═24┘'4┌!54*!!╚$))5 ╘-*┬╚╩*╩!╒4$1!5$6@04┘'3$53#0╒╒<&1┴=&4@8╓╤├
  2929. ═#2!╠9&$@<╫@-(&%─8╥!─<╫@-(&-═<" ├86┘╟;6%╪(#═┴4─6@5╘6@/├╓@34%8
  2930. ═24╒53:!!3─=,13\-(&)├8╥ ┌8╓]╬=#$-('-┬8╥ ├86┘╟;6%╪(#╔╔1┬!33╥╨@
  2931. ═4─53150-.╞-╧;╟0╤('-╘82!╙> ╘@8╓╤├#2!╠9&$@<╫─-(&%─8╥!─<╫─-(&-═
  2932. ═<" ├86┘╟;6%╪#2!┬8╓,@.╞-╧;╟0╥#2!╙8╞,@(╓%╬9╓╒┴>" [<╘%-1:!$14%,
  2933. ═#3╔├;╓┘╘,┬!╙=&$@<╫─-(&-╠8╨╘@;&1┴('-┌#2!┴9&,@9'-┌#2!├;7 @(╓%╬
  2934. ═9╓╒┴> ╘@8╞-├(#╔├;╓┘╘,╨╘@<╓)├("-┴;╞=═87@-.╞-╧;╟0╙('-╘82!╙>@╘-
  2935. ═*┬╚╩*╩!╥3╒1!5$6@0╘]/4─1)3─%415,-#7)╧=&%╘90╘-*┬╚╩╚&9)4┼-4+*!#
  2936. ═04╤#54╤!5$6@5#$╠5#(╠+┬╪╬+%0╤, ╘-*┬╩@=%=/╚$╒!0╒)/4┌!43┌!324╒0
  2937. ═3$┼&6:!/55*@3$┼&10╒┴9&1┴(&╒┴8╥ @.╓%$1*!45╘^@04┘'3$53╚%1/1╘54
  2938. ═2$52#2!├;&,-(&╤─82!=,0╘@861├(%╘╥#2!├;7 @(╓%╬9╓╒┴>" [:5.@5$┴%
  2939. ═╚%-53: ^╚#(╩4$─_#2!┬8╓,@9&]╬90╘@<╓)├("-┴;╞=═87@@.╓┼&╚%-/+*!3
  2940. ═54)44─%#5* ╥*┼!)#61╧;╞4@/#╨\#0╒╙=6)┴(&╒┴8╥ @.╫-50┼1204-4╚%17
  2941. ═3┌!!3─=,15,-('-┼8╨╘@;&1┴(%╘╤#2!╙8╞,@73(-(&)├<╥!─;╓┘┼#2!┴9&,@
  2942. ═(╓%╬9╓╒┴>" [;╘]04╥╥@5╘6@3─5%1*!43┌!!1$2@,┬╔020╒─;╓┘┼(#╨\/ ╘-
  2943. ═*┬╩@;─]7╚$-!3$-53$%41:!4,2╤4,┬╤%5$,╬#0╘@/├╪^('-╒8╞$╠<╫─[<╫╚-
  2944. ═('-╘82!╘,2 [5#$]4╒─═4╒╚-(#╪^/┬!┴9&1┴+'-┘.╫-┌#2!╙=&$@=#(@.╒0╥
  2945. ═/5-9*╒-:#2 ^/├╪@861─82╤╙>#═╙>@╘@<╫1┴('0╙(#═4,╙╒36"═36@╘@/├╪^
  2946. ═('-╒8╞$╠<╫@[<╫╚-('-╘82!╘-" [5#0]4╒@═4╒╚-(#╪^/┬!┴9&1┴+'-╪.╫0╥
  2947. ═#2!╙=&$@=#4@.╒0╒/5-8*╒0╥#2 ^/├╪@<╫5┬82╤╙>#═╘,0╘@<╫1┴('0╓(#═4
  2948. ═-├╒36"╒4,0╘@/├╪^(&%─9&$╠<╫@[=#$-('-╘82!╘-╥ [5#<]4╒@╦5#$-(#╪^
  2949. ═/┬!╙=6)┴+'0╥.╫-╪#2!╙=&$@=#@@.╒0╪/50╥+5-8#2 ^/├╪@<╫5┬82╤╙>3═╙
  2950. ═> ╘@<╫1┴('0┘(#═4.3╒362╒36 ╘@/├╪^(&%─9&$╠<╫@[<╫─-('-╘82!╘,3 @
  2951. ═.╒0╤,#╒36"═360╘-*╩!┼5*!63╘┼,02$-#2╚╩*╩!╬15┴4+*!#04╤#54╤!5$6@
  2952. ═82╤┬+&,╠+┬╪╬+&─-#2╚╩╚&%.3╒1(15*@55-%1┼5,╚$╤)5%1,1:!-04-23╨╒─
  2953. ═:78╥(&╒┴8╥ @.╓1)5─┼$1:!!╚%-)1╘┘%1*!.54╒"15*@0┼╞@,@╘[:52@25.@
  2954. ═05-354╒%1*!42$%4╚%1(1:!.54╒"15(-(&)╨;"!╨;╫,@.╘┼3╚$┼.╚%1(1:!!
  2955. ═0╘-5355,051/4@╘@8╓╤├#2!┼;╫(@(╥1╞9┬ [=╘6@3─5%1*!43┌!53┬╒.14=!
  2956. ═5$┼61:!42$6@3┼5-0─52#2!┴9&,@(╙ ╤(#═"6:!404═)3─>@250╟4┌!#3╘╒0
  2957. ═3$5-14┘4#2!╠<╫(@(#═$259)1$6@0┼╞@5%=/#2!├;&,-(&5╧<┬ ├)&9╞#2!┴
  2958. ═9&,@(╙ ╤(#══04═%╚$┼4╚$┘%1╘%4259%╚$%'04┼.#2!╩;7 @9&]╬961╔=@╒╨
  2959. ═;╫,@;'-╥(" [;┼5-0─52╚$┼3╚%!/4╘┼4259%#61╧;╞5─:78@/#╨\#0╒═=6╨╥
  2960. ═(&╒┴8╥ @.╓╒53%1)4$╤9╚$&@4╘┼'3─5$╚$┘534)%4╩!"6: ╥#2!┬<&╨@<&]╙
  2961. ═;0╘@8╓╤├#2!┼;╫(@(╥1╞9@╘@861├(",─,#$-(&%╙; ╘@8╓╤├#2!┼;╫(@(╥1╞
  2962. ═9@╘@861├(",─,#$-(&╔═<"!─;╓┘┼;75╠#7!╧<╓╘@87-╠#61╧;╞5═=6╨@/#╨\
  2963. ═#0╘╩*╩!╬3╒1%╚%1(052@5╘6@05)%╚$-54┼)%3┼1,6:!-04═)3─>@0:!-24┘/
  2964. ═4╩!,14%0#2╚╩╚$]&╚$9!251(╚%1(052@3─^@3╒9%4─9,3╒=3╚%=)3$╥@3╘-#
  2965. ═55(╬#0╘┌8╓%╠8╓$@8╓╤├#2!╠9'@@=#$-(&╤─82!├;╫,╠> ╘@;&1╪('0╥#2!┴
  2966. ═9&,@8╓]╙+'@-('-╘82!┴,3$@.╓$]*$-/4╥┴4,2─╦0╘]3*%0╥*2─╧,@╘┌8╓%╠
  2967. ═8╓(@;&1╪('0╤#2!╠9&$@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╥#2!╙8╞,@<╓┼╬+'@-
  2968. ═('-╘82!┬,3(@.╓(]*%-)3┬┴4,2─═4╘┼.*%0╥*2─╧,@╘┌8╓%╠8╓,@;&1╪('-┘
  2969. ═#2!╠9&$@<╓┼╬+'@-(#╪^/┬!═=6╨╥#2!╙=&$@8╙$╙(#═├/5-)3┬┴362─-.╞-┴
  2970. ═;&-─('-┼8╨╘@;&1╪('0╪#2!╠9&$@8╓]╙+'@-(&╤─>"!╘-╨╘@<╓)├(&-╧<╥╤╪
  2971. ═#2!╙96,-(&╤─>"!╘-0╘@<╓)├(&-╧<╥╤╪#2!├;&,-(&╤─>"!╘-@╘@861├(&-╧
  2972. ═<╥╤╪(#═─23╘╚0╘]3*%0╪*2╒#3╒,╚5#<╔*╘-/4╥┴4-┬─═0╘]3*%0╒*2─╧,@╘@
  2973. ═/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╙#2!┴9&,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╘
  2974. ═#2!╙8╞,@<╓┼╬+'@-('-╘82!─,├$@.╓0]*%-)3┬┴4,╥─═4╘┼.*%0╘*2═─22─╧
  2975. ═,@╘┌8╓%╠8╓4@<╓5├#2!╠9'@@=#4-(&╤─82!╙:6╪╠> ╘@;&1╪('0╓#2!╙8╞,@
  2976. ═<╓┼╬+'@-('-┼8╨╘@;&1╪('0╫#2!╙8╞,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╪#2!╙
  2977. ═8╞,@<╓┼╬+'@@.╓5)/2┴324╪╚5#4╔+5-)3┬┴4-┬─═4╘┼.*%0╫*2╒324╪╚5#@╔
  2978. ═*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!├;╫,╠> ╘@8╓╤├#2!╠
  2979. ═9'@@=#0-(&%─8╥!├;╫,╠> ╘@<╫1┴(&4╥,┬ [93╘╚0╘]3*%0╙*2═#3╒,╚5#0╔
  2980. ═*╓5)*2\╥#3╔├86╤├9┬!╠9'@@=#─-(&╤─82!╙:6╪╠> ╘@<╓5├#2!╠9'@@=#$╨
  2981. ═#2!╙8╞,@<╓┼╬+'@-('-╘82!╞,├,@.╓8]*%-)3┬┴4.2─═4╘┼.*%0╤,"─╔+╙(-
  2982. ═.╞-┴;&-╟(&╤─>"!╘-@╘@;&1┴('-╔;┬╤╪#2!╙96,-(&╤─>"!╘. ╘@<╓)├('-╔
  2983. ═;┬╤╪#2!╙96,-(&╤─>"!╘-╨╘@<╓)├('-╔;┬╤╪#2!╙96,-(&╤─>"!╘-0╘@<╓)├
  2984. ═('-╔;┬╤╪(#═╟23╘╚4╘┼.*%0╓*2╒324╪╚5#@╔+5-)3┬┴4-╥─═4╘┼.*%0╒*2─╧
  2985. ═,@╘@/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╘#2!┴9&,@8╓]╙+'@-('-┼8╨╘@;&1╪
  2986. ═('0╙#2!╙8╞,@8╓]╙+'@-('-╘82!╟,╙$@.╓<]*$-/4╥┴4-"─═0╘]3*%0╙*2═╟
  2987. ═22─╧,@╘┌8╓%╠8╓@@8╓╤├#2!╠9'@@=#8-(&╤─82!├;╫,╠> ╘@;&1╪('0╫#2!┴
  2988. ═9&,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╒#2!╙8╞,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╪
  2989. ═#2!╙8╞,@8╓]╙+'@@.╓┴)/2┴#3╒,╚5#8╔*╘-/4╥┴4-╥─═0╘]3*%0╒*2╒#3╒,╚
  2990. ═5#@╔*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!╙:6╪╠> ╘@8╓╤├
  2991. ═#2!╠9'@@=#0-(&%─8╥!╙:6╪╠> ╘@<╫1┴(&@╙,┬ [:#╘╚4╘┼.*%0╙*2═324╪╚
  2992. ═5#0╔*╓┴)*2\╥#3╔╫:&5╫(&-╠8╨╘@;&1╪('0┘#2!╠9&$@8╓]╙+'@-(&╤─>"!╘
  2993. ═,3 -(&%─8╥!├;╫,╠> ╘@<╫1┴(&─╙,╥ [:3╘╚0╘]3*%0┘*2═#3╒,╚5#$╨*2─╧
  2994. ═,@╘-*┬╩@:50╟4┌!!3$╥@1$]73─┴)3$╥@1┼)/3:!(15)%+@╘-9&]╫;╞┴╔;&╨-
  2995. ═*┬╚╩*╩!├3$5!4╩!"549&15(-*╩!┴╚$╤)5%1,1:!-04-23╨╘-<╓5╘8╟5╞(&╒┴
  2996. ═8╥ @.╫!55*!"549&15)3╚%=(15)%╚%1(15╞@0╘%.╚$)%╚$┴54┼0-(&╤─82 ├
  2997. ═,# -('-╘82!┬=69╞97(-(&╤─82!┌=&5═<" [:$┼'2*!"651%#7-╘86)╒9┬!╙
  2998. ═=&$@8╟5╞9╞5╥*╙$-(#╨\/ ╘-(#╪^/┬!╙971┬=68-8╓╤╥9')┴=╥!╠9'@@(╙ ╪
  2999. ═#2!╠9&$@(╙ ╨#3╔╞;╓]╠(&╤─>2 ├,# -.╞1╧<&4@<╫1┴("┴┬=69╞97(╔+'─-
  3000. ═(&┼╬>0╘@8╞┘┼(#╔─;╫!┼#2!╔;╞,@8╟5╞9╞5╥*╙$-(&1┼> ╘@8╞┘┼(#╔╞;╓]╠
  3001. ═#0╘╩*┬╚╩╚&╒9╚$=/3╘1.15-3╚$)55*!╔)╘╓@0:!$3╒!%#2╔├;')─<╞%╫╚&╤─
  3002. ═8:!╟;&]┬>&╒╔;@╘╩╚&╤╙<╩"@.╓┘%142@5$^@1╘54╚$┼.5$^@5$┴%╚%))1╘┴4
  3003. ═╚$-/3%5-3@╘╩╚&)├8┌ ┌979┼;╩ [95┴03$%)3─5$╚$┼.╚$╒/4─6@1$5404┼,
  3004. ═╚$)%3$]7#2╩@;&1┘╚",─.# -*╩!╙='╞@8╟5╞9╞5╥╚#═╨4─5354╒!0─╤9╚%1(
  3005. ═25.@5╘┼,3*!"1:!!╚$╤)5%1,10╘╩╚&-╠8┌"@.╘╒/4─6@149&24-)14┘4+@╘╩
  3006. ═.╞5╓96┌@861├╚&)╒9╞9┼<┬╠╤#2╩@<╫1┴╚&)╒9╞9┼<┬╠╤#2╩@;&1┴╚&=╠;╓)╪
  3007. ═;6%╪#2╩@<╓5├#2╩@<╓)├╚&=╠;╓)╪;6┼╬#2╩@=&%╪#2╩@:6┘╪#2╩@;&1┘╚&=╠
  3008. ═;╓)┘;6%╪#2╩@8╞5╤╚#╔╥97-┼= ╘╩.╟┼┴>:!╠9&&@(╥0╨, ╘╩╚&╤─>:!╟;&]┬
  3009. ═>6╒┴> ╘╩.╞)╠86┬@<╫1┴╚"┴┬=69╞97(╔+'─-*╩!─97─-*╩!├<'╞@9╓╤╧8╟┼═
  3010. ═:6╪-*╩!┬8╫.@.╞)╠86@-*╩!╠9&&@8╟5╞9╞5╥#2╩@96]╥╚",─.# -*╩!╙=&&@
  3011. ═8╟5╞9╞5╥#2╩@8╞┘┼╚#╔╫:&]╨964-*╩!╔;╞.@8╟5╞9╞5╥*╙$-*├╔╫:&]╨966@
  3012. ═9&5╪#2╩@8╞┘┼╚#╔┘87─-*├╔╥97-┼=*!╠9&&@(╙"@.╓┘%142@5$^@4─53152@
  3013. ═5$┴%4╘6@1╒594╨╘╩╚'-╘8:!╟;&]┬>&╒┴> ╘╩╚'-╘8:!╟;&]┬>6╒┴> ╘╩╚&╤─
  3014. ═8: ├)&9╞#2╩@<╫1┴╚&=╠;╓)╪;6┼╬#2╩@<╫1┴╚&=╠;╓)┘;6┼╬#0╘╩*┬╚╩╚&┘%
  3015. ═6%0╠╚%)%042@04┘$╚$1205>@4$],64=/3┼,-#7)┼861─<╞%╫(&╤─>2 ├,# -
  3016. ═('-╘>2!╔;╞1┼> ╒╧8╞╔╠;╓]╨(&╤─>2!╔;╞1┼> ╘@;&1┴('!╧;'┼╠:7-╘+'─@
  3017. ═.╓9)4┼-4+*!42$6@3┼5-0─52╚$]&╚%!/24┘44╨╘@8╞┘┼(#╔├;╓┘╘(#═┬552@
  3018. ═24:@3┼5-4$])3┼13╚$┼3╚%╔%4─^@5$┴%3@╘@:╞╒╨(&]┬:╞1╧;╞4@.╒=%╚$%2
  3019. ═1:!!5*!42$6@14┘$╚$]&╚%1(1:!,25-4#3╔├;╓┘╘('-╘82!├;╫5╬='!╘<╨╘@
  3020. ═:6┘├(&┼╬9&5╪#0╘╩╚')/5$%41:!04─]*14-4╚$%.1*!$4─%7╚%1(1:!03╘╤9
  3021. ═1╘].#2╩@;4%+1:!355)%╚$)51─9%4╩!"14┼.1┌!$4─%73╩!43┌!)4┌!#3$5!
  3022. ═4┬$-#3╔─;╓┼╘(&╔╙<┬!╥;╫1╨<╞]╩#0╘╩╚&-/3┼9%4┼2@6$╒)3╩!!3─2@6$╒!
  3023. ═6*!43┌!#3╘╤534┘3#0╘@;&1┴(&╤╧8╫┴═:6╪-(&╤╙<@╘@;'-╥#2!╠<╫(@(#═8
  3024. ═╚$╒/1* ╪#2!╙=&$@;&]├>&╒╔;@╘@8╓╒╨(&=╠;╓)╪;6┼╬#2!┬8╫,@.╞┘┴: ╘@
  3025. ═<╫1┴(&=╠;╓)╪;6┼╬#3╔╬86@@;&1┴(&╤╧8╫┼═:6╪-(&-═<"!╟;&]┬>6╒╔;@╘@
  3026. ═8╞-╙(#╔╒:'5╚#2!╙=&$@9╓╤╧8╟┼═:6╪-.╟5╚=6@@;&1┴(&╤╧8╫┴═87@-(&╤╙
  3027. ═<@╘@;'-╥#2!╠<╫(-('-╘82!╠;╓-╪;6%╪#2!├;7 @9╓╤╧8╟┴═87@-(&)├8╥ ┌
  3028. ═;╞]╫87─-('-╘82!╟;&]┬>&╒┴> ╘┌;╞]╫87─@;&1┴(&╤╧8╫┼═87@-(&-═<"!╟
  3029. ═;&]┬>6╒┴> ╘@8╞-├(&5╧<╞9╔;&╨-('-╘82!╟;&]┬>6╒┴> ╘-*╩!╔1╩!54╘┼.
  3030. ═1┌!42$6@96]╥+4)51─9%4┬╥@0╘]06:!)3┼1/╚$1205=)3─>@0┼5&1─52#2╩@
  3031. ═84┘$╚%1(14┌@0╘╤%05*@5$┴%╚&5╧<┬╒"549&15(-#65╧<╞9╔;&╨@;&1┴(&9╔
  3032. ═;&╨-(&)┼<2!╧8╞╔╠;╓]╨#0╘@/├╪^('-┼=&)╒9@╘@;&1┴(",\96]╥8╟5╞#2!╙
  3033. ═=&$@=&5═<#$-(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴('1┼;7 ╤*╙$-#2!╠9&$@;&]├
  3034. ═>&╒╔;┬ [;&]├>&╒╔;╩!.3╒>@0╘].5$%)3┼.@0╘],54╒.#2!╠<╫(@(#═┼04-(
  3035. ═╚$-/3%5-3╩!)4┌ ╤,├┬@0┼┼415,-(&)├8╥ ┌979┼;┬ [<╘^@5$┴%4─6@34┼'
  3036. ═2%2@0─6@0:!#05)260╘@;&1┘(",─.# -('-╘>2!┬=69╞97(-('-╘>2!╘96╒╨
  3037. ═,0╘@8╓╤├#3╔┼=╞5╬('-╘82!╘,@╘@861├(&)╒9╞9┼<┬╠╤#2!╙=&$@8╟5╞9╞5╥
  3038. ═*╙$@.╓5!0╘┬@0╘],54╒.╚$┼3╚#$╥.*!"651%4╨╘@;&1┴('0╥#2!┴9&,@=&5═
  3039. ═<#$╦,2 [;─]7╚%=%╚%=)3$╥@4╒1!4┼2@052@5$┴%#2!╙=&$@=&5═<#$╦,2 [
  3040. ═0╘],54╒.#0╘@;&1┴(&╤╧8╫┴═87@-('-┼8╨╘@<╓)├(&╤╧8╫┴═:6╪-('1┴>" [
  3041. ═=$]404╥@3┼5-0─52╚$]&╚$-/3%5-3┼.@5$^@1$\-(&┼╬>" @.╘4╬1╥┌@1─┼,
  3042. ═3*!#3╘╤534┘3╚#$╬+├,-(&╤─>2!╠;╓-┘;6%╪#2!┬;╞4@.╞9╧;╫ -(&┼╬8╥!╠
  3043. ═;╓-┘;6%╪#3╔╞;╓]╨(&╤─>2!╠;╓-┘;6%╪#2!╠9&$@(╙ ╨#3╔╟;╓]╨(&5╧<┬ ╚
  3044. ═=&5═<#$╔+'─@.╓5╧<┬╒"549&15(-('!╚80╘╩╚&╒!64)%╚%!55*!!3╩!┼;╫*@
  3045. ═0─5,3╒<_#2!┼;╫(@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82 ├
  3046. ═,# @.╓╒)1╘┴4╚$%3╚%=%3$╥@0╘╤%05*@252@3─]7#2!╙=&$@*'1┼;7 ╤*2╤┘
  3047. ═#2!╨;&$-(&1┼>0╘@8╫!┘(&╤╧8╫┼═:6╪-(&)├<╥ ┌9╓]╧< ╘@;&1┴(&)╒9╞9┼
  3048. ═<@╘@96]╥(",─.# -('-╘82!┬=69╞97(-('-╘82!╘96╒╨,0╘@8╞┘┼(#╔┬;╓]╨
  3049. ═#2!╔;╞,@8╟5╞9╞5╥*╙$-(&┼╬8╥!╘96╒╨,2╠╤#3╔┬;╓]╨(&1┼> ╘@8╞┘┼(#╔╞
  3050. ═;╓]╨#2!╩;7 @;╓)╩;&]╧< ╘-;╓)╩9&]╬90╘╩*┬╚╩╚'-705"@0┼5&1─524╨╘-
  3051. ═<╫=┴<&)╒9┬!╠9&$@=╞╒├<╓(-(&5╧<┬ ├)# ╥(#═╨4─545%╞@5%))0╘═9+*!%
  3052. ═2#\-('-╘82!╓;6-╙8@╘@;&1┴(",─,#@-(&5╧<┬!┌=&5═<" [6┼1%35 ]2$┼'
  3053. ═2*!"651%╚$╔54╒2@1─╤)4%,-('-╘82!┌=&5═<" [0─545╘5%3╩ ─,╙"@04┘$
  3054. ═╚"0╙. ╘-(&╔═<"!═86┼╬(#═┴4─]53─2@04┘$╚$%23╒5.1*!71:!'3╥╪╬+@╘-
  3055. ═('1╪=" ╟9╘5%╚&)204┼.+*!72$%4╚$1/╚%┼/5:!704┘4╚%1/╚$1/╚"<-('1╪
  3056. ═=" ╟5$].24=(5#\╟#0╘╩*╩!╥3╒1!5$4╠╚%!23╘╔%0╒0╠╚$%.1*!35$]21:!4
  3057. ═2$6@4$])3┼13#2╚-*╩!╘2$┼3╚%!!4┼2@25.@0:!324=.249)0╘%.5*!#2$%.
  3058. ═1╘6@4╘┼.0╘4-*╩!6,┬╪╨+╩"@;─]7╚$┼4╚$┼3╚$&@0╘]-4$╤%5$5,6:!'14┘%
  3059. ═4─%,╚%!/3%┼'3╘┌@4$╤/5%1%4┬╪-*╩!┴╚%-%5*!/1╩!03╘┼.5%.@25.@4─5!
  3060. ═1*!)3┬╥@4─]4051%1*!!3─2@4%)/2─5#5$5$+*!!3─0-*╩!03$]45$5$╚$┼.
  3061. ═5$^@5$┴%╚$1205=)3─>@0┼5&1─52╚"┴┼;╫*@3╒*@3─]234%,*2╪-#7)╧='!╥
  3062. ═;╓╚-#2╩@8:!.14%4╚$╒!0╒)/#6┘┼9╥!═86,@(#═├2$%.1╘6@5$┴%╚%-)1╘┌@
  3063. ═3╘:@0:!45╘\╟4┌!#3╘╒03$5-14┘4#2!├;&,-(&╤─82!=,2 [3┼5-0─52+@╘@
  3064. ═96]╥(",─9╞8-(&%─8╥ ├)# ╤#2 \/#╨-#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
  3065. ═+2╘═+2╘═+2╘═+2╘═#2╩@=$┴%4╘6@34%#4─]3╚%)%4$╤!0╘6@5$┴%╚%!2159)
  3066. ═3╒53╚%!23╘╔%0╒1)3╘╪-*╩!354)23╒5424┘%+@╘-<╓╒╒;'2@;6%├╚#══54╤4
  3067. ═25!,6:!45╘^@4╘┼'3─5$╚#@═0─┼4#2 [3┼5-0─524╙╩@82╔┘+╙8╘╚"╘^╚&$-
  3068. ═('-╘8:!┌,╨╘@8╓╤├╚* [=$┴)4┌!-54╤425!,6:!)4┌!&3╒*@3─]234%,#2!┼
  3069. ═;╫*@(╥1╞9╩ [3┼5-0─524╥╥@22┘%+╩!8/2╘╓-"╪╬-├0-(&%─8┌ ├)# ╤#2!╙
  3070. ═=&&@>├0-(&╤─8: ╚>├,╔+'─-('-┼8╨╘@<╓)├╚"┴┌-"─╠>0╘@/#╨\╚* [84╤,
  3071. ═╚$1/3─6@.┬─-#7-═=6╤╘>┬!═86,@.╓╒53%1)4$╤9╚%173┌!324=.142@."╒"
  3072. ═250-(" @.╘┘534)%4┼,┌╚&$╩>2\╓-* ═/╩!┴#2!╙=&$@>├$-(&-╠8╥ @.╓%.
  3073. ═1*!42$┼3╚$╒53%1)4$╤9╚$┼3╚%-014-)1─┼#04╤,60╘@96]╥(",─9╞8@.╘9/
  3074. ═4╩!42$6@4%)/2─5#5$┼/3╩!005)4+*!72$5210╘@861├(",─,#$@.╘┘534)%
  3075. ═4┼.@05)%╚"╘╤,3 ╬+├$╤,*!!3─2@,"╪╬-# -('-╘82!┌,@╘@;&1┴("┴┌,2─╠
  3076. ═>0╘@<╓5├#2!╙8╞,@*'╚╥*2╤┘#2 \/#╨@(#═┴3$╥@1$].1: ┌*0╘-<')╧:╞5├
  3077. ═="!═86,@(#═╘2$6@04-454%,╚%!23╘╔%0╒1)3╘┌@4─]55$┼.10╘[=$┴%╚%)/
  3078. ═551)3─6@5$%+15.@5$┴%╚%!/24┘4#3═=,:!=,╩!=,╥╥@4─]4051%4┌!!3─0-
  3079. ═.╒!23╘╔%0╒13╚$┼4+*!!3─2@4╒1/4─53╚%1(10╘[4─5354╤4╚$┼.╚%╘╤╚%╘╥
  3080. ═╚%╘╙+@╘-(&╤─>2!=,2 [;55,5$┼03%╞@1─┼24╒2@4─]4051)3╘┌@0╘],54╒.
  3081. ═#2!╠9&$@83$╤#2 ^/├╪@<╓╒╒;'0-('-╘82!╨,70-(&╤─82!─,├$-(#╪^/┬!╙
  3082. ═;75╠= ╘@<╫1┴(' ╥= ╘@;&1┴(&<╙,0╘@/├╪^('-═=6╤╘#2!╙=&$@<#-╘#2!╠
  3083. ═9'─@73(@.╫-%0╘].1*!#3╘╤534╪-(&╤─82!┬,3(-(#╪^/┬!╙;75╠= ╘@8╓╤├
  3084. ═#2!┴9&,@<#%╘#2!╙=&$@<#%╘#2!╠9&$@93(╥#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@
  3085. ═861├(' ╥= ╘@<╫1┴(' ╥= ╘@;&1┴(&@╙,@╘@/├╪^('-═=6╤╘#2!├;&,-(&%─
  3086. ═8╥!╨,╫0-('-╘82!╨,╫0-(&╤─>2!=,╥ [=$┴)4─2@0╘],54╒.#2!╠9&$@8╙$╙
  3087. ═#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@861├(' ╤= ╘@<╫1┴(' ╤= ╘@;&1┴(&8╥,╨╘@
  3088. ═/├╪^('-═=6╤╘#2!├;&,-(&%─8╥!╨,╟0-('-╘82!╨,╟0-(&╤─82!╔,╙,-(#╪^
  3089. ═/┬!╙;75╠= ╘@8╓╤├#2!┴9&,@<#-╘#2!╙=&$@73,@.╫)/5$%4142@>@╘@=&%╪
  3090. ═#2!╠9'─@>╞1╔=┬╤╪(#═╘04),1:!/1╩!$+╥┴:*╒╚╨*0╘@(" [;─]7╚'╞@0╘].
  3091. ═5$%)3┼.@4%)/2─5#5$┼/3╩!#3╘┘35 ╘-(&╤─82!╨,70-(#╪^/┬!╙;75╠='╚-
  3092. ═(&╤─>"!┌;╓]═#2!├<'@@(╙8╘#2!┬97$@8╓]╬='@-('-╘>2!╘96╒╨,0╘@;&1┘
  3093. ═('╔╧;╓╘-(#╪^/┬!╙;75╠= ╘@;&1┘('1┼;7 ╤#6-╧;╟1╪(&-╠8╨╘@861├(",╓
  3094. ═-" [;╘9&4╘54╚%1(1:!#3╘]21$┼.051%#2!╙=&$@73$@.╫)/5$%4142@04┘$
  3095. ═╚%!23╘╔%0╒1%1 ╘@8╓╒╨(&╤╧8╫┴═:6╪@.╫-%1:!)1╩!)5*!)4┌!!╚$╤/0╘%,
  3096. ═╚$╒)3─┼-54╘-(&)├<╥!╬;╫1╪;6┼╬#2!╙=&$@;&]├>&╒╔;@╒╬;╫1╪;6┼╬(&-═
  3097. ═<"!╠;╓-╪;6%╪#2!┬8╓,@;╞]╘>&╒┴> ╘@<╫1┴(&╤╧8╫┴═87@-#6┘╧='┴═87@@
  3098. ═;&1┴(' ╥= ╘@/├╪^('-═=6╤╘>@╘@8╫!╪(",╓- ╘@8╞5╤(&-╧;╟1┘#2!╠9'─@
  3099. ═>╞]╧;0╘@/├╪^('-═=6╤╘#6-╧;╟1┘(&-╠8╨╘@861├(",╓- ╘@<╫1┴(%╘╥(#═╥
  3100. ═3╒1!5$5$╚$%.1*!04─]*14-4142@>0╘@8╓╒╨(&╤╧8╫┼═:6╪-(&)├<╥!╬;╫1┘
  3101. ═;6┼╬#2!╙=&$@;&]├>6╒╔;@╒╬;╫1┘;6┼╬(&-═<"!╠;╓-┘;6%╪#2!┬8╓,@;╞]╘
  3102. ═>6╒┴> ╘@<╫1┴(&╤╧8╫┼═87@-#6┘╧='┼═87@@/#╨\(" [84╤,╚$1/3─4-#2╩@
  3103. ═;&1┴╚",\96]╥8╟5╞╚#═╞25)35*!71:!.145$╚%1/╚$-,14%2╚%1(10╘╩╚'-╘
  3104. ═8:!┬=69╞97*@.╓5╧<╩!"549&15(-*╩!╠9&&@(╙┘┼;╫)┬=68-*╩!╙=&&@8╟5╞
  3105. ═9╞5╥*╙$-#2!╠9&$@(╙ @.╫)%4╘54╚'┼-24┌@04┘$╚'┼-05@-('-╘82!╠;╓-┘
  3106. ═;6%╪#2!╙=&$@;&]├>&╒┴> ╘@;&1┴(",─9╞8-('-╘82!╠;╓-┘;6┼╬#2!╙=&$@
  3107. ═;&]├>&╒╔;@╘-<╞5┴9'!╘<╥!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙
  3108. ═=&$@<#%╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┘#2!╔;╟─-(&╤─
  3109. ═82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┌#2!╔;╟─-(&1┼8╥!├;╫5╬='!╘<╨╘@;&1┴
  3110. ═('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟@-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘
  3111. ═82!╨,╟─-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟╚-(&┼╬>0╘@9&5├
  3112. ═(&-╧=6┘╘<'1╙#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙> ╘@:6┘┘#2!╠9&$@
  3113. ═<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙>0╘@:6┘┘#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴
  3114. ═(' ╙>@╘@:6┘┘#2!╙='─@:6┘─97@-(#╪^/┬!╨<╞]╩96-╘+' ╤>#═╨,7─[<#%┌
  3115. ═#2 ^/├╪@<')╧:╞5├="╤╨,╟@[<#)┘.╫ ╥>@╘@/├╪^('!╥;╓╔┼8╫0╠<#-╪.╫ ╙
  3116. ═>3═╨,╫╚-#2!╠9&$@:&┼─90╘@8╞5╤(#╔─;╓┼╘#2!╠9&$@<#)╪(#═╚241$14┌@
  3117. ═1─%#1:!#2$5#2╨╘@<╓5├#2!╙8╞,@<#%╪#2!╘87─@(#═┘/2┴8,┬╒8,2─-(&╤─
  3118. ═82!╨,╫─-('-┼8╨╘@<╓)├(' ╥>2 [83╘╚63,═63(╔#2 ^/├╪@<╓╒╒;'0-('-╘
  3119. ═82!╘96╒╨,0╘@;&1┴(' ╙> ╘@<╓5├#2!╙8╞,@<#)╪#2!╘87─-(&╤─82!╨,╟─-
  3120. ═('-┼8╨╘@<╓)├(' ╤>0╘@/├╪^('-═=6╤╘#2!├;7 @=&5═<#$@.╓┼&╚%@╤*┼─╥
  3121. ═+5─╤*┼@╥╚#┌@,*!42$5.╚$9!0╘4-(&)═:2 ┌9&]╔=" [25.@5─┼324),10╘@
  3122. ═9&5├(&-╧=6┘╘<'1╙(#═╧5$┴%4┼=)4╘6@4─5!1*!)3╩!214╒!24┘)3─<-(&)┼
  3123. ═<2 ┌86)╧<╟0@.╒!/24┘44┌!!3─2@4─5455).#3╔╨;╓]╨(&┼╬8╥!╔;╞1┼> ╘@
  3124. ═:6┘├(&┼╬9&5╪#2!╔;╞,@:6┘─97@-(&1┼8╥!├;╫5╬='!╘<╨╘@8╞┘┼(#╔╨;╓]╨
  3125. ═#3╔┴8╞]╥="!╥=',-#3╔─;╓┼╘(&╤─82!╨,7@-('-╘82!╪,0╘@;&1┴(' ╤>0╘@
  3126. ═<╫1┴('─╤#2!╠9&$@<#)╪#2!╙=&$@>#(-(&╤─82!╨,╟─-('-╘82!┘,@╘@:╟-╥
  3127. ═(&1╥87<-(&╤─82!╨,╟@-('-╘82!╪,0╘@;&1┴(' ╥>0╘@<╫1┴('─╤#2!╠9&$@
  3128. ═<#-╪#2!╙=&$@>#(-(&╤─82!╨,╫─-('-╘82!┘,@╘@:╟-╥(&1╥87<-#2!─96,@
  3129. ═8╓]╒;╟1╨=',-(&)╬92!╨;╓╤┘;&]╧<" [:5.@252@2┼535*!!╚%1224%.1╘╤%
  3130. ═/╨╘@:╞╒╨('!╧;'┼─;╓┘┼#0╒╨;╓╤┘;&]╧<"!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘
  3131. ═;&┼╙="╤┘#2!╙=&$@<#)╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┘
  3132. ═#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┌#2!╔;╟─-('-╘>2!╔;╞1┼
  3133. ═> ╘@/├╪^('!╥;╓╔┼8╫0╠<#)╪.╫ ╥>3═╨,╟╚-#2!╠9&$@<#)╪#2!╙=&$@>#$-
  3134. ═(&╤─82!╨,╟─-('-╘82!┘,0╘@;&1┴(' ╙> ╘@<╫1┴('@╥#2!╠9&$@<#-┘#2!╙
  3135. ═=&$@>3(-(&╔╙<┬!─<╞%╫#0╘@;&1┴(' ╥> ╘@<╫1┴(' ╙> ╘@;&1┴(' ╥>0╘@
  3136. ═<╫1┴(' ╙>0╘@9&5├(&-╧=6┘╘<'1╙#2!┬97$@<&]╠>61╧;╞4-(&╔═<"!╨;╓╤┘
  3137. ═;&]╧< ╒╨;╓╤┘9&]╬92!╠9&$@<#%╪(#═├3$]31:!42$6@4$],64=/3@╘@<╫1┴
  3138. ═('@╥#2!╠9&$@<#%┘#2!╙=&$@>3(-(&╤─82!╨,╫@-('-╘82!╪,0╘@;&1┴(' ╙
  3139. ═>0╘@<╫1┴('─╤#2!╩<╫(@9')┴=╨╘@<╟1╙#0╘@='┴╘("=╙04╒%╚%1(24┘'╚%=%
  3140. ═╚$1/╚$5615)9╚$┘)1╘┴4+*!╨24┘+63╩@)╨╘@='┴╘("=44┼╞@5$^@5$%+1:!/
  3141. ═5─52╚%1(1:!73╒),1"$╟#0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
  3142. ═+2╘═+2╘-*╩!╟14┘%4─%,╚%%515-424].04),12╒604╤51:!%4┼)/4╩!04─]#
  3143. ═14154─4-#2╔├:&]╦9:!╠9'┬@(╙ ╨#2╚┌;&]╧<*!╠9&&@.╞-╘97┴╘+'@-*╩!┬
  3144. ═97&@.╞1╧;╞4-*╩!╩<╫*@8╓┴╥;╫5╘#2╩@:6┘╪#2╩@:╞╒╨╚#╔╠;╓]╨#2╚┌9&]╬
  3145. ═9:!╥=',-*├╔├=&5╪=*!╚97┬@,&2@.╓-╥#2╩@='┴╘╚"=33╘╒%5$┴)3─>@0╘┴/
  3146. ═2╘5$╚#╚╚)╨╘╩╚&┴┼>* ╨9# ╨#2╚-('1╪=" ╟;─%21┬$╟#0╘╩+2╘═+2╘═+2╘═
  3147. ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚&1205=)3┬>@0:!,24┘%+╩"@8:!&
  3148. ═04┴.╚$╤!2$╪╬#0╘╩*┬╩@<╘]-1:!54╘5&54╥@34%#4─]3#0╒├:6┘╔="!═86,@
  3149. ═(#══04-23┌!43┌!)3─┼424%,25╔%╚%1(1:!#3╒5.5$52#2!╠9&$@73$@.╘18
  3150. ═╚$]2╚$19#2!╠<╫(-(#╨\/" @.╫1(1:!$6"\╥╚$╒!2╘53╚$&@3─┼#15*@3$]/
  3151. ═2╘┼.1┌!,24┘%#0╘╩*┬╚╩*╩!═04-23┌!43┌!404═%╚$&@4╒1%4*!)3╩!╪#0╒╪
  3152. ═<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%4─%424].4╨╘@
  3153. ═/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔>&,@.╫501$%4
  3154. ═1:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@4╒1%4*!)3╩!┘
  3155. ═#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4╚%1(1:!,05-4
  3156. ═╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&]╥82 ╚8╟5╞9╞5╥*2╤┘#2!╙=&$@*&)╒9╞9┼
  3157. ═<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&]╥82 ╚8╟5╞9╞5╥*2╤┘
  3158. ═(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫501$%41:!#2%5.
  3159. ═2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.0╒)%05-%╚%1(
  3160. ═1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬92!├,@╘@:6┘├
  3161. ═(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-(&%─8╥!─> ╘@
  3162. ═:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-(&5╠<╓4-(&1┼
  3163. ═>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴┘(&%─
  3164. ═8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!╧<╞$@*&)╒9╞9┼<┬─╠
  3165. ═>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠9'@-('!╠80╘@
  3166. ═:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞:6╪-(&1┼> ╘@
  3167. ═8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!84╒1%4 ╘-*┬╚╩
  3168. ═*┬╩@=$%+1:!!╚%-415"@24┌@>0╘->7-╘97 @;6%├#2!╠9'@@9'─@.╓┘534)%
  3169. ═4╩!/1╩!,3╘]0╚$┼415)!5$┼/3┼,-(&)┼<2!─;╓┘┼(#═╔1╩!$63╘╨╚$┼4)╒.@
  3170. ═2┼535*!!╚%!/24┘4#2 ^/├╪@8╓┼╬:70╠9'─-('-┼8╨╒┘;&]╧<"!╨:&$-(&╤─
  3171. ═82!╧;&1╪#2!╧<╞$@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-('!╠80╘@
  3172. ═:68@:2╤=,0╘@:6┘┘#2!┼;'-┼#2!─97─-(&9╔;@╘@<╓)├(&1╪#2!┬8╓,@9╞┼╪
  3173. ═> ╘@9&5╪#2!┬;╞4@>6╤╧;╫ -9&]╬92!╠9&$@;╓╤─> ╘@;╫)┴("┴┬=69╞97(╔
  3174. ═+'─-('-╘82 ╚8╟5╞9╞5╥*2╤┘#2!╥=',-#69╔>'@@861├(&1┘#2!╠<╫(@;╓╤─
  3175. ═> ╘@<╓5├(" [:4╒03╒)404┘4(0╘@8╞5╤(&9╔>&,-(&1┼> ╘@8╞┘┼('┼╠;╓]╨
  3176. ═#2!╩;7 @9&]╬90╘-9╞┼╪8╥!╨:&$-(&╤─82 ├)#@╨#2!╙=&$@;╓╤─> ╘@96]╥
  3177. ═(&)╒9╞9┼<@╘@<╫1┴(&)╒9╞9┼<@╘@8╞┘┼(&,╥#2!╔;╞,@8╟5╞9╞5╥*╙$-8╙(@
  3178. ═<&╤┴#2!─97@-(&)╬92!┘;&]╧< ╘@:╞╒╨(&1╧;╞4-(#╨\/" @.╓5.1*!/1╩!═
  3179. ═04-23┌!94╒1%4 ╘-*╩!╘04═%╚$%.╚%┬@4╒1%4*!)3╩!42$6@96]╥╚$)51─9%
  3180. ═4@╘╩╚'1(1:!33╘╤%╚$-(04┘'1:!)4┌!43┌!54╘6@96]╥╚$┼.4╒1%042@3╘:@
  3181. ═;╫)┴#0╒┼;╫)╪<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%
  3182. ═4─%424].4╨╘@/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔
  3183. ═>&,@.╫501$%41:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@
  3184. ═4╒1%4*!)3╩!┘#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4
  3185. ═╚%1(1:!,05-4╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&5╧<┬ ╚8╟5╞9╞5╥*2╤┘#2!╙
  3186. ═=&$@*&)╒9╞9┼<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&5╧<┬ ╚
  3187. ═8╟5╞9╞5╥*2╤┘(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫50
  3188. ═1$%41:!#2%5.2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.
  3189. ═0╒)%05-%╚%1(1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬
  3190. ═92!├,@╘@:6┘├(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-
  3191. ═(&%─8╥!─> ╘@:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-
  3192. ═(&5╠<╓4-(&1┼>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼
  3193. ═#0╒╞:7┴┘(&%─8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!┼;╫(@
  3194. ═*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠
  3195. ═9'@-('!╠80╘@:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞
  3196. ═:6╪-(&1┼> ╘@8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!8
  3197. ═4╒1%4 ╘-#2╩@=$%+1:!!╚%─═4╒1%4*!)3╩!42$6@96]╥+4)51─9%4@╘╩╚&-(
  3198. ═04┘'15.@1┼)/3:!!0─]61:!!4─4┌╚$].3%╞@4$╤/5*!,05-4╚%!!4┼2@3╘:@
  3199. ═14%#2 ╘╩╚%9%4┼1)0╘%,╚$-(54┘++*!$3╘╪╟5*!03$]4╚$╤!4╒2@4$])3┼0╠
  3200. ═╚%!,3╒2@5╘┼42*!┼;╫(-#65╧<╟┼╙=&5╨(&╒┴8╨╘@;&1╪(&1┘(#═╬54╒"15*@
  3201. ═3╘:@3$]/4*!)5$52051)3╘┘3#2!┬97$@9&]╬92 [:4:@1%─],*!)5"=3╚$╔5
  3202. ═4╒2@0:!03╘┼.5 ╘@/├╪^(&-╔;╞┼╘+&1┘#2!╙96,-*╟┼╠;╓]╨╚'!╚80╘╩╚&╤─
  3203. ═8:!╧;&1╪#2╩@;╫)┴╚"┴┬=69╞97(╔+'─-*╩!╙=&&@*&)╒9╞9┼<┬─╠>0╘╩╚'!╠
  3204. ═80╒┘;&]╧<"!╔9┬!╔+%╘╤#2!╔;╟─-(&5╠<╓4-(&1┼>0╘@9╞┼╬#2!╙8╞,@9'@-
  3205. ═(&)├8╥!╞:7┴╪#2!─97@-(&)╬92!┘;&]╧< ╘╩9&]╬9:!╠9&&@;╓╤─> ╘╩╚&]╥
  3206. ═8: ╚8╟5╞9╞5╥*2╤┘#2╩@<╫1┴╚"┴┬=69╞97(╔+'─-9&]╬92!╥=',-#69╔>'@@
  3207. ═861├(&1┘#2!╨:&$@(#═╫1:!/3─╤9╚%!,3╒2@5$┴%╚$╤!4╒2@4$%25*!/1╩!%
  3208. ═04-(╚$-(54┘+#2!╠9&$@;╓╤─> ╘@96]╥("┴┬=69╞97(╔+'─-('-╘82 ╚8╟5╞
  3209. ═9╞5╥*2╤┘#2!╨;&$-(&╤╙<┬!╧;&1╪#2!╙96,@(#═╔35!/4┼1!3┼0┴#2!┬97$@
  3210. ═9╞┼╪8╨╘@9&5╪#2!┬;╞4@>6╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴├('!╚80╘@;&1┴
  3211. ═(",─.# -('-╘82!╧;&1╪#2!┼;╫(@8╟5╞9╞5╥#2!╙=&$@8╟5╞9╞5╥#2!┬;╞4@
  3212. ═8╙(-(&┼╬8╥!┬=69╞97(╦,0╒├,┬!╨;&$-(&1┼> ╘@8╞┘┼('┼╠;╓]╨#2!╩;7 @
  3213. ═9&]╬90╘@/#╨\(" [94┘$╚$]&╚&╒!0╒)/╚%┼35$50#2╚╩*┬╩@:4┘)5$┼!3*!,
  3214. ═24┘%╚%-%5%50#0╘╩*╩!╘2$6@0╘]-345.5$5$╚$╤)3─53╚$)%3$]7╚$%21:!.
  3215. ═3╒>@5$%+14┌@0╘%21:!/1╩!"6:!42$4-*┬╩@0╘%,3$┼.1┌!23╒5424┘%+@╘╩
  3216. ═9')┴=┌ ^/├┌@;6]╓92╤╘>#$[>#&@╚#══3╒9%╚%-4549&╚$┼.5$^@6─523┌!0
  3217. ═04=%#2╩@/├╪^╚&╒╧=╞4╠='@╥.╫@╥╚* [=╘┴%4─6@252@0╘%.╚$)%╚$╒/1$┼&
  3218. ═245$#2╩@/├╪^╚&╒╧=╞4╠='─╤.╫─╤#2╩@/├╪^╚&╒╧=╞4╠='─╥.╫─╥#0╒─<╞%╫
  3219. ═(&╤─82!╞:6╤╠#2!┬;╞4@.╟-┼=&5╧<@╘@/├╪^('-┼=&)╒9@╘@:╞╒╨(#╔╙971╒
  3220. ═< ╘┌<╓5╘96]╥(&╤─82 ├/&5╧<╞)╒9┬ [=5-%╚&5╧<╩!"549&15*@24┘35$5!
  3221. ═1*!/1@╘@<╫1┴(&)╒9╞9┼<┬ [1$┼34$╤!6:!"549&15*@1─]2╚$1205=)3─<-
  3222. ═(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘┌<╓5╘=7 @<╓5├(" [;4%+
  3223. ═1:!355)%╚%@╤/%@╥#2!╠9&$@>#(-('-┬8╥!╪,0╘@8╞-╙(#╔├;╓┘╘#2!╠9&$@
  3224. ═>3(@.╓┼&╚$┘/5"╥@4╒=!4*!╨,:!!3─2@<#(-(&╤─>2!┘,0╘@<╫1┴('─╤#2!╙
  3225. ═='─@>3(-(&╤─82!╪,0╘@;&1┘('@╥#2!╙='─@>#$-('-╘82!╪,@╘-('-┼8╨╘@
  3226. ═<╓)├('@╤(#═╬3╒>@83╒$6 ╘┌8╓]╬="!╙=&$@9'@-(&╤─>"!╪,2 [<%54╚%@╤
  3227. ═╚$┼.5$^@>"╥@3─]7╚%=%╚$-!3╩!44─%32*!╪,0╘-8╓]╠=6╒╬('1╪82 [9─┼.
  3228. ═1*!42$6@1─┼24╒2@0╘],54╒.╚$9/4╩!╪#2!╠<╫(-(&╤╙<┬ @.╫1(15)%╚$%2
  3229. ═1:!8,2\╪╚#$╥.*!"651%╚$),3╘-+4╨╘@;'-╥(" [=╘┴)0╘┬@345!3┼.@6#$╧
  3230. ═,3:@,├4╓╚$)95$6@0─╤/0╘═3#2!╠<╫(-(&)├8╥ ┌979┼;┬ [=╘┼42*!!╚%!/
  3231. ═4╒-)0─╤%╚$585%)!╚#$╥.*!"651%╚$),3╘-+#2!╠9'─@(╥0╪," [24:@4╘\╠
  3232. ═╚%-%5*!42$6@2$┼'2*!"250-('-╘>2!┬=69╞97(-(&-╠8╨╘┌979┼;┬!┴9&,@
  3233. ═8╟5╞9╞5╥*╙$@.╓%$1*!)3╩!42$6@3┼5-0─52╚$]&╚#(╒-╩!"651%╚$),3╘-+
  3234. ═4╨╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘@<╓5├#2!╠9&$@>3(@.╓-!3$-53$%41:!$60╘@
  3235. ═<╓)├('─╤#2!┬8╫,@.╞-╧;╟0╥(#═╔4┌!9,├┘9,3\-(&5╧<┬ ├)&9╞(#═╧5$┴%
  3236. ═4┼=)4╘6@1%─]63$═63(-(&%─8╥ ├)# ╤#3╔├;╓┘╘,┬!╙=&$@9'─-(&-═<"!─
  3237. ═>" [=╘┴/)╒.@0─┼'1╘52.╩!$6:!/4╩!$6#\-(&)├8╥!╙=&5╨:6┘╪(#═╔1╩!$
  3238. ═6"╥@5$┴%3┬╪╬+@╘@:╞╒╨('-╘97!╔;╟─-#7-╘97!╔;╟@@;&1┘('─╤#2!├<'─@
  3239. ═>3(-(&╤─82!┬:71╨+'@@.╫┬@0╒524─5.5$╤9╚$-/3┼1!24┘3╚%@╤#2!╙=&$@
  3240. ═;╓╤─> ╘@<╫1┴(&-╚=6┘╦#2!┬8╓,@>&┼╬8╫─@.╓1/╚%=%╚%-415"@1─]25╘%2
  3241. ═1%.@3╒*@0─%#2╒=!4─13╚$┼.╚'─_#2!╩;7 @>&1┼8╫─-#7┴╔;╞-┘(&╤─82!╞
  3242. ═:6╤╠#2!┬97$@;╞]╥;7┴╔;╞,-(#╪^/┬!┼;╫)╪<╫1┼<"╤╔;╟─-;╞]╥;7┴╔;╞,@
  3243. ═/├╪^('┴╙=&5╨+&┼╬>0╘->&1┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═>&1┼8╨╘@
  3244. ═/├╪^(&5╧<╟┴╙=&5╨+&1┼>0╒╬;╫)═>&1┼8╥ ^/├╪@>'-╘97 ╠9&5┘#0╒╙=&5╨
  3245. ═:6┘┘(&╤─>2!┘,0╘@;&1┴(&)╔=' ╠>" [>#╒8,0╘@<╫1┴(&]╠9'@-(&╤╙<┬ @
  3246. ═.╫╞@1$]%4╘╪╟5*!54╘6@0╘┴53─═3#2!┼;╫(@;╓╤─>" [<╘^@5╘6@2┼535*!7
  3247. ═04┘4╚%1(1:!"250-('-╘82!╧;&1╪#2!├<'─@>3(-(&)├<╥!┘9&5├>0╘->6┼╬
  3248. ═8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═:6┘├#2 ^/├╪@96]╥>7-╘97 ╠:6┘┘#6┘╧
  3249. ═<╞╒╔;╞,@/├╪^('┼╙=&5╨+&┼╬>0╘->61┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═
  3250. ═9&5├#2 ^/├╪@96]╥>7-╘97 ╠9&5┘#6┘╧<╞╒─96,@/├╪^('┼╙=&5╨+&1┼>0╘-
  3251. ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#2╩@8╘╤%04┌@55 -
  3252. ═#6-╠96%╬=7 @;&1┴('9═8╫-┬(#═╙5╘┼40╘┬@0╘┴!4╩!23╘╓@0─%#2┌!)3@╘@
  3253. ═86┘─(",┼,3$╤,3 ╤,#$@.╘1%1─%53%0-('-╘82!╓;6-╙8@╘-(')╘<╥ @.╘)9
  3254. ═12$-#2!╘>'0@)╒-024┘!3*!#4─%#2╘52╚"<-('1╪=" ╟4╘╤*╚#8╧.34╟#0╘╩
  3255. ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚'-%5*!54*!"252@
  3256. ═5$%"3$4-#2!─<╥!>(#═├3$5!4╩!43┌!%3─2@3╘:@4$%'10╘@(" [<╘^@5$┴!
  3257. ═5*!404),15.@4╒1!4┼2@3╘┌@0:!004=%╚$)/54┘$05)9#6)╔=' @;'5╨(#$╓
  3258. ═(#╠╤,├┬@94┘44─┼%4┌!&3╒*@> ╘@9&9┬("4╤,3$╤,3$╤,0╘@9&9┬("4╨,3$╤
  3259. ═,3$╤,0╘@9&9┬("4╨,#$╤,3$╤,0╘@9&9┬("4╨,# ╤,3$╤,0╘@9&9┬("4╨,# ╨
  3260. ═,3$╤,0╘@9&9┬("4╨,# ╨,#$╤,0╘@9&9┬("4╨,# ╨,# ╤,0╘@9&9┬("4╨,# ╨
  3261. ═,# ╨,0╘@+2╒>#0╒╙:6╪@.╫1!0─╤%╚$]&╚%-)3─53+* ╤,├"@0┼┼415,-8╓]╙
  3262. ═(&5╤=2!╙:6╪╦,3(╪(#═╘04),1:!/1╩!#3╒-)3─53#2 @(#═┬3╒1(╚$]&╚%1(
  3263. ═15-%╚%1224>@5$%"3$53╚$%210╘@(" [0╒524─5.5$╤9╚%-%5*!54*!&4─]-
  3264. ═╚&)┴<╓┼├#7╔─:78@97%╒(&-╧<╥╠╤,├@@.╓1)5─┼324].╚%1!0─╤%#71═871╚
  3265. ═,2!┼<74@>╞1╔=┬╠╙.#0@.╓╒!5$┬@5$%"3$6@3╘:@1┬┴8*3╒8*┼@╧,├4╓#71═
  3266. ═871╚,┬!┼<74@=&╒┴=&@╤*╙4╤,┬ [<╘5#3╘┘$╚$╒!5$┬@5$%"3$4-<&]╠>6╤╔
  3267. ═<╫0@97%╒('1═871╚,┬╠╒,3(@.╓╤)4╒2@3╘:@4$],64=/3┼,-&┴╚:&┴╚:&┴╚:
  3268. 8&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3269.  
  3270. END
  3271.  
  3272. BEGIN 666 CUBE3D3.2.O
  3273. ═ ("╔ (╘@╘(╘┴╘*╘8╘"─/"1"-&-"@ *─?┴?╬╔@(7\3+╥!─╨41$1$@(" @(" @
  3274. ═(" @(" @0╒5"13-$(%8╙+├(-#2 @(" @(" @(" @(" @(" @($)9#9\@(" @
  3275. ═4╒1%4$┴%3┬!*541$╞2 @("!'14]21╘4@5$%93$]2#0╓;("!#2$5#2╥!/550@
  3276. ═5$┴%($╔!3┬╪@.34@25-3544@3╘8-┼┬ @0╙╒(04-+24┘'╞╥!&3╒(@34]212!$
  3277. ═151!24╤3(0╘-'1╓>$─8╤+╘8╥─┬ ═($┼.0╥]$14,@6"╒23╒1!5$┼/3@╘='1)&
  3278. ═,╥]&-)(@+2!)3─,╧1$5#(%─═4─]4051)3╘╪-'1╘21├4╧1├:2("╘@24┘#+╘1%
  3279. ═0╥!:+5)/5$%424].#1╘=$┬!&-╥ @─┬ ═(%)%4╘54#1╘=$┬ ╦+╥╘@─┬ ═(%╔/
  3280. ═3╘╘@24╪╧3╒54#1╘=$┬ @2" @─┬ ═(%1/1╘=,12!(241$14╪@4╒521─%#15,-
  3281. ═'1╘24╒!!0╘62("╘@5$]'1╘╤%(%-54─9!0╘4@1─┼,3$┼.1╨╘-("!04─534╥!1
  3282. ═(%1/(%%5250-#04@(" @("!04─534╥!!3┼─@2╘59(%1/($)%1╘┼.#0"╤^_ +
  3283. ═(-+_╥-#╓┘╧╤,╧($@┘/_) /#┘╩9*%(╪4┼╩92%)╪4╔╩0&-(="╔─╥#2_┌─ ├2'0
  3284. ═╩4!╔#(7[╩06%_*─ ╚ "┬ !┬1^\┴╔$)#┘&*7[:2┬%^┌7\:0"%_*  ┌(╦@$-#─
  3285. ═╩0"%╚┌─╨┴:2@ *(8╩0"1╚\├0^^:─╥═#╓╩0"%╚┌─╨┴:2% ╩╘8╘"╟╤"0┌-&-"╔
  3286. ═ (57┴5┬%685@┴3^%085 ┴4*%885┬┴6.%9(5┼┴6:%4*─!┴;6╔0(5╤6"#─_\╞%
  3287. ═╘ ╬┼8<─\\%'╞84╨-@\╞)╘ ╞┼8?!$╤╞%,#8/)┴═ +╔6+)// ╒┘╞),#8/)┬═ )
  3288. ═╔6+╨*,9┬3 ╓#╥8?0"┌5├╥3╙╨&>9├3 ╓#╥8╧0":5├\ ╙&8╘╨-@\╞(╘ 9,1╚),
  3289. ═#8/)*] '┘╟'╞<4╨-@\─═╘ ╫&<<9╤$"├╞<>9╤3 ╓#╥4├0":6╒20&%═4╨-@\─@
  3290. ═╘ ╞┼4$─!┴5!,#8/)4= #3)╞.>!┬┼9&5┴╥7┬0 ╬┼╪┴608╔65┼8╠┼╪─ +╔>(5┼
  3291. ═&*5╞96/)>) "┌7┬%9├┬┼9>5╞╠ )╔>(5╟&*5┼96;)>) "┌7┬%:!┬┼9&5╞╥7┬0
  3292. ═ ╬┼╪┴6─╪╔63┼9╦ ":7┬%:┴┬┼9&5╚╥7┬0 ╬┼╪┴6╠╪╔63┼9[ ":7┬%;!┬┼9&5╟
  3293. ═╥7┬0 ╬┼╪┴6╘╪╔6├┼9+ ":7┬%;├┬┼9>5─╠ )╔>(5╧&*5─967)>) "┌7┬%<!┬╞
  3294. ═9[╘ ─*9╚?0"0┴:6╞9[╓ ├╙┬╞:/╓ ├╪6╞╔╞6]@(\0#┴┴)_╓─!"┴┴)_╓─!3-╓#
  3295. ═"╚6╟.*9╬╧0"0╔╞╫] ) ╪╔╞╧] ) 8╔╞╤] ) 0#┴┴)_╓─!2┴┴)_╓─!3 >$2┴┬╞
  3296. ═:7╓ ├╙┬╞:╧╓ ├╪6╚.*9╦╧8"/╔╞╙]@(\╪╔╞╫]@(\╪╔╞[]@(\0#┴┴)_╓─!2┴┴)
  3297. ═_╓─!3#╓$2┴┬╞:7╘ ─!┬╞:╟╘ ─(6╔╔╞^]@(\╪╔╟#]@(^%╩╩9╠╧8"/.*9╬_8"/
  3298. ═.*9═_8"/.*9╦_8"/$ ╪82?]╔ 4╚82?]╔ 4╥ ┴$╚8╔╞╔] ) ╪╔╞╟] )"%╩╤┬╞
  3299. ═;+╘ ─*9═?0"0.*9╦_0"0.*9╬_0"0$ ╪82?]╔ 4╚82?]╔ 4╥╓┴$╚8╔╞┼]@(\8
  3300. ═╔╞╔]@(^%╦!┬╞;[╘ ─*9╨?0"0┴:╓╔ (6├╔0*%╔*((╩0"@ )&├╥-#[┘╩3*╘/2@
  3301. ═ (11╔%&┘ );0 ╘╥*┴852┘┼$@╤86┼5╘╔*2╚57╤3^╨ ╚4_╔5╟%0; "┴4&┼6$╔*
  3302. ═2╚58╤4"0 ╚5 ╔6#%0╔ "┴4*┼4/#!╩0"%╚┌4"┴:2╔ (7[╩4"%_*572╔ '╚("$
  3303. ═╚╪3[&(5╚9:2%╔*5╚9?╥%_*58..57╩╬┬─8- "┘╞"─8*─ 4?═(4:.1╚┌─ ─?═╚
  3304. ═┬,19╠.^┼╚╘╞ ┴:.%^] $┘╩3╞_,╦0╓─╙═┴*╘8╘$─"├1├0╩0┴% ╚4"3&┌"9╘5%
  3305. ═(&)204┼.+"!72$%4($1/(%┼/52!704┘4(%1/($1/(%1/3─┼'2%0_╩0"%8(58
  3306. ═╩?^%6857╔%&┘ ):%─╠┬┘ ):%─\┬┘ ):%┼,├&4╦─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬
  3307. ═╥,92╬0"6┴:_(╬0"6┴;#(╬0"6┴;'(┴%&──╩6┼┴2882?]╔ 84╚╠28╪\2┬%╠╩6╚
  3308. ═┴2882?]╔ 84╚╠28╪\2┬%╠┌6╦┴2882?]╔ 84╚╠28╪\2┬%═*23╔::%)┴┴)_╓─!
  3309. ═┴2┬╤)├├╤*!┴┼╠╚6╥╔:╞%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╥%)┴┴)_╓─!┴2┬╤
  3310. ═)├├╤*!┴┼═(6╘╔)2┼╔╪4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼╩╚4╞&$╟_:0&%*+$╞
  3311. ═./$╚&&6╙┴;.┼╦84╞&$╟_:0&%*+$╞./$╚&&6╘┴92╩╧("0╔;*%(┴┴)_╓─!┴22╤
  3312. ═(├├╤)*9╤╪$#╨%(3[╔'&%)┴┴)_╓─!┴2┬╤)├├╤**3[&&┼ ┴9+%5[ "┴5?%6) "
  3313. ═┴5┬┼╠╪4┬&$╟_:0&%)+$┬./$─╪$#╨$*1╤┴2882?]╔ 84╚╠28╪\2@8:4"%─\59
  3314. ═╠ *%6<5@─ *%8*25╔:6%)┴┴)_╓─!┴2┬╤)├├╤*(6╥╔:┬%)┴┴)_╓─!┴2┬╤)├├╤
  3315. ═*(6╙╔:╬%)┴┴)_╓─!┴2┬╤)├├╤*(6╘╔):┼╔╚4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼
  3316. ═╩84╞&$╟_:0&%*+$╞./$╚&&6╙┴;.┼╦(4╞&$╟_:0&%*+$╞./$╚&&6╘┴;2─╦╩6╟
  3317. ═┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╩┴2882?]╔ 84╚╠28╪\2@89;.%╠┌6═┴288
  3318. ═2?]╔ 84╚╠28╪\2@89;2%╦╩╩\@)"┼╠╚4┬&$╟_:0&%)+$┬./$─╔╟'@0/ 4┴/╬─
  3319. ═<84╞&$╟_:0&%*+$╞./$╚╔/╠8:4"%┼<57╠ *%5\58─ *%6*6╙┴2(82?]╔ 84─
  3320. ═╠2(╪\23@0/ 0╔'&%)┴┴)_╓─!┴2┬╤)├├╤*!┴╔0(66╤5╞╨ ╚59╤6"0 ╚5@╔*^┼
  3321. ═╔84╞&$╟_:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%
  3322. ═*+$╞./$╚┴;2─╠*6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪
  3323. ═\2@89;.%╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╤╔:>%)┴┴)_╓─!┴2┬╤)├├╤
  3324. ═*!┴┼╠╚6╥╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼
  3325. ══(6╤╩╦╥ ─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪
  3326. ═\2┬─^╤┴╔0(6╧╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞
  3327. ═&$╟_:0&%*+$╞./$╚&&┼ ┴;#%6; "┴5╟%8) "┴6"┼═?!'╔94╪┘9*╚╔; ╪┘9:%
  3328. ═)┴┴)_╓─!┴2┬╤)├├╤*(7[╔:\╪┘96╚╔98╪┘9.%)┴┴)_╓─!┴2┬╤)├├╤*,7[, _&
  3329. ═4╧ *┘┼'╞4>91╤┼+0]╞"┼─╚7[╔9.%_*65┴?╓┼┼╚7^(-"+╔96%^┌66┴?╥┼╦╪7]
  3330. ═╔;"%_┬#0┬\92╘ -,=╪╬─4;─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬╥(11╔)6┼╔84╞&$╟_
  3331. ═:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%*+$╞./$╚
  3332. ═┴;2─┼╩6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪\2@89;.%
  3333. ═╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╬╔:>%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╚6╥
  3334. ═╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼═(6╬╩╦╥
  3335. ═─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪\2┬─^╤┴╔
  3336. ═0(65╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞&$╟_:0&%
  3337. ═*+$╞./$╚&&┼ ┴9;%6; "┴5╟%8) "┴6"┼┼87[╔9:%_*6╧┴?╓┼╠(7^(-"+╔96%
  3338. ═╦┌66┴;#&4╧ #3!&*╔9*%_:63┴?┌┼╦╪7[╔;"%_"#0┬╓!╙04╒%(%1(24┘'(%=%
  3339. ═($1/($5615)9($┘)1╘┴4+"!╨24┘+63╚@5%)9(%1/(%1!2╘4@3╒9%4┬!42$4@
  3340. ═5╘]23$0┴;─%21┬&┼4- +╩0"%╚┌4"┴:1,┘╪╬╔ (6├╩4"%╔#┬┼_>7[╠!.┼_╩3\
  3341. ═┴?╥$_╩7[╔/╓$^╪7]..7[┴6>╞^╪╔*2─╔*─ 6@@(2├&&6─┴:0╪╔?[┼_+ $2?]╔
  3342. ═ 85╚╤6>0 ╘╥-├:3\╤/┌] (^%_87^─ -,╪╪╥┼4/!3╔╞>┼9╘╔&_╧ 0┘6┬0,<╦0
  3343. ═]:7]1?┘1╚┘&├8$┬┼_5&├─:.╔_╪7]┴?┌╔@$6├┴:/0 ╬:─:.5╚╠ -┼9\├*╘,╔,
  3344. ═38╤┼9╘┬┼_47^4:.1╚┌7^┴?╒╚╥,╦0╠╓"╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┴&├
  3345. ═─:-@2*7]$:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟╥,╦0╥─╥@├&5╟2*7]
  3346. ═1?╪1╚┘&├╔?┌%_6├(╥═"╙8*50\%.╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┼&├─:-@
  3347. ═2*7]4:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟┬,╦0╥─╙╫├&5╟2*7]1?┘1
  3348. ═╚┘&├╔?┌%_6┬(╥═"╙8*9╟╔6=*1╧[╨$.5╚─#'*╘/6┼_47^$:.1╚╓!(╔?╘1╚┘&├
  3349. ═╩?^%_87^╩8!%╚╪6├╘ +╞╔&├┼:+ #96>(╥═#*3$╩-96=(╔?╒%_┴&├─:.┼_╚7]
  3350. ═:(├*╘+-@╔/╥] (^%_4╔%_87]╤/┌╨?╩50\#╩╞:/ ,╔6┴*.,├┼9┘ $╥═#╪8&5╚
  3351. ═2*7]4:.1╚╓┴&_3├╨!╠╦0┘4╥╤├4┬╔@(7]1:.%╚] "┘╩1╚╥═#13+&-╔╞├╨%*5╚
  3352. ═2├┴(╔?╘1╚┘&├:,├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],\╪╒(╩8"%_46├
  3353. ═┴:/0 ╬:─:,╦0╥╘╙╙├:50\#╩╞:/ ,╔6┴*.(├┼9┘ $╥═#╪8&5╚2*7]4:.1╚╓┴&
  3354. ═_3├╨!╠╦0┘4╨╧├─┬╔@(7]1:.%╚] "┘╩1╚╥═#13"^.╔╞├╨%*5╚2├┴(╔?╘1╚┘&├
  3355. ═:(├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],<8┘(╩8"%_46├┴:/0 ╬:─:,╦0
  3356. ═╥╘╤╤├╩╘8╘"╟╒├1├08%-024┘!3"!#4─%#2╘52(%-,2┬ ╓+╙─╒
  3357. ═                      #_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?
  3358. ═#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_
  3359. ═?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\'
  3360. ═ ╨'_?╙\?#╨<# 1╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3361. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3362. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3363. !&┴╚:
  3364.  
  3365. END
  3366.  
  3367. BEGIN 666 SHAPE3.2
  3368. ═ 1╨┴'   ├╥!#54)%,╘0@4╘┴!4$4@24┘)5"!04─]'4─%- $<<!0"7-3$╠,├4╒
  3369. ═.╔<╒,┬╨╤,├<┌┼╙4╒+#(╒-3╩7-38╠,3(╫.╔╨ ;┴╤┬ (\@34%)3┬!04─]'4─%-
  3370. ═(%-405)44╥!!5"!,24┘%(#4╨,#  =!╤├ #╚ ┬!╤─ (\@4%)/1╒)!32!.3╒1%
  3371. ═4╨":'&╪ ├╥!33$╚@-┬\╤-┬\┘-0"╨''@ ├╥!$051!($9/4─╒!5"!)4╙╚ ╒┴╤]
  3372. ═ (\@3┼5-4$])3┼13+%@╤+%─╤+%╚╤+%@╥+%─╥+%╚╥+"╪╬+@#╫'(( ├╥!42$4@
  3373. ═4$],64=/3┬!,25-4("╔-55-4*┬!"10 5'8< ├╥!415)-24┘!5$5$(%=)5$@@
  3374. ═02!:15)/(0 ;'8─ .@ ^'8╨ ├╥!/1┬!#3╒524╘4╠(%1(15)%($┼3($$@3$]4
  3375. ═($]& %╪=─0"/($154$╤)0╘%424].($1205=)3─<@3$┼.15, @╤╓3 (\@5╘┴%
  3376. ═3┬!&04-%4╥!!4─5.)╒0@0─5)3─<@1─┼,3$5$ *8=┼@"/($$@1─%35"!04─]'
  3377. ═4─%-(%=/54╤$3┬=4($1205< ╥┴╓@ (\@5$┴%(%-!344@3$┼.12!45╘┼#12╨@
  3378. ═0┼54(%1(25, ┌!╓┼ (\@25,@1╘]/1"!%3─]51╘@@1─]2($┘/5╥$ "┴┌╟ (\@
  3379. ═3╘8@0╘]54┼-%+"!&3╒(@1─┼,3$5$($9!0╘53 "╠>╩ "/(%1(25,@25,@3─\@
  3380. ═3$].1╘52($%.($┼34╒5% #$>╩@ ┌ %8>═ "/($9%14╨@1┼)%12!43╥!0550@
  3381. ═64]54┬!/5╘╪@1$%400!\'╦─ ├╥!)3┬╨@0┼54($-(04┘'12!42$4@4$]+12!)
  3382. ═3┬!,24┘% )@>╧@"/(#4╨,#4@5$\@55-%($,╤($%.1"!#,@">'╠@ .@##'═(
  3383. ═├╥!33╒)262!!0─]55"!33╘╒%($]&(%1(12!,25143$4 ╫┴[7 (\@0┼5'4╥╨@
  3384. ═15(╬+┬╪@1─5!5%5215, _┴[< (\@5$┴)4╥!705,@02!214%,(%)54╘@@2─]"
  3385. ═+@ $'^8 .@ ╟'_  ├╥!!3─0@248@64]5($9%14╨@4╘\@24┘#3$┼.140╠ $0?
  3386. ═^@"/(%=2251%(%1/(%-*541$0$┘752┘%1%4 2┴\$ 3╚ :1\. 8\@04┘$($%"
  3387. ═3╒9%($%,3"╨@2$%612!&54╪┴ &\?& $┌ ($?┘@./($9)4┼-4(%-(05!% )<?
  3388. ═┘╨-!,;+"*#8╤*3╔!,╦+"*#8╥*0#''^@#@╥ ╘+"╘╥-┬╨═,├8╠-├0╠,├8╠+3(╓
  3389. ═+#8╘+#(╓+#8╘+#8╘+"╘╥-┬╨╓-"╨╓- #╙'_(#@╥ ╘+"╘╥-┬╨═,├8╠,"╨╥-┬╨═
  3390. ═,├8╠,"╨╥-┬╨╓-"╨╨+"╘╥-┬╨╓-"╨╨ !<@_ .#(#,╠,"╨═,├8╠,╙(╠,38╠,╙(╠
  3391. ═,╙(╠+3$╓+#,╥+#,╥ !\@!@2#(#  ,┬!*!(\@4╘5#3╘┘$(%-(05!% $@@2╨1"
  3392. ═,;+"*#8╤*3╔",╦+"*#8╥*0!\($╨$@╥ ╘+"╘╤-2╨╙,"╨═,3(╠+3$╒+"╘╙,"╨═
  3393. ═,3(╠+34╫+"╘╙,"╨═,╥╨═-3$╠+38╠+3, ╦"!6!(,@-"╨╤-2╨╙,"╨═,3(╠-3$╠
  3394. ═+38╠+3,╠-3<╠+3,╨+"╘╙+#$╒+"╘╙,"╨═,3( ╪"!@!(,@-"╨╤-2╨╙,"╨═,3(╠
  3395. ═,34╠+3,╨+"╘╤,┬╨═,34╠+3,╨+"╘╤,┬╨═,34╠,╙ ╠+3$╥ "0┴:@2#(#<╠,34╠
  3396. ═+3,╨+"╘╤,┬╨╒-╥╨═,╙ ╠+3,╠,╙,╠+3,╨+#8╠,"╨═,╙ ╠,3(╠+3,╙+"╘╙,"╨╓
  3397. ═+"╘╒-╥╨═,╙ ╠+3, -┬%╠!(,@+3$╒+"╘╙,"╨═,3( 6╥%╘!(,@,╥╨╙,╥╨═,╙ ╠
  3398. ═,"╨╙,╥╨═,╙ ╠+30╠,╙─╠+3,╨+"╘╥ (,┴?@2#(#,╠+3,╙+"╘╙,"╨╨+"╘╙.2╨═
  3399. ═,╙ ╠+3(╠+3,╙+"╘╙,"╨═- "╧(8@$@╥ ╘+#8╠+3,╨+#,╠-┬╨═,╙ ╠+38╠,3@╠
  3400. ═+3,╨+"╘╘+#$╪+"╘╙,"╨╤ -\┴─@2#(#0╠+38╠+3,╨+#,╠+3$╪+"╘╙,"╨╤+"╘╤
  3401. ═."╨═,╙ ╠+30╠+38╠+3,╨+"╘╓  <┬╟ 2#(#,╠+34╫+"╘╙,"╨═,╥╨═,╙,╠+3,╨
  3402. ═+#8╠+34╤+"╘╤,┬╨═,╨ ╧(╩8$@╥ ╙+"╘╙,╥╨═,╙ ╠-┬╨═,34╠,╙ ╠+3$╥+"╘╒
  3403. ═,2╨═,3(╠+3, 4╥*╨!(,@,╥╨═,34╠,╙ ╠+3$╥+"╘╙,╥╨═,╙ ╠-┬╨╨+#8╠,3(
  3404. ═=2*┌!(,@,╥╨╨+#8╠,3(╠+3,╙+"╘╙,"╨╓+# ╠+3,╨+#$╥ )─┬╤ 2#(#,╠,34╠
  3405. ═,╙ ╠+3$╥+"╘╤-2╨╙,"╨═,3(╠,"╨╓+#$╥ +╚┬╙@2#(#,╠,"╨═,╙ ╠,3(╠,╙,╠
  3406. ═+3,╨+#8╠,"╨╓+#$╥ -╨┬╓ 2#(#,╠,"╨╓+#$╥+#,╙+"╘╙,"╨╓+#$╒+#,╨+"╘╤
  3407. ═,@ !(^($@╥ ╙+#$╒+#,╨+"╘╤,┬╨╙,╥╨═,╙ ╠-┬╨╒,2╨═,3(╠+3, )┬/╠!(,@
  3408. ═,╥╨╙,╥╨═,╙ ╠-┬╨╒-╥╨═,╙ ╠+3,╠-3$╠+3$╥+"╘╙ "╪├]@2#(#  0",2!8\@
  3409. ═5$┴)4─0@4╘┴!4$4 5┬,3!4,╤╠╠(╚-├$╔.─,╥╠╠(╚-├(╔ ' ├% 6/(%┼/55(@
  3410. ═1$%402!'3╘53($┴%4─4 >"/0!╪,@, ",(╪@30┼"╥,├4╓╦"@┘╦#$╓╩├8╔ + ├
  3411. ═├!./($-(04┘'12!"14╤/5╥!43╥!03╘┼.5"!43╥!$051! ,(├├1.7-├4╠0├$┌
  3412. ═┼╙8╓+$(╥ .$├─┴.'3├╩70┼ ╠3├╔"4+)"4*╚╤.╚═.╠├"╟-3 ╒, #╔(┘<3╞2!.
  3413. ═  8─╟!.!2;(╤╔#.╠3├╩'4#╩+4+,╨╔╒"╥,├4╓╩┼  &"2╞$┘="4"╤0.─)0╠─)0
  3414. ═╩├$ (┬2╦$┘─┬+┬([ "╪─╠!.".╚─╒,#$╨ #\─╬┴.>,╙(╫-├@┌╟#╩,.╚     :
  3415. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3416. 0&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3417.  
  3418. END
  3419.  
  3420. BEGIN 666 TABLES$8F80-$95FF
  3421. ═@(\  @,%!╨@*"╨╘/$!$3%!47&!─:&╤╨='1╪>'╤\@(" @(" @'╤\>'┴╘='!╠:
  3422. ═&1@7%103$1 /#0╠*" <% ╨( _╧╫[^?├╓]?/╤\._═[.╧╔┌.?╞┘>3├╪^+┬╪>'@
  3423. ═╪.#@╪.#@╪>'┬╪╬/├┘.7╞┘^├╔┌^╙═[_#╤\_7╓^/╟[_?╪ _╨    #_\" @(" ?
  3424. ═'╤╪>'1╘<&╤╚9&!<5%!,1$ \-"╨╚(!╨4# @#^_?╧┘^/;╒\_'╨[^╫╠┌^╟╚┘^;┼
  3425. ═┘./├╪╬+┴╪>#@╪.#@╪.#┴╪>+┬╪^/─┘>;╟┌.╟╦[.╫╧\/'╙]?;╪^?╧]_@ " ╨4'
  3426. ═" ╚+#0\0$1,4%1<8&1╚;'!╘='┴╪?'╥ @("  _____╨  (┬(┬(┬(├(╥,├(╥,├
  3427. ═(╥,─)"0─)"0─)"4┼)24┼)24┼)┬8╞)┬8╞)┬8╟)╥<╟)╥<╟*"@╚*"@╚*"─╔*2─╔
  3428. ═*2╚╩*┬╚╩*┬╠╦*╥╠╦*╥╨╠+"╨╠+"╘═+2╘═+┬╪╬+┬╪╬+╥\╧+╙ ╨,# ╨,3$╤,3$╥
  3429. ═,├(╥,╙,╙,╙0╘-#0╒-34╒-├8╓-├<╫-╙@╪.#@8&!@8&1─9&1─9&1─9&1─9&1─9
  3430. ═&1─9&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╠;&╤╠;&╤╠;&╤╠;&╤╠;&╤╨<'!╨<'!╨<'!╨<
  3431. ═'!╨<'1╘='1╘='1╘='1╘='1╪>'┴╪>'┴╪>'┴╪>'┴\?'╤\?'╤\?'╤\?(" @(" @
  3432. ═(" @(" ┴(2$┴(2$┴(2$┴(┬(┬(╧__     /____\ \   _╨#__╨    #_____
  3433. ═     /____\     _____╨    #_ /__     /_╨__\     _____╨    #_
  3434. ═____     /____\     _____╨    #_____     /____\     _____╨
  3435. ═  #_____     /_╨                 0$! 0$! 0$" @(" @(# ╨,#! 0$
  3436. ═! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45%┴<7
  3437. ═&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫.#─┌
  3438. ═.╙╨]/├] 04)#1$5&1╘┴)2─═-3─]045)35%976"╠╩*2─╚)╥8╞)20├(╥(┴(" ?
  3439. ═'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)" @(
  3440. ═!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
  3441. ═              $! 0$! 0$! @(" @(" ╨,# ╨0$! 0%!04%!@8&!╨<'" @(
  3442. ═"0─)"@╚+"╨╠,# ╘-#@╪/#╤ 0$1$2$┴,3%!05%187%╤@8&1╚:&╤╨<'1╪>'╥ @
  3443. ═(2(├(╥0┼)┬8╟*"─╔*┬╠╠+2╪╬+╙ ╤,├,╘-34╓-╙@┘.├╠\/3╪_0$%"0╘1%1─=(
  3444. ═24╔+34┘/4%%24╒165╒@╦*┬─╔*"<╞)┬4─(╥,┬(2 @'╤╪>'1╨<&╤╚:&1@8%╤<6
  3445. ═%144%!,3$┴(1$1 0#╨\.#@╘-# ╨+"╨╠*"@─)"0@(" <'!╨8&!@4%!04$! 0$
  3446. ═ ╨,# ╨(" @(" @$! 0$! 0$!                               ! 0$!
  3447. ═ 0$! 0(" @(" @,# ╨,$! 0$!04%!08&!@<'!╨@(" ─)"0╚*"╨╠+# ╨-#0╪.
  3448. ═#╨\0$!$1$┴(3$╤04%146%╤<8&!─:&┴╠<'!╘>'┴\@("$┬(╥,─)28╞)╥@╔*2╚╦
  3449. ═+"╘╬+┬\╨,3(╙-#4╒-├<╪.3╚[/#╘^/╘ _/├╘\.╙╚┘.#<╓-34╘,╙(╤,"\╬+┬╘╠
  3450. ═*╥╚╔*2@╟)┬8┼)",├(┬$@(!\>'┴╘<'!╠:&┴─8&!<7%┴45%!03$╤(2$1$0$ \/
  3451. ═#@╪-#0╨,"╨╠+"@╚)"0─(" @'!╨<&!@8%!04%! 0$! ,# ╨," @(" @(! 0$!
  3452. ═ 0$! 0                               0$! 0$! 0$" @(" @(# ╨,#
  3453. ═! 0$! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45
  3454. ═%┴<7&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫
  3455. ═.#─┌.╙╨]/├] /╙╪]/#╠┌.3@╫-├4╒-#,╥,3 ╧+┬╪═+"╠╩*2─╚)╥8╞)20├(╥(┴
  3456. ═(" ?'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)
  3457. ═" @(!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
  3458. ═ !╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3459. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3460. ┼&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  3461.  
  3462. END
  3463.  
  3464.  
  3465. ********************************
  3466. *                              *
  3467. * ╙TEPHEN ╩UDD                 *
  3468. * ╟EORGE ╘AYLOR                *
  3469. * ╙TARTED: 7/11/94             *
  3470. * ╞INISHED: 7/19/94            *
  3471. * V2.0 ├OMPLETED: 12/17/94     *
  3472. * V3.0 ├OMPLETED: 3/20/95      *
  3473. * V3.1 ├OMPLETED: 6/14/95      *
  3474. * V3.2 ├OMPLETED: 6/15/95      *
  3475. *                              *
  3476. * ╫ELL, IF ALL GOES WELL THIS  *
  3477. * PROGRAM WILL ROTATE A CUBE.  *
  3478. *                              *
  3479. * V2.0 + ╬EW AND ╔MPROVED!     *
  3480. * ╬OW WITH FASTER ROUTINES,    *
  3481. * HIDDEN SURFACES, FILLED      *
  3482. * FACES, AND EXTRA TOP SECRET  *
  3483. * TEXT MESSAGES!               *
  3484. *                              *
  3485. * V3.0 + ╞AST CHUNKY LINE      *
  3486. * ROUTINE.                     *
  3487. *                              *
  3488. * V3.1 + ╟ENERAL POLYGON PLOT  *
  3489. * WITH HIDDEN FACES (╪-PRODUCT)*
  3490. * AND ZOOM FEATURE.            *
  3491. *                              *
  3492. * V3.2 + ┼╧╥-BUFFER FILLING    *
  3493. *                              *
  3494. * ╘HIS PROGRAM IS INTENDED TO  *
  3495. * ACCOMPANY THE ARTICLE IN     *
  3496. * ├=╚ACKING, ╩UN. 95 ISSUE.    *
  3497. * ╞OR DETAILS ON THIS PROGRAM, *
  3498. * READ THE ARTICLE!            *
  3499. *                              *
  3500. * ╫RITE TO US!                 *
  3501. *                              *
  3502. * ═YSELF WHEN YOUNG DID        *
  3503. * EAGERLY FREQUENT             *
  3504. * ─OCTOR AND ╙AINT, AND HEARD  *
  3505. * GREAT ┴RGUMENT               *
  3506. *  ┴BOUT IT AND ABOUT: BUT     *
  3507. *  EVERMORE                    *
  3508. * ├AME OUT BY THE SAME ─OOR    *
  3509. * AS IN ╔ WENT.                *
  3510. *    - ╥UBAIYAT                *
  3511. *                              *
  3512. * ╘HOUGH ╔ SPEAK WITH THE      *
  3513. * TONGUES OF MEN AND OF ANGLES *
  3514. * AND HAVE NOT LOVE, ╔ AM      *
  3515. * BECOME AS SOUNDING BRASS, OR *
  3516. * A TINKLING CYMBAL.           *
  3517. *    - 1 ├ORINTHIANS 13        *
  3518. *                              *
  3519. * ╨.╙. ╘HIS WAS WRITTEN USING  *
  3520. *      ═ERLIN 128.             *
  3521. ********************************
  3522.  
  3523. ╧╥╟ $8000
  3524.  
  3525. * ├ONSTANTS
  3526.  
  3527. ┬╒╞╞1 ┼╤╒ $3000 ;╞IRST CHARACTER SET
  3528. ┬╒╞╞2 ┼╤╒ $3800 ;╙ECOND CHARACTER SET
  3529. ┼╧╥┬╒╞ ┼╤╒ $4000 ;┼╧╥-BUFFER
  3530. ┬╒╞╞┼╥ ┼╤╒ $┴3 ;╨RESUMABLY THE TAPE WON'T BE RUNNING
  3531. ╪1 ┼╤╒ $╞┬ ;╨OINTS FOR DRAWING A LINE
  3532. ┘1 ┼╤╒ $╞├ ;╘HESE ZERO PAGE ADDRESSES
  3533. ╪2 ┼╤╒ $╞─ ;DON'T CONFLICT WITH ┬┴╙╔├
  3534. ┘2 ┼╤╒ $╞┼
  3535. ╧╠─╪ ┼╤╒ $╞─
  3536. ├╚╒╬╦ ┼╤╒ $╞┼
  3537. ─╪ ┼╤╒ $67 ;╘HIS IS SHARED WITH ╘1 BELOW
  3538. ─┘ ┼╤╒ $68
  3539. ╘┼═╨1 ┼╤╒ $╞┬ ;╧F COURSE, COULD CONFLICT WITH X1
  3540. ╘┼═╨2 ┼╤╒ $╞├ ;╘EMPORARY VARIABLES
  3541. ┌╘┼═╨ ┼╤╒ $02 ;╒SED FOR BUFFER SWAP.  ─ON'T TOUCH.
  3542. ┌1 ┼╤╒ $22 ;╒SED BY MATH ROUTINE
  3543. ┌2 ┼╤╒ $24 ;─ON'T TOUCH THESE EITHER!
  3544. ┌3 ┼╤╒ $26
  3545. ┌4 ┼╤╒ $28
  3546. ╦ ┼╤╒ $┬6 ;├ONSTANT USED FOR HIDDEN
  3547.    ;SURFACE DETECTION - DON'T TOUCH
  3548. ╚╔─┼ ┼╤╒ $┬5 ;┴RE SURFACES HIDDEN?
  3549. ╞╔╠╠ ┼╤╒ $50 ;┴RE WE USING ┼╧╥-FILL?
  3550. ┴╬╟═┴╪ ┼╤╒ 120 ;╘HERE ARE 2*PI/ANGMAX ANGLES
  3551.  
  3552. * ╓╔├
  3553.  
  3554. ╓═├╙┬ ┼╤╒ $─018
  3555. ┬╦╟╬─ ┼╤╒ $─020
  3556. ┬╧╥─┼╥ ┼╤╒ $─021
  3557. ╙╙╘┴╥╘ ┼╤╒ 1344 ;ROW 9 IN SCREEN MEMORY AT 1024
  3558.  
  3559.  
  3560. * ╦ERNAL
  3561.  
  3562. ├╚╥╧╒╘ ┼╤╒ $╞╞─2
  3563. ╟┼╘╔╬ ┼╤╒ $╞╞┼4
  3564.  
  3565. * ╙OME VARIABLES
  3566.  
  3567. ╟╠╧┬╪═╔╬ = $3╞ ;╘HESE ARE USED IN CLEARING THE
  3568. ╟╠╧┬╪═┴╪ = $40 ;DRAWING (GLOBAL) BUFFER
  3569. ╟╠╧┬┘═╔╬ = $41
  3570. ╟╠╧┬┘═┴╪ = $42
  3571. ╠╧├╪═╔╬ = $57 ;╘HESE ARE USED IN CLEARING THE
  3572. ╠╧├╪═┴╪ = $58 ;┼╧╥ (LOCAL) BUFFER
  3573. ╠╧├┘═╔╬ = $59
  3574. ╠╧├┘═┴╪ = $60
  3575. ╨1╪ = $92 ;╘HESE ARE TEMPORARY STORAGE
  3576. ╨1┘ = $93 ;╒SED IN PLOTTING THE PROJECTION
  3577. ╨1┌ = $94
  3578. ╨2╪ = $95 ;╘HEY ARE HERE SO THAT WE
  3579. ╨2┘ = $96 ;DON'T HAVE TO RECALCULATE THEM.
  3580. ╨2┌ = $┴┼
  3581. ╨3╪ = $┴╞ ;╘HEY MAKE LIFE EASY.
  3582. ╨3┘ = $┬0
  3583. ╨3┌ = $┬1 ;╫HY ARE YOU LOOKING AT ME LIKE THAT?
  3584. ╨1╘ = $┬2 ;─ON'T YOU TRUST ME?
  3585. ╨2╘ = $┬3
  3586. ╨3╘ = $┬4 ;╚AVING ANOTHER CHILD WASN'T MY IDEA.
  3587. ╔╬─┼╪ = $51
  3588. ├╧╒╬╘╨╘╙ = $52
  3589. ┌╧╧═ = $71 ;┌OOM FACTOR
  3590. ─╙╪ = $61 ;─╙╪ IS THE INCREMENT FOR
  3591.    ;ROTATING AROUND X
  3592. ─╙┘ = $62 ;╙IMILAR FOR ─╙┘, ─╙┌
  3593. ─╙┌ = $63
  3594. ╙╪ = $64 ;╘HESE ARE THE ACTUAL ANGLES IN X Y AND Z
  3595. ╙┘ = $65
  3596. ╙┌ = $66
  3597. ╘1 = $67 ;╘HESE ARE USED IN THE ROTATION
  3598. ╘2 = $68
  3599. ╘3 = $69 ;╙EE THE ARTICLE FOR MORE DETAILS
  3600. ╘4 = $6┴
  3601. ╘5 = $6┬
  3602. ╘6 = $6├
  3603. ╘7 = $6─
  3604. ╘8 = $6┼
  3605. ╘9 = $6╞
  3606. ╘10 = $70
  3607. ┴11 = $┴5 ;╘HESE ARE THE ELEMENTS OF THE ROTATION MATRIX
  3608. ┬12 = $┴6 ;╪┘┌
  3609. ├13 = $┴7
  3610. ─21 = $┴8 ;╘HE NUMBER DENOTES (ROW,COLUMN)
  3611. ┼22 = $┴9
  3612. ╞23 = $┴┴
  3613. ╟31 = $┴┬
  3614. ╚32 = $┴├
  3615. ╔33 = $┴─
  3616.  
  3617.  
  3618. *** ═ACROS
  3619.  
  3620. ═╧╓┼ ═┴├
  3621.  ╠─┴ ]1
  3622.  ╙╘┴ ]2
  3623.  <<<
  3624.  
  3625. ╟┼╘╦┼┘ ═┴├  ;╫AIT FOR A KEYPRESS
  3626. ╫┴╔╘ ╩╙╥ ╟┼╘╔╬
  3627.  ├═╨ #00
  3628.  ┬┼╤ ╫┴╔╘
  3629.  <<<
  3630.  
  3631. ─┼┬╒╟ ═┴├  ;╨RINT A CHARACTER
  3632.  ─╧ 0  ;─ON'T ASSEMBLE
  3633.  
  3634.  ╠─┴ #]1
  3635.  ╩╙╥ ├╚╥╧╒╘
  3636.  ├╠╔
  3637.  >>> ╟┼╘╦┼┘ ;┴ND WAIT TO CONTINUE
  3638.  ├═╨ #'S' ;═Y SECRECT SWITCH KEY
  3639.  ┬╬┼ ╠1
  3640.  ╩╙╥ ├╠┼┴╬╒╨
  3641.  ╩═╨ ─╧╬┼
  3642. ╠1 ├═╨ #'X' ;═Y SECRET ABORT KEY
  3643.  ┬╬┼ ─╧╬┼
  3644.  ╩═╨ ├╠┼┴╬╒╨
  3645.  ╞╔╬
  3646. ─╧╬┼ <<<
  3647.  
  3648. ─┼┬╒╟┴ ═┴├
  3649.  ─╧ 0
  3650.  ╠─┴ ]1
  3651.  ╙╘┴ 1024
  3652.  ╞╔╬
  3653. ─╧╬┼┴ <<<
  3654.  
  3655. *-------------------------------
  3656.  
  3657.  ╠─┴ #$00
  3658.  ╙╘┴ ┬╦╟╬─
  3659.  ╙╘┴ ┬╧╥─┼╥
  3660.  ╠─┴ ╓═├╙┬
  3661.  ┴╬─ #%00001111 ;╙CREEN MEMORY TO 1024
  3662.  ╧╥┴ #%00010000
  3663.  ╙╘┴ ╓═├╙┬
  3664.  
  3665.  ╠─┘ #00
  3666.  ╠─┴ #<╘╘┼╪╘
  3667.  ╙╘┴ ╘┼═╨1
  3668.  ╠─┴ #>╘╘┼╪╘
  3669.  ╙╘┴ ╘┼═╨2
  3670.  ╩═╨ ╘╔╘╠┼
  3671. ╘╘┼╪╘ ╚┼╪ 9305111111 ;CLEAR SCREEN, WHITE, CRSR DN
  3672.  ╘╪╘ '             CUBE3D V3.2',0D,0D
  3673.  ╘╪╘ '                  BY',0D
  3674.  ╚┼╪ 9╞ ;CYAN
  3675.  ╘╪╘ '    STEPHEN JUDD'
  3676.  ╚┼╪ 99
  3677.  ╘╪╘ '    GEORGE TAYLOR',0D,0D
  3678.  ╚┼╪ 9┬
  3679.  ╘╪╘ '  CHECK OUT THE JAN. 95 ISSUE OF',0D
  3680.  ╚┼╪ 96
  3681.  ╘╪╘ '  C=HACKING'
  3682.  ╚┼╪ 9┬
  3683.  ╘╪╘ ' FOR MORE DETAILS!',0D
  3684.  ╚┼╪ 0─1─1─9┼12
  3685.  ╘╪╘ 'F1/F2',92
  3686.  ╘╪╘ ' - INC/DEC X-ROTATION',0D
  3687.  ╚┼╪ 1─1─12
  3688.  ╘╪╘ 'F3/F4',92
  3689.  ╘╪╘ ' - INC/DEC Y-ROTATION',0D
  3690.  ╚┼╪ 1─1─12
  3691.  ╘╪╘ 'F5/F6',92
  3692.  ╘╪╘ ' - INC/DEC Z-ROTATION',0D
  3693.  ╚┼╪ 1─1─12
  3694.  ╘╪╘ ' F7  ',92
  3695.  ╘╪╘ ' - RESET',0D
  3696.  ╚┼╪ 1─1─12
  3697.  ╘╪╘ ' +/- ',92
  3698.  ╘╪╘ ' - ZOOM IN/OUT',0D
  3699.  ╚┼╪ 1─1─12
  3700.  ╘╪╘ '  H  ',92
  3701.  ╘╪╘ ' - TOGGLE HIDDEN SURFACES',0D
  3702.  ╚┼╪ 1─1─12
  3703.  ╘╪╘ 'SPACE',92
  3704.  ╘╪╘ ' - TOGGLE SURFACE FILLING',0D,0D
  3705.  ╘╪╘ '  PRESS Q TO QUIT',0D
  3706.  ╚┼╪ 0─05
  3707.  ╘╪╘ '      PRESS ANY KEY TO BEGIN',0D
  3708.  ╚┼╪ 00
  3709. ╘╔╘╠┼ ╠─┴ (╘┼═╨1),┘
  3710.  ┬┼╤ :├╧╬╘
  3711.  ╩╙╥ ├╚╥╧╒╘
  3712.  ╔╬┘
  3713.  ┬╬┼ ╘╔╘╠┼
  3714.  ╔╬├ ╘┼═╨2
  3715.  ╩═╨ ╘╔╘╠┼
  3716. :├╧╬╘ >>> ╟┼╘╦┼┘
  3717.  
  3718. **** ╙ET UP TABLES(?)
  3719.  
  3720. * ╘ABLES ARE CURRENTLY SET UP IN ┬┴╙╔├
  3721. * AND BY THE ASSEMBLER.
  3722.  
  3723. ╘┴┬╠┼╙ ╠─┴ #>╘═┴╘╚1
  3724.  ╙╘┴ ┌1+1
  3725.  ╙╘┴ ┌2+1
  3726.  ╠─┴ #>╘═┴╘╚2
  3727.  ╙╘┴ ┌3+1
  3728.  ╙╘┴ ┌4+1
  3729.  
  3730. **** ├LEAR SCREEN AND SET UP "BITMAP"
  3731. ╙┼╘╒╨ ╠─┴ #$01 ;╫HITE
  3732.  ╙╘┴ $─021 ;╘HIS IS DONE SO THAT OLDER
  3733.  ╠─┴ #147 ;MACHINES WILL SET UP
  3734.  ╩╙╥ ├╚╥╧╒╘
  3735.  ╠─┴ #$00 ;CORRECTLY
  3736.  ╙╘┴ $─021
  3737.  ╠─┴ #<╙╙╘┴╥╘
  3738.  ┴─├ #12 ;╘HE GOAL IS TO CENTER THE GRAPHICS
  3739.  ╙╘┴ ╘┼═╨1 ;├OLUMN 12
  3740.  ╠─┴ #>╙╙╘┴╥╘ ;╥OW 9
  3741.  ╙╘┴ ╘┼═╨1+1 ;╙╙╘┴╥╘ POINTS TO ROW 9
  3742.  ╠─┴ #00
  3743.  ╠─┘ #00
  3744.  ╠─╪ #00 ;X WILL COUNT 16 ROWS FOR US
  3745.  ├╠├
  3746.  
  3747. :╠╧╧╨ ╙╘┴ (╘┼═╨1),┘
  3748.  ╔╬┘
  3749.  ┴─├ #16
  3750.  ┬├├ :╠╧╧╨
  3751.  ├╠├
  3752.  ╠─┴ ╘┼═╨1
  3753.  ┴─├ #40 ;╬EED TO ADD 40 TO THE BASE POINTER
  3754.  ╙╘┴ ╘┼═╨1 ;╘O JUMP TO THE NEXT ROW
  3755.  ╠─┴ ╘┼═╨1+1
  3756.  ┴─├ #00 ;╘AKE CARE OF CARRIES
  3757.  ╙╘┴ ╘┼═╨1+1
  3758.  ╠─┘ #00
  3759.  ╔╬╪
  3760.  ╘╪┴  ;╪ IS ALSO AN INDEX INTO THE CHARACTER NUMBER
  3761.  ├╨╪ #16
  3762.  ┬╬┼ :╠╧╧╨ ;╬EED TO DO IT 16 TIMES
  3763.  
  3764. **** ├LEAR BUFFERS
  3765.  
  3766.  ╠─┴ #<┬╒╞╞1
  3767.  ╙╘┴ ┬╒╞╞┼╥
  3768.  ╠─┴ #>┬╒╞╞1
  3769.  ╙╘┴ ┬╒╞╞┼╥+1
  3770.  ╠─┘ #$00
  3771.  ╠─╪ #24 ;┴SSUMING ALL THREE BUFFERS ARE
  3772.  ╠─┴ #$00 ;BACK-TO-BACK
  3773. :┬╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
  3774.  ╔╬┘
  3775.  ┬╬┼ :┬╠╧╧╨
  3776.  ╔╬├ ┬╒╞╞┼╥+1
  3777.  ─┼╪
  3778.  ┬╬┼ :┬╠╧╧╨
  3779.  
  3780. **** ╙ET UP BUFFERS
  3781.  
  3782.  ╠─┴ #<┬╒╞╞1
  3783.  ╙╘┴ ┬╒╞╞┼╥
  3784.  ╠─┴ #>┬╒╞╞1
  3785.  ╙╘┴ ┬╒╞╞┼╥+1
  3786.  ╙╘┴ ┌╘┼═╨ ;ZTEMP WILL MAKE LIFE SIMPLE FOR US
  3787.  ╠─┴ ╓═├╙┬
  3788.  ┴╬─ #%11110001 ;╙TART HERE SO THAT SWAP BUFFERS WILL WORK RIGHT
  3789.  ╧╥┴ #%00001110
  3790.  ╙╘┴ ╓═├╙┬
  3791.  
  3792. **** ╙ET UP INITIAL VALUES
  3793.  
  3794. ╔╬╔╘ ╠─┴ #00
  3795.  ╙╘┴ ╠╧├╪═╔╬
  3796.  ╙╘┴ ╠╧├╪═┴╪
  3797.  ╙╘┴ ╠╧├┘═╔╬
  3798.  ╙╘┴ ╠╧├┘═┴╪
  3799.  ╙╘┴ ╟╠╧┬╪═╔╬
  3800.  ╙╘┴ ╟╠╧┬┘═╔╬
  3801.  ╙╘┴ ╟╠╧┬╪═┴╪
  3802.  ╙╘┴ ╟╠╧┬┘═┴╪
  3803.  ╙╘┴ ─╙╪
  3804.  ╙╘┴ ─╙┘
  3805.  ╙╘┴ ─╙┌
  3806.  ╙╘┴ ╙╪
  3807.  ╙╘┴ ╙┘
  3808.  ╙╘┴ ╙┌
  3809.  ╙╘┴ ╞╔╠╠
  3810.  ╠─┴ #01
  3811.  ╙╘┴ ╚╔─┼
  3812.  ╠─┴ #64
  3813.  ╙╘┴ ┌╧╧═
  3814.  
  3815. *-------------------------------
  3816. * ═AIN LOOP
  3817.  
  3818. **** ╟ET KEYPRESS
  3819.  
  3820. ═┴╔╬
  3821.  ├╠╔
  3822. ╦╨╥┼╙╙ ╩╙╥ ╟┼╘╔╬
  3823.  ├═╨ #133 ;╞1?
  3824.  ┬╬┼ :╞2
  3825.  ╠─┴ ─╙╪
  3826.  ├═╨ #┴╬╟═┴╪/2 ;╬O MORE THAN PI
  3827.  ┬┼╤ :├╧╬╘1
  3828.  ╔╬├ ─╙╪ ;OTHERWISE INCREASE X-ROTATION
  3829.  ╩═╨ :├╧╬╘
  3830. :╞2 ├═╨ #137 ;╞2?
  3831.  ┬╬┼ :╞3
  3832.  ╠─┴ ─╙╪
  3833.  ┬┼╤ :├╧╬╘1
  3834.  ─┼├ ─╙╪
  3835.  ╩═╨ :├╧╬╘
  3836. :╞3 ├═╨ #134
  3837.  ┬╬┼ :╞4
  3838.  ╠─┴ ─╙┘
  3839.  ├═╨ #┴╬╟═┴╪/2
  3840.  ┬┼╤ :├╧╬╘1
  3841.  ╔╬├ ─╙┘ ;╔NCREASE Y-ROTATION
  3842.  ╩═╨ :├╧╬╘
  3843. :╞4 ├═╨ #138
  3844.  ┬╬┼ :╞5
  3845.  ╠─┴ ─╙┘
  3846.  ┬┼╤ :├╧╬╘1
  3847.  ─┼├ ─╙┘
  3848.  ╩═╨ :├╧╬╘
  3849. :╞5 ├═╨ #135
  3850.  ┬╬┼ :╞6
  3851.  ╠─┴ ─╙┌
  3852.  ├═╨ #┴╬╟═┴╪/2
  3853.  ┬┼╤ :├╧╬╘1
  3854.  ╔╬├ ─╙┌ ;Z-ROTATION
  3855.  ╩═╨ :├╧╬╘
  3856. :╞6 ├═╨ #139
  3857.  ┬╬┼ :╞7
  3858.  ╠─┴ ─╙┌
  3859.  ┬┼╤ :├╧╬╘1
  3860.  ─┼├ ─╙┌
  3861.  ╩═╨ :├╧╬╘
  3862. :╞7 ├═╨ #136
  3863.  ┬╬┼ :╨╠╒╙
  3864.  ╩═╨ ╔╬╔╘
  3865. :├╧╬╘1 ╩═╨ :├╧╬╘
  3866. :╨╠╒╙ ├═╨ #'+'
  3867.  ┬╬┼ :═╔╬╒╙
  3868.  ╔╬├ ┌╧╧═ ;┬AH, WHO NEEDS ERROR CHECKING?
  3869.  ╔╬├ ┌╧╧═
  3870.  ╩═╨ :├╧╬╘
  3871. :═╔╬╒╙ ├═╨ #'-'
  3872.  ┬╬┼ :╚
  3873.  ─┼├ ┌╧╧═
  3874.  ─┼├ ┌╧╧═
  3875.  ┬╨╠ :├╧╬╘
  3876.  ╔╬├ ┌╧╧═
  3877.  ╔╬├ ┌╧╧═
  3878.  ╩═╨ :├╧╬╘
  3879. :╚ ├═╨ #'H'
  3880.  ┬╬┼ :╙╨┴├┼
  3881.  ╠─┴ ╚╔─┼
  3882.  ┼╧╥ #$01
  3883.  ╙╘┴ ╚╔─┼
  3884.  ╩═╨ :├╧╬╘
  3885. :╙╨┴├┼ ├═╨ #' '
  3886.  ┬╬┼ :╤
  3887.  ╠─┴ ╞╔╠╠
  3888.  ┼╧╥ #$01
  3889.  ╙╘┴ ╞╔╠╠
  3890.  ╩═╨ :├╧╬╘
  3891. :╤ ├═╨ #'Q' ;Q QUITS
  3892.  ┬╬┼ :├╧╬╘
  3893.  ╩═╨ ├╠┼┴╬╒╨
  3894.  
  3895. :├╧╬╘ ╙┼╔  ;╙PEED THINGS UP A BIT
  3896.  
  3897. **** ╒PDATE ANGLES
  3898.  
  3899. ╒╨─┴╘┼ ├╠├
  3900.  ╠─┴ ╙╪
  3901.  ┴─├ ─╙╪
  3902.  ├═╨ #┴╬╟═┴╪ ;┴RE WE >= MAXIMUM ANGLE?
  3903.  ┬├├ :├╧╬╘1
  3904.  ╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
  3905. :├╧╬╘1 ╙╘┴ ╙╪
  3906.  ├╠├
  3907.  ╠─┴ ╙┘
  3908.  ┴─├ ─╙┘
  3909.  ├═╨ #┴╬╟═┴╪
  3910.  ┬├├ :├╧╬╘2
  3911.  ╙┬├ #┴╬╟═┴╪ ;╙AME DEAL
  3912. :├╧╬╘2 ╙╘┴ ╙┘
  3913.  ├╠├
  3914.  ╠─┴ ╙┌
  3915.  ┴─├ ─╙┌
  3916.  ├═╨ #┴╬╟═┴╪
  3917.  ┬├├ :├╧╬╘3
  3918.  ╙┬├ #┴╬╟═┴╪
  3919. :├╧╬╘3 ╙╘┴ ╙┌
  3920.  
  3921. **** ╥OTATE COORDINATES
  3922.  
  3923. ╥╧╘┴╘┼
  3924.  
  3925. *** ╞IRST, CALCULATE T1,T2,...,T10
  3926.  
  3927. ** ╘WO MACROS TO SIMPLIFY OUR LIFE
  3928. ┴──┴ ═┴├  ;┴DD TWO ANGLES TOGETHER
  3929.  ├╠├
  3930.  ╠─┴ ]1
  3931.  ┴─├ ]2
  3932.  ├═╨ #┴╬╟═┴╪ ;╔S THE SUM > 2*PI?
  3933.  ┬├├ ─╧╬┼
  3934.  ╙┬├ #┴╬╟═┴╪ ;╔F SO, SUBTRACT 2*PI
  3935. ─╧╬┼ <<<
  3936.  
  3937. ╙╒┬┴ ═┴├  ;╙UBTRACT TWO ANGLES
  3938.  ╙┼├
  3939.  ╠─┴ ]1
  3940.  ╙┬├ ]2
  3941.  ┬├╙ ─╧╬┼
  3942.  ┴─├ #┴╬╟═┴╪ ;╧OPS, WE NEED TO ADD 2*PI
  3943. ─╧╬┼ <<<
  3944.  
  3945. ** ╬OW CALCULATE T1,T2,ETC.
  3946.  
  3947.  >>> ╙╒┬┴,╙┘;╙┌
  3948.  ╙╘┴ ╘1 ;T1=SY-SZ
  3949.  >>> ┴──┴,╙┘;╙┌
  3950.  ╙╘┴ ╘2 ;T2=SY+SZ
  3951.  >>> ┴──┴,╙╪;╙┌
  3952.  ╙╘┴ ╘3 ;T3=SX+SZ
  3953.  >>> ╙╒┬┴,╙╪;╙┌
  3954.  ╙╘┴ ╘4 ;T4=SX-SZ
  3955.  >>> ┴──┴,╙╪;╘2
  3956.  ╙╘┴ ╘5 ;T5=SX+T2
  3957.  >>> ╙╒┬┴,╙╪;╘1
  3958.  ╙╘┴ ╘6 ;T6=SX-T1
  3959.  >>> ┴──┴,╙╪;╘1
  3960.  ╙╘┴ ╘7 ;T7=SX+T1
  3961.  >>> ╙╒┬┴,╘2;╙╪
  3962.  ╙╘┴ ╘8 ;T8=T2-SX
  3963.  >>> ╙╒┬┴,╙┘;╙╪
  3964.  ╙╘┴ ╘9 ;T9=SY-SX
  3965.  >>> ┴──┴,╙╪;╙┘
  3966.  ╙╘┴ ╘10 ;T10=SX+SY
  3967.  
  3968. * ┼T VOILA!
  3969.  
  3970. *** ╬EXT, CALCULATE ┴,┬,├,...,╔
  3971.  
  3972. ** ┴NOTHER USEFUL LITTLE MACRO
  3973. ─╔╓2 ═┴├  ;─IVIDE A SIGNED NUMBER BY 2
  3974. ;╔T IS ASSUMED THAT THE NUMBER
  3975.  ┬╨╠ ╨╧╙ ;IS IN THE ACCUMULATOR
  3976.  ├╠├
  3977.  ┼╧╥ #$╞╞ ;╫E NEED TO UN-NEGATIVE THE NUMBER
  3978.  ┴─├ #01 ;BY TAKING IT'S COMPLEMENT
  3979.  ╠╙╥  ;DIVIDE BY TWO
  3980.  ├╠├
  3981.  ┼╧╥ #$╞╞
  3982.  ┴─├ #01 ;═AKE IT NEGATIVE AGAIN
  3983.  ╩═╨ ─╧╬┼─╔╓
  3984. ╨╧╙ ╠╙╥  ;╬UMBER IS POSITIVE
  3985. ─╧╬┼─╔╓ <<<
  3986.  
  3987. ═╒╠2 ═┴├  ;═ULTIPLY A SIGNED NUMBER BY 2
  3988.  ┬╨╠ ╨╧╙═
  3989.  ├╠├
  3990.  ┼╧╥ #$╞╞
  3991.  ┴─├ #$01
  3992.  ┴╙╠
  3993.  ├╠├
  3994.  ┼╧╥ #$╞╞
  3995.  ┴─├ #$01
  3996.  ╩═╨ ─╧╬┼═╒╠
  3997. ╨╧╙═ ┴╙╠
  3998. ─╧╬┼═╒╠ <<<
  3999.  
  4000. ** ╬OTE THAT WE ARE CURRENTLY MAKING A MINOR LEAP
  4001. ** OF FAITH THAT NO OVERFLOWS WILL OCCUR.
  4002.  
  4003. :├┴╠├┴ ├╠├
  4004.  ╠─╪ ╘1
  4005.  ╠─┴ ├╧╙,╪
  4006.  ╠─╪ ╘2
  4007.  ┴─├ ├╧╙,╪
  4008.  ╙╘┴ ┴11 ;┴=(COS(T1)+COS(T2))/2
  4009. :├┴╠├┬ ╠─╪ ╘1
  4010.  ╠─┴ ╙╔╬,╪
  4011.  ╙┼├
  4012.  ╠─╪ ╘2
  4013.  ╙┬├ ╙╔╬,╪
  4014.  ╙╘┴ ┬12 ;┬=(SIN(T1)-SIN(T2))/2
  4015. :├┴╠├├ ╠─╪ ╙┘
  4016.  ╠─┴ ╙╔╬,╪
  4017.  >>> ═╒╠2
  4018.  ╙╘┴ ├13 ;├=SIN(SY)
  4019. :├┴╠├─ ╙┼├
  4020.  ╠─╪ ╘8
  4021.  ╠─┴ ├╧╙,╪
  4022.  ╠─╪ ╘7
  4023.  ╙┬├ ├╧╙,╪
  4024.  ╙┼├
  4025.  ╠─╪ ╘5
  4026.  ╙┬├ ├╧╙,╪
  4027.  ├╠├
  4028.  ╠─╪ ╘6
  4029.  ┴─├ ├╧╙,╪ ;─I=(COS(T8)-COS(T7)+COS(T6)-COS(T5))/2
  4030.  >>> ─╔╓2
  4031.  ├╠├
  4032.  ╠─╪ ╘3
  4033.  ┴─├ ╙╔╬,╪
  4034.  ╙┼├
  4035.  ╠─╪ ╘4
  4036.  ╙┬├ ╙╔╬,╪
  4037.  ╙╘┴ ─21 ;─=(SIN(T3)-SIN(T4)+─I)/2
  4038. :├┴╠├┼ ╙┼├
  4039.  ╠─╪ ╘5
  4040.  ╠─┴ ╙╔╬,╪
  4041.  ╠─╪ ╘6
  4042.  ╙┬├ ╙╔╬,╪
  4043.  ╙┼├
  4044.  ╠─╪ ╘7
  4045.  ╙┬├ ╙╔╬,╪
  4046.  ╙┼├
  4047.  ╠─╪ ╘8
  4048.  ╙┬├ ╙╔╬,╪ ;┼I=(SIN(T5)-SIN(T6)-SIN(T7)-SIN(T8))/2
  4049.  >>> ─╔╓2
  4050.  ├╠├
  4051.  ╠─╪ ╘3
  4052.  ┴─├ ├╧╙,╪
  4053.  ├╠├
  4054.  ╠─╪ ╘4
  4055.  ┴─├ ├╧╙,╪
  4056.  ╙╘┴ ┼22 ;┼=(COS(T3)+COS(T4)+┼I)/2
  4057. :├┴╠├╞ ╠─╪ ╘9
  4058.  ╠─┴ ╙╔╬,╪
  4059.  ╙┼├
  4060.  ╠─╪ ╘10
  4061.  ╙┬├ ╙╔╬,╪
  4062.  ╙╘┴ ╞23 ;╞=(SIN(T9)-SIN(T10))/2
  4063. :├┴╠├╟ ╠─╪ ╘6
  4064.  ╠─┴ ╙╔╬,╪
  4065.  ╙┼├
  4066.  ╠─╪ ╘8
  4067.  ╙┬├ ╙╔╬,╪
  4068.  ╙┼├
  4069.  ╠─╪ ╘7
  4070.  ╙┬├ ╙╔╬,╪
  4071.  ╙┼├
  4072.  ╠─╪ ╘5
  4073.  ╙┬├ ╙╔╬,╪ ;╟I=(SIN(T6)-SIN(T8)-SIN(T7)-SIN(T5))/2
  4074.  >>> ─╔╓2
  4075.  
  4076.  ├╠├
  4077.  ╠─╪ ╘4
  4078.  ┴─├ ├╧╙,╪
  4079.  ╙┼├
  4080.  ╠─╪ ╘3
  4081.  ╙┬├ ├╧╙,╪
  4082.  ╙╘┴ ╟31 ;╟=(COS(T4)-COS(T3)+╟I)/2
  4083. :├┴╠├╚ ├╠├
  4084.  ╠─╪ ╘6
  4085.  ╠─┴ ├╧╙,╪
  4086.  ╠─╪ ╘7
  4087.  ┴─├ ├╧╙,╪
  4088.  ╙┼├
  4089.  ╠─╪ ╘5
  4090.  ╙┬├ ├╧╙,╪
  4091.  ╙┼├
  4092.  ╠─╪ ╘8
  4093.  ╙┬├ ├╧╙,╪ ;╚I=(COS(T6)+COS(T7)-COS(T5)-COS(T8))/2
  4094.  >>> ─╔╓2
  4095.  ├╠├
  4096.  ╠─╪ ╘3
  4097.  ┴─├ ╙╔╬,╪
  4098.  ├╠├
  4099.  ╠─╪ ╘4
  4100.  ┴─├ ╙╔╬,╪
  4101.  ╙╘┴ ╚32 ;╚=(SIN(T3)+SIN(T4)+╚I)/2
  4102. :╫╚┼╫ ├╠├
  4103.  ╠─╪ ╘9
  4104.  ╠─┴ ├╧╙,╪
  4105.  ╠─╪ ╘10
  4106.  ┴─├ ├╧╙,╪
  4107.  ╙╘┴ ╔33 ;╔=(COS(T9)+COS(T10))/2
  4108.  
  4109. ** ╔T'S ALL DOWNHILL FROM HERE.
  4110.  
  4111. ─╧╫╬╚╔╠╠
  4112. **** ├LEAR BUFFER
  4113. * ┴ LITTLE MACRO
  4114.  
  4115. ╙┼╘┬╒╞ ═┴├  ;╨UT BUFFERS WHERE THEY CAN BE HURT
  4116.  ╠─┴ #00
  4117.  ╙╘┴ ┬╒╞╞┼╥
  4118.  ╠─┴ ┌╘┼═╨ ;╚IGH BYTE
  4119. ╙╘┴┬╒╞ ╙╘┴ ┬╒╞╞┼╥+1
  4120.  <<<
  4121.  
  4122.  >>> ╙┼╘┬╒╞
  4123. ├╠╥─╥┴╫ ╠─╪ #08
  4124.  ╠─┴ #00
  4125. :╞╧╧╠ ╠─┘ #00
  4126. :─╧╨┼ ╙╘┴ (┬╒╞╞┼╥),┘
  4127.  ╔╬┘
  4128.  ┬╬┼ :─╧╨┼
  4129.  ╔╬├ ┬╒╞╞┼╥+1
  4130.  ─┼╪
  4131.  ┬╬┼ :╞╧╧╠
  4132.  
  4133. **** ═Y GOODNESS BUT ╔'M A DOPE
  4134. *├╠╥─╥┴╫ ╠─┴ ╟╠╧┬╪═╔╬
  4135. * ╠╙╥  ;╬EED TO GET INTO THE RIGHT COLUMN
  4136. * ┬├├ :┼╓┼╬ ;┼XPLAINED IN MORE DETAIL BELOW
  4137. * ╠─┘ #$80
  4138. * ╙╘┘ ┬╒╞╞┼╥ ;╨RESUMABLY THIS WILL BE A LITTLE
  4139. * ├╠├  ;MORE EFFICIENT.
  4140. *:┼╓┼╬ ┴─├ ┬╒╞╞┼╥+1
  4141. * ╙╘┴ ┬╒╞╞┼╥+1
  4142. * ╠─┴ ╟╠╧┬╪═┴╪
  4143. * ╙┼├
  4144. * ╙┬├ ╟╠╧┬╪═╔╬
  4145. * ╘┴╪
  4146. * ╔╬╪
  4147. * ╠─┘ ╟╠╧┬┘═┴╪
  4148. * ┬┼╤ :╥┼╙┼╘
  4149. *:┘┴┘ ╠─┴ #$00
  4150. * ╠─┘ ╟╠╧┬┘═┴╪
  4151. *:┬╠┴╚ ╙╘┴ (┬╒╞╞┼╥),┘
  4152. * ─┼┘
  4153. * ├╨┘ ╟╠╧┬┘═╔╬
  4154. * ┬├╙ :┬╠┴╚
  4155. * ╠─┴ ┬╒╞╞┼╥
  4156. * ┼╧╥ #$80
  4157. * ╙╘┴ ┬╒╞╞┼╥
  4158. * ┬╬┼ :╫╚╧╨┼┼
  4159. * ╔╬├ ┬╒╞╞┼╥+1
  4160. *:╫╚╧╨┼┼ ─┼╪
  4161. * ┬╬┼ :┘┴┘
  4162. *:╥┼╙┼╘ ╠─┴ #0 ;╬EED TO RESET THESE GUYS
  4163. * ╙╘┴ ╟╠╧┬╪═┴╪
  4164. * ╙╘┴ ╟╠╧┬┘═┴╪
  4165. * ╠─┴ #$╞╞
  4166. * ╙╘┴ ╟╠╧┬╪═╔╬
  4167. * ╙╘┴ ╟╠╧┬┘═╔╬
  4168.  
  4169. **** ╬EXT, READ AND DRAW POLYGONS
  4170.  
  4171. ╥┼┴──╥┴╫ ╠─┘ #00
  4172.  ╙╘┘ ╔╬─┼╪
  4173. ╧┬╩╠╧╧╨ ╠─┘ ╔╬─┼╪
  4174.  ╠─┴ ╨╧╠┘╠╔╙╘,┘ ;╞IRST, THE NUMBER OF POINTS
  4175.  ┬╬┼ :├╧╬╘ ;┬UT IF NUMPOINTS IS ZERO THEN
  4176.  ╩═╨ ╧┬╩─╧╬┼ ;WE ARE AT THE END OF THE LIST
  4177. :├╧╬╘ ╙╘┴ ├╧╒╬╘╨╘╙
  4178.  ╔╬├ ╔╬─┼╪
  4179.  
  4180. * ╥OTATE PROJECT AND DRAW THE POLYGON
  4181. * ═AKE SURE BUFFER BEING DRAWN TO IS CLEAR!
  4182.  
  4183. :─╧╔╘ ╩╙╥ ╥╧╘╨╥╧╩
  4184.  
  4185. * ├ONVERT XMIN AND XMAX TO COLUMNS
  4186.  
  4187.  ╠─┴ ╠╧├╪═╔╬
  4188.  ╠╙╥
  4189.  ╠╙╥
  4190.  ╠╙╥  ;X MOD 8
  4191.  ╙╘┴ ╠╧├╪═╔╬
  4192.  ├═╨ ╟╠╧┬╪═╔╬
  4193.  ┬├╙ :╬┴╚
  4194.  ╙╘┴ ╟╠╧┬╪═╔╬
  4195. :╬┴╚ ╠─┴ ╠╧├┘═╔╬
  4196.  ├═╨ ╟╠╧┬┘═╔╬
  4197.  ┬├╙ :╒╚╒╚
  4198.  ╙╘┴ ╟╠╧┬┘═╔╬
  4199. :╒╚╒╚ ╠─┴ ╠╧├╪═┴╪
  4200.  ╠╙╥
  4201.  ╠╙╥
  4202.  ╠╙╥
  4203.  ╙╘┴ ╠╧├╪═┴╪
  4204.  ├═╨ ╟╠╧┬╪═┴╪
  4205.  ┬├├ :╬╧╫┴┘
  4206.  ╙╘┴ ╟╠╧┬╪═┴╪
  4207. :╬╧╫┴┘ ╠─┴ ╠╧├┘═┴╪
  4208.  ├═╨ ╟╠╧┬┘═┴╪
  4209.  ┬├├ ┼╧╥╞╔╠╠
  4210.  ╙╘┴ ╟╠╧┬┘═┴╪
  4211.  
  4212. * ╔F USING THE ┼╧╥-BUFFER, COPY INTO DRAWING BUFFER
  4213. * ┴ND THEN CLEAR THE ┼╧╥-BUFFER
  4214.  
  4215. ┼╧╥╞╔╠╠ ╠─┴ ╞╔╠╠
  4216.  ┬┼╤ ╧┬╩╠╧╧╨
  4217.  
  4218.  >>> ╙┼╘┬╒╞
  4219.  ╠─┴ #<┼╧╥┬╒╞
  4220.  ╙╘┴ ╘┼═╨1
  4221.  ╠─┴ #>┼╧╥┬╒╞
  4222.  ╙╘┴ ╘┼═╨1+1
  4223.  
  4224.  ╠─┴ ╠╧├╪═╔╬ ;╠╧├╪═╔╬ NOW CONTAINS COLUMN
  4225.  ╠╙╥  ;┼ACH COLUMN IS 128 BYTES
  4226.  ┬├├ :┼╓┼╬ ;╙O THERE MIGHT BE A CARRY
  4227.  ╠─┘ #$80
  4228.  ╙╘┘ ┬╒╞╞┼╥
  4229.  ╙╘┘ ╘┼═╨1
  4230.  ├╠├
  4231. :┼╓┼╬ ╙╘┴ ╘2
  4232.  ┴─├ ┬╒╞╞┼╥+1
  4233.  ╙╘┴ ┬╒╞╞┼╥+1 ;┼ACH COLUMN IS 128 BYTES
  4234.  ╠─┴ ╘2
  4235.  ┴─├ ╘┼═╨1+1 ;╬OW WE WILL START AT THE
  4236.  ╙╘┴ ╘┼═╨1+1 ;COLUMN
  4237.  
  4238.  ╠─┴ ╠╧├╪═┴╪
  4239.  ╙┼├
  4240.  ╙┬├ ╠╧├╪═╔╬
  4241.  ╘┴╪ ;╘OTAL NUMBER OF COLUMNS TO DO
  4242.  ╔╬╪  ;E.G. FILL COLUMNS 1..3
  4243.  ╠─┘ ╠╧├┘═┴╪
  4244.  ┬╬┼ :╞╧╧╨
  4245.  ╔╬├ ╠╧├┘═┴╪
  4246. :╞╧╧╨ ╠─┘ ╠╧├┘═┴╪
  4247.  ╠─┴ #00
  4248. :╟╧╧╨ ┼╧╥ (╘┼═╨1),┘ ;┼╧╥-BUFFER
  4249.  ╨╚┴
  4250. * ═AYBE PUT AN ┼╧╥ BELOW?
  4251.  ┼╧╥ (┬╒╞╞┼╥),┘
  4252.  ╙╘┴ (┬╒╞╞┼╥),┘
  4253.  ╠─┴ #00 ;═IGHT AS WELL CLEAR IT NOW
  4254.  ╙╘┴ (╘┼═╨1),┘
  4255.  ╨╠┴
  4256.  ─┼┘
  4257.  ├╨┘ ╠╧├┘═╔╬
  4258.  ┬├╙ :╟╧╧╨
  4259.  ╠─┴ ┬╒╞╞┼╥
  4260.  ┼╧╥ #$80
  4261.  ╙╘┴ ┬╒╞╞┼╥
  4262.  ╙╘┴ ╘┼═╨1
  4263.  ┬╬┼ :┬╧╧╨
  4264.  ╔╬├ ┬╒╞╞┼╥+1
  4265.  ╔╬├ ╘┼═╨1+1
  4266. :┬╧╧╨ ─┼╪
  4267.  ┬╬┼ :╞╧╧╨
  4268.  ╩═╨ ╧┬╩╠╧╧╨
  4269.  
  4270. ╧┬╩─╧╬┼
  4271. **** ╙WAP BUFFERS
  4272.  
  4273. ╙╫┴╨┬╒╞ ╠─┴ ╓═├╙┬
  4274.  ┼╧╥ #$02 ;╨RETTY TRICKY, EH?
  4275.  ╙╘┴ ╓═├╙┬
  4276.  ╠─┴ #$08
  4277.  ┼╧╥ ┌╘┼═╨ ;ZTEMP=HIGH BYTE JUST FLIPS
  4278.  ╙╘┴ ┌╘┼═╨ ;BETWEEN $30 AND $38
  4279.  
  4280.  ╩═╨ ═┴╔╬ ;┴ROUND AND AROUND WE GO...
  4281.  
  4282.  ╘╪╘ '╟EE ┬RAIN, WHAT DO YOU WANT TO DO '
  4283.  ╘╪╘ 'TONIGHT?'
  4284.  
  4285. ** ╥OTATE, PROJECT, AND STORE THE POINTS
  4286. *
  4287. * ╘HIS PART IS A SIGNIFICANT CHANGE SINCE
  4288. * V2.0.  ╬OW IT IS A COMPLETELY GENERAL POLYGON PLOTTER.
  4289. * ┴ SET OF POINTS IS READ IN, ROTATED AND PROJECTED, AND
  4290. * PLOTTED INTO THE DRAWING BUFFER (┼╧╥ OR NORMAL).
  4291.  
  4292. ╥╧╘╨╥╧╩
  4293.  
  4294. * ┴ NEAT MACRO
  4295. ╬┼╟ ═┴├  ;├HANGE THE SIGN OF A TWO'S COMPLEMENT
  4296.  ├╠├
  4297.  ╠─┴ ]1 ;NUMBER.
  4298.  ┼╧╥ #$╞╞
  4299.  ┴─├ #$01
  4300.  <<<
  4301.  
  4302. *-------------------------------
  4303. * ╘HESE MACROS REPLACE THE PREVIOUS PROJECTION
  4304. * SUBROUTINE.
  4305.  
  4306. ╙═╒╠╘ ═┴├ ;═ULTIPLY TWO SIGNED 8-BIT
  4307.  ;NUMBERS: ┴*┘/64 -> ┴
  4308.  ╙╘┴ ┌3
  4309.  ├╠├  ;╘HIS MULTIPLY IS FOR NORMAL
  4310.  ┼╧╥ #$╞╞ ;NUMBERS, I.E. X=-64..64
  4311.  ┴─├ #$01
  4312.  ╙╘┴ ┌4
  4313.  ╠─┴ (┌3),┘
  4314.  ╙┼├
  4315.  ╙┬├ (┌4),┘
  4316.  <<<  ;┴LL DONE :)
  4317.  
  4318. ╙═╒╠╘┌ ═┴├ ;═ULTIPLY TWO SIGNED 8-BIT
  4319.    ;NUMBERS: ┴*┘/64 -> ┴
  4320.  ╙╘┴ ┌1
  4321.  ├╠├  ;┴ND THIS MULTIPLY IS SPECIFICALLY
  4322.  ┼╧╥ #$╞╞ ;FOR THE PROJECTION PART, WHERE
  4323.  ┴─├ #$01 ;NUMBERS ARE -110..110 AND 0..40
  4324.  ╙╘┴ ┌2
  4325.  ╠─┴ (┌1),┘
  4326.  ╙┼├
  4327.  ╙┬├ (┌2),┘
  4328.  <<<  ;┴LL DONE :)
  4329.  
  4330. ╨╥╧╩┼├╘ ═┴├  ;╘HE ACTUAL PROJECTION ROUTINE
  4331. ;╘HE ROUTINE TAKES THE POINT
  4332. ;]1 ]2 ]3, ROTATES AND
  4333. ;PROJECTS IT, AND STORES THE
  4334. ;RESULT IN ]1 ]2 ]3.
  4335.  
  4336.  ╠─┘ ]1 ;═ULTIPLY FIRST ROTATION COLUMN
  4337.  ╠─┴ ┴11
  4338.  >>> ╙═╒╠╘
  4339.  ╙╘┴ ╨1╘
  4340.  ╠─┴ ─21
  4341.  >>> ╙═╒╠╘
  4342.  ╙╘┴ ╨2╘
  4343.  ╠─┴ ╟31
  4344.  >>> ╙═╒╠╘
  4345.  ╙╘┴ ╨3╘
  4346.  ╠─┘ ]2 ;╙ECOND COLUMN
  4347.  ╠─┴ ┬12
  4348.  >>> ╙═╒╠╘
  4349.  ├╠├
  4350.  ┴─├ ╨1╘
  4351.  ╙╘┴ ╨1╘
  4352.  ╠─┴ ┼22
  4353.  >>> ╙═╒╠╘
  4354.  ├╠├
  4355.  ┴─├ ╨2╘
  4356.  ╙╘┴ ╨2╘
  4357.  ╠─┴ ╚32
  4358.  >>> ╙═╒╠╘
  4359.  ├╠├
  4360.  ┴─├ ╨3╘
  4361.  ╙╘┴ ╨3╘
  4362.  ╠─┘ ]3 ;╘HIRD COLUMN
  4363.  ╠─┴ ├13
  4364.  >>> ╙═╒╠╘
  4365.  ├╠├
  4366.  ┴─├ ╨1╘
  4367.  ╙╘┴ ╨1╘
  4368.  ╠─┴ ╞23
  4369.  >>> ╙═╒╠╘
  4370.  ├╠├
  4371.  ┴─├ ╨2╘
  4372.  ╙╘┴ ╨2╘
  4373.  ╠─┴ ╔33
  4374.  >>> ╙═╒╠╘
  4375.  ├╠├
  4376.  ┴─├ ╨3╘
  4377.  ╙╘┴ ]3 ;╥OTATED ┌
  4378.  ╘┴╪
  4379.  ╠─┘ ┌─╔╓,╪ ;╘ABLE OF D/(Z+Z0)
  4380.    ;╬OW ┘ CONTAINS PROJECTION CONST
  4381.  
  4382.  ╠─┴ ╨1╘
  4383.  >>> ╙═╒╠╘┌
  4384.  ╠─╪ ┌╧╧═
  4385.  ├╨╪ #64
  4386.  ┬┼╤ ├╧╬╘╪
  4387.  ╙╘┘ ╘┼═╨1
  4388.  ╠─┘ ┌╧╧═
  4389.  >>> ╙═╒╠╘
  4390.  ╠─┘ ╘┼═╨1
  4391. ├╧╬╘╪ ├╠├
  4392.  ┴─├ #64 ;╧FFSET THE COORDINATE
  4393.  ╙╘┴ ]1 ;╥OTATED AND PROJECTED
  4394.  ├═╨ ╠╧├╪═╔╬ ;╙EE IF IT IS A LOCAL MINIMUM
  4395.  ┬├╙ ╬╧╘╪═╔╬
  4396.  ╙╘┴ ╠╧├╪═╔╬
  4397. ╬╧╘╪═╔╬ ├═╨ ╠╧├╪═┴╪
  4398.  ┬├├ ╬╧╘╪═┴╪
  4399.  ╙╘┴ ╠╧├╪═┴╪
  4400.  
  4401. ╬╧╘╪═┴╪ ╠─┴ ╨2╘
  4402.  >>> ╙═╒╠╘┌
  4403.  ├╨╪ #64
  4404.  ┬┼╤ ├╧╬╘┘
  4405.  ╠─┘ ┌╧╧═
  4406.  >>> ╙═╒╠╘
  4407. ├╧╬╘┘ ├╠├
  4408.  ┴─├ #64
  4409.  ╙╘┴ ]2 ;╥OTATED AND PROJECTED ┘
  4410.  ├═╨ ╠╧├┘═╔╬
  4411.  ┬├╙ ╬╧╘┘═╔╬
  4412.  ╙╘┴ ╠╧├┘═╔╬
  4413. ╬╧╘┘═╔╬ ├═╨ ╠╧├┘═┴╪
  4414.  ┬├├ ╬╧╘┘═┴╪
  4415.  ╙╘┴ ╠╧├┘═┴╪
  4416.  
  4417. ╬╧╘┘═┴╪ <<<  ;┴LL DONE
  4418.  
  4419. * ╠─┴ #<┼╧╥┬╒╞ ;╞IRST WE NEED TO CLEAR THE
  4420. * ╙╘┴ ┬╒╞╞┼╥ ;┼╧╥ BUFFER
  4421. * ╠─┴ #>┼╧╥┬╒╞
  4422. * ╙╘┴ ┬╒╞╞┼╥+1
  4423.  
  4424.  ╠─┴ #0 ;╥ESET ┘MIN AND ┘MAX
  4425.  ╙╘┴ ╠╧├┘═┴╪
  4426.  ╙╘┴ ╠╧├╪═┴╪
  4427.  ╠─┴ #$╞╞
  4428.  ╙╘┴ ╠╧├┘═╔╬
  4429.  ╙╘┴ ╠╧├╪═╔╬
  4430.  
  4431. ╥┼┴─╨╘╙ ╠─┘ ╔╬─┼╪
  4432.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4433.  ╙╘┴ ╨1╪
  4434.  ╔╬┘
  4435.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4436.  ╙╘┴ ╨1┘
  4437.  ╔╬┘
  4438.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4439.  ╙╘┴ ╨1┌
  4440.  ╔╬┘
  4441.  ─┼├ ├╧╒╬╘╨╘╙
  4442.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4443.  ╙╘┴ ╨2╪
  4444.  ╔╬┘
  4445.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4446.  ╙╘┴ ╨2┘
  4447.  ╔╬┘
  4448.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4449.  ╙╘┴ ╨2┌
  4450.  ╔╬┘
  4451.  ─┼├ ├╧╒╬╘╨╘╙
  4452.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4453.  ╙╘┴ ╨3╪
  4454.  ╔╬┘
  4455.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4456.  ╙╘┴ ╨3┘
  4457.  ╔╬┘
  4458.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4459.  ╙╘┴ ╨3┌
  4460.  ╔╬┘
  4461.  ╙╘┘ ╔╬─┼╪
  4462.  >>> ╨╥╧╩┼├╘,╨1╪;╨1┘;╨1┌
  4463.  >>> ╨╥╧╩┼├╘,╨2╪;╨2┘;╨2┌
  4464.  >>> ╨╥╧╩┼├╘,╨3╪;╨3┘;╨3┌
  4465.  
  4466.  ╠─┴ ╚╔─┼
  4467.  ┬┼╤ :─╧╔╘
  4468.  ╠─┴ ╨2╪ ;╚IDDEN FACE CHECK
  4469.  ╙┼├
  4470.  ╙┬├ ╨1╪
  4471.  ╘┴┘  ;┘=(X2-X1)
  4472.  ╠─┴ ╨3┘
  4473.  ╙┼├
  4474.  ╙┬├ ╨2┘ ;┴=(Y3-Y2)
  4475.  >>> ╙═╒╠╘
  4476.  ╙╘┴ ╘┼═╨1
  4477.  ╠─┴ ╨3╪
  4478.  ╙┼├
  4479.  ╙┬├ ╨2╪
  4480.  ╘┴┘
  4481.  ╠─┴ ╨2┘
  4482.  ╙┼├
  4483.  ╙┬├ ╨1┘
  4484.  >>> ╙═╒╠╘
  4485.  ├═╨ ╘┼═╨1 ;╔F X1*Y2-Y1*X2 > 0 THEN FACE
  4486.  ┬═╔ :─╧╔╘ ;IS VISIBLE
  4487.  ─┼├ ├╧╒╬╘╨╘╙ ;╧THERWISE READ IN REMAINING
  4488.  ┬┼╤ :┴┬╧╥╘ ;POINTS AND RETURN
  4489. :╨╧╧╨ ╔╬├ ╔╬─┼╪
  4490.  ╔╬├ ╔╬─┼╪
  4491.  ╔╬├ ╔╬─┼╪
  4492.  ─┼├ ├╧╒╬╘╨╘╙
  4493.  ┬╬┼ :╨╧╧╨
  4494. :┴┬╧╥╘ ╥╘╙
  4495.  
  4496. :─╧╔╘ ╠─┴ ╨1╪
  4497.  ╙╘┴ ╪1
  4498.  ╠─┴ ╨1┘
  4499.  ╙╘┴ ┘1
  4500.  ╠─┴ ╨2╪
  4501.  ╙╘┴ ╪2
  4502.  ╠─┴ ╨2┘
  4503.  ╙╘┴ ┘2
  4504.  ╩╙╥ ─╥┴╫
  4505.  ╠─┴ ╨2╪
  4506.  ╙╘┴ ╪1
  4507.  ╠─┴ ╨2┘
  4508.  ╙╘┴ ┘1
  4509.  ╠─┴ ╨3╪
  4510.  ╙╘┴ ╪2
  4511.  ╠─┴ ╨3┘
  4512.  ╙╘┴ ┘2
  4513.  ╩╙╥ ─╥┴╫
  4514.  
  4515.  ─┼├ ├╧╒╬╘╨╘╙
  4516.  ┬╬┼ ╨╧╠┘╠╧╧╨ ;╔S IT JUST A TRIANGLE?
  4517.  ╩═╨ ╨╧╠┘─╧╬┼
  4518.  
  4519. ╨╧╠┘╠╧╧╨ ╠─┘ ╔╬─┼╪
  4520.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4521.  ╙╘┴ ╨2╪
  4522.  ╔╬┘
  4523.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4524.  ╙╘┴ ╨2┘
  4525.  ╔╬┘
  4526.  ╠─┴ ╨╧╠┘╠╔╙╘,┘
  4527.  ╙╘┴ ╨2┌
  4528.  ╔╬┘
  4529.  ╙╘┘ ╔╬─┼╪
  4530.  >>> ╨╥╧╩┼├╘,╨2╪;╨2┘;╨2┌
  4531.  
  4532.  ╠─┴ ╨2╪
  4533.  ╙╘┴ ╪1
  4534.  ╠─┴ ╨2┘
  4535.  ╙╘┴ ┘1
  4536.  ╠─┴ ╨3╪
  4537.  ╙╘┴ ╪2
  4538.  ╠─┴ ╨3┘
  4539.  ╙╘┴ ┘2
  4540.  ╩╙╥ ─╥┴╫
  4541.  
  4542.  ╠─┴ ╨2╪
  4543.  ╙╘┴ ╨3╪
  4544.  ╠─┴ ╨2┘
  4545.  ╙╘┴ ╨3┘
  4546.  ─┼├ ├╧╒╬╘╨╘╙
  4547.  ┬┼╤ ╨╧╠┘─╧╬┼
  4548.  ╩═╨ ╨╧╠┘╠╧╧╨
  4549. ╨╧╠┘─╧╬┼ ╠─┴ ╨1╪ ;├LOSE THE POLYGON
  4550.  ╙╘┴ ╪2
  4551.  ╠─┴ ╨1┘
  4552.  ╙╘┴ ┘2
  4553.  ╠─┴ ╨3╪
  4554.  ╙╘┴ ╪1
  4555.  ╠─┴ ╨3┘
  4556.  ╙╘┴ ┘1
  4557.  ╩╙╥ ─╥┴╫
  4558.  ╥╘╙
  4559.  
  4560.  ╘╪╘ '╙AME THING WE DO EVERY NIGHT, ╨INKY: '
  4561.  ╘╪╘ 'TRY TO TAKE OVER THE WORLD!'
  4562.  
  4563.  
  4564. *-------------------------------
  4565. * ╟ENERAL QUESTIONABLE-VALUE ERROR PROCEDURE
  4566.  
  4567. *├╚╧╦┼ ╠─╪ #00
  4568. *:╠╧╧╨ ╠─┴ :├╘┼╪╘,╪
  4569. * ┬┼╤ :─╧╬┼
  4570. * ╩╙╥ ├╚╥╧╒╘
  4571. * ╔╬╪
  4572. * ╩═╨ :╠╧╧╨
  4573. *:─╧╬┼ ╥╘╙
  4574. *:├╘┼╪╘ ╚┼╪ 0─ ;├╥
  4575. * ╘╪╘ 'SOMETHING CHOKED :('
  4576. * ╚┼╪ 0─00
  4577. *
  4578.  ╘╪╘ '╬ARF!'
  4579.  
  4580. *-------------------------------
  4581. * ─RAWIN' A LINE.  ┴ FAHN LAHN.
  4582.  
  4583. *** ╙OME USEFUL MACROS
  4584.  
  4585. ├╔╬╔╘ ═┴├  ;═ACRO TO INITIALIZE THE COUNTER
  4586.  ╠─┴ ]1 ;DX OR DY
  4587.  ╠╙╥
  4588.  <<<  ;╘HE DX/2 MAKES A NICER LOOKING LINE
  4589.  
  4590. ***** ═ACRO TO TAKE A STEP IN ╪
  4591.  
  4592. ╪╙╘┼╨ ═┴├
  4593.  ╠─╪ ─╪ ;╬UMBER OF LOOP ITERATIONS
  4594.  >>> ├╔╬╔╘,─╪
  4595. ╪╠╧╧╨ ╠╙╥ ├╚╒╬╦
  4596.  ┬┼╤ ╞╔╪├ ;╒PDATE COLUMN
  4597.  ╙┬├ ─┘
  4598.  ┬├├ ╞╔╪┘ ;╘IME TO STEP IN ┘
  4599.  ─┼╪
  4600.  ┬╬┼ ╪╠╧╧╨
  4601. ─╧╬┼ ╠─┴ ╧╠─╪ ;╨LOT THE LAST CHUNK
  4602.  ┼╧╥ ├╚╒╬╦
  4603.  ╧╥┴ (┬╒╞╞┼╥),┘
  4604.  ╙╘┴ (┬╒╞╞┼╥),┘
  4605.  ╥╘╙
  4606.  
  4607. ╞╔╪├ ╨╚┴
  4608.  ╠─┴ ╧╠─╪
  4609.  ╧╥┴ (┬╒╞╞┼╥),┘ ;╨LOT
  4610.  ╙╘┴ (┬╒╞╞┼╥),┘
  4611.  ╠─┴ #$╞╞ ;╒PDATE CHUNK
  4612.  ╙╘┴ ╧╠─╪
  4613.  ╙╘┴ ├╚╒╬╦
  4614.  ╠─┴ #$80 ;╔NCREASE THE COLUMN
  4615.  ┼╧╥ ┬╒╞╞┼╥
  4616.  ╙╘┴ ┬╒╞╞┼╥
  4617.  ┬╬┼ ├2
  4618.  ╔╬├ ┬╒╞╞┼╥+1
  4619. ├2
  4620.  ╨╠┴
  4621.  ╙┬├ ─┘
  4622.  ┬├╙ ├╧╬╘
  4623.  ┴─├ ─╪
  4624.  ╔╞ ╔,]1 ;─O WE USE ╔╬┘ OR ─┼┘?
  4625.  ╔╬┘
  4626.  ┼╠╙┼
  4627.  ─┼┘
  4628.  ╞╔╬
  4629. ├╧╬╘ ─┼╪
  4630.  ┬╬┼ ╪╠╧╧╨
  4631.  ╩═╨ ─╧╬┼
  4632.  
  4633. ╞╔╪┘ ┴─├ ─╪
  4634.  ╨╚┴
  4635.  ╠─┴ ╧╠─╪
  4636.  ┼╧╥ ├╚╒╬╦
  4637.  ╧╥┴ (┬╒╞╞┼╥),┘
  4638.  ╙╘┴ (┬╒╞╞┼╥),┘
  4639.  ╠─┴ ├╚╒╬╦
  4640.  ╙╘┴ ╧╠─╪
  4641.  ╨╠┴
  4642.  ╔╞ ╔,]1 ;╒PDATE ┘
  4643.  ╔╬┘
  4644.  ┼╠╙┼
  4645.  ─┼┘
  4646.  ╞╔╬
  4647.  ─┼╪
  4648.  ┬╬┼ ╪╠╧╧╨
  4649.  ╥╘╙
  4650.  <<<  ;┼ND OF ═ACRO XSTEP
  4651.  
  4652. ***** ╘AKE A STEP IN ┘
  4653.  
  4654. ┘╙╘┼╨ ═┴├
  4655.  ╠─╪ ─┘ ;╬UMBER OF LOOP ITERATIONS
  4656.  ┬┼╤ ─╧╬┼ ;╔F DY=0 IT'S JUST A POINT
  4657.  >>> ├╔╬╔╘,─┘
  4658.  ╙┼├
  4659. ┘╠╧╧╨ ╨╚┴
  4660.  ╠─┴ ╧╠─╪
  4661.  ╧╥┴ (┬╒╞╞┼╥),┘
  4662.  ╙╘┴ (┬╒╞╞┼╥),┘
  4663.  ╨╠┴
  4664.  ╔╞ ╔,]1
  4665.  ╔╬┘
  4666.  ┼╠╙┼
  4667.  ─┼┘
  4668.  ╞╔╬
  4669.  ╙┬├ ─╪
  4670.  ┬├├ ╞╔╪╪
  4671.  ─┼╪
  4672.  ┬╬┼ ┘╠╧╧╨
  4673. ─╧╬┼ ╠─┴ ╧╠─╪
  4674.  ╧╥┴ (┬╒╞╞┼╥),┘
  4675.  ╙╘┴ (┬╒╞╞┼╥),┘
  4676.  ╥╘╙
  4677.  
  4678. ╞╔╪╪ ┴─├ ─┘
  4679.  ╠╙╥ ╧╠─╪
  4680.  ╙┼├  ;╔MPORTANT!
  4681.  ┬┼╤ ╞╔╪├
  4682.  ─┼╪
  4683.  ┬╬┼ ┘╠╧╧╨
  4684.  ╩═╨ ─╧╬┼
  4685.  
  4686. ╞╔╪├ ╨╚┴
  4687.  ╠─┴ #$80
  4688.  ╙╘┴ ╧╠─╪
  4689.  ┼╧╥ ┬╒╞╞┼╥
  4690.  ╙╘┴ ┬╒╞╞┼╥
  4691.  ┬╬┼ ├2
  4692.  ╔╬├ ┬╒╞╞┼╥+1
  4693. ├2 ╨╠┴
  4694.  ─┼╪
  4695.  ┬╬┼ ┘╠╧╧╨
  4696.  ╩═╨ ─╧╬┼
  4697.  <<<  ;┼ND OF ═ACRO YSTEP
  4698.  
  4699. * ╘AKE AN X STEP IN THE ┼╧╥ BUFFER
  4700. * ╘HE SOLE CHANGE IS TO USE ┼╧╥ INSTEAD OF ╧╥┴
  4701.  
  4702. ┼╧╥╪╙╘┼╨ ═┴├
  4703.  ╠─╪ ─╪ ;╬UMBER OF LOOP ITERATIONS
  4704.  >>> ├╔╬╔╘,─╪
  4705. ╪╠╧╧╨ ╠╙╥ ├╚╒╬╦
  4706.  ┬┼╤ ╞╔╪├ ;╒PDATE COLUMN
  4707.  ╙┬├ ─┘
  4708.  ┬├├ ╞╔╪┘ ;╘IME TO STEP IN ┘
  4709.  ─┼╪
  4710.  ┬╬┼ ╪╠╧╧╨
  4711. ─╧╬┼ ╠─┴ ╧╠─╪ ;╨LOT THE LAST CHUNK
  4712.  ┼╧╥ ├╚╒╬╦
  4713.  ┼╧╥ (┬╒╞╞┼╥),┘
  4714.  ╙╘┴ (┬╒╞╞┼╥),┘
  4715.  ╥╘╙
  4716.  
  4717. ╞╔╪├ ╨╚┴
  4718.  ╠─┴ ╧╠─╪
  4719.  ┼╧╥ (┬╒╞╞┼╥),┘ ;╨LOT
  4720.  ╙╘┴ (┬╒╞╞┼╥),┘
  4721.  ╠─┴ #$╞╞ ;╒PDATE CHUNK
  4722.  ╙╘┴ ╧╠─╪
  4723.  ╙╘┴ ├╚╒╬╦
  4724.  ╠─┴ #$80 ;╔NCREASE THE COLUMN
  4725.  ┼╧╥ ┬╒╞╞┼╥
  4726.  ╙╘┴ ┬╒╞╞┼╥
  4727.  ┬╬┼ ├2
  4728.  ╔╬├ ┬╒╞╞┼╥+1
  4729. ├2
  4730.  ╨╠┴
  4731.  ╙┬├ ─┘
  4732.  ┬├╙ ├╧╬╘
  4733.  ┴─├ ─╪
  4734.  ╔╞ ╔,]1 ;─O WE USE ╔╬┘ OR ─┼┘?
  4735.  ╔╬┘
  4736.  ┼╠╙┼
  4737.  ─┼┘
  4738.  ╞╔╬
  4739. ├╧╬╘ ─┼╪
  4740.  ┬╬┼ ╪╠╧╧╨
  4741.  ╩═╨ ─╧╬┼
  4742.  
  4743. ╞╔╪┘ ┴─├ ─╪
  4744.  ╨╚┴
  4745.  ╠─┴ ╧╠─╪
  4746.  ┼╧╥ ├╚╒╬╦
  4747.  ┼╧╥ (┬╒╞╞┼╥),┘
  4748.  ╙╘┴ (┬╒╞╞┼╥),┘
  4749.  ╠─┴ ├╚╒╬╦
  4750.  ╙╘┴ ╧╠─╪
  4751.  ╨╠┴
  4752.  ╔╞ ╔,]1 ;╒PDATE ┘
  4753.  ╔╬┘
  4754.  ┼╠╙┼
  4755.  ─┼┘
  4756.  ╞╔╬
  4757.  ─┼╪
  4758.  ┬╬┼ ╪╠╧╧╨
  4759.  ╥╘╙
  4760.  <<<  ;┼ND OF ═ACRO XSTEP
  4761.  
  4762.  
  4763. * ╘AKE A Y-STEP IN THE ┼╧╥-BUFFER
  4764. * ├HANGES FROM ABOVE ARE: ONLY PLOT LAST PART OF EACH
  4765. * VERTICAL CHUNK, DON'T PLOT LAST POINT, PLOT WITH ┼╧╥
  4766.  
  4767. ┼╧╥┘╙╘┼╨ ═┴├
  4768.  ╠─╪ ─┘ ;╬UMBER OF LOOP ITERATIONS
  4769.  ┬┼╤ ─╧╬┼ ;╔F DY=0 IT'S JUST A POINT
  4770.  >>> ├╔╬╔╘,─┘
  4771.  ╙┼├
  4772. *┘╠╧╧╨ ╨╚┴
  4773. * ╠─┴ ╧╠─╪
  4774. * ╧╥┴ (┬╒╞╞┼╥),┘
  4775. * ╙╘┴ (┬╒╞╞┼╥),┘
  4776. * ╨╠┴
  4777. ┘╠╧╧╨ ╔╞ ╔,]1
  4778.  ╔╬┘
  4779.  ┼╠╙┼
  4780.  ─┼┘
  4781.  ╞╔╬
  4782.  ╙┬├ ─╪
  4783.  ┬├├ ╞╔╪╪
  4784.  ─┼╪
  4785.  ┬╬┼ ┘╠╧╧╨
  4786. *─╧╬┼ ╠─┴ ╧╠─╪
  4787. * ╧╥┴ (┬╒╞╞┼╥),┘
  4788. * ╙╘┴ (┬╒╞╞┼╥),┘
  4789. ─╧╬┼ ╥╘╙
  4790.  
  4791. ╞╔╪╪ ┴─├ ─┘
  4792.  ╨╚┴  ;╫E ONLY PLOT THE LAST PART OF EACH CHUNK
  4793.  ╠─┴ ╧╠─╪
  4794.  ┼╧╥ (┬╒╞╞┼╥),┘
  4795.  ╙╘┴ (┬╒╞╞┼╥),┘
  4796.  ╨╠┴
  4797.  ╠╙╥ ╧╠─╪
  4798.  ╙┼├  ;╔MPORTANT!
  4799.  ┬┼╤ ╞╔╪├
  4800.  ─┼╪
  4801.  ┬╬┼ ┘╠╧╧╨
  4802.  ╩═╨ ─╧╬┼
  4803.  
  4804. ╞╔╪├ ╨╚┴
  4805.  ╠─┴ #$80
  4806.  ╙╘┴ ╧╠─╪
  4807.  ┼╧╥ ┬╒╞╞┼╥
  4808.  ╙╘┴ ┬╒╞╞┼╥
  4809.  ┬╬┼ ├2
  4810.  ╔╬├ ┬╒╞╞┼╥+1
  4811. ├2 ╨╠┴
  4812.  ─┼╪
  4813.  ┬╬┼ ┘╠╧╧╨
  4814.  ╩═╨ ─╧╬┼
  4815.  <<<  ;┼ND OF ═ACRO YSTEP
  4816. **** ╔NITIAL LINE SETUP
  4817.  
  4818. ** ╘HE COMMENTED LINES BELOW ARE NOW TAKEN CARE OF BY THE
  4819. ** CALLING ROUTINE.
  4820. *─╥┴╫ >>> ═╧╓┼,╘╪1;╪1  ;═OVE STUFF INTO ZERO PAGE
  4821. * >>> ═╧╓┼,╘╪2;╪2  ;╫HERE IT CAN BE MODIFIED
  4822. * >>> ═╧╓┼,╘┘1;┘1
  4823. * >>> ═╧╓┼,╘┘2;┘2
  4824.  
  4825. ─╥┴╫ ╠─┴ ╞╔╠╠
  4826.  ┬╬┼ :╙┼╘┼╧╥
  4827.  >>> ╙┼╘┬╒╞
  4828.  ╩═╨ :╙┼╘╒╨
  4829. :╙┼╘┼╧╥ ╠─┴ #<┼╧╥┬╒╞ ;╒SE ┼╧╥ BUFFER INSTEAD OF
  4830.  ╙╘┴ ┬╒╞╞┼╥ ;DISPLAY BUFFER FOR DRAWING
  4831.  ╠─┴ #>┼╧╥┬╒╞
  4832.  ╙╘┴ ┬╒╞╞┼╥+1
  4833.  
  4834. :╙┼╘╒╨ ╙┼├  ;═AKE SURE X1<X2
  4835.  ╠─┴ ╪2
  4836.  ╙┬├ ╪1
  4837.  ┬├╙ :├╧╬╘
  4838.  ╠─┴ ┘2 ;╔F NOT, SWAP ╨1 AND ╨2
  4839.  ╠─┘ ┘1
  4840.  ╙╘┴ ┘1
  4841.  ╙╘┘ ┘2
  4842.  ╠─┴ ╪1
  4843.  ╠─┘ ╪2
  4844.  ╙╘┘ ╪1
  4845.  ╙╘┴ ╪2
  4846.  
  4847.  ╙┼├
  4848.  ╙┬├ ╪1 ;╬OW ┴=DX
  4849. :├╧╬╘ ╙╘┴ ─╪
  4850.  ╠─╪ ╪1 ;╨UT X1 INTO ╪, NOW WE CAN TRASH ╪1
  4851.  
  4852. ├╧╠╒═╬ ╘╪┴ ;╞IND THE FIRST COLUMN FOR ╪
  4853.  ╠╙╥
  4854.  ╠╙╥  ;╘HERE ARE X1/8 128 BYTE BLOCKS
  4855.  ╠╙╥  ;╫HICH MEANS X1/16 256 BYTE BLOCKS
  4856.  ╠╙╥
  4857.  ┬├├ :┼╓┼╬ ;╫ITH A POSSIBLE EXTRA 128 BYTE BLOCK
  4858.  ╠─┘ #$80 ;IF SO, SET THE HIGH BIT
  4859.  ╙╘┘ ┬╒╞╞┼╥
  4860.  ├╠├
  4861. :┼╓┼╬ ┴─├ ┬╒╞╞┼╥+1 ;┴DD IN THE NUMBER OF 256 BYTE BLOCKS
  4862.  ╙╘┴ ┬╒╞╞┼╥+1
  4863.  
  4864.  ╙┼├
  4865.  ╠─┴ ┘2 ;├ALCULATE DY
  4866.  ╙┬├ ┘1
  4867.  ┬├╙ :├╧╬╘2 ;╔S Y2>Y1?
  4868.  ┼╧╥ #$╞╞ ;╧THERWISE DY=Y1-Y2
  4869.  ┴─├ #$01
  4870. :├╧╬╘2 ╙╘┴ ─┘
  4871.  ├═╨ ─╪ ;╫HO'S BIGGER: DY OR DX?
  4872.  ┬├├ ╙╘┼╨╔╬╪ ;╔F DX, THEN...
  4873.  ╩═╨ ╙╘┼╨╔╬┘
  4874.  
  4875. ╙╘┼╨╔╬╪ ╠─┘ ┘1
  4876.  ├╨┘ ┘2
  4877.  ╠─┴ ┬╔╘╨,╪ ;╪ CURRENTLY CONTAINS X1
  4878.  ╙╘┴ ╧╠─╪
  4879.  ╙╘┴ ├╚╒╬╦
  4880.  ┬├├ ╪╔╬├┘ ;─O WE STEP FORWARDS OR BACKWARDS IN ┘?
  4881.  ╩═╨ ╪─┼├┘
  4882.  
  4883. ╪╔╬├┘ ╠─┴ ╞╔╠╠
  4884.  ┬┼╤ ╬╧╥═╪╔╬├
  4885.  >>> ┼╧╥╪╙╘┼╨,╔╬┘
  4886. ╬╧╥═╪╔╬├ >>> ╪╙╘┼╨,╔╬┘
  4887.  
  4888. ╪─┼├┘ ╠─┴ ╞╔╠╠
  4889.  ┬┼╤ ╬╧╥═╪─┼├
  4890.  >>> ┼╧╥╪╙╘┼╨,─┼┘
  4891. ╬╧╥═╪─┼├ >>> ╪╙╘┼╨,─┼┘
  4892.  
  4893. ╙╘┼╨╔╬┘ ╠─┘ ┘1
  4894.  ╠─┴ ┬╔╘╨,╪ ;╪=X1
  4895.  ╙╘┴ ╧╠─╪
  4896.  ╠╙╥  ;┘ DOESN'T USE CHUNKS
  4897.  ┼╧╥ ╧╠─╪ ;╙O WE JUST WANT THE BIT
  4898.  ╙╘┴ ╧╠─╪
  4899.  ├╨┘ ┘2
  4900.  ┬├╙ ┘─┼├┘
  4901.  
  4902. ┘╔╬├┘ ╠─┴ ╞╔╠╠
  4903.  ┬┼╤ ╬╧╥═╔╬├
  4904.  >>> ┼╧╥┘╙╘┼╨,╔╬┘
  4905. ╬╧╥═╔╬├ >>> ┘╙╘┼╨,╔╬┘
  4906.  
  4907. ┘─┼├┘ ╠─┴ ╞╔╠╠
  4908.  ┬┼╤ ╬╧╥═─┼├
  4909.  >>> ┼╧╥┘╙╘┼╨,─┼┘
  4910. ╬╧╥═─┼├ >>> ┘╙╘┼╨,─┼┘
  4911.  
  4912.  
  4913. *-------------------------------
  4914. * ├LEAN UP
  4915.  
  4916. ├╠┼┴╬╒╨ ╠─┴ ╓═├╙┬ ;╙WITCH CHAR ROM BACK IN
  4917.  ┴╬─ #%11110101 ;DEFAULT
  4918.  ╙╘┴ ╓═├╙┬
  4919.  
  4920.  ╥╘╙  ;BYE!
  4921.  
  4922.  ╘╪╘ 'SPINAL CRACKER '
  4923.  ╘╪╘ 'SLJ 6/95'
  4924.  
  4925. *-------------------------------
  4926. * ╙ET UP BIT TABLE
  4927.  
  4928.  ─╙ ^ ;├LEAR TO END OF PAGE
  4929.    ;╙O THAT TABLES START ON A PAGE BOUNDARY
  4930. ┬╔╘╨ ╠╒╨ 16 ;128 ┼NTRIES FOR ╪
  4931.  ─╞┬ %11111111
  4932.  ─╞┬ %01111111
  4933.  ─╞┬ %00111111
  4934.  ─╞┬ %00011111
  4935.  ─╞┬ %00001111
  4936.  ─╞┬ %00000111
  4937.  ─╞┬ %00000011
  4938.  ─╞┬ %00000001
  4939.  --^
  4940.  
  4941. ╙╔╬ ;╘ABLE OF SINES, 120 BYTES
  4942. ├╧╙ ┼╤╒ ╙╔╬+128 ;╘ABLE OF COSINES
  4943.    ;┬OTH OF THESE TRIG TABLES ARE
  4944.    ;CURRENTLY SET UP FROM ┬┴╙╔├
  4945. ┌─╔╓ ┼╤╒ ├╧╙+128 ;─IVISION TABLE
  4946. ╘═┴╘╚1 ┼╤╒ ┌─╔╓+384 ;═ATH TABLE OF F(X)=X*X/256
  4947. ╘═┴╘╚2 ┼╤╒ ╘═┴╘╚1+512 ;╙ECOND MATH TABLE
  4948. ╨╧╠┘╠╔╙╘ ┼╤╒ ╘═┴╘╚2+512 ;╠IST OF POLYGONS
  4949.  
  4950. ========================================================================
  4951. ╙ECOND ╙╔─ ├HIP ╔NSTALLATION
  4952. ├OPYRIGHT 1988 ═ARK ┴. ─ICKENSON
  4953.  
  4954. ╘HIS INFORMATION AND SOFTWARE IS ├╧╨┘╥╔╟╚╘┼─ AND MADE AVAILABLE ON A
  4955. ╙╚┴╥┼╫┴╥┼ BASIS.  ╘HIS FILE CAN BE FREELY COPIED AND DISTRIBUTED AS LONG
  4956. AS IT IS NOT ╙╧╠─.  ╘HIS INFORMATION CANNOT BE USED TO CONSTRUCT AND SELL A
  4957. HARDWARE DEVICE WITHOUT RECEIVING PRIOR PERMISSION FROM THE AUTHOR. ╘HERE IS
  4958. NOT A SET FEE FOR THE USE OF THIS INFORMATION.  ╩UST SEND IN WHATEVER YOU FEEL
  4959. THE INFORMATION IS WORTH.
  4960.  
  4961. ╔F YOU HAVE ANY GRIPES, COMPLAINTS, SUGGESTIONS, ├╧═╨╠╔═┼╬╘╙ OR ─╧╬┴╘╔╧╬╙ OF
  4962. ANY SORT PLEASE SEND THEM TO:
  4963.  
  4964.  ═ARK ─ICKENSON
  4965.  600 ╙OUTH ╫EST ╙TREET
  4966.  ╬EVADA, ═ISSOURI  64772
  4967.  
  4968. ┴DDING AN EXTRA ╙╔─ 6581/6582 CHIP
  4969.  
  4970. ╘HIS IS NOT A PROJECT TO BE TACKLED BY THE SQEAMISH OR PEOPLE WHO ARE DEATHLY
  4971. AFRAID OF OPENING THEIR COMPUTER JUST TO TAKE A PEEK INSIDE.
  4972.  
  4973. ╬OW LET'S GET RID OF THE NASTY STUFF FIRST.  ╬O LIABILITY IS ASSUMED WITH
  4974. RESPECT TO THE USE OF THE FOLLOWING INFORMATION.  ╔N OTHER WORDS IF YOU
  4975. SCREW-UP TRYING TO INSTALL THIS MODIFICATION, THEN IT'S YOUR RESPONSABILITY.
  4976.  
  4977.   ┘╧╒ ─╧ ╘╚╔╙ ┴╘ ┘╧╒╥ ╧╫╬ ╥╔╙╦!!!!
  4978.  
  4979. ╔F YOU DO NOT FEEL UP TO IT ╨╠┼┴╙┼ TAKE IT TO A ├OMMODORE REPAIR CENTER
  4980. OR A REPAIR SERVICE THAT CAN WORK ON COMPUTERS AND LET THEM DO THE
  4981. INSTALLATION.  ╔ WILL WARN YOU THAT MOST ├OMMODORE ╥EPAIR ├ENTERS WILL NOT OR
  4982. DO NOT LIKE TO DO THIS MODIFICATION.  ╫HEN THEY DO, IT CAN BE EXPENSIVE. ╔F
  4983. YOU BELONG TO A ╒SERS ╟ROUP, TELL THEM ABOUT THE PROJECT AND ASK IF THERE IS
  4984. ANYONE THERE THAT COULD PERFORM THE OPERATION.  ╘HIS MODIFICATION WILL ╬╧╘
  4985. HURT THE COMPUTER IN ANY WAY, UNLESS IT IS INSTALLED ╫╥╧╬╟.
  4986.  
  4987. ┘OU CAN MAKE YOUR OWN PIGGY BACK BOARD OR YOU CAN DO WHAT ╔ AM GOING TO
  4988. DESCRIBE (SINCE IT IS A LITTLE HARD TO PUT A SCHEMATIC IN A TEXT FILE).
  4989.  
  4990. ┘OU SHOULD GROUND YOURSELF WITH A STATIC GUARD WRISTBAND (SUCH AS WHAT
  4991. ╥ADIO ╙HACK SELLS).  ┼VEN THOUGH THE CHIP IS QUITE DURABLE, JUST THE RIGHT
  4992. STATIC DISCHARGE CAN RUIN ALL OR PART OF THE ╙╔─ CHIP.
  4993.  
  4994. ╞OR THOSE OF YOU THAT ARE NOT FAMILIER WITH THE WAY PINS ARE NUMBERED ON AN
  4995. ╔├ CHIP HERE IS A SHORT EXPLANATION.  ╧N ONE END OF THE ╔├ YOU SHOULD FIND A
  4996. LITTLE NOTCH, LOOKING AT THE CHIP WITH THE NOTCH AT THE TOP THE NUMBERING GOES
  4997. THIS WAY.  ╘HE UPPER LEFT CORNER OF THE CHIP IS PIN 1 AND THEY ARE NUMBERED
  4998. CONSECUTIVELY, COUNTER-CLOCKWISE AROUND THE CHIP. ╙OME CHIPS DO NOT HAVE A
  4999. NOTCH IN ONE END, BUT INSTEAD DOT IS PLACED IN ONE OF THE CHIP CORNERS TO
  5000. DESIGNATE THAT PIN 1 STARTS IN THAT LOCATION.
  5001.  
  5002.             NOTCH
  5003.           ----,,----
  5004.         1-!.       !-8
  5005.         2-! DOT    !-7
  5006.         3-!        !-6
  5007.         4-!        !-5
  5008.           ----------
  5009.  
  5010.  
  5011. ╔ HAVE INCLUDED THE INFORMATION THAT IS NEEDED TO INSTALL THIS MODIFICATION
  5012. ON THE ├OMMODORE 64, 64├ AND 128.  ╔ HAVEN'T BEEN ABLE TO LOOK INSIDE THE
  5013. 128─, SO ╔ CANNOT PROVIDE THE INFORMATION WITH ANY ACCURACY.
  5014.  
  5015. ╘HERE ARE ╘╫╧ DIFFERENT 64├ CIRCUIT BOARDS AND BOTH USE ─╔╞╞┼╥┼╬╘ ╙╔─
  5016. CHIPS.  ┘OU CAN TELL THE DIFFERENCE BY OPENING THE 64├.  ╔F YOU SEE A 64-PIN
  5017. CHIP ON THE BOARD AND THE BOARD IS ONLY 5.5-6 INCHES WIDE THEN YOU HAVE THE
  5018. NARROW BOARD 64├ AND MUST USE THE 9 VOLT 6582 ╙╔─ CHIP.  ╘HE NUMBER OF THE
  5019. CHIP IN THE 64├ NARROW IS AN 8520 AND IS THE SAME AS THE 6582.
  5020.  
  5021. ----------------------------------
  5022.  
  5023. ╨ARTS ├OMMODORE 64, 64├ (WIDE) & 128
  5024.  
  5025. 1 - 6581 ╙╔─ CHIP FROM ╩AMCO OR ╦ASSARA ═ICROSYSTEMS
  5026. 1 - 2╬2222 TRANSISTOR  ╥ADIO ╙HACK 276-1617
  5027. 2 - 220PF CAPACITORS  ╥ADIO ╙HACK 272-124
  5028.  
  5029. -----------------------------------
  5030.  
  5031. ╨ARTS ├OMMODORE 64├ ╬ARROW ┬OARD
  5032.  
  5033. 1 - 6582 ╙╔─ ├HIP  ╞ROM ╩AMCO OR ╦ASSARA ═ICROSYSTEMS
  5034. 1 - 2222┴ TRANSISTOR  ╥ADIO ╙HACK 276-2009
  5035. 2 - .022UF CAPACITORS  ╥ADIO ╙HACK 272-1066
  5036. 2 - 1K OHM 1/4 WATT RESISTORS  ╥ADIO ╙HACK 271-1321
  5037.  
  5038. -----------------------------------
  5039.  
  5040. ╨ARTS 64, 64├ (ALL) & 128
  5041.  
  5042. 2 - 1K OHM 1/4 WATT RESISTORS  ╥ADIO ╙HACK 271-1321
  5043. 1 - 1000 PF CAPACITOR  ╥ADIO ╙HACK 272-126 LISTED AS .001 MF THIS IS
  5044.     THE SAME AS 1000PF
  5045. 1 - 10K OHM 1/4 WATT RESISTOR  ╥ADIO ╙HACK 271-1335
  5046. 1 - 10 UF ELECTROLITIC CAPACITOR  ╥ADIO ╙HACK 272-1025
  5047. 1 - 5 INCH LENGTH OF WIRE
  5048. 1 - 5 INCH LENGTH OF SHIELDED CABLE
  5049. 1 - SURFACE MOUNT FEMALE ╥├┴ PLUG (THIS IS WHAT YOU NORMALLY FIND ON THE BACK
  5050.     OF YOUR STEREO.
  5051.  
  5052.  
  5053. ╧N THE ├-64 AND 64├ (WIDE) THE ╙╔─ IS ╔├ ╒18 (THE ╔├ NUMBER WILL BE MARKED IN
  5054. WHITE ON THE CIRCUIT BOARD).  ╔T IS USUALLY LOCATED IN THE MIDDLE OF THE
  5055. CIRCUIT BOARD, NEXT TO THE METAL VIDEO CHIP CASE OR UP BETWEEN AND JUST
  5056. BELOW THE SERIAL AND MONITOR JACKS.
  5057.  
  5058. ╧N THE ├-64├ (NARROW BOARD) THE ╙╔─ CHIP IS ╔├ ╒9.  ╔T IS LOCATED IN THE
  5059. MIDDLE OF THE BOARD, JUST A LITTLE TO THE RIGHT OF CENTER) AND CALLED 520.
  5060.  
  5061. ╧N THE ├-128 THE ╙╔─ IS ╔├ ╒5.  ╔T IS LOCATED AT THE BACK OF THE CIRCUIT
  5062. BOARD JUST TO THE RIGHT OF THE METAL HOUSING FOR THE 40 AND 80 COLUMN VIDEO
  5063. CHIPS.
  5064.  
  5065. ╞IRST BEND OUT PINS 23, 24 AND 26 AND CUT THEM OFF OF THE 6581/6582 ╙╔─
  5066. CHIP.  ╘HESE ARE FOR THE TWO ANALOG AND ONE AUDIO INPUT LINES.  ╘HEY WILL
  5067. CAUSE PROBLEMS IF CONNECTED AND SINCE THEY WILL NOT BE USED IT IS BEST TO
  5068. REMOVE THEM.
  5069.  
  5070. ╬OW BEND OUT PINS 1, 2, 3, 4, 8, AND 27.
  5071.  
  5072. ╙OLDER ONE OF THE 220PF CAPACITORS (64├ NARROW USES .022 UF) TO PINS 1
  5073. AND 2 THEN SOLDER THE OTHER 220PF (64├ NARROW - .022UF) CAPACITOR TO PINS 3
  5074. AND 4.  ╘HE CAPACITORS CONTROL THE UPPER AND LOWER FREQUENCY RANGE AND
  5075. FILTERS OF THE ╙╔─ CHIP.
  5076.  
  5077. ╘HE REASON ╔ AM USING 220PF CAPACITORS IS BECAUSE OF PROBLEMS WITH THE
  5078. FILTERS IN THE ╙╔─ CHIP.  ╘HE ├-64 FIRST CAME OUT WITH 2200PF CAPACITORS, BUT
  5079. THEY WERE CHANGED TO 470PF.  ╘HE REASON FOR THIS WAS BECAUSE THE FILTERS OF
  5080. THE ╙╔─ VARY FROM CHIP TO CHIP AND USING 2200PF CAUSED A LOT OF THEM TO SOUND
  5081. MUFFELED WHEN THE FILTERS WERE ON.  ╔ HAVE FOUND THAT BY LOWERING THE
  5082. CAPACITOR VALUE TO 220 PF HELPS EVEN MORE.  ╔F YOU WISH, YOU CAN USE 470S IF
  5083. YOU FEEL IT WOULD BE BETTER, BUT ─╧ ╬╧╘ USE 2200PF.
  5084.  
  5085. ╘HE 6582 ╙╔─ CHIP FOR THE 64├ NARROW MUST USE THE .022UF CAPACITORS, AS THE
  5086. FILTER RANGE IS MUCH DIFFERENT.
  5087.  
  5088. ╙OLDER ONE END OF YOUR WIRE TO PIN 8 OF THE ╙╔─ CHIP.  ╘HIS IS FOR THE CHIP
  5089. SELECT LINE.  ╫E WILL CONNECT THIS TO THE CARTRIDGE PORT.  ╘HIS TELLS THE
  5090. COMPUTER WHERE IN MEMORY THE CHIP RESIDES (DESCRIBED LATER).
  5091.  
  5092. ╬OW SOLDER THE REMAINING PINS (EXCLUDING THE ONES WE HAVE BENT OUT
  5093. AND/OR REMOVED 1, 2, 3, 4, 8, 23, 24, 26 AND 27) TO THE SID CHIP CURRENTLY IN
  5094. YOUR COMPUTER.  ┘OU MAY HAVE TO BEND THOSE PINS INWARD JUST A LITTLE FOR THEM
  5095. TO GET A GOOD GRIP ON THE ╙╔─ CHIP.  ┬E VERY CAREFUL NOT LEAVE THE SOLDERING
  5096. IRON ON THE CHIP ╘╧╧ LONG AS YOU COULD RUIN ┬╧╘╚ ╙╔─ CHIPS.  ╔ WOULD PUT SOME
  5097. HEAT SINK (SILICON GREASE) BETWEEN THE TWO CHIPS BEFORE SOLDERING THEM
  5098. TOGETHER.  ╘HIS WILL PROVIDE BETTER HEAT DISPERSAL ON THE BOTTOM CHIP.
  5099.  
  5100. ╬OW THAT YOU HAVE THE CHIPS SOLDERED TOGETHER (PLACE THE ╙╔─ CHIPS BACK IN
  5101. THE SOCKET IF YOU REMOVED THEM), SOLDER THE WIRE FROM PIN 8 (ON THE ╙╔─ CHIP)
  5102. TO PIN 7 OF THE CARTRIDGE PORT ON THE BACK OF THE COMPUTER.  ╙ET THE COMPUTER
  5103. INFRONT OF YOU LIKE TO ARE GETTING READY TO TYPE, WITH THE BACK OF THE
  5104. COMPUTER AWAY FROM YOU.  ╠OOK AT THE CARTRIDGE PORT (LOCATED IN THE UPPER
  5105. RIGHT CORNER OF THE CIRCUIT BOARD).  ┘OU WILL SEE TWO ROWS OF PINS CONNECTING
  5106. THE CARTRIDGE PORT TO THE CIRCUIT BOARD.  ┘OU WANT THE ROW OF PINS CLOSEST TO
  5107. THE FRONT OF THE COMPUTER.  ╬OW, COUNT THE PINS STARTING AT THE ╠┼╞╘ SIDE AND
  5108. COUNTING TO THE RIGHT.  ┘OU WANT TO SOLDER THE WIRE FROM PIN 8 OF THE EXTRA
  5109. ╙╔─ CHIP TO PIN NUMBER 7 OF THE CARTRIDGE PORT. ╘HIS IS THE SAME PLACE ON ALL
  5110. OF THE MODELS ├-64, 64├ AND 128.
  5111.  
  5112. ╘HIS WILL TELL THE COMPUTER THAT THE EXTRA ╙╔─ CHIP IS AT ADDRESS $─┼00 HEX
  5113. OR 56832 DECIMAL.  ┘OU WILL ACCESS IT JUST LIKE YOU WOULD THE REGULAR SID
  5114. CHIP BUT STARTING AT THIS ADDRESS.
  5115.  
  5116. ╔ AM NO LONGER DESCRIBING HOW TO CONNECT FOR ADDRESS $─╞00.  ╘HIS
  5117. ADDRESS CAUSES PROBLEMS WITH THE ╥┴═ ┼XPANSION ╒NITS AND NUMEROUS OTHER
  5118. CARTRIDGES.  ╞ROM NOW ON ADDRESS $─┼00 IS THE ╧╬╠┘ ADDRESS FOR THE ╙╔─ CHIP.
  5119.  
  5120. ╬OW PARTIALLY REASSEMBLE YOUR COMPUTER (BE CAREFUL THAT NOTHING SHORTS OUT
  5121. THE PINS STILL STICKING OUT).  ╘URN THE COMPUTER ON AND LOAD THE PLAYER
  5122. PROGRAM PROVIDED AND TELL IT TO LOAD IN '╘┼╙╘'.  ╔F YOU GET SOUND THEN SO FAR
  5123.  SO GOOD.  ╘URN OFF THE COMPUTER AND DISASSEMBLE THE CASE.
  5124.  
  5125. ─RILL A HOLE IN THE BACK END OF THE COMPUTER JUST LARGE ENOUGH TO ANCHOR
  5126. THE ╥├┴ PLUG.  ╘HEN SOLDER THE CENTER WIRE OF THE SHIELDED CABLE TO THE
  5127. CENTER POST OF THE ╥├┴ PLUG.  ╔NSERT THE WIRE THROUGH THE HOLE YOU HAVE
  5128. JUST DRILLED AND ANCHOR THE PLUG TO THE CASE.  ╬OW SOLDER THE GROUND WIRE TO
  5129. THE GROUND TAB ON THE ╥├┴ PLUG.
  5130.  
  5131. ╚ERE COMES THE DIFFICULT PART TO EXPLAIN.  ╘HIS IS THE COUPLING CIRCUIT
  5132. FOR THE AUDIO OUTPUT.  ╚ERE IS A ROUGH SCHEMATIC.
  5133.  
  5134.  
  5135. ╨IN 27 ON             12VOLTS DC,
  5136. 9VOLTS 64├ (NARROW)
  5137. ╙╔─ CHIP  RESISTOR
  5138.     !--.  10K OHM      !COLLECTOR
  5139. 27!----.--/!/!/--.-----╧ 2N2222 OR 2222┴
  5140. --'    !         !     !EMITTER
  5141.        !         !     !
  5142.        <RESISTOR !     !
  5143.        >1K       !     ! +
  5144.  
  5145. ===========================================================================
  5146. ╙╧╠╓╔╬╟ ╠┴╥╟┼ ╙┘╙╘┼═╙ ╧╞ ╠╔╬┼┴╥ ┼╤╒┴╘╔╧╬╙ ╧╬ ┴ ├64 ╫╔╘╚╧╒╘ ═┼═╧╥┘
  5147. BY ┴LAN ╩ONES  (ALAN.JONES@QCS.ORG)
  5148.  
  5149. ╧╦, NOW THAT ╔ HAVE YOUR ATTENTION, ╔ LIED.  ┘OU CAN'T SOLVE DENSE
  5150. LINEAR SYSTEMS OF EQUATIONS BY DIRECT METHODS WITHOUT USING MEMORY TO
  5151. STORE THE PROBLEM DATA.  ╚OWEVER, ╔'LL COME BACK TO THIS MEMORY FREE
  5152. ASSERTION LATER.  ╘HE MAIN PURPOSE OF THIS ARTICLE IS TO RESCUE A
  5153. USEFULL NUMERICAL ALGORITHM, "╤UARTERSOLVE", AND ALSO TO PROVIDE A BRIEF
  5154. LOOK AT THE ├╧═┴╠ PROGRAMMING LANGUAGE AND ┬╠┴╙ ROUTINES.
  5155.  
  5156. ╠INEAR SYSTEMS OF EQUATIONS, ┴(,)*X()=B(), WHERE ┴ IS A SQUARE MATRIX
  5157. AND X AND B ARE VECTORS (OR ARRAYS), MUST OFTEN BE SOLVED FOR X IN THE
  5158. SOLUTION OF A VARIETY OF PROBLEMS.  ╘HE SIZE OR DIMENSION OF THE PROBLEM
  5159. IS N AND JUST STORING ┴ REQUIRES 5*N*N BYTES OF MEMORY, ASSUMING ├64/128
  5160. 5 BYTE REAL VARIABLES.  ╘HE PREFERED SOLUTION METHOD IS A FORM OF
  5161. ╟AUSSIAN ┼LIMINATION WHICH REQUIRES 1/3 N*N*N MULTIPLICATIONS.  ╔'LL
  5162. IGNORE THE ADDITIONAL N*N AND N MULTIPLIES.  ╞OR LARGE PROBLEMS OUR ├64
  5163. HAS TWO SERIOUS LIMITATIONS, SMALL MEMORY SIZE AND SLOW FLOATING POINT
  5164. ARITHMETIC.  ╨ROBLEMS WITH N=10 CAN BE COMPUTED EASILY.  ╨ROBLEMS WITH
  5165. N=100 WILL REQUIRE 100 TIMES MORE MEMORY AND 1000 TIMES MORE COMPUTING
  5166. TIME.  ╘HE COMPUTING TIME IS NOT A REAL PROBLEM.  ╔ DON'T MIND LETTING
  5167. MY COMPUTER RUN WHILE ╔ WATCH A MOVIE, SLEEP, OR GO ON A TRIP.
  5168. ├ALCULATING OR SETTING UP THE PROBLEM MAY TAKE MUCH LONGER THAN ITS
  5169. SOLUTION ANYWAY.  ┴VAILABLE MEMORY IS THE PRACTICAL LIMITING FACTOR.
  5170. ┴FTER WE USE UP AVAILABLE ╥┴═ WE HAVE TO RESORT TO OTHER ALGORITHMS THAT
  5171. WILL USE THE DISK DRIVE TO MOVE DATA IN AND OUT OF THE COMPUTER.  ╘HE
  5172. 1541 DRIVE IS PARTICULARLY SLOW AND ╔ WOULD NOT WANT TO SUBJECT IT TO
  5173. UNDUE WEAR AND TEAR.
  5174.  
  5175. ╚OW BIG A PROBLEM DO WE NEED TO BE ABLE TO SOLVE?  ╔N MANY CASES THE
  5176. PROBLEM ITSELF WILL FIX N AND THERE IS NO WAY TO REDUCE IT.  ╔N OTHER
  5177. CASES YOU MIGHT BE MODELING A REAL CONTINUOUS PROBLEM WITH A DISCRETE
  5178. NUMBER OF ELEMENTS.  ╬ SHOULD BE INFINITY BUT FOR PROBLEM SOLUTION N=50
  5179. MIGHT BE BIG ENOUGH.  ├ONSIDER CALCULATING THE AERODYNAMIC POTENTIAL
  5180. FLOWFIELD AROUND A BODY OF REVOLUTION.  ┘OU COULD FIX POINTS ON THE
  5181. SURFACE OF THE BODY (A MERIDIAN) AND HAVE A SERIES OF SORT LINE SEGMENTS
  5182. MAKE UP ELEMENTS TO APPROXIMATE THE SHAPE.  ╘HE LAGER N IS THE CLOSER
  5183. THE SMOOTH SHAPE IS APROXIMATED AND THE MORE ACCURATE THE COMPUTED
  5184. SOLUTION BECOMES.  N=100 MIGHT BE A GOOD CHOICE FOR A SIMPLE SHAPE.  ╫E
  5185. COULD ALSO USE A "HIGHER ORDER" MENTHOD.  ╔N THIS CASE WE CAN SUBSTITUTE
  5186. A CURVED LINE ELEMENT FOR THE STRAIGHT LINE SEGMENT.  ├ALCULATING THE
  5187. MATRIX ELEMENTS WILL BE MORE DIFFICULT BUT N=40 CURVED ELEMENTS MIGHT
  5188. GIVE A MORE ACCURATE SOLUTION THAN 100 FLAT ELEMENTS.  ┴NOTHER
  5189. CONSIDERATION IS THE RESOLUTION OF THE SOLUTION.  ┘OU MIGHT WANT TO PLOT
  5190. THE SOLUTION ON THE 200 X 320 PIXEL HI-RES ├64 SCREEN.  40 POINTS MIGHT
  5191. BE TOO COARSE AND 320 MIGHT BE OVERKILL.  ╫E MIGHT ALSO NEED TO
  5192. CALCULATE THE SLOPE OR DERIVATIVES FROM THE CALCULATED SOLUTION WHICH
  5193. WILL REQUIRE MORE CLOSELY SPACED SOLUTION POINTS.  ╘HERE ARE OFTEN
  5194. CHOICES THAT YOU CAN MAKE IN MODELING A SYSTEM AND SELECTING A SOLUTION
  5195. ALGORITHM SO THAT A PROBLEM CAN BE SOLVED WITHIN THE LIMITS OF A ├64.
  5196. ╘HERE ARE OFTEN INTERESTING TRADEOFFS IN MEMORY REQUIREMENTS AND
  5197. EXECUTION SPEED.
  5198.  
  5199. ╚OW BIG A PROBLEM CAN WE SOLVE WITH A ├64?  ╒SING ╤UARTERSOLVE WITH
  5200. ASSEMBLY LANGUAGE WE CAN PROBABLY DO N=200 OR MORE.  ╔F WE ARE GOING TO
  5201. STORE THE PROBLEM DATA ON A SINGLE 1541 DISKETTE AND READ IT IN A ROW AT
  5202. TIME WE CAN ONLY DO N=182 OR SO.  ┴CTUALLY ╔ THINK N SHOULD BE WELL
  5203. UNDER 100.  ─IFFERENT OPERATING SYSTEMS AND LANGUAGES LIMIT THE AMOUNT
  5204. OF USEABLE ╥┴═; ┬┴╙╔├ 40╦, ├╧═┴╠ 2.0 30╦, ╟┼╧╙ 23╦, THE INITIAL DISK
  5205. LOADED ├╧═┴╠ 0.14 10╦...  ╙OLVING A LINEAR SYSTEM MAY ONLY BE A SMALL
  5206. SUBPROBLEM INSIDE A LARGE APPLICATION PROGRAM.  ╘HE IDEA IS TO BE ABLE
  5207. TO SOLVE REASONABLE SIZED PROBLEMS USING YOUR PREFERED  COMPUTING
  5208. ENVIRONMENT WITHOUT HAVING TO DO A LOT OF CHAINING OR LOADING OF
  5209. SEPARATE PROGRAMS.  ╤UARTERSOLVE CAN FREE UP A LOT OF MEMORY FOR OTHER
  5210. ROUTINES OR ALLOW N TO BE DOUBLED.
  5211.  
  5212. ╙╨┼┼─
  5213.  
  5214. ╘HERE ARE A FEW THINGS THAT WE CAN DO TO SPEED UP THE CALCULATIONS.
  5215. ╞IRST WE CAN SELECT A FAST PROGRAMMING LANGUAGE.  ╔ PREFERE ├╧═┴╠ 2.0
  5216. WHICH IS A FAST THREE PASS INTERPRETER.  ╒SING AN ASSEMBLER COULD BE THE
  5217. FASTEST AND PROVIDE THE MOST USEABLE MEMORY.  ┴ TRUE COMPILER SUCH AS ├
  5218. OR ╨ASCAL COULD ALSO BE A GOOD CHOICE.  ┬┴╙╔├ IS A POOR CHOICE EXCEPT
  5219. THAT IT IS BUILT IN AND FREE.  ╔N MOST CASES EXECUTION CAN BE SPED UP
  5220. WITH SOME MACHINE LANGUAGE ROUTINES LIKE THE ┬╠┴╙ (┬ASIC ╠INEAR ┴LGEBRA
  5221. ╙UBROUTINES).  ├ALCULATION SPEED IS MEASURED IN ╞╠╧╨╙/SEC  (╞LOATING
  5222. ╨OINT ╧╨ERATION╙) WHERE, C(I#,J#):=C(I#,J#) + A(I#,K#)*B(K#,J#) IS THE
  5223. OPERATION.  ╔T IS ONE ╞╨ MULTIPLY, ONE ╞╨ ADD, AND SOME INDEXING
  5224. OVERHEAD.  ╫ITH SOME INTERPRETERS THE INDEXING AND INTERPRETING OVERHEAD
  5225. CAN FAR EXCEED THE ACTUAL ╞╨ MULTIPLY TIME.  ╫ITH ASSEMBLED CODE THE ╞╨
  5226. MULTIPLY TIME SHOULD DOMINATE.  ╔ USE A ═╠ LEVEL 1 ┬╠┴╙ PACKAGE WITH
  5227. ├╧═┴╠ 2.0.  ╞OR EXAMPLE:
  5228.  
  5229.     C(I#,╩#):+SDOT(N#,A(I#,1),1,B(1,J#),SDB#)
  5230.     ╞╧╥ K#:=1 TO N# DO C(I#,J#):+A(I#,K#)*B(K#,J#)
  5231.  
  5232. BOTH CALCULATE THE SAME THING, A DOT PRODUCT WITH N# ╞╠╧╨╙.  ╞OR LARGE
  5233. N# ON A ├64 THE ┬╠┴╙ APPROACH ABOUT 320 ╞╠╧╨╙/SEC., ╘HE OVERHEAD OF
  5234. CALLING THE PROCEDURE FROM THE INTERPRETER IS ABOUT THE EQUIVALENT OF 4
  5235. ╞╠╧╨╙.  ╧F COURSE MODERN COMPUTER PERFORMANCE IS MEASURED IN
  5236. ═EGA╞╠╧╨╙/SEC. WITH 8 BYTE REALS (SUPER COMPUTERS RUN HUNDREDS OR
  5237. THOUSANDS OF ═╞╠╧╨╙/SEC.).  ╘HEY ALSO INFLATE THE PERFORMANCE BY
  5238. COUNTING THE MULTIPLY AND ADD AS TWO ╞╠╧╨╙.  ╔N HIS ARTICLE ╔ USE THE
  5239. "OLD FLOPS" OR NUMBER OF MULTIPLIES.
  5240.  
  5241. ╔T MAY ALSO BE POSSIBLE TO CODE 6502 ╞╨ ARITHMETIC ROUTINES USING LOOKUP
  5242. TABLES THAT MAY PERFORM FASTER THAN THE BUILT IN ROUTINES.  ╫E COULD
  5243. ALSO USE THE ├╨╒ IN THE DISK DRIVES TO DO DISTRIBUTED PROCESSING.  ┬UT
  5244. THIS IS BEYOND THE SCOPE OF THIS ARTICLE.
  5245.  
  5246. ╙╧╠╒╘╔╧╬ ═┼╘╚╧─╙
  5247.  
  5248. ├ONSIDER THE FOLLOWING CHOICES FOR NUMERICAL SOLUTION ALGORITHMS:
  5249.  
  5250. ═┼╘╚╧─                  ═┼═╧╥┘       ╞╠╧╨╙
  5251. ╟AUSSIAN ┼LIMINATION       N*N     1/3 N*N*N
  5252. ├HOLESKY ─ECOMPOSITION 1/2 N*N     1/6 N*N*N
  5253. ╤╥ DECOMPOSITION           N*N     2/3 N*N*N
  5254. ╤╥ UPDATING            1/2 N*N      2  N*N*N
  5255. ╟AUSS-╩ORDAN               N*N     1/2 N*N*N
  5256. ╤UARTERSOLVE           1/4 N*N     1/2 N*N*N
  5257.  
  5258.  
  5259. ╟AUSSIAN ┼LIMINATION IS THE PREFERED METHOD WHEN ENOUGH MEMORY IS
  5260. AVAILABLE.  ╔N MODERN TERMINOLOGY THIS IS ╠╒ DECOMPOSITION WHERE ┴ IS
  5261. DECOMPOSED OR FACTORED INTO A LOWER TRIANGULAR MATRIX AND AN UPPER
  5262. TRIANGULAR MATRIX.  ╨ARTIAL PIVOTING OF ROWS OR COLUMNS IS AN ADDITIONAL
  5263. COMPLICATION OFTEN REQUIRED FOR A STABLE SOLUTION.  ┴FTER THE ╠╒
  5264. DECOMPOSTION YOU CAN READILY SOLVE FOR ANY NUMBER OF RIGHT HAND SIDE
  5265. VECTORS IN N*N FLOPS EACH.  ╔N ADDITION YOU CAN CALCULATE MATRIX
  5266. CONDITION NUMBER ESTIMATES AND USE ITERATIVE IMPROVEMENT TECHNIQUES.
  5267. ╘HE ╠╒ DECOMPOSITION IS DONE IN PLACE OVERWRITING THE PROBLEM MATRIX ┴.
  5268.  
  5269. ├HOLESKY ─ECOMPOSITION IS A SPECIALIZED VERSION OF ╟AUSSIAN ┼LIMINATION
  5270. FOR SYMETRIC POSITIVE DEFINITE MATRICES ONLY.  ╙INCE ┴ IS SYMETRIC WE
  5271. ONLY NEED N*(N+1)/2 MEMORY STORAGE LOCATIONS.  ╘HE ╠ AND ╒ TRIANGULAR
  5272. MATRICES ARE SIMPLY TRANSPOSES OF THE OTHER SO ONLY ONE NEEDS TO BE
  5273. STORED AND IS COMPUTED IN PLACE OVERWRITING THE ORIGINAL STORAGE USED
  5274. FOR ┴.  ╬O PIVOTING IS REQUIRED.  ╘HIS ALGORITHM CANNOT SOLVE GENERAL
  5275. NONSYMETRIC PROBLEMS AND IS INCLUDED ONLY FOR COMPARISON.
  5276.  
  5277. ╤╥ DECOMPOSITION FACTORS ┴ INTO AN ORTHOGONAL MATRIX ╤ AND A TRIANGULAR
  5278. MATRIX ╥.  ╤╥ DECOMPOSITION IS VERY STABLE AND CAN BE PERFORMED WITHOUT
  5279. PIVOTING.  ╙INCE ╤ IS ORTHOGONAL ITS INVERSE IS JUST ╤ TRANSPOSE.  ╘O
  5280. SOLVE THE LINEAR SYSTEM WE MULTIPLY THE RIGHT HAND SIDE VECTOR BY ╤
  5281. TRANSPOSE THEN SOLVE THE TRIANGULAR SYSTEM ╥.  ╤ IS COMPUTED IN A
  5282. SPECIAL COMPACT FORM AND STORED IN THE SPACE BELOW ╥.  ╘HE DECOMPOSITION
  5283. IS DONE IN PLACE IN THE STORAGE USED FOR ┴, PLUS AN ADDITIONAL N STORAGE
  5284. LOCATIONS.  ╤╥ DECOMPOSITION REQUIRES ABOUT TWICE AS MANY FLOPS AS
  5285. ╟AUSSIAN ┼LIMINATION.
  5286.  
  5287. ╘HERE IS A VARIATION OF THE ╤╥ SOLUTION KNOWN AS ╤╥ UPDATING.  ╘HE
  5288. PROBLEM IS SOLVED A ROW AT A TIME.  ┴ ╥OW OF ┴ CAN BE READ IN FROM DISK
  5289. STORAGE OR CALCULATED AS NEEDED.  ╧NLY ╥ NEEDS TO BE STORED IN MAIN
  5290. MEMORY, N*(N+1)/2 MEMORY LOCATIONS.  ╥ IS INITIALY THE IDENTITY MATRIX
  5291. AND IS UPDATED AS EACH ROW OF ┴ AND ITS RIGHT HAND SIDE ELEMENT ARE
  5292. PROCESSED.  ╤ IS NOT STORED, BUT THE RIGHT HAND SIDE VECTOR IS
  5293. SEQUENTIALY MULTIPLIED BY ╤ TRANSPOSE.  ┴FTER ALL N ROWS HAVE BEEN
  5294. PROCESSED THE SOLUTION IS FOUND BY SIMPLY SOLVING THE TRIANGULAR SYSTEM
  5295. ╥.  ╙INCE THIS METHOD ONLY NEEDS HALF AS MUCH MEMORY STORAGE AS ╠╒
  5296. DECOMPOSITION, WE CAN SOLVE PROBLEMS 40% LARGER IN A LIMITED MEMORY
  5297. SPACE.  ╚OWEVER, THE COST IN FLOPS IS HIGH.  ┴CTUALLY ╤╥ UPDATING IS
  5298. BEST USED FOR SOLVING LARGE OVERDETERMINED LEAST SQUARES PROBLEMS.
  5299.  
  5300. ╟AUSS-╩ORDAN IS A VARIATION OF ╟AUSSIAN ┼LIMINATION THAT REDUCES ┴ TO
  5301. THE ╔DENTITY MATRIX INSTEAD OF TO ╠╒ FACTORS.  ┬Y APPLYING THE SAME
  5302. TRANSFORMATIONS TO TO THE RIGHT HAND SIDE THAT REDUCE ┴ TO THE IDENTITY
  5303. MATRIX, THE RIGHT HAND SIDE BECOMES THE SOLUTION AT COMPLETION.
  5304. ╨IVOTING IS REQUIERED.  ╟AUSS-╩ORDAN REQUIRES ABOUT 50% MORE FLOPS THAN
  5305. ╟AUSSIAN ┼LIMINATION AND MOST CODES USE N*N MEMORY STORAGE.  ╙INCE THE
  5306. ╠╒ FACTORS ARE NOT COMPUTED WE CAN'T SOLVE ADDITIONAL RIGHT HAND SIDE
  5307. VECTORS LATER, OR ESTIMATE THE MATRIX CONDITION NUMBER, OR USE ITERATIVE
  5308. IMPROVEMENT TECHNIQUES.  ╔T WILL SOLVE MULTIPLE RIGHT HAND SIDES THAT
  5309. ARE AVAILABLE FROM THE START.
  5310.  
  5311. ╤UARTERSOLVE IS A CLEVER IMPLEMENTATION OF ╟AUSS-╩ORDAN(?) THAT SOLVES
  5312. THE PROBLEM A ROW AT A TIME LIKE ╤╥ UPDATING BUT ONLY REQUIRES 1/4 N*N
  5313. MEMORY STORAGE.  ╫ITH FIXED AVAILABLE MEMORY ╤UARTERSOLVE CAN SOLVE A
  5314. PROBLEM TWICE AS LARGE AS ╟AUSSIAN ┼LIMINATION BUT WITH A MODEST
  5315. PERFORMANCE PENALTY.  ╙OLVING A 2N PROBLEM WITH ╤UARTERSOLVE WOULD TAKE
  5316. 12 TIMES LONGER (INSTEAD OF 8) THAN ╟AUSSIAN ┼LIMINATION ON A SIZE N
  5317. PROBLEM.
  5318.  
  5319. ═Y RECOMMENDATION IS TO USE ╟AUSSIAN ELIMINATION FOR SOLVING DENSE
  5320. GENERAL SYSTEMS OF LINEAR EQUATIONS WHEN ENOUGH MAIN MEMORY IS AVAILABLE
  5321. AND SWITCH TO ╤UARTERSOLVE FOR LARGER PROBLEMS.  ╞OR SOLVING HUGE
  5322. PROBLEMS REQUIERING EXTERNAL STORAGE A BLOCKED VERSION OF ╤╥
  5323. DECOMPOSITION MIGHT WORK BEST.  ├HOLESKY DECOMPOSITION SHOULD BE USED
  5324. FOR SYMETRIC POSITIVE DEFINITE PROBLEMS.  ╠ARGE PROBLEMS ARE OFTEN
  5325. SPARSE, CONTAINING LOTS OF ZEROS THAT NEED NOT BE STORED.  ╙PECIALIZED
  5326. CODE EXISTS FOR SOLVING MANY SPARCE PROBLEMS, PARTICULARLY BANDED
  5327. MATRICES, AND MANY OF THESE METHODS CAN BE USED ON A ├64.  ├ODES FOR
  5328. SOLVING UNSTRUCTURED SPARCE PROBLEMS ARE NOT VERY SUITABLE FOR THE ├64
  5329. SINCE THEY ARE COMPLEX AND REDUCE THE AMOUNT OF MEMORY AVAILABLE FOR
  5330. SOLVING THE PROBLEM.  ╚OWEVER, LARGE SPARCE PROBLEMS CAN ALSO BE SOLVED
  5331. ON THE ├64 BY ITERATIVE METHODS SUCH AS ╟AUSS-╙IEDEL AND ├ONJUGATE
  5332. ╟RADIENT ALGORITHMS.
  5333.  
  5334. ╤╒┴╥╘┼╥╙╧╠╓┼
  5335.  
  5336. ╤UARTERSOLVE IS A USEFUL METHOD FOR SOLVING GENERAL DENSE SYSTEMS OF
  5337. LINEAR EQUATIONS THAT ╔ DISCOVERED ALMOST BY ACCIDENT WHILE DOING RANDOM
  5338. RESEARCH IN THE LIBRARY.  ╔ HAVE NOT SEEN ANY RECENT TEXTS OR PAPERS
  5339. MENTIONING THIS ALGORITHM.  ╔ HAVE NOT SEEN ANY REFERENCE TO IT IN THE
  5340. ├64 LITERATURE EITHER.  ┴T LEAST ONE OLDER TEXT MENTIONED IT IN PASSING
  5341. SAYING THAT THE CODE WAS TOO LONG OR COMPLEX.  ╘HIS IS A VALID POINT
  5342. SINCE USUALY THE CODE SIZE DIRECTLY SUBTRACTS FROM THE PROBLEM STORAGE.
  5343. ╘HE CODE IS LONGER THAN THE ╟AUSSIAN ┼LIMINATION CODE BUT IN MY
  5344. IMPLEMENTATION IT ONLY TAKES ABOUT 2╦ OF MAIN MEMORY STORAGE AND IT IS A
  5345. REAL ADVANTAGE ON THE ├64.  ╫ITH A ├64 WE CAN ALSO PUT THE ENTIRE CODE
  5346. IN AN ┼╨╥╧═ ON A CARTRIDGE SO THE CODE SIZE IS OF LITTLE CONCERN.
  5347.  
  5348. ╔ FOUND ╤UARTERSOLVE IN ╥EF. 1 (╥. ┴. ┌AMBERDINO, 1974), WHICH CREDITED
  5349. THE ALGORITHM TO ╥EF. 2 (┴. ╧RDEN, 1960).  ╔ AM A LITTLE UNEASY
  5350. DESCRIBING THE ALGORITHM SINCE ╔ HAVE NOT SEEN ╥EF. 2 OR ANALYZED THE
  5351. ALGORITHM.  ╔ HAVE CODED THE ALGORITHM, TESTED IT, AND USED IT TO SOLVE
  5352. SOME LARGE PROBLEMS ON A ├64, UP TO N=90.  ┌AMBARDINO MAKES TWO
  5353. INTERESTING STATEMENTS IN ╥EF 1.  "╘HE NUMBER OF ARITHMETIC OPERATIONS
  5354. IS THE SAME AS FOR THE ╟AUSSIAN ┼LIMINATION METHOD."  ╔ AM REASONABLY
  5355. SURE FROM THE DESCRIPTION THAT HE MEANT ╟AUSS-╩ORDAN WHICH REQUIRES
  5356. ABOUT 50% MORE ARITHMETIC THAN ╟AUSSIAN ┼LIMINATION.  ┴FTER PROCESSING
  5357. THE ITH ROW ONLY I(N-I) STORAGE LOCATIONS ARE REQUIRED TO STORE THE
  5358. REDUCED MATRIX.  ═AX[I(N-I)] = N*N/4.  ╘HIS MAXIMUM MEMORY REQUIREMENT
  5359. OCCURS AT I = N/2.  ┴S I INCREASES FURTHER MEMORY REQUIRED IS REDUCED.
  5360. ┴LTHOUGH N*N/4 MEMORY LOCATIONS MUST BE ALLOCATED AND DIMENSIONED IN AN
  5361. ARRAY AT THE START, ╤UARTERSOLVE ALWAYS USES THE FIRST PORTION OF THE
  5362. ARRAY CONTINUOUSLY AND DOES NOT FREE UP MEMORY IN HOLES SCATTERED
  5363. THROUGHOUT THE ARRAY.  ╘HE ├ LANGUAGE COULD POSSIBLY USE "HEAP STORAGE"
  5364. AND RELEASE THE MEMORY FOR ANY OTHER USE AS THE PROCEDURE ADVANCES.
  5365.  
  5366. ╬OW BACK TO MY INITIAL MEMORY FREE CLAIM.  ╘HE LARGE PROBLEM THAT ╔
  5367. ACTUALLY WANTED TO SOLVE WAS: ┴*X=B, ┬*X=R, FOR R GIVEN B AND THE SQUARE
  5368. MATRICES ┴ AND ┬.  ┼LEMENTS OF ┴ AND ┬ ARE MOST EFFICIENTLY CALCULATED
  5369. AT THE SAME TIME.  ╔ COULD WRITE ┬ TO THE DRIVE AND READ IT BACK IN
  5370. AFTER X IS COMPUTED TO CALCULATE R, BUT ╔ ACTUALLY WANTED TO SOLVE THIS
  5371. REPEATEDLY INSIDE ANOTHER LOOP AND ╔ DID NOT WANT TO READ AND WRITE TO A
  5372. LOUSY 1541 THAT MUCH.  ╒SING ╟AUSSIAN ELIMINATION WOULD REQUIRE 2N*N
  5373. STORAGE.  ╒SING ╤UARTERSOLVE COULD REQUIRE 1.25N*N STORAGE.  ╚OWEVER,
  5374. ONLY N*N STORAGE IS NEEDED, THAT FOR ┬.  ┴T THE ITH STEP THE ITH ROW OF
  5375. ┴ AND ┬ ARE CALCULATED.  ╘HE ROW OF ┴ IS PROCESSED INTO THE THE N*N
  5376. DIMENSIONED ARRAY ┬ FILLING IT FROM THE FRONT.  ╘HE CORRESPONDING ROW OF
  5377. ┬ IS STORED IN THE SAME ARRAY ┬ FILLING FROM FROM THE END OF ARRAY ┬.
  5378. ┴S THE PROCESS CONTINUES ╤UARTERSOLVE "DISSUSES" ARRAY ┬ SO THAT ROWS OF
  5379. ┬ NEVER OVERWRITE STORAGE NEEDED BY ╤UARTERSOLVE.  ┴T THE END WE HAVE
  5380. COMPUTED X AND  ALL OF ┬ IS STORED IN THE ARRAY ┬.  ╙IMPLE
  5381. MULTIPLICATION PRODUCES R.  ╙O ╔ CAN SAY WITH PRIDE, AT THE EXPENSE OF
  5382. HONESTY, THAT ╔ HAVE SOLVED ┴*X=B WITHOUT ANY ADDITIONAL MEMORY STORAGE
  5383. FOR ┴.
  5384.  
  5385. ╨╥╧├ SLV(N#,NR#,I#,╥┼╞ A(),╥┼╞ C(),╥┼╞ B(,),SDB#,╥┼╞ SW#(),╥┼╞ FAIL#) ├╠╧╙┼─
  5386.   // ╘HIS ROUTINE SOLVES A SYSTEM OF EQUATIONS USING THE QUARTERSOLVE
  5387.   // ALGORITHM WITH PARTIAL PIVOTING.
  5388.   // ╔T IS CALLED A "LINE AT A TIME" AND USES ONLY
  5389.   // 0.25*NN MEMORY LOCATIONS WHICH ENABLES LARGER PROBLEMS TO BE SOLVED.
  5390.   // ╘HE ╠╒ FACTORIZATION IS NOT AVAILABLE, NOR A CONDITION ESTIMATE.
  5391.   // N# IS THE DIMENSION OF THE PROBLEM
  5392.   // NR# IS THE NUMBER OF RIGHT HAND VECTORS TO BE SOLVED FOR.
  5393.   // B(,) IS THE RIGHT HAND SIDE COLUMNS
  5394.   // SDB# IS THE SECOND DIMENSION OF THE ARRAY B(,)
  5395.   ╒╙┼ BLAS
  5396.   ╒╙┼ STRINGS
  5397.   Q#:=I#-1; M#:=N#-Q#; MM1#:=M#-1; FAIL#:=╘╥╒┼; IP1#:=I#+1
  5398.   ╔╞ I#=1 ╘╚┼╬ //INITIALIZE PIVOT ARRAY
  5399.     ╞╧╥ J#:=1 ╘╧ N# ─╧ SW#(J#):=J#
  5400.   ┼╬─╔╞
  5401.   ╞╧╥ J#:=1 ╘╧ Q# ─╧ //ADJUST FOR PREVIOUS PIVOTING
  5402.     K#:=SW#(J#)
  5403.     ╫╚╔╠┼ K#<J# ─╧ K#:=SW#(K#)
  5404.     ╔╞ K#>J# ╘╚┼╬ SWAP'REAL(C(J#),C(K#))
  5405.   ┼╬─╞╧╥ J#
  5406.   ╞╧╥ J#:=I# ╘╧ N# ─╧ C(J#):-SDOT(Q#,C(1),1,A(J#-Q#),M#)
  5407.   P#:=Q#+ISAMAX#(M#,C(I#),1)
  5408.   R:=┴┬╙(C(P#))
  5409.   ╔╞ R=0 ╘╚┼╬ ╥┼╘╒╥╬
  5410.   FAIL#:=╞┴╠╙┼
  5411.   ╔╞ P#<>I# ╘╚┼╬
  5412.     SWAP'REAL(C(I#),C(P#))
  5413.     SWAP'INTEGER(SW#(I#),SW#(P#))
  5414.     SSWAP(Q#,A(1),M#,A(P#-Q#),M#)
  5415.   ┼╬─╔╞
  5416.   R:=1/C(I#)
  5417.   ╔╞ MM1#<>0 ╘╚┼╬ SSCAL(MM1#,R,C(IP1#),1)
  5418.   ╞╧╥ J#:=1 ╘╧ NR# ─╧ B(I#,J#):=R*(B(I#,J#)-SDOT(Q#,C(1),1,B(1,J#),SDB#))
  5419.   ╞╧╥ K#:=1 ╘╧ NR# ─╧ SAXPY(Q#,-B(I#,K#),A(1),M#,B(1,K#),SDB#)
  5420.   ╔╞ MM1#>0 ╘╚┼╬
  5421.     T#:=1
  5422.     ╞╧╥ J#:=1 ╘╧ Q# ─╧
  5423.       R:=A(T#); T#:+1
  5424.       SCOPY(MM1#,A(T#),1,A(T#-J#),1)
  5425.       SAXPY(MM1#,-R,C(IP1#),1,A(T#-J#),1)
  5426.       T#:+MM1#
  5427.     ┼╬─╞╧╥ J#
  5428.     SCOPY(MM1#,C(IP1#),1,A(MM1#*Q#+1),1)
  5429.   ┼╠╙┼ //UNSCRAMBLE SOLUTION FROM PIVOTING
  5430.     ╞╧╥ J#:=1 ╘╧ NR# ─╧
  5431.       ╞╧╥ K#:=1 ╘╧ N# ─╧ C(SW#(K#)):=B(K#,J#)
  5432.       SCOPY(N#,C(1),1,B(1,J#),SDB#)
  5433.     ┼╬─╞╧╥ J#
  5434.   ┼╬─╔╞
  5435. ┼╬─╨╥╧├ SLV
  5436. //
  5437. N#:=8; SDRH#:=1; NRH#:=1; NR#:=1
  5438. // A IS OF  DIMENSION N*N/4
  5439. ─╔═ A(16), B(N#), RHS(N#,NRH#), SW#(N#)
  5440. ╞╧╥ I#:=1 ╘╧ N# ─╧
  5441.   ╞╧╥ J#:=1 ╘╧ N# ─╧ B(J#):=2297295/(I#+J#-1)
  5442.   S:=0
  5443.   ╞╧╥ J#:=N# ╘╧ 1 ╙╘┼╨ -1 ─╧ S:+B(J#)
  5444.   RHS(I#,1):=S
  5445.   SLV(N#,NR#,I#,A(),B(),RHS(,),SDRH#,SW#(),FAIL#)
  5446.   ╔╞ FAIL# ╘╚┼╬
  5447.     ╨╥╔╬╘ "SINGULARITY DETECTED AT I=";I#
  5448.     ╙╘╧╨
  5449.   ┼╬─╔╞
  5450. ┼╬─╞╧╥ I#
  5451. ╞╧╥ J#:=1 ╘╧ N# ─╧ ╨╥╔╬╘ RHS(J#,1);
  5452. ┼╬─
  5453.  
  5454. ╘HE ╤UARTERSOLVE ALGORITHM IS PRESENTED HERE AS A ├╧═┴╠ 2.0 PROCEDURE
  5455. "SLV".  ├╧═┴╠ IS PRETTY MUCH A DEAD LANGUAGE AND ╔ DON'T EXPECT ANYONE
  5456. TO RUN THIS CODE.  ╚OWEVER, ├╧═┴╠ IS A STRUCTURED ALGORITHMIC LANGUAGE
  5457. THAT IS EASY TO READ.  ┘OU CAN READILY TRANSLATE IT INTO THE PROGRAMMING
  5458. LANGUAGE OF YOUR CHOICE.  ╙LV IS CODED AS A ├╠╧╙┼─ PROCEDURE AS A
  5459. PERSONAL MATTER OF STYLE.  ┴N OPEN PROCEDURE WOULD EXECUTE FASTER.  ╘HE
  5460. ARRAYS ARE PASSED BY ╥┼╞┼╥┼╬├┼ AND DO NOT ALLOCATE ADDITIONAL LOCAL
  5461. STORAGE.  ╘HE MAIN PROGRAM IS JUST AN EXAMPLE FOR TESTING.  ╔T CALLS SLV
  5462. N TIMES TO SOLVE THE LINEAR SYSTEM.  ╘HE TEST PROBLEM SOLVES A SCALED
  5463. ╚ILBERT MATRIX WHICH IS ILL CONDITIONED.  ╔N THE ABSENCE OF ROUNDOFF
  5464. ERROR THE SOLUTION SHOULD BE A VECTOR OF ONES.  ╔ USUALLY DIMENSION A()
  5465. TO N#*(N#+1)/4.  ╙LV IS PRESENTED IN ITS FULL GENERALITY, BUT YOU MAY
  5466. WANT TO MAKE SOME SIMPLIFICATIONS.
  5467.  
  5468. ╙LV CAN HANDLE MULTIPLE RIGHT HAND SIDE VECTORS WITH THE TWO DIMENSIONAL
  5469. ARRAY B(,) IN MOST APPLICATIONS YOU WILL ONLY USE A SINGLE VECTOR,
  5470. NR#=1, AND YOU CAN MAKE SOME SIMPLIFICATIONS BY JUST USING A ONE
  5471. DIMENSIONAL ARRAY.
  5472.  
  5473. ╨IVOTING ALSO COMPLICATES THE CODE.  ╨ROBLEMS WHICH ARE POSITIVE
  5474. DEFINITE, OR  DIAGONALLY DOMINANT, OR SOMETIMES JUST WELL CONDITIONED
  5475. CAN BE SAFELY SOLVED WITHOUT PIVOTING.  ╙TRIPPING OUT THE PIVOTING CODE
  5476. IS STRAIGHT FORWARD AND WILL SHORTEN THE CODE AND SPEED EXECUTION.
  5477.  
  5478. ┴NYTHING FOLLOWING // IS A COMMENT AND CAN BE DELETED FROM YOUR RUNNING
  5479. CODE.
  5480.  
  5481. ╔N ├╧═┴╠ 2.0 YOU CAN ALSO "PROTECT" THE CODE WHICH WILL STRIP OUT
  5482. COMMENTS AND OTHER INFORMATION TO MAKE A SHORTER RUNNING VERSION.
  5483.  
  5484. ╘HE REMAINING DISCUSSION WILL CONCERN ├╧═┴╠ 2.0 AND THE ┬╠┴╙.
  5485.  
  5486. ├╧═┴╠ 2.0
  5487.  
  5488. ├╧═┴╠ 2.0 IS AN EXCELLENT PROGRAMMING LANGUAGE FOR THE ├64/128 AND ╔
  5489. CAN'T DESCRIBE ALL OF ITS VIRTUES HERE.  ╔T HAS ONE SERIOUS LIMITATION.
  5490. ╔T DOES NOT USE "CONTINUATION" LINES, SO LINE LENGTH IS LIMITED.  ╘HIS
  5491. IS MOST RESTRICTIVE IN FUNCTION AND PROCEDURE LINES WHERE IT LIMITS THE
  5492. NUMBER OF PARAMETERS THAT CAN BE PASSED.  ╠INE LENGTH IS LIMITED TO 80
  5493. CHARACTERS.  ╚OWEVER, IF YOU USE A SEPARATE TEXT EDITOR OR WORD
  5494. PROCESSOR YOU CAN ENTER 120 CHARACTER LINES.  ├OMAL WILL ACTUALLY
  5495. EXECUTE TOKENIZED LINES UP TO 256 CHARACTERS SO THE LIMITATION IS REALLY
  5496. IN THE EDITOR RATHER THAN ├╧═┴╠.  ╨ROCEDURE AND VARIABLE NAMES CAN BE
  5497. QUITE LONG IN ├OMAL, BUT ARE KEPT SHORT BECAUSE OF THE LINE LENGTH
  5498. LIMITATION.  "╤UARTERSOLVE" WAS SHORTENED TO "SLV" FOR THIS REASON.
  5499.  
  5500. A:+T IS A SHORTER FASTER VERSION A:=A+T, AND A:-T IS A SHORTER FASTER
  5501. VERSION OF A:=A-T.  ╘HIS IS MOST USEFULL WHEN "A" IS AN ARRAY ELEMENT OR
  5502. AN INTEGER.
  5503.  
  5504. ├OMAL 2.0 SUPPORTS ═╠ PACKAGES.  ┴ PACKAGE IS A COLLECTION OF FUNCTIONS
  5505. OR PROCEDURES THAT CAN BE CALLED AND EXECUTED.  ┴ PACKAGED CAN BE ╥╧══┼─
  5506. AND STORED IN ┼╨╥╧═ ON THE ├OMAL 2.0 CARTRIDGE.  ┴ PACKAGE CAN ALSO BE
  5507. LOADED FROM DISK AND WILL NORMALLY BE STORED IN A ╥┴═ LOCATION THAT
  5508. ├╧═┴╠ DOES NOT USE FOR NORMAL PROGRAMS.  ╠╔╬╦ "FILENAME" WILL LOAD AND
  5509. LINK THE ═╠ PACKAGE TO A ├OMAL PROGRAM.  ╔T WILL STAY ATTACHED TO THE
  5510. PROGRAM WHEN THE PROGRAM IS SAVED AND LOADED, UNLESS IT IS MARKED AS
  5511. ╥╧══┼─.  ╘HE ENTIRE SLV PROCEDURE COULD BE CODED IN ASSEMBLY LANGUAGE
  5512. AND BE PLACED IN A PACKAGE.  ╘HE SLV PROCEDURE USES TWO PACKAGES,
  5513. STRINGS AND BLAS.  ╘HE COMMAND ╒╙┼ PACKAGENAME MAKES ALL OF THE
  5514. FUNCTIONS AND PROCEDURES OF THE PACKAGE KNOWN.  ┴LTERNATIVELY, YOU COULD
  5515. PLACE THE ╒╙┼ PACKAGENAME COMMAND IN THE MAIN PROGRAM AND PUT ╔═╨╧╥╘
  5516. PROCEDURENAME INSIDE ALL OF THE CLOSED PROCEDURES THAT CALL
  5517. PROCEDURENAME.
  5518.  
  5519. ╙LV CALLS THE SWAP'REAL AND SWAP'INTEGER PROOCEDURES FROM THE STRINGS
  5520. PACKAGE.  ╘HE STRINGS PACKAGE IS A ╥╧══┼─ PACKAGE ON THE ╙UPER ├HIP ╥╧═.
  5521.  
  5522. ╔T DOES EXACTLY WHAT IT SAYS, E.G.  SWAP'REAL(A,B) IS THE SAME AS:
  5523. T:=A; A:=B; B:=T.
  5524.  
  5525. ╙LV CALLS THE SDOT, ISAMAX#, SSWAP, SSCAL, SAXPY, AND SCOPY ROUTINES
  5526. FROM THE BLAS PACKAGE.  ╘HE BLAS PACKAGE IS ╠╔╬╦ED TO THE PROGRAM, BUT
  5527. IT COULD, AND SHOULD, BE PLACED ON ┼╨╥╧═.
  5528.  
  5529. ┬ASIC ╠INEAR ┴LGEBRA ╙UBROUTINES, ┬╠┴╙
  5530.  
  5531. ╘HE ┬╠┴╙ WERE ORIGINALLY WRITTEN FOR THE ╞ORTRAN LANGUAGE TO SPEED
  5532. EXECUTION AND STREAMLINE CODE USED FOR SOLVING LINEAR ALGEBRA AND OTHER
  5533. MATRIX PROBLEMS.  ╘HE ╠╔╬╨┴├╦ ROUTINES, ╥EF. 3, USE THE ┬╠┴╙ AND ARE
  5534. PERHAPS THE BEST KNOWN.  ╘HE IDEA IS THAT THE ┬╠┴╙ ROUTINES WILL BE
  5535. HIGHLY OPTIMIZED FOR A PARTICULAR COMPUTER, CODED IN ═╠ OR A ╚IGH ╧RDER
  5536. ╠ANGUAGE.  ╙OME OPERATING SYSTEMS EVEN INCLUDE ┬╠┴╙ LIKE ROUTINES.
  5537. ╫RITING FAST EFFICIENT PROGRAMS IS THEN A SIMPLE MATTER OF SELECTING THE
  5538. BEST SOLUTION ALGORITHM AND CODING IT IN A MANNER THAT MAKES BEST USE OF
  5539. THE BLAS ROUTINES.  ╘HERE ARE BLAS ROUTINES FOR SINGLE PRECISION, DOUBLE
  5540. PRECISION, AND COMPLEX NUMBERS.  ╘HE LEVEL 1 ┬╠┴╙ PERFORM OPERATIONS ON
  5541. ROWS OR COLUMNS OF AN ARRAY AND TYPICALY DO N SCALAR OPERATIONS
  5542. REPLACING THE INNER MOST LOOP OF CODE.  ╘HERE ARE ALSO LEVEL 2 ┬╠┴╙ THAT
  5543. PERFORM N*N OPERATIONS AND ╠EVEL 3 ┬╠┴╙ THAT PERFORM N*N*N OPERATIONS.
  5544. ╬ICHOLAS ╚IGHAM HAS CODED MOST OF THE SINGLE PRECISION LEVEL 1 BLAS
  5545. ROUTINES AND PUT THEM IN A ├OMAL 2.0 PACKAGE.  ╘HE ├OMAL BLAS PACKAGE IS
  5546. INCLUDED ON THE ╨ACKAGES ╠IBRARY ╓OLUME 2 DISK.  ╔ AM NOT AWARE OF ═╠
  5547. BLAS ROUTINES CODED FOR ANY OTHER ├64/128 LANGUAGES ALTHOUGH THIS IS
  5548. CERTAINLY POSSIBLE AND RECOMMENDED.
  5549.  
  5550. ╘HE ├OMAL BLAS ROUTINES BEHAVE EXACTLY THE SAME WAY THAT THE ╞ORTRAN
  5551. BLAS ROUTINES DO EXCEPT THAT ╞ORTRAN CAN PASS THE STARTING ADDRESS OF AN
  5552. ARRAY WITH JUST "A", WHILE ├OMAL REQUIRES "A(1)".  ╘HE ├OMAL BLAS WILL
  5553. ALLOW YOU PASS AN ARRAY, BY REFERENCE, OF SINGLE OR MULTIPLE DIMENSIONS
  5554. AND START FROM ANY POSITION IN THE ARRAY.  ╔F YOU CODE THE BLAS ROUTINES
  5555. AS ORDINARY ├OMAL ROUTINES YOU HAVE TO PASS ADDITIONAL PARAMETERS AND
  5556. HAVE SEPARATE ROUTINES FOR SINGLE DIMENSIONED ARRAYS AND TWO DIMENSIONAL
  5557. ARRAYS.  ╬OTE ALSO THAT ╞ORTRAN STORES TWO DIMENSIONAL ARRAYS BY
  5558. COLUMNS, AND ├OMAL (LIKE MANY OTHER LANGUAGES) STORES TWO DIMENSIONAL
  5559. ARRAYS BY ROWS.  ╔F YOU TRANSLATE CODE BETWEEN ╞ORTRAN AND ├OMAL USING
  5560. BLAS ROUTINES YOU WILL HAVE TO CHANGE THE INCREMENT VARIABLES.
  5561.  
  5562.             ╞ORTRAN                          ├OMAL
  5563.     DIMENSION C(N), A(ILDA,ISDA)     ─╔═ C(N#), A(LDA#,SDA#)
  5564.     SCOPY(N,C,1,A(I,1),ILDA)         SCOPY(N#,C(1),1,A(I#,1),1)
  5565.     SCOPY(N,C,1,A(1,J),1)            SCOPY(N#,C(1),1,A(1,J#),SDA#)
  5566.  
  5567. ╘HE FIRST SCOPY COPIES ARRAY C INTO THE ITH ROW OF ARRAY A.  ╘HE SECOND
  5568. SCOPY COPIES ARRAY C INTO THE JTH COLUMN OF ARRAY A.
  5569.  
  5570. ╘HIS IS WHAT SCOPY DOES IN ╞ORTRAN:
  5571.  
  5572.     SUBROUTINE SCOPY(N,SX,INCX,SY,INCY)
  5573.     REAL SX(1),SY(1)
  5574.     IX=1
  5575.     IY=1
  5576.     DO 10 I = 1,N
  5577.       SY(IY) = SX(IX)
  5578.       IX = IX + INCX
  5579.       IY = IY + INCY
  5580.  10 CONTINUE
  5581.     RETURN
  5582.     END
  5583.  
  5584. ╘HE ├OMAL ┬╠┴╙ DOES EXACTLY THE SAME THING.  ╔F CODED ENTIRELY IN ├╧═┴╠
  5585. RATHER THAN AS A PACKAGE IT WOULD HAVE TO BE DIFFERENT.  ╘HE CALL WOULD
  5586. CHANGE.
  5587.  
  5588. SCOPY(N#,C(1),1,A(1,J#),SDA#) WOULD HAVE TO BECOME,
  5589. SCOPY(N#,C(),1,1,A(,),1,J#,SDA#,SDA#) AND THE ├OMAL PROCEDURE MIGHT BE:
  5590.  
  5591. ╨╥╧├ SCOPY(N#, ╥┼╞ X(), IX#, INCX#, ╥┼╞ Y(,), IY#, JY#, SDY#, INCY#) ├╠╧╙┼─
  5592.   IYINC#:=INCY# ─╔╓ SDY#  //ASSUMING Y IS DIMENSIONED Y(?,SDY#)
  5593.   JYINC#:=INCY# ═╧─ SDY#
  5594.   ╞╧╥ I#=1 ╘╧ N# ─╧
  5595.     Y(IY#,JY#):=X(IX#)
  5596.     IX#:+INCX#; IY#:+IYINC#; JY#:+JYINC#
  5597.   ┼╬─╞╧╥
  5598. ┼╬─╨╥╧├ SCOPY
  5599.  
  5600. ╬OTE THAT MORE INFORMATION HAS TO BE PASSED TO THE PROCEDURE AND USED
  5601. THAT THE ═╠ BLAS PICKS UP AUTOMATICALLY.  ┴LSO WE WOULD NEED SEPARATE
  5602. PROCEDURES TO HANDLE EVERY COMBINATION OF SINGLE AND MULTI DIMENSIONAL
  5603. ARRAYS.  ╘HE ├OMAL ═╠ BLAS ARE INDEED WONDERFUL.  ╞OR SPEED
  5604. CONSIDERATIONS THIS SHOULD ALSO BE LEFT AS AN OPEN PROCEDURE OR BETTER
  5605. YET JUST USE IN LINE CODE.
  5606.  
  5607. ╚ERE IS A VERY SIMPLIFIED DESCRIPTION OF WHAT EACH OF THE ROUTINES IN
  5608. THE ├OMAL ┬╠┴╙ PACKAGE DOES.
  5609.  
  5610. SUM:=SASUM(N#,X(1),1)  ╥ETURNS SUM OF ABSOLUTE VALUES IN X().
  5611.   SUM:=0
  5612.   ╞╧╥ I#:=1 ╘╧ N# ─╧ SUM:+┴┬╙(X(I#))
  5613.  
  5614. SAXPY(N#,SA,X(1),1,Y(1),1)  ┴DD A MULTIPLE OF X() TO Y().
  5615.   ╞╧╥ I#:=1 ╘╧ N# ─╧ Y(I#):+SA*X(I#)
  5616.  
  5617. PROD:=SDOT(N#,X(1),1,Y(1),1)  ╥ETURNS DOT PRODUCT OF X() AND Y().
  5618.   PROD:=0
  5619.   ╞╧╥ I#:=1 ╘╧ N# ─╧ PROD:+X(I#)*Y(I#)
  5620.  
  5621. SSWAP(N#,X(1),1,Y(1),1)  ╙WAPS X() AND Y().
  5622.   ╞╧╥ I#:=1 ╘╧ N# ─╧ T:=X(I#); X(I#):=Y(I#); Y(I#):=T
  5623.  
  5624. SCOPY(N#,X(1),1,Y(1),1)  ├OPY X() TO Y().
  5625.   ╞OR I#:=1 ╘╧ N# ─╧ Y(I#):=X(I#)
  5626.  
  5627. MAX#:=ISAMAX#(N,X(1),1)  ╥ETURNS INDEX OF THE ELEMENT OF X() WITH THE
  5628.                          LARGEST ABSOLUTE VALUE.
  5629.   T:=0; MAX#:=1
  5630.   ╞╧╥ I#:=1 ╘╧ N#
  5631.     ╔╞ ┴┬╙(X(I#))>T ╘╚┼╬ T:=┴┬╙(X(I#)); MAX#:=I#
  5632.   ┼╬─╞╧╥ I#
  5633.  
  5634. SSCAL(N#,SA,X(1),1)  ╙CALE X() BY A CONSTANT SA.
  5635.   ╞╧╥ I#:=1 ╘╧ N# ─╧ X(I#):=SA*X(I#)
  5636.  
  5637. SNRM2(N#,X(1),1)  ╥ETURNS THE 2 NORM OF X().
  5638.   NORM2:=0
  5639.   ╞╧╥ I#:=1 ╘╧ N# ─╧ NORM2:+X(I#)*X(I#)
  5640.   NORM2:=╙╤╥(NORM2)
  5641.  
  5642. SROT(N#,X(1),1,Y(1),1,C,S)  ┴PPLY ╟IVENS ROTATION.
  5643.   ╞╧╥ I#:=1 ╘╧ N# ─╧
  5644.     T:=C*X(I#) + S*Y(I#)
  5645.     Y(I#):=S*X(I#) + C*Y(I#)
  5646.     X(I#):=T
  5647.   ┼╬─╞╧╥ I#
  5648.  
  5649.  
  5650. ┬EAR IN MIND THAT EACH OF THESE SIMPLE EXAMPLES CAN BE MORE COMPLEX AS
  5651. WAS GIVEN FOR SCOPY.  ┘OU NOW HAVE ENOUGH INFORMATION TO WRITE YOUR OWN
  5652. ┬╠┴╙ ROUTINES IN ═╠ OR THE PROGRAMMING LANGUAGE OF YOUR CHOICE, OR TO
  5653. EXPAND THE ┬╠┴╙ ROUTINE CALLS IN SLV TO ORDINARY IN LINE CODE.
  5654.  
  5655. ┘OU CAN ALSO APPLY THE ┬╠┴╙ ROUTINES IN CREATIVE WAYS BESIDES JUST
  5656. OPERATING ON ROWS OR COLUMNS.  ╞OR EXAMPLE YOU COULD CREATE THE IDENTITY
  5657. MATRIX WITH:
  5658.  
  5659.   ─╔═ A(N#,N#)
  5660.   A(1,1):=1; A(1,2):=0
  5661.   SCOPY(N#*N#-2,A(1,2),0,A(1,3),1) // ZERO THE REST OF THE MATRIX
  5662.   SCOPY(N#-1,A(1,1),0,A(2,2),N#+1) // COPY ONES TO THE DIAGONAL.
  5663.  
  5664. ╥EFERENCES
  5665.  
  5666. 1.  ┌AMBARDINO, ╥. ┴., "╙OLUTIONS OF ╙YSTEMS OF ╠INEAR ┼QUATIONS WITH
  5667. ╨ARTIAL ╨IVOTING AND ╥EDUCED ╙TORAGE ╥EQUIREMENTS", ╘HE ├OMPUTER ╩OURNAL
  5668. ╓OL. 17, ╬O. 4, 1974, PP. 377-378.
  5669.  
  5670. 2.  ╧RDEN ┴., "═ATRIX ╔NVERSION AND ╥ELATED ╘OPICS BY ─IRECT ═ETHODS",
  5671. IN ═ATHEMATICAL ═ETHODS FOR ─IGITAL ├OMPUTERS, ╓OL. 1, ┼DITED BY ┴.
  5672. ╥ALSTON AND ╚. ╫ILF, ╩OHN ╫ILEY AND ╙ONS ╔NC.,  1960.
  5673.  
  5674. 3.  ─ONGARRA, ╩. ╩., ═OELER, ├. ┬., ┬UNCH, ╩. ╥., ╙TEWART, ╟. ╫.,
  5675. ╠INPACK ╒SERS' ╟UIDE, ╙╔┴═ ╨RESS, ╨HILADELPHIA, 1979.
  5676.  
  5677.