home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / C128 / TEXT / HACKING1.SFX / hacking1.txt next >
Text File  |  1990-02-12  |  63KB  |  1,185 lines

  1. ===========================================================================
  2.  
  3.   ╙ORRY THAT THIS IS LATER THAN ╔ HAD HOPED TO GET IT OUT, BUT HERE IT IS --
  4. ┼XPECT ANOTHER ONE SOON IN A MONTH OR TWO DEPENDING ON SUBMISSIONS... ╨RAISE,
  5. ├OMMENTS, (╔T SUCKS, ╔ LOVED IT, ETC) ARE WELCOME ->
  6. DUCK@PEMBVAX1.PEMBROKE.EDU.  ═ANY THANKS TO ├RAIG ┬RUCE FOR HIS ARTICLE ON LINE
  7. DRAWING / DOT PLOTTING WITH THE 80 COLUMN SCREEN ON THE ├=128.
  8.  
  9. ===============================================================================
  10. ╚ACKING / ╘HIS ═AGAZINE
  11. BY ├RAIG ╘AYLOR
  12. DUCK@PEMBVAX1.PEMBROKE.EDU
  13.  
  14. ─EF:
  15.   ╚ACKER - ╬OUN - ┴ TALENTED AMATEUR USER OF COMPUTERS.
  16.   ╙OURCE - ╫EBSTER'S ╬EW ╫ORLD ─ICTIONARY
  17.  
  18. ├ORRECTION:
  19.   ╚ACKER - ╬OUN - ┴ TALENTED USER OF COMPUTERS.
  20.  
  21.  
  22.   ╘HERE, NOW THAT WE GOT THAT OUT OF THE WAY, LET'S SEE HOW SOME PEOPLE
  23. INTERPRET THE WORD HACKER. ╔N THE 1980'S NEWSPAPERS, MAGAZINES, MOVIES -
  24. EVERYWHERE YA LOOKED PEOPLE WERE USING THE TERM "╚ACKER" TO DENOTE A PERSON WHO
  25. MALICIOUSLY TRIED TO DESTROY / BORE ILL INTENT TOWARDS ANOTHER COMPUTER SYSTEM.
  26. ╘HIS WAS THE RESULT OF THE MISUNDERSTANDING OF THE ACTUAL DEFINITION OF
  27. "╚ACKER" (UNDER MY CORRECTION ABOVE).
  28.  
  29.   ╘HIS MAGAZINE WILL NOT TELL PEOPLE HOW TO "PHREAK", HOW TO HHACK VOICE
  30. MAILBOXES AND OTHER ILLEGAL ACTIVITIES.  ╚OWEVER, IT WILL ATTEMPT TO REVEAL
  31. SOME OF THE "MYSTIQUE" BEHIND SOME OF THE NEW TECHNIQUES AND ABILITIES FOUND IN
  32. THE ├OMMODORE 64 AND ├OMMODORE 128 THAT ARE JUST NOW BEING REVEALED.
  33. ╔N THE EVENT THAT AN ARTICLE IS SUBMITTED AND THERE IS A QUESTION ABOUT IT'S
  34. ABILITY TO BE APPLIED TOWARDS ILLEGAL ACTIVITES, THE ARTICLE WILL BE CARRIED
  35. WITH A WARNING THAT THE INTENT IS NOT TOWARDS THAT ACTIVITY.  ╚OPEFULLY, THESE
  36. WILL NEVER COME ALONG. :-)
  37.   ╘HE ├OMMODORE 64 CAME OUT IN LATE 1982 (╔ BELIEVE) AND WAS KNOWN TO ONLY
  38. SUPPORT 16 COLORS, 320 X 200 RESOLUTION GRAPHICS OF 2 COLORS, 160X200
  39. RESOLUTION GRAPHICS OF 4 COLORS.  ╙INCE THEN PEOPLE HAVE PUSHED THE ├OMMODORE
  40. 64 TO ITS LIMITS WITH APPARENT RESOLUTION OF 320 X 200 WITH A RESOLUTION OF 4
  41. COLORS AND EVEN HIGHER... MORE THAN 8 SPRITES ON THE SCREEN... FAST
  42. HIGH-QUALITY DIGITIZED SOUNDS....
  43.   ╘HE ├OMMODORE 128 CAME OUT AS AN "UPGRADE" FROM THE ├OMMODORE 64 AND WITH
  44. IT'S UNIQUE MEMORY MANAGEMENT SCHEME AND THE ┌80A CHIP STILL ON THERE PEOPLE
  45. ARE STILL FINDING OUT UNIQUE AND INTERESTING WAYS TO EXPLORE THE ├=128. ╧NE OF
  46. THE MOST INTERESTING HAS BEEN THAT OF THE SEPERATE VIDEO DISPLAY CHIP WHICH
  47. MAKES IT POSSIBLE TO DISPALY 640X200 RESOLUTION GRAPHICS QUICKLY AND EASILY.
  48.  
  49. **┴╘╘┼╬╘╔╧╬**
  50.   ╘HIS MAGAZINE IS GOING TO BE A SOURCEBOOK OF MANY PEOPLE - ╔F YOU KNOW
  51. ANYTHING ABOUT SOMETHING, PLEASE FEEL FREE TO SUBMIT IT.  ╩UST MAIL THE ARTICLE
  52. TO THE FOLLOWING :
  53.         DUCK@PEMBVAX1.PEMBROKE.EDU
  54.         AND A SUBJECT OF "┴╥╘╔├╠┼ - " AND THEN THE ARTICLE NAME.
  55.  
  56.   ╘HE SOURCE CODE FOR ALL PROGRAMS MENTIONED WITHIN ARTICLES WILL BE PROVIDED
  57. AS WELL AS ANY EXECUTABLES UUENCODED SENT OUT SEPRATELY. [┼D. ╬OTE - ╔N THIS
  58. ISSUE, THE SOURCE IS NOT SENT SEPERATELY DUE TO ONLY ONE ARTICLE WITH FILES]
  59.  
  60.   ╔N ADDITION, THE MAGAZINE WILL GO OUT WHEN THERE ARE ENOUGH ARTICLES
  61. COLLECTED.  ┴LSO, ╔'M CURRENTLY IN COLLEGE - SO - IT WILL ALSO BE DEPENDANT ON
  62. FEW TESTS ETC BEING AROUND THE RELEASE PERIOD.
  63.  
  64.   ╔N THIS ISSUE:
  65.  
  66.     ╘ITLE                               ┴UTHOR(S)
  67. ------------------------------------------------------------------------------
  68. ╚ACKING - ─EFINITION ╧F                 DUCK@PEMBVAX1.PEMBROKE.EDU
  69. ╠EARNING ═╠ - ╨ART 1                    DUCK@PEMBVAX1.PEMBROKE.EDU
  70. 6502 ╦NOWN/╒NKNOWN ╧PCODES              COMPILATION OF SEVERAL
  71. ─OT ╨LOTTING & ┬ITMAPPING               F2RX@JUPITER.SUN.CSD.UNB.CA
  72.   THE 8563 ╙CREEN.
  73.  
  74. ** ┴LL ARTICLES AND FILES (├) 1992 BY THEIR RESPECTIVE AUTHORS.
  75. =============================================================================
  76. ┬EGINNING ═╠ - ╨ART ╧NE
  77. (├) 1992 BY ├RAIG ╘AYLOR
  78.  
  79.   ╘HE BEST WAY TO LEARN MACHINE LANGUAGE IS TO ACTUALLY CODE ROUTINES THAT YOU
  80. DON'T THINK WILL WORK, HOPE THAT THEY WORK, AND THEN FIGURE OUT WHY THEY DON'T
  81. WORK. (╔F THEY DO WORK, YOU TRY TO FIGURE OUT WHY YOU DIDN'T THINK THEY'D
  82. WORK).  ╔E: ╘╚┼ ┬┼╙╘ ╫┴┘ ╘╧ ╠┼┴╥╬ ┴╬┘ ╨╥╧╟╥┴══╔╬╟ ╠┴╬╟╒┴╟┼ ╔╙ ╘╧ ╨╥╧╟╥┴═ ╔╬
  83. ╘╚┴╘ ╠┴╬╟╒┴╟┼.  ┴ND ═ACHINE ╠ANGUAGE IS A PROGRAMMING LANGUAGE.
  84.   ╬OW, LET'S GET A FEW TERMS AND DEFINITIONS OUT OF THE WAY:
  85.  
  86.   ═ACHINE ╠ANGUAGE - ╔NSTRUCTIONS THAT THE COMPUTER UNDERSTANDS AT A PRIMITIVE
  87.      LEVEL AND EXECUTES ACCORDINGLY.
  88.   ┴SSEMBLY ╠ANGUAGE - ╔NSTRUCTIONS MORE UNDERSTANDABLE TO HUMANS THAN PURE
  89.      ═ACHINE ╠ANGUAGE THAT MAKES LIFE EASIER.
  90.  
  91.                       ┴SSEMBLY:                 ═ACHINE:
  92.         ┼XAMPLE:        LDA #$00                  $┴9 $00
  93.  
  94.   ╚UH? YOU MIGHT BE SAYING AT THE MOMENT.  ╘URNS OUT THAT ╠─┴ STANDS FOR, OR IS
  95. A MNEMONIC (COMPUTER PEOPLE ALWAYS COME UP WITH THESE BIG LONG WORDS -- YOU'LL
  96. SEE MNEMONIC'S OFTEN WHEN DEALING WITH MACHINE LANGUAGE) FOR THE FOLLOWING:
  97.     "╠╧┴─ REGISTER ┴ WITH THE FOLLOWING VALUE"
  98.      ^  ^          ^
  99.   ├OOL 'EH? ┘EAH, BUT THERE'S SOMEBODY GRUMBLING NOW ABOUT WHY NOT MAKE IT
  100. ╠╧┴─┴ ETC.. ╚EY, THAT'S LIFE. (╟╥╔╬).
  101.   
  102.   ╧H, MORE DEFINITIONS:
  103.  
  104.   ╥EGISTER - ┴ LOCATION INSIDE THE ├╨╒ THAT CAN BE MANIPULATED DIRECTLY WITHOUT
  105.      HAVING TO ACCESS MEMORY.
  106.  
  107.   ╘HE "┴" REGISTER IS OFTEN CALLED THE ACCUMALATOR WHICH INDICATES ITS
  108. FUNCTION: ALL MATH AND LOGICAL MANIPULATIONS ARE DONE TO THE "┴" REGISTER (FROM
  109. HEREON OUT IT WILL BE REFERRED TO AS .┴).
  110.   ╘HERE ARE TWO OTHER REGISTERS INSIDE THE 6502 PROCESSOR, SPECIFICALLY .╪ AND
  111. .┘.  ╘HESE REGISTERS HELP ACT AS COUNTERS AND INDEXES INTO MEMORY (SORTA LIKE
  112. MEM[X] IN PASCAL BUT NOT QUITE...).
  113.  
  114.   ╬OW, LET'S ADD 3 AND 5 AND LEAVE THE RESULT IN THE ACCUMALATOR (.┴).
  115.  
  116.                 LDA     #3              ; ╚ERE .┴ = 3 (ANYTHING W/ A ; IS A
  117.    ; COMMENT AND WILL BE IGNORED BY THE ASSEMBLER... 
  118.                 CLC             ; HU? - ╘HIS CLEARS THE CARRY. ╘HE 6502
  119.   ; DOES ADDITION *EVERYTIME* WITH THE CARRY ... SO IF WE CLEAR IT IT WON'T
  120.   ; AFFECT THE RESULT.
  121.                 ADC     #5              ; ╬OW, .┴ = .┴ + 5
  122.  
  123.   AND WE'RE DONE.  ╔F THE ├╠├ CONFUSED YOU THEN CONSIDER THAT IF YOU'RE ADDING
  124. A COLUMN OF #'S:
  125.                
  126.        12 <--\__╘HE 2 + 9 = 11, BUT WE PUT THE 1 DOWN AND SET THE CARRY TO 1.
  127.     +  89 <---/ 
  128.        --
  129.       101
  130.    ╘HEN WE SAY 1 + 8 + CARRY , WHICH IN THIS CASE HAPPENS TO = 1 AND WE GET 10
  131. AND AGAIN WE SET THE CARRY AND WRITE DOWN 0. ╘HEN IT'S JUST THE CARRY AND WE
  132. WRITE THAT DOWN.  ╔F WE DIDN'T CLEAR THE CARRY WE MAY HAVE ENDED UP WITH THE
  133. VALUE OF 9 INSTEAD 8 IF THE CARRY HAD HAPPENED TO BE SET.
  134.   
  135.   ┴AAGH, ═ATH - ╠ET'S CONTINUE - ╘HE ├╠├ MNEMONIC STANDS FOR "├╠┼┴╥ ├┴╥╥┘" AND
  136. THE ┴─├ STANDS FOR "┴── WITH ├┴╥╥┘".  ╧N MANY PROCESSORS THERE IS A ┴──
  137. (WITHOUT A CARRY) BUT UNFORTUNATELY THE 6502 PROCESSOR INSIDE THE ├=64 DOESN'T
  138. HAVE IT.
  139.  ╙O WE'VE GOT:
  140.     LOAD REG ┴ WITH THE VALUE 5                 LDA #5
  141.     CLEAR THE CARRY                             CLC
  142.     ADD REG A AND VALUE 3                       ADC #3
  143.  
  144.  ╔N ┬ASIC IT'S JUST: 
  145.     ┴ = 5+3 
  146.  
  147.   ╧NE STATEMENT... ╔N ═ACHINE ╠ANGUAGE YOU'VE GOT TO BREAK EVERYTHING DOWN INTO
  148. SMALLER AND SMALLER STEPS AND QUITE OFTEN THE ═╠ LISTING WILL BE FAR LONGER
  149. THAN THE ┬┴╙╔├ OR ╨┴╙├┴╠ OR ├ EQUIVLENT.
  150.  
  151.  ─EFINITIONS:
  152.    ┴SSEMBLER - ╨ROGRAM TAKES SOURCE CODE IN BASIC FORM OR FROM A FILE AND
  153. WRITES TO MEMORY OR A FILE THE RESULTING EXECUTABLE. ┴LLOWS HIGHER FLEXIBILITY
  154. THAN A MONITOR (SEE BELOW) DUE TO USE OF LABELS ETC AND NOT HAVING TO KEEP
  155. TRACK OF EACH ADDRESS WITHIN THE PROGRAM.
  156.  
  157.   ═ONITOR - ┴ PROGRAM, RESIDENT IN MEMORY, INVOKED BY A SYS CALL FROM BASIC OR
  158. BY HITTING THE RESTORE KEY THAT WILL LET YOU DISASSEMBLE, ASSEMBLE AND EXAMINE
  159. AREAS OF MEMORY AND EXECUTE PROGRAMS DIRECTLY FROM THE MONITOR. ╒SEFUL FOR
  160. DEBUGGING PROGRAMS AND FOR WRITING SHORT PROGRAMS.
  161.   
  162.   ╠ET'S ENTER THE FOLLOWING INTO A MONITOR (IF YOU DON'T HAVE ONE THEN CONTACT
  163. DUCK@PEMBVAX1.PEMBROKE.EDU AND ╔'LL SEND YA ONE):
  164.  
  165. 128:                    C64:
  166. >A 1300 LDA #$93        >A C000 LDA #$93
  167. >A 1302 JSR $FFD2       >A C003 JSR $FFD2
  168. >A 1305 RTS             >A C005 RTS
  169. (EXIT MONITOR)          (EXIT MONITOR)
  170. BANK15:SYS4864          SYS 49152
  171.  
  172.   ╫OW! ╔T CLEARED THE SCREEN. ╬EAT 'EH?  ┬UT SEE HOW MUCH YA GOTTA BREAK
  173. PROBLEMS DOWN?  ╘HE FIRST STATEMENT LOADS IN $93 HEX INTO THE ACCUMALATOR ($93
  174. HEX JUST HAPPENS TO EQUAL 147 WHICH IS ALSO THE ├OMMODORSCII CODE FOR CLEAR
  175. SCREEN.  ╞OR A WHOLE LIST JUST LOOK IN THE BACK OF THE BOOK THAT CAME WITH THE
  176. COMPUTER).  ╘HEN WE JUMP TO A SYSTEM ROUTINE WHICH ├OMMODORE SO GRACIOUSLY
  177. SUPPLIED US WITH THAT PRINTS THE VALUE OF THE CHARACTER IN .┴ TO THE SCREEN.
  178. (JSR $FFD2) THEN WE DO A ╥╘╙ (╥E╘URN FROM ╙UBROUTINE) SO THAT WE WILL GO BACK
  179. TO BASIC AND THE ╥EADY PROMPT WHEN WE ARE FINISHED WITH THE SYS CALL.
  180.   ┘OU ├= 128 PEOPLE MAY BE WONDERING WHY YOU HAD TO DO A BANK 15 AND ASSEMBLE
  181. THE STUFF AT A DIFFERENT MEMORY LOCATION.  ╘URNS OUT THAT THE ├128 MEMORY MAP
  182. OF WHERE ROUTINES ETC ARE AT IS MUCH MORE COMPLEX THAN THE ├=64 AND THUS YOU
  183. HAVE TO TELL BASIC WHICH BANK YOU WISH TO HAVE ALL SYS, PEEK, AND POKE CALLS TO
  184. TAKE PLACE IN. ┴LSO, $C000 AS USED ON THE ├=64 IS NOT AN AREA THAT IS FREE TO
  185. USE ON THE ├128 IN THIS MANNER.
  186.  
  187.   ┴SSIGNMENT: ╘AKE A LOOK @ THE DIFFERENT COMMANDS AS LISTED IN 6502 ╧PCODES
  188. AND TRY TO UNDERSTAND WHAT THEY DO. ┼XPERIMENT WITH THE JSR $FFD2 ROUTINE BY
  189. USING DIFFERENT VALUES ETC.
  190.  
  191.   ╬EXT ╘IME: ╨RINTING OUT STRINGS, AND UNDERSTANDING '╔NDEXING'.
  192.  
  193. ===========================================================================
  194. 6502 ╧PCODES AND ╤UASI-╧PCODES.
  195. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  196.  
  197.   ╘HE FOLLOWING TABLE LISTS ALL OF THE AVAILABLE OPCODES ON THE 65XX LINE OF 
  198. MICRO-PROCESSORS (SUCH AS THE 6510 ON THE ├=64 AND THE 8502 ON THE ├=128)
  199.  
  200. -----------------------------------------------------------------------------
  201. ╙TD ═NEMONIC ╚EX ╓ALUE ─ESCRIPTION                ┴DDRESSING ═ODE  ┬YTES/╘IME 
  202. *   ┬╥╦      $00       ╙TACK <- ╨├, ╨├ <- ($FFFE) (╔MMEDIATE)      1/7
  203. *   ╧╥┴      $01       ┴ <- (┴) ╓ ═               (╔ND,╪)          6/2
  204.     ╩┴═      $02       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  205.     ╙╠╧      $03       ═ <- (═ >> 1) + ┴ + ├      (╔ND,╪)          2/8
  206.     ╬╧╨      $04       [NO OPERATION]             (┌-╨AGE)         2/3
  207. *   ╧╥┴      $05       ┴ <- (┴) ╓ ═               (┌-╨AGE)         2/3
  208. *   ┴╙╠      $06       ├ <- ┴7, ┴ <- (┴) << 1     (┌-╨AGE)         2/5
  209.     ╙╠╧      $07       ═ <- (═ >> 1) + ┴ + ├      (┌-╨AGE)         2/5
  210. *   ╨╚╨      $08       ╙TACK <- (╨)               (╔MPLIED)        1/3
  211. *   ╧╥┴      $09       ┴ <- (┴) ╓ ═               (╔MMEDIATE)      2/2
  212. *   ┴╙╠      $0┴       ├ <- ┴7, ┴ <- (┴) << 1     (┴CCUMALATOR)    1/2
  213.     ┴╬├      $0┬       ┴ <- ┴ /\ ═, ├=~┴7         (╔MMEDIATE)      1/2
  214.     ╬╧╨      $0├       [NO OPERATION]             (┴BSOLUTE)       3/4
  215. *   ╧╥┴      $0─       ┴ <- (┴) ╓ ═               (┴BSOLUTE)       3/4
  216. *   ┴╙╠      $0┼       ├ <- ┴7, ┴ <- (┴) << 1     (┴BSOLUTE)       3/6
  217.     ╙╠╧      $0╞       ═ <- (═ >> 1) + ┴ + ├      (┴BSOLUTE)       3/6
  218. *   ┬╨╠      $10       IF ╬=0, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  219. *   ╧╥┴      $11       ┴ <- (┴) ╓ ═               ((╔ND),┘)        2/5'1
  220.     ╩┴═      $12       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  221.     ╙╠╧      $13       ═ <- (═ >. 1) + ┴ + ├      ((╔ND),┘)        2/8'5
  222.     ╬╧╨      $14       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  223. *   ╧╥┴      $15       ┴ <- (┴) ╓ ═               (┌-╨AGE,╪)       2/4
  224. *   ┴╙╠      $16       ├ <- ┴7, ┴ <- (┴) << 1     (┌-╨AGE,╪)       2/6
  225.     ╙╠╧      $17       ═ <- (═ >> 1) + ┴ + ├      (┌-╨AGE,╪)       2/6
  226. *   ├╠├      $18       ├ <- 0                     (╔MPLIED)        1/2
  227. *   ╧╥┴      $19       ┴ <- (┴) ╓ ═               (┴BSOLUTE,┘)     3/4'1
  228.     ╬╧╨      $1┴       [NO OPERATION]             (╔MPLIED)        1/2
  229.     ╙╠╧      $1┬       ═ <- (═ >> 1) + ┴ + ├      (┴BSOLUTE,┘)     3/7
  230.     ╬╧╨      $1├       [NO OPERATION]             (┴BSOLUTE,╪)     2/4'1
  231. *   ╧╥┴      $1─       ┴ <- (┴) ╓ ═               (┴BSOLUTE,╪)     3/4'1
  232. *   ┴╙╠      $1┼       ├ <- ┴7, ┴ <- (┴) << 1     (┴BSOLUTE,╪)     3/7
  233.     ╙╠╧      $1╞       ═ <- (═ >> 1) + ┴ + ├      (┴BSOLUTE,╪)     3/7
  234. *   ╩╙╥      $20       ╙TACK <- ╨├, ╨├ <- ┴DDRESS (┴BSOLUTE)       3/6
  235. *   ┴╬─      $21       ┴ <- (┴) /\ ═              (╔ND,╪)          2/6
  236.     ╩┴═      $22       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  237.     ╥╠┴      $23       ═ <- (═ << 1) /\ (┴)       (╔ND,╪)          2/8
  238. *   ┬╔╘      $24       ┌ <- ~(┴ /\ ═) ╬<-═7 ╓<-═6 (┌-╨AGE)         2/3 
  239. *   ┴╬─      $25       ┴ <- (┴) /\ ═              (┌-╨AGE)         2/3
  240. *   ╥╧╠      $26       ├ <- ┴7 & ┴ <- ┴ << 1 + ├  (┌-╨AGE)         2/5
  241.     ╥╠┴      $27       ═ <- (═ << 1) /\ (┴)       (┌-╨AGE)         2/5'5
  242. *   ╨╠╨      $28       ┴ <- (╙TACK)               (╔MPLIED)        1/4
  243. *   ┴╬─      $29       ┴ <- (┴) /\ ═              (╔MMEDIATE)      2/2
  244. *   ╥╧╠      $2┴       ├ <- ┴7 & ┴ <- ┴ << 1 + ├  (┴CCUMALATOR)    1/2
  245.     ┴╬├      $2┬       ┴ <- ┴ /\ ═, ├ <- ~┴7      (╔MMEDIATE9      1/2     
  246. *   ┬╔╘      $2├       ┌ <- ~(┴ /\ ═) ╬<-═7 ╓<-═6 (┴BSOLUTE)       3/4
  247. *   ┴╬─      $2─       ┴ <- (┴) /\ ═              (┴BSOLUTE)       3/4
  248. *   ╥╧╠      $2┼       ├ <- ┴7 & ┴ <- ┴ << 1 + ├  (┴BSOLUTE)       3/6
  249.     ╥╠┴      $2╞       ═ <- (═ << 1) /\ (┴)       (┴BSOLUTE)       3/6'5
  250. *   ┬═╔      $30       IF ╬=1, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  251. *   ┴╬─      $31       ┴ <- (┴) /\ ═              ((╔ND),┘)        2/5'1
  252.     ╩┴═      $32       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  253.     ╥╠┴      $33       ═ <- (═ << 1) /\ (┴)       ((╔ND),┘)        2/8'5
  254.     ╬╧╨      $34       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  255. *   ┴╬─      $35       ┴ <- (┴) /\ ═              (┌-╨AGE,╪)       2/4
  256. *   ╥╧╠      $36       ├ <- ┴7 & ┴ <- ┴ << 1 + ├  (┌-╨AGE,╪)       2/6
  257.     ╥╠┴      $37       ═ <- (═ << 1) /\ (┴)       (┌-╨AGE,╪)       2/6'5
  258. *   ╙┼├      $38       ├ <- 1                     (╔MPLIED)        1/2
  259. *   ┴╬─      $39       ┴ <- (┴) /\ ═              (┴BSOLUTE,┘)     3/4'1
  260.     ╬╧╨      $3┴       [NO OPERATION]             (╔MPLIED)        1/2
  261.     ╥╠┴      $3┬       ═ <- (═ << 1) /\ (┴)       (┴BSOLUTE,┘)     3/7'5
  262.     ╬╧╨      $3├       [NO OPERATION]             (┴BSOLUTE,╪)     3/4'1
  263. *   ┴╬─      $3─       ┴ <- (┴) /\ ═              (┴BSOLUTE,╪)     3/4'1
  264. *   ╥╧╠      $3┼       ├ <- ┴7 & ┴ <- ┴ << 1 + ├  (┴BSOLUTE,╪)     3/7
  265.     ╥╠┴      $3╞       ═ <- (═ << 1) /\ (┴)       (┴BSOLUTE,╪)     3/7'5
  266. *   ╥╘╔      $40       ╨ <- (╙TACK), ╨├ <-(╙TACK) (╔MPLIED)        1/6
  267. *   ┼╧╥      $41       ┴ <- (┴) \-/ ═             (╔ND,╪)          2/6
  268.     ╩┴═      $42       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  269.     ╙╥┼      $43       ═ <- (═ >> 1) \-/ ┴        (╔ND,╪)          2/8  
  270.     ╬╧╨      $44       [NO OPERATION]             (┌-╨AGE)         2/3
  271. *   ┼╧╥      $45       ┴ <- (┴) \-/ ═             (┌-╨AGE)         2/3
  272. *   ╠╙╥      $46       ├ <- ┴0, ┴ <- (┴) >> 1     (┴BSOLUTE,╪)     3/7 
  273.     ╙╥┼      $47       ═ <- (═ >> 1) \-/ ┴        (┌-╨AGE)         2/5
  274. *   ╨╚┴      $48       ╙TACK <- (┴)               (╔MPLIED)        1/3
  275. *   ┼╧╥      $49       ┴ <- (┴) \-/ ═             (╔MMEDIATE)      2/2
  276. *   ╠╙╥      $4┴       ├ <- ┴0, ┴ <- (┴) >> 1     (┴CCUMALATOR)    1/2
  277.     ┴╙╥      $4┬       ┴ <- [(┴ /\ ═) >> 1]       (╔MMEDIATE)      1/2
  278. *   ╩═╨      $4├       ╨├ <- ┴DDRESS              (┴BSOLUTE)       3/3
  279. *   ┼╧╥      $4─       ┴ <- (┴) \-/ ═             (┴BSOLUTE)       3/4
  280. *   ╠╙╥      $4┼       ├ <- ┴0, ┴ <- (┴) >> 1     (┴BSOLUTE)       3/6
  281.     ╙╥┼      $4╞       ═ <- (═ >> 1) \-/ ┴        (┴BSOLUTE)       3/6
  282. *   ┬╓├      $50       IF ╓=0, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  283. *   ┼╧╥      $51       ┴ <- (┴) \-/ ═             ((╔ND),┘)        2/5'1
  284.     ╩┴═      $52       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  285.     ╙╥┼      $53       ═ <- (═ >> 1) \-/ ┴        ((╔ND),┘)        2/8
  286.     ╬╧╨      $54       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  287. *   ┼╧╥      $55       ┴ <- (┴) \-/ ═             (┌-╨AGE,╪)       2/4
  288. *   ╠╙╥      $56       ├ <- ┴0, ┴ <- (┴) >> 1     (┌-╨AGE,╪)       2/6
  289.     ╙╥┼      $57       ═ <- (═ >> 1) \-/ ┴        (┌-╨AGE,╪)       2/6
  290. *   ├╠╔      $58       ╔ <- 0                     (╔MPLIED)        1/2
  291. *   ┼╧╥      $59       ┴ <- (┴) \-/ ═             (┴BSOLUTE,┘)     3/4'1
  292.     ╬╧╨      $5┴       [NO OPERATION]             (╔MPLIED)        1/2 
  293.     ╙╥┼      $5┬       ═ <- (═ >> 1) \-/ ┴        (┴BSOLUTE,┘)     3/7
  294.     ╬╧╨      $5├       [NO OPERATION]             (┴BSOLUTE,╪)     3/4'1
  295. *   ┼╧╥      $5─       ┴ <- (┴) \-/ ═             (┴BSOLUTE,╪)     3/4'1
  296.     ╙╥┼      $5╞       ═ <- (═ >> 1) \-/ ┴        (┴BSOLUTE,╪)     3/7
  297. *   ╥╘╙      $60       ╨├ <- (╙TACK)              (╔MPLIED)        1/6
  298. *   ┴─├      $61       ┴ <- (┴) + ═ + ├           (╔ND,╪)          2/6
  299.     ╩┴═      $62       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  300.     ╥╥┴      $63       ═ <- (═ >> 1) + (┴) + ├    (╔ND,╪)          2/8'5
  301.     ╬╧╨      $64       [NO OPERATION]             (┌-╨AGE)         2/3
  302. *   ┴─├      $65       ┴ <- (┴) + ═ + ├           (┌-╨AGE)         2/3
  303. *   ╥╧╥      $66       ├<-┴0 & ┴<- (┴7=├ + ┴>>1)  (┌-╨AGE)         2/5
  304.     ╥╥┴      $67       ═ <- (═ >> 1) + (┴) + ├    (┌-╨AGE)         2/5'5
  305. *   ╨╠┴      $68       ┴ <- (╙TACK)               (╔MPLIED)        1/4
  306. *   ┴─├      $69       ┴ <- (┴) + ═ + ├           (╔MMEDIATE)      2/2
  307. *   ╥╧╥      $6┴       ├<-┴0 & ┴<- (┴7=├ + ┴>>1)  (┴CCUMALATOR)    1/2
  308.     ┴╥╥      $6┬       ┴ <- [(┴ /\ ═) >> 1]       (╔MMEDIATE)      1/2'5
  309. *   ╩═╨      $6├       ╨├ <- ┴DDRESS              (╔NDIRECT)       3/5
  310. *   ┴─├      $6─       ┴ <- (┴) + ═ + ├           (┴BSOLUTE)       3/4
  311. *   ╥╧╥      $6┼       ├<-┴0 & ┴<- (┴7=├ + ┴>>1)  (┴BSOLUTE)       3/6 
  312.     ╥╥┴      $6╞       ═ <- (═ >> 1) + (┴) + ├    (┴BSOLUTE)       3/6'5
  313. *   ┬╓╙      $70       IF ╓=1, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  314. *   ┴─├      $71       ┴ <- (┴) + ═ + ├           ((╔ND),┘)        2/5'1
  315.     ╩┴═      $72       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  316.     ╥╥┴      $73       ═ <- (═ >> 1) + (┴) + ├    ((╔ND),┘)        2/8'5
  317.     ╬╧╨      $74       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  318. *   ┴─├      $75       ┴ <- (┴) + ═ + ├           (┌-╨AGE,╪)       2/4
  319. *   ╥╧╥      $76       ├<-┴0 & ┴<- (┴7=├ + ┴>>1)  (┌-╨AGE,╪)       2/6
  320.     ╥╥┴      $77       ═ <- (═ >> 1) + (┴) + ├    (┌-╨AGE,╪)       2/6'5
  321. *   ╙┼╔      $78       ╔ <- 1                     (╔MPLIED)        1/2
  322. *   ┴─├      $79       ┴ <- (┴) + ═ + ├           (┴BSOLUTE,┘)     3/4'1
  323.     ╬╧╨      $7┴       [NO OPERATION]             (╔MPLIED)        1/2
  324.     ╥╥┴      $7┬       ═ <- (═ >> 1) + (┴) + ├    (┴BSOLUTE,┘)     3/7'5
  325.     ╬╧╨      $7├       [NO OPERATION]             (┴BSOLUTE,╪)     3/4'1
  326. *   ┴─├      $7─       ┴ <- (┴) + ═ + ├           (┴BSOLUTE,╪)     3/4'1
  327. *   ╥╧╥      $7┼       ├<-┴0 & ┴<- (┴7=├ + ┴>>1)  (┴BSOLUTE,╪)     3/7
  328.     ╥╥┴      $7╞       ═ <- (═ >> 1) + (┴) + ├    (┴BSOLUTE,╪)     3/7'5 
  329.     ╬╧╨      $80       [NO OPERATION]             (╔MMEDIATE)      2/2
  330. *   ╙╘┴      $81       ═ <- (┴)                   (╔ND,╪)          2/6
  331.     ╬╧╨      $82       [NO OPERATION]             (╔MMEDIATE)      2/2
  332.     ╙┴╪      $83       ═ <- (┴) /\ (╪)            (╔ND,╪)          2/6
  333. *   ╙╘┘      $84       ═ <- (┘)                   (┌-╨AGE)         2/3
  334. *   ╙╘┴      $85       ═ <- (┴)                   (┌-╨AGE)         2/3
  335. *   ╙╘╪      $86       ═ <- (╪)                   (┌-╨AGE)         2/3
  336.     ╙┴╪      $87       ═ <- (┴) /\ (╪)            (┌-╨AGE)         2/3 
  337. *   ─┼┘      $88       ┘ <- (┘) - 1               (╔MPLIED)        1/2
  338.     ╬╧╨      $89       [NO OPERATION]             (╔MMEDIATE)      2/2
  339. *   ╘╪┴      $8┴       ┴ <- (╪)                   (╔MPLIED)        1/2
  340.     ┴╬┼      $8┬       ═ <-[(┴)\/$┼┼] /\ (╪)/\(═) (╔MMEDIATE)      2/2^4
  341. *   ╙╘┘      $8├       ═ <- (┘)                   (┴BSOLUTE)       3/4
  342. *   ╙╘┴      $8─       ═ <- (┴)                   (┴BSOLUTE)       3/4
  343. *   ╙╘╪      $8┼       ═ <- (╪)                   (┴BSOLUTE)       3/4 
  344.     ╙┴╪      $8╞       ═ <- (┴) /\ (╪)            (┴BSOLUTE)       3/4
  345. *   ┬├├      $90       IF ├=0, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  346. *   ╙╘┴      $91       ═ <- (┴)                   ((╔ND),┘)        2/6
  347.     ╩┴═      $92       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  348.     ╙╚┴      $93       ═ <- (┴) /\ (╪) /\ (╨├╚+1) (┴BSOLUTE,╪)     3/6'3
  349. *   ╙╘┘      $94       ═ <- (┘)                   (┌-╨AGE,╪)       2/4
  350. *   ╙╘┴      $95       ═ <- (┴)                   (┌-╨AGE,╪)       2/4
  351.     ╙┴╪      $97       ═ <- (┴) /\ (╪)            (┌-╨AGE,┘)       2/4
  352. *   ╙╘╪      $96       ═ <- (╪)                   (┌-╨AGE,┘)       2/4
  353. *   ╘┘┴      $98       ┴ <- (┘)                   (╔MPLIED)        1/2
  354. *   ╙╘┴      $99       ═ <- (┴)                   (┴BSOLUTE,┘)     3/5
  355. *   ╘╪╙      $9┴       ╙ <- (╪)                   (╔MPLIED)        1/2
  356.     ╙╚╙      $9┬       ╪ <- (┴) /\ (╪), ╙ <- (╪)  (┴BSOLUTE,┘)     3/5
  357.                        ═ <- (╪) /\ (╨├╚+1)      
  358.     ╙╚┘      $9├       ═ <- (┘) /\ (╨├╚+1)        (┴BSOLUTE,┘)     3/5'3
  359. *   ╙╘┴      $9─       ═ <- (┴)                   (┴BSOLUTE,╪)     3/5
  360.     ╙╚╪      $9┼       ═ <- (╪) /\ (╨├╚+1)        (┴BSOLUTE,╪)     3/5'3
  361.     ╙╚┴      $9╞       ═ <- (┴) /\ (╪) /\ (╨├╚+1) (┴BSOLUTE,┘)     3/5'3
  362. *   ╠─┘      $┴0       ┘ <- ═                     (╔MMEDIATE)      2/2
  363. *   ╠─┴      $┴1       ┴ <- ═                     (╔ND,╪)          2/6
  364. *   ╠─╪      $┴2       ╪ <- ═                     (╔MMEDIATE)      2/2
  365.     ╠┴╪      $┴3       ┴ <- ═, ╪ <- ═             (╔ND,╪)          2/6
  366. *   ╠─┘      $┴4       ┘ <- ═                     (┌-╨AGE)         2/3
  367. *   ╠─┴      $┴5       ┴ <- ═                     (┌-╨AGE)         2/3
  368. *   ╠─╪      $┴6       ╪ <- ═                     (┌-╨AGE)         2/3
  369.     ╠┴╪      $┴7       ┴ <- ═, ╪ <- ═             (┌-╨AGE)         2/3
  370. *   ╘┴┘      $┴8       ┘ <- (┴)                   (╔MPLIED)        1/2
  371. *   ╠─┴      $┴9       ┴ <- ═                     (╔MMEDIATE)      2/2
  372. *   ╘┴╪      $┴┴       ╪ <- (┴)                   (╔MPLIED)        1/2
  373.     ╠╪┴      $┴┬       ╪04 <- (╪04) /\ ═04        (╔MMEDIATE)      1/2
  374.                        ┴04 <- (┴04) /\ ═04
  375. *   ╠─┘      $┴├       ┘ <- ═                     (┴BSOLUTE)       3/4
  376. *   ╠─┴      $┴─       ┴ <- ═                     (┴BSOLUTE)       3/4
  377. *   ╠─╪      $┴┼       ╪ <- ═                     (┴BSOLUTE)       3/4
  378.     ╠┴╪      $┴╞       ┴ <- ═, ╪ <- ═             (┴BSOLUTE)       3/4
  379. *   ┬├╙      $┬0       IF ├=1, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  380. *   ╠─┴      $┬1       ┴ <- ═                     ((╔ND),┘)        2/5'1
  381.     ╩┴═      $┬2       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  382.     ╠┴╪      $┬3       ┴ <- ═, ╪ <- ═             ((╔ND),┘)        2/5'1
  383. *   ╠─┘      $┬4       ┘ <- ═                     (┌-╨AGE,╪)       2/4
  384. *   ╠─┴      $┬5       ┴ <- ═                     (┌-╨AGE,╪)       2/4
  385. *   ╠─╪      $┬6       ╪ <- ═                     (┌-╨AGE,┘)       2/4
  386.     ╠┴╪      $┬7       ┴ <- ═, ╪ <- ═             (┌-╨AGE,┘)       2/4
  387. *   ├╠╓      $┬8       ╓ <- 0                     (╔MPLIED)        1/2
  388. *   ╠─┴      $┬9       ┴ <- ═                     (┴BSOLUTE,┘)     3/4'1
  389. *   ╘╙╪      $┬┴       ╪ <- (╙)                   (╔MPLIED)        1/2
  390.     ╠┴┼      $┬┬       ╪,╙,┴ <- (╙ /\ ═)          (┴BSOLUTE,┘)     3/4'1
  391. *   ╠─┘      $┬├       ┘ <- ═                     (┴BSOLUTE,╪)     3/4'1
  392. *   ╠─┴      $┬─       ┴ <- ═                     (┴BSOLUTE,╪)     3/4'1
  393. *   ╠─╪      $┬┼       ╪ <- ═                     (┴BSOLUTE,┘)     3/4'1
  394.     ╠┴╪      $┬╞       ┴ <- ═, ╪ <- ═             (┴BSOLUTE,┘)     3/4'1
  395. *   ├╨┘      $├0       (┘ - ═) -> ╬┌├             (╔MMEDIATE)      2/2
  396. *   ├═╨      $├1       (┴ - ═) -> ╬┌├             (╔ND,╪)          2/6
  397.     ╬╧╨      $├2       [NO OPERATION]             (╔MMEDIATE)      2/2
  398.     ─├╨      $├3       ═ <- (═)-1, (┴-═) -> ╬┌├   (╔ND,╪)          2/8
  399. *   ├╨┘      $├4       (┘ - ═) -> ╬┌├             (┌-╨AGE)         2/3
  400. *   ├═╨      $├5       (┴ - ═) -> ╬┌├             (┌-╨AGE)         2/3
  401. *   ─┼├      $├6       ═ <- (═) - 1               (┌-╨AGE)         2/5
  402.     ─├╨      $├7       ═ <- (═)-1, (┴-═) -> ╬┌├   (┌-╨AGE)         2/5
  403. *   ╔╬┘      $├8       ┘ <- (┘) + 1               (╔MPLIED)        1/2
  404. *   ├═╨      $├9       (┴ - ═) -> ╬┌├             (╔MMEDIATE)      2/2
  405. *   ─┼╪      $├┴       ╪ <- (╪) - 1               (╔MPLIED)        1/2
  406.     ╙┬╪      $├┬       ╪ <- (╪)/\(┴) - ═          (╔MMEDIATE)      2/2
  407. *   ├╨┘      $├├       (┘ - ═) -> ╬┌├             (┴BSOLUTE)       3/4
  408. *   ├═╨      $├─       (┴ - ═) -> ╬┌├             (┴BSOLUTE)       3/4
  409. *   ─┼├      $├┼       ═ <- (═) - 1               (┴BSOLUTE)       3/6
  410.     ─├╨      $├╞       ═ <- (═)-1, (┴-═) -> ╬┌├   (┴BSOLUTE)       3/6
  411. *   ┬╬┼      $─0       IF ┌=0, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  412. *   ├═╨      $─1       (┴ - ═) -> ╬┌├             ((╔ND),┘)        2/5'1
  413.     ╩┴═      $─2       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  414.     ─├╨      $─3       ═ <- (═)-1, (┴-═) -> ╬┌├   ((╔ND),┘)        2/8
  415.     ╬╧╨      $─4       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  416. *   ├═╨      $─5       (┴ - ═) -> ╬┌├             (┌-╨AGE,╪)       2/4
  417. *   ─┼├      $─6       ═ <- (═) - 1               (┌-╨AGE,╪)       2/6
  418.     ─├╨      $─7       ═ <- (═)-1, (┴-═) -> ╬┌├   (┌-╨AGE,╪)       2/6
  419. *   ├╠─      $─8       ─ <- 0                     (╔MPLIED)        1/2
  420. *   ├═╨      $─9       (┴ - ═) -> ╬┌├             (┴BSOLUTE,┘)     3/4'1
  421.     ╬╧╨      $─┴       [NO OPERATION]             (╔MPLIED)        1/2 
  422.     ─├╨      $─┬       ═ <- (═)-1, (┴-═) -> ╬┌├   (┴BSOLUTE,┘)     3/7
  423.     ╬╧╨      $─├       [NO OPERATION]             (┴BSOLUTE,╪)     3/4'1
  424. *   ├═╨      $──       (┴ - ═) -> ╬┌├             (┴BSOLUTE,╪)     3/4'1
  425. *   ─┼├      $─┼       ═ <- (═) - 1               (┴BSOLUTE,╪)     3/7
  426.     ─├╨      $─╞       ═ <- (═)-1, (┴-═) -> ╬┌├   (┴BSOLUTE,╪)     3/7
  427. *   ├╨╪      $┼0       (╪ - ═) -> ╬┌├             (╔MMEDIATE)      2/2
  428. *   ╙┬├      $┼1       ┴ <- (┴) - ═ - ~├          (╔ND,╪)          2/6
  429.     ╬╧╨      $┼2       [NO OPERATION]             (╔MMEDIATE)      2/2
  430.     ╔╙┬      $┼3       ═ <- (═) - 1,┴ <- (┴)-═-~├ (╔ND,╪)          3/8'1
  431. *   ├╨╪      $┼4       (╪ - ═) -> ╬┌├             (┌-╨AGE)         2/3
  432. *   ╙┬├      $┼5       ┴ <- (┴) - ═ - ~├          (┌-╨AGE)         2/3
  433. *   ╔╬├      $┼6       ═ <- (═) + 1               (┌-╨AGE)         2/5
  434.     ╔╙┬      $┼7       ═ <- (═) - 1,┴ <- (┴)-═-~├ (┌-╨AGE)         2/5  
  435. *   ╔╬╪      $┼8       ╪ <- (╪) +1                (╔MPLIED)        1/2
  436. *   ╙┬├      $┼9       ┴ <- (┴) - ═ - ~├          (╔MMEDIATE)      2/2
  437. *   ╬╧╨      $┼┴       [NO OPERATION]             (╔MPLIED)        1/2
  438.     ╙┬├      $┼┬       ┴ <- (┴) - ═ - ~├          (╔MMEDIATE)      1/2
  439. *   ╙┬├      $┼─       ┴ <- (┴) - ═ - ~├          (┴BSOLUTE)       3/4
  440. *   ├╨╪      $┼├       (╪ - ═) -> ╬┌├             (┴BSOLUTE)       3/4
  441. *   ╔╬├      $┼┼       ═ <- (═) + 1               (┴BSOLUTE)       3/6
  442.     ╔╙┬      $┼╞       ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE)       3/6
  443. *   ┬┼╤      $╞0       IF ┌=1, ╨├ = ╨├ + OFFSET   (╥ELATIVE)       2/2'2
  444. *   ╙┬├      $╞1       ┴ <- (┴) - ═ - ~├          ((╔ND),┘)        2/5'1
  445.     ╩┴═      $╞2       [LOCKS UP MACHINE]         (╔MPLIED)        1/-
  446.     ╔╙┬      $╞3       ═ <- (═) - 1,┴ <- (┴)-═-~├ ((╔ND),┘)        2/8
  447.     ╬╧╨      $╞4       [NO OPERATION]             (┌-╨AGE,╪)       2/4
  448. *   ╙┬├      $╞5       ┴ <- (┴) - ═ - ~├          (┌-╨AGE,╪)       2/4
  449. *   ╔╬├      $╞6       ═ <- (═) + 1               (┌-╨AGE,╪)       2/6
  450.     ╔╙┬      $╞7       ═ <- (═) - 1,┴ <- (┴)-═-~├ (┌-╨AGE,╪)       2/6
  451. *   ╙┼─      $╞8       ─ <- 1                     (╔MPLIED)        1/2
  452. *   ╙┬├      $╞9       ┴ <- (┴) - ═ - ~├          (┴BSOLUTE,┘)     3/4'1
  453.     ╬╧╨      $╞┴       [NO OPERATION]             (╔MPLIED)        1/2
  454.     ╔╙┬      $╞┬       ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE,┘)     3/7
  455.     ╬╧╨      $╞├       [NO OPERATION]             (┴BSOLUTE,╪)     3/4'1
  456. *   ╙┬├      $╞─       ┴ <- (┴) - ═ - ~├          (┴BSOLUTE,╪)     3/4'1
  457. *   ╔╬├      $╞┼       ═ <- (═) + 1               (┴BSOLUTE,╪)     3/7
  458.     ╔╙┬      $╞╞       ═ <- (═) - 1,┴ <- (┴)-═-~├ (┴BSOLUTE,╪)     3/7
  459.  
  460. '1 - ┴DD ONE IF ADDRESS CROSSES A PAGE BOUNDRY.
  461. '2 - ┴DD 1 IF BRANCH SUCCEEDS, OR 2 IF INTO ANOTHER PAGE.
  462. '3 - ╔F PAGE BOUNDRY CROSSED THEN ╨├╚+1 IS JUST ╨├╚
  463. '4 - ╙OURCES DISPUTED ON EXACT OPERATION, OR SOMETIMES DOES NOT WORK.
  464. '5 - ╞ULL EIGHT BIT ROTATION (WITH CARRY)
  465.  
  466. ╙OURCES:
  467.   ╨ROGRAMMING THE 6502, ╥ODNEY ┌AKS, (C) 1983 ╙YBEX
  468.   ╨AUL ╧JALA, ╨OST TO ├OMP.╙YS.├BM (PO87553@CS.TUT.FI / ALBERT@CC.TUT.FI)
  469.   ─ ╩OHN ═CKENNA, ╨OST TO ├OMP.╙YS.├BM (GUDJM@UNIWA.UWA.OZ.AU)
  470.  
  471. ├OMPILED BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
  472. ==============================================================================
  473. ╙IMPLE ╚IRES ╠INE ─RAWING ╨ACKAGE FOR THE ├-128 80-├OLUMN ╙CREEN
  474.  
  475. ├OPYRIGHT (C) 1992 ├RAIG ┬RUCE <F2RX@JUPITER.SUN.CSD.UNB.CA>
  476.  
  477. 1. ╟╥┴╨╚╔├╙ ╨┴├╦┴╟┼ ╧╓┼╥╓╔┼╫
  478.  
  479. ╘HE GRAPHICS PACKAGE THIS ARTICLE EXPLAINS IS ┬╠╧┴─ED INTO MEMORY AT ADDRESS
  480. $1300 ON BANK 15 AND HAS THREE ENTRY POINTS:
  481.  
  482. $1300 = MOVE THE PIXEL CURSOR OR DRAW A LINE: .┴╪=X, .┘=Y, .├=CMD
  483. $1303 = ACTIVATE GRAPHICS MODE AND CLEAR THE SCREEN
  484. $1306 = EXIT GRAPHICS MODE AND RELOAD THE CHARACTER SET
  485.  
  486. ╘O MOVE THE PIXEL CURSOR TO THE START POINT OF A LINE, LOAD THE .┴╪ REGISTERS
  487. WITH THE ╪ COORDINATE (0-639), LOAD THE .┘ REGISTER WITH THE ┘ COORDINATE
  488. (0-199), CLEAR THE CARRY FLAG, AND CALL $1300.  (═AKE SURE THAT ┬ANK 15 IS IN
  489. CONTEXT).  ╘HIS CAN BE DONE IN ┬┴╙╔├ AS FOLLOWS:
  490.  
  491. ╙┘╙ 4864, ╪ ┴╬─ 255, ╪/256, ┘, 0
  492.  
  493. ╘O DRAW A LINE FROM THE PIXEL CURSOR LOCATION TO A GIVEN POINT, LOAD THE .┴╪
  494. AND .┘ REGISTERS LIKE BEFORE, SET THE CARRY FLAG, AND CALL $1300.  ╘HE PIXEL
  495. CURSOR WILL THEN BE SET TO THE END POINT OF THE LINE JUST DRAWN, SO YOU DO NOT
  496. HAVE TO SET IT AGAIN IF YOU ARE DRAWING A CONTINUOUS OBJECT (LIKE A SQUARE).
  497.  
  498. ╙┘╙ 4864, ╪ ┴╬─ 255, ╪/256, ┘, 1
  499.  
  500. ╘HE ACTIVATE AND EXIT ROUTINES ARE CALLED WITHOUT ANY PARAMETERS AND WORK VERY
  501. SIMPLY.  ┘OU SHOULD BE SURE TO CALL EXIT BEFORE RETURNING TO THE PROGRAM
  502. EDITING MODE OR YOU WILL NOT BE ABLE TO SEE WHAT YOU ARE TYPING.
  503.  
  504. ┴ ┬┴╙╔├ DEMONSTRATION PROGRAM IS ALSO INCLUDED IN THE ╒╒ SECTION FOR THIS
  505. PACKAGE.  ╔T STARTS BY PUTTING THE PIXEL CURSOR AT THE CENTER OF THE SCREEN
  506. AND THEN PICKS A RANDOM POINT TO DRAW TO, AND REPEATS UNTIL YOU PRESS A KEY
  507. TO STOP IT.  ╞OR AN INTERESTING EFFECT, PUT A CALL TO $1303 IMMEDIATELY BEFORE
  508. THE CALL TO DRAW THE LINE.
  509.  
  510. ╘HE POINT PLOTTING SPEED IS ABOUT 4,100 PIXELS PER SECOND AND THE LINE DRAWING
  511. SPEED IS A BIT SLOWER THAN THIS BECAUSE OF ALL OF THE CALCULATIONS THAT HAVE
  512. TO BE DONE TO DRAW A LINE.  ╘HERE ARE FASTER PIXEL PLOTTING AND LINE DRAWING
  513. ALGORITHMS THAN THE ONES IMPLEMENTED HERE, BUT THAT IS MATERIAL FOR A FUTURE
  514. ARTICLE.
  515.  
  516. 2. ╔╬╘╥╧─╒├╘╔╧╬ ╘╧ ╘╚┼ ╓─├
  517.  
  518. ╨ROGRAMMING THE 8563 ╓IDEO ─ISPLAY ├ONTROLLER IS QUITE STRAIGHT FORWARD.  ┘OU
  519. ACCESS IT A BIT INDIRECTLY, BUT IT CAN STILL BE DONE AT RELATIVELY HIGH SPEEDS
  520. USING MACHINE LANGUAGE.  ╘HE ╓─├ CONTAINS 37 CONTROL REGISTERS AND FROM 16╦ TO
  521. 64╦ OF DEDICATED DISPLAY MEMORY THAT IS SEPARATE FROM THE MAIN PROCESSOR.  ╘HE
  522. MEMORY MUST BE ACCESSED THROUGH THE ╓─├ REGISTERS.
  523.  
  524. ╘HE IMPORTANT ╓─├ REGISTERS FOR THIS EXERCISE ARE:
  525.  
  526. ╥┼╟   ┬╔╘╙   ─┼╙├
  527. ---   ----   ----
  528. $12   7-0    ╓─├ ╥┴═ ADDRESS HIGH BYTE
  529. $13   7-0    ╓─├ ╥┴═ ADDRESS LOW BYTE
  530. $18   7      ┬LOCK COPY / BLOCK FILL MODE SELECT
  531. $19   7      ┬ITMAP / ├HARACTER MODE SELECT
  532. $19   6      ├OLOR / ═ONOCHROME MODE SELECT
  533. $1A   7-4    ╞OREGROUND COLOR
  534. $1A   3-0    ┬ACKGROUND COLOR
  535. $1E   7-0    ├OPY / FILL REPETITION COUNT
  536. $1F   7-0    ╓─├ ╥┴═ DATA READ / WRITE
  537.  
  538. ┘OU ACCESS THE ╓─├ CHIP REGISTERS THOUGH ADDRESSES $─╞00 AND $─╞01 ON BANK 15.
  539. ╠OCATION $─╞00 SELECTS THE ╓─├ REGISTER TO USE ON WRITE AND RETURNS THE ╓─├
  540. STATUS ON READ.  ╘HE ONLY IMPORTANT STATUS INFORMATION IS BIT 7 (VALUE $80)
  541. WHICH IS THE "READY" FLAG.  ╘HE FOLLOWING TWO SUBROUTINES READ OR WRITE THE
  542. VALUE IN .┴ TO ╓─├ REGISTER NUMBER .╪:
  543.  
  544. ╓DC╥EAD:  STX $DF00                  ╓DC╫RITE: STX $DF00
  545. ╫AIT╠OOP: BIT $DF00                  ╫AIT╠OOP: BIT $DF00
  546.           BPL ╫AIT╠OOP                         BPL ╫AIT╠OOP
  547.           LDA $DF01                            STA $DF01
  548.           RTS                                  RTS
  549.  
  550. ╧NCE THE CURRENT ╓─├ REGISTER IS SELECTED AT $DF00, IT REMAINS SELECTED.  ┘OU
  551. MAY READ OR WRITE IT THOUGH $DF01 AS MANY TIMES AS YOU LIKE AS LONG AS YOU
  552. WAIT FOR THE ╓─├ TO BE "READY" BETWEEN ACCESSES.
  553.  
  554. ╔N ORDER TO ACCESS THE ╓─├ ╥┴═, YOU MUST FIRST PUT THE HIGH AND LOW BYTES OF
  555. THE ╓─├ ╥┴═ ADDRESS INTO REGISTERS $12 AND $13 (HIGH BYTE FIRST) AND THEN
  556. READ OR WRITE THROUGH REGISTER $1F TO READ OR WRITE THE DATA IN THE ╓─├ ╥┴═.
  557. ┴FTER EACH ACCESS TO REGISTER $1F, THE ╓─├ ╥┴═ ADDRESS IS INCREMENTED BY ONE.
  558. ╙O, IF YOU REPEATEDLY READ OR WRITE TO REGISTER $1F YOU CAN READ OR WRITE A
  559. CHUNK OF ╓─├ MEMORY VERY QUICKLY.
  560.  
  561. 3. ┼╬╘┼╥╔╬╟ ╟╥┴╨╚╔├╙ ═╧─┼
  562.  
  563. ┴CTIVATING THE GRAPHICS MODE OF THE ╓─├ IS VERY SIMPLE - YOU JUST HAVE TO SET
  564. BIT 7 OR ╓─├ REGISTER $19 AND POOF!  ┘OU SHOULD ALSO CLEAR BIT 6 OF THAT
  565. REGISTER TO DISABLE THE CHARACTER COLOR MODE.  ╘HIS GRAPHICS PACKAGE SUPPORTS
  566. ONLY MONOCHROME GRAPHICS SINCE THE STANDARD 16╦ ╓─├ DOES NOT HAVE ENOUGH SPACE
  567. TO HOLD BOTH THE BITMAP AND THE 8*8 PIXEL CELL ATTRIBUTES.  ╘HE 640*200 PIXEL
  568. DISPLAY TAKES 128,000 BITS OR 16,000 BYTES.  ╘HIS LEAVES 384 BYTES OF ╓─├ ╥┴═
  569. THAT IS NOT NEEDED BY THE BITMAP BUT IT IS NOT LARGE ENOUGH TO DO ANYTHING
  570. WITH, SO IT IS WASTED.
  571.  
  572. ╫HEN YOU DISABLE THE CHARACTER COLOR MODE, THE ╓─├ TAKES ITS FOREGROUND AND
  573. BACKGROUND COLOR VALUES FROM REGISTER $1A.  ╘HE FOREGROUND COLOR IS WHAT COLOR
  574. THE "1" BITS IN THE BITMAP WILL BE DISPLAYED IN AND THE BACKGROUND COLOR, THE
  575. "0" BITS.
  576.  
  577. ╬OW THAT THE BITMAP MODE IS SET UP, WE MUST CLEAR THE ╓─├ MEMORY LOCATIONS 0
  578. TO 15999 (DECIMAL) TO CLEAR THE BITMAP SCREEN.  ╘HIS CAN BE DONE VERY QUICKLY
  579. USING THE ╓─├ FILL MODE.  ╔F YOU POKE A VALUE INTO ╓─├ REGISTER NUMBER $1E,
  580. THE ╓─├ WILL FILL ITS MEMORY FROM THE LOCATION CURRENTLY IN THE ╓─├ ╥┴═
  581. ADDRESS REGISTERS FOR THE NUMBER OF BYTES YOU JUST POKED INTO REGISTER $1E
  582. WITH THE VALUE THAT YOU LAST POKED INTO THE ╓─├ ╥┴═ DATA REGISTER.  (╘HIS IS
  583. ASSUMING THAT "FILL" MODE IS SELECTED IN REGISTER $18).  ╔F YOU POKE A 0 INTO
  584. THE REPEAT REGISTER IT MEANS TO FILL 256 BYTES.
  585.  
  586. ╙O, TO CLEAR THE BITMAP, POKE A ZERO INTO BOTH OF THE ╓─├ ╥┴═ ADDRESS
  587. REGISTERS SINCE THE BITMAP STARTS AT LOCATION 0.  ╘HEN POKE A VALUE OF 0 INTO
  588. ╓─├ ╥┴═ DATA REGISTER.  ╘HIS SETS THE FILL VALUE TO 0 AND POKES THE FIRST ╓─├
  589. ╥┴═ LOCATION.  ╘HEN, GO INTO A LOOP AND PUT A ZERO INTO THE ╓─├ REPEAT
  590. REGISTER 63 TIMES.  ╘HIS WILL FILL 63 CONTIGUOUS CHUNKS OF 256 BYTES EACH.
  591. ╫E END UP FILLING 16,129 BYTES, BUT THAT IS NOT A PROBLEM SINCE WE HAVE 384
  592. "SAFETY" BYTES AT THE END OF THE BITMAP.  ╔NTERNALLY, THE ╓─├ WILL FILL ITS
  593. MEMORY AT A RATE OF ABOUT 1 ═EGABYTE PER SECOND (IF ╔ REMEMBER MY TEST RESULTS
  594. CORRECTLY), SO CLEARING THE SCREEN IS A ╨─╤ OPERATION.
  595.  
  596. 4. ┼╪╔╘╔╬╟ ╟╥┴╨╚╔├╙ ═╧─┼
  597.  
  598. ╘O EXIT FROM GRAPHICS MODE WE HAVE TO RELOAD THE CHARACTER SET FROM THE ╥╧═
  599. ON BANK 14 AND WE HAVE TO GO BACK INTO CHARACTER MODE AND CLEAR THE TEXT
  600. SCREEN.  ╘HE KERNEL PROVIDES ITS OWN CHARACTER RELOAD ROUTINE SO ╔ USED THAT.
  601. ╘HE ONLY PROBLEM WITH IT IS THAT IT IS A LOT SLOWER THAN IT HAS TO BE.  ╔T
  602. TAKES ABOUT 0.45 SECONDS WHEREAS THE SAME JOB CAN BE DONE IN ABOUT 0.09
  603. SECONDS.  ╘HE KERNEL IS SO SLOW BECAUSE IT USES THE KERNEL ╔╬─╞┼╘├╚ NONSENSE.
  604.  
  605. ╘HEN YOU JUST SET THE BITMAP MODE BIT TO ZERO AND THE CHARACTER COLOR MODE TO
  606. ONE.  ╘HIS GETS YOU BACK TO NORMAL CHARACTER MODE.  ┘OU ALSO HAVE TO CLEAR THE
  607. TEXT SCREEN SINCE IT WILL BE FILLED WITH GARBAGE FROM THE GRAPHING.
  608.  
  609. 5. ╨╧╔╬╘ ╨╠╧╘╘╔╬╟
  610.  
  611. ╘HE PIXELS ON THE SCREEN ACCESSED BY THEIR ╪ AND ┘ COORDINATES, 0 <= ╪ <= 639,
  612. 0 <= ┘ <= 199.  ╘HE FORMULA TO CALCULATE THE BYTE ADDRESS IN THE ╓─├ ╥┴═ GIVEN
  613. THE ╪ AND ┘ COORDINATES IS MADE SIMPLE BY THE MAPPING OF BYTES TO THE PIXELS
  614. ON THE SCREEN.  ╘HE BYTES OF ╓─├ MEMORY GO ACROSS THE SCREEN RATHER THAN IN
  615. 8*8 CELLS LIKE THE ╓╔├ SCREEN.  ┼ACH PIXEL ROW IS DEFINED BY 80 CONSECUTIVE
  616. BYTES OF ╓─├ ╥┴═.
  617.  
  618. ╘HE FORMULA FOR THE BYTE ADDRESS OF A PIXEL IS: ┴─=┘*80+╔╬╘(╪/8), AND THE
  619. FORMULA FOR THE BIT NUMBER IS SIMPLY ┬╔=╪ ┴╬─ 7.  ╘HE BIT NUMBER CAN BE USED
  620. AS AN INDEX INTO A TABLE OF BIT VALUES: [$80,$40,$20,$10,$08,$04,$02,$01],
  621. SUCH THAT INDEX 0 CONTAINS $80, SINCE THE HIGHEST BIT IS THE LEFTMOST BIT.
  622.  
  623. ├ALCULATING THE BIT NUMBER AND LOOKING UP THE BIT VALUE IS VERY EASY TO DO IN
  624. MACHINE LANGUAGE, BUT THE BYTE ADDRESS CALCULATION REQUIRES A LITTLE MORE
  625. WORK.  ╞IRST WE HAVE TO MULTIPLY THE ┘ VALUE BY 80, USING A 16-BIT WORD FOR
  626. STORAGE.  ╘HIS IS DONE BY SHIFTING THE ┘ VALUE LEFT TWICE, ADDING THE ORIGINAL
  627. ┘ VALUE, AND SHIFTING LEFT FOUR MORE TIMES.  ╘HEN WE HAVE TO SHIFT THE ╪ VALUE
  628. RIGHT BY THREE USING A 16-BIT WORD FOR STORAGE TO GET ╔╬╘(╪/8), AND WE ADD THE
  629. TWO RESULTS TOGETHER AND WE HAVE THE BYTE ADDRESS.
  630.  
  631. ╘O PLOT THE POINT, WE HAVE TO PEEK INTO THE ╓─├ ╥┴═ AT THE BYTE ADDRESS TO SEE
  632. WHAT IS "BEHIND" THE PIXEL WE WANT TO PLOT.  ╘HEN ╧╥ THE NEW BIT VALUE ON TO
  633. THE "BACKGROUND" VALUE AND POKE THE RESULT BACK INTO ╓─├ ╥┴═ AT THE BYTE
  634. ADDRESS.  ╒NFORTUNATELY, SINCE THE ╓─├ ╥┴═ ADDRESS REGISTER AUTO-INCREMENTS
  635. AFTER EACH REFERENCE, WE WILL HAVE TO SET IT TWICE - ONCE FOR THE READ AND
  636. ONCE FOR THE WRITE.  ╘HAT MEANS THAT THE ╓─├ REGISTERS HAVE TO BE ACCESSED SIX
  637. TIMES FOR EACH PIXEL.  ╞ORTUNATELY, THE ╓─├ OPERATES AT ITS HIGHEST SPEED IN
  638. MONOCHROME BITMAP MODE (IT HAS LESS WORK TO DO THAN IN COLOR CHARACTER MODE,
  639. SO IT IS ABLE TO PAY MORE ATTENTION TO THE ├╨╒).
  640.  
  641. ┼FFECTS OTHER THAN JUST PLOTTING THE POINT CAN BE ACHIEVED BY USING FUNCTIONS
  642. OTHER THAN ╧╥ TO PUT THE POINT ON THE BACKGROUND.  ┼╧╥ WOULD "FLIP" THE PIXEL,
  643. AND ┴╬─-╬╧╘ (ACHIEVED BY ╠─┴ BITVAL : ┼╧╥ #$FF : ┴╬─ BACKGROUND) WOULD ERASE
  644. THE PIXEL.
  645.  
  646. 6. ╠╔╬┼ ─╥┴╫╔╬╟
  647.  
  648. ╘HE LINE DRAWING ROUTINE THAT IS IMPLEMENTED IN THE PACKAGE IS GIVEN BY THE
  649. FOLLOWING ┬┴╙╔├ CODE (IN FACT, ╔ PROGRAMMED IT IN ┬┴╙╔├ FIRST TO GET IT
  650. WORKING; OF COURSE, THE ┬┴╙╔├ VERSION IS AS SLOW AS HELL):
  651.  
  652. 10 DX=X-LX:DY=Y-LY
  653. 20 IF ABS(DX)>ABS(DY) THEN BEGIN R=DX:GY=DY/ABS(DX):GX=SGN(DX)
  654. 30 BEND:ELSE R=DY:GX=DX/ABS(DY):GY=SGN(DY)
  655. 40 PX=LX+0.5:PY=LY+0.5
  656. 50 FORI=1TO ABS(R): <╨╠╧╘ ╨╪,╨┘> :PX=PX+GX:PY=PY+GY:NEXT
  657. 60 LX=X:LY=Y
  658.  
  659. ╘HIS IMPLEMENTS THE ┬ASIC ╔NCREMENTAL ┴LGORITHM FOR RASTER LINE DRAWING.  ╘HE
  660. "LX" AND "LY" ARE THE POSITION OF THE PIXEL CURSOR AND "X" AND "Y" ARE THE
  661. COORDINATES TO DRAW THE LINE TO.  ╘HE "DX" AND "DY" ARE THE DIFFERENCES IN THE
  662. ╪ AND ┘ DIRECTIONS.  ╘HE IDEA IS THAT WE WILL INCREMENT THE PIXEL CURSOR BY
  663. A CONSTANT OF 1 IN ONE DIRECTION AND BY A FRACTION 0.0 <= G <= 1.0 IN THE
  664. OTHER DIRECTION.  ╘HIS FRACTION IS ACTUALLY THE SLOPE OF THE LINE.
  665.  
  666. ╠INES 20 AND 30 FIGURE OUT THE INCREMENTS FOR THE ╪ AND ┘ DIRECTIONS ("GX" AND
  667. "GY").  ╘HESE ARE SIGNED FRACTIONAL NUMBERS ON THE RANGE -1.0 <= G <= 1.0.
  668. ╫E CHECK THE "DX" AND "DY" TO SEE WHICH HAS THE GREATEST ABSOLUTE VALUE AND
  669. THAT WILL BE THE DIRECTION THAT IS INCREMENTED BY 1, 0, OR -1 AND THE OTHER
  670. DIRECTION WILL INCREMENT BY THE (FRACTIONAL) SLOPE OF THE LINE WITH RESPECT TO
  671. THE OTHER DIRECTION.
  672.  
  673. ╠INE 40 STARTS THE PLOTTING AT THE CURRENT PIXEL CURSOR LOCATION ╨╠╒╙ 0.5.  ╫E
  674. ADD 1/2 TO THE ╪ AND ┘ POSITIONS TO "CENTER" ONTO THE PIXEL CELL.  ╔F WE
  675. DIDN'T DO THIS, WE WOULD NOTICE DIS-SYMMETRY IN PLOTTING TO THE LEFT AND TO
  676. THE RIGHT.  ╞OR EXAMPLE, 50.0 - 0.3 = 49.7 AND 50.0 + 0.3 = 50.3.  ╔F WE
  677. TRUNCATE THESE VALUES, GOING LEFT BY 0.3 MOVES US TO POSITION 49 WHEREAS GOING
  678. RIGHT BY 0.3 MAKES US STAY IN THE SAME POSITION.  ╘HIS IS DIS-SYMMETRY AND
  679. MAKES PLOTS LOOK A BIT OFF.  ┴DDING 0.5 CORRECTS THE PROBLEM.
  680.  
  681. ╠INE 50 GOES INTO A LOOP FOR THE LONGEST DIMENSION OF THE LINE (THE ONE
  682. INCREMENTED BY 1).  ╘HE <╨╠╧╘ ╨╪,╨┘> IS NOT EXACTLY ┬┴╙╔├; YOU SUBSTITUTE
  683. THE CALL TO THE POINT PLOT ROUTINE DESCRIBED IN THE PREVIOUS SECTION.  ╔T
  684. REPEATEDLY ADDS THE ╪ AND ┘ INCREMENT VALUES UNTIL THE LINE IS FINISHED.
  685. ╘HIS ALGORITHM DRAWS THE LINE IN THE DIRECTION THAT YOUR END POINTS IMPLY.
  686.  
  687. 6.1. ╞╥┴├╘╔╧╬┴╠ ╬╒═┬┼╥ ╥┼╨╥┼╙┼╬╘┴╘╔╧╬
  688.  
  689. ╘HERE ARE ONLY TWO REAL COMPLICATIONS TO THE MACHINE LANGUAGE IMPLEMENTATION
  690. ARE THE REPRESENTATION OF THE SIGNED FRACTIONAL NUMBERS AND THE DIVISION OF
  691. THE FRACTIONAL NUMBERS.  ╘O REPRESENT THE NUMBERS ╔ USE A 32-BIT FORMAT WITH
  692. A 16-BIT SIGNED INTEGER PORTION (-32768 TO +32767) AND A 16-BIT FRACTIONAL
  693. PORTION (0.0 TO 0.99998474 IN 0.00001526 INCREMENTS).  ╘HE WEIGHT VALUES OF
  694. THE BIT POSITIONS ARE AS FOLLOWS:
  695.  
  696. ╨╧╙    31 ... 22 21 20 19 18 17 16  15  14  13  12    11   10     9 ...      0
  697. ╓┴╠ 32768 ... 64 32 16  8  4  2  1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 ...1/65536
  698.  
  699. ╞OR EXAMPLE, 0...00001011101.10011010000...0 (NOTICE THE ┬╔╬┴╥┘ POINT) IS
  700. 64 + 16 + 8 + 4 + 1 + 1/2 + 1/16 + 1/32 + 1/128 = 93.6015625 IN DECIMAL.  ╧R,
  701. AS A SHORT CUT, YOU CAN CONSIDER THE INTEGER 16 BITS AND THE FRACTIONAL 16
  702. BITS AS INDEPENDENT WORDS AND ADD 1/65536TH OF THE SECOND TO THE FIRST.  ╘HUS,
  703. FOR THE EXAMPLE ABOVE, THE QUANTITY IS 93 + (32768+4096+2048+512)/65536 =
  704. 93.6015625.  (╟OOD, THEY BOTH MATCH).  ╘HE FIRST CALCULATION USES TRUE BASE 2
  705. WHEREAS THE SECOND CALCULATION USES BASE 65536.
  706.  
  707. ╘WO'S COMPLEMENT REPRESENTATION IS USED TO ACHIEVE SIGNEDNESS (,╨ARK!).  ╫E
  708. SHOULD ALL KNOW ABOUT TWO'S COMP.  ╫ELL, IT WORKS JUST FINE FOR FRACTIONAL
  709. BINARY NUMBERS AS WELL.  ╔N FACT, IT MAKES NO DIFFERENCE AT ALL.  ┘OU CAN JUST
  710. THINK OF THE QUANTITY AS AN INTEGER NUMBER OF 65536'S OF A PIXEL AND YOU GET
  711. THE INTEGER OPERATIONS OF COMPLEMENT, ADD, AND SUBTRACT FOR FREE.  ╘HE EASY
  712. WAY TO GET THE TWO'S COMP. REPRESENTATION OF A NUMBER IS TO TAKE THE POSITIVE
  713. BINARY IMAGE OF THE NUMBER AND SUBTRACT IT FROM 0 (THIS MAKES PERFECT SENSE
  714. SINCE 0 - X = -X).
  715.  
  716. ╞RACTIONAL BINARY DIVISION IS A LITTLE MORE COMPLICATED.  ╘HERE IS NO PROBLEM
  717. WITH THE BINARY POINT, SINCE THE LAWS OF MATHEMATICS SAY WE CAN MULTIPLY THE
  718. TOP AND BOTTOM BY THE SAME QUANTITY (LIKE 65536) WITHOUT CHANGING THE RESULT,
  719. BUT HANDLING THE TWO'S COMPLEMENT IS A PROBLEM.  ╫HAT ╔ DID WAS FIGURE OUT
  720. WHAT THE SIGN OF THE RESULT OF THE DIVISION WAS GOING TO BE (BY ┼╧╥ING THE
  721. SIGN BITS TOGETHER) AND THEN CONVERTED THE TWO OPERANDS TO THEIR POSITIVE
  722. VALUE IF THEY WERE ORIGINALLY NEGATIVE.  ╘HIS LETS ME PERFORM A 32-BIT
  723. UNSIGNED DIVISION OPERATION AND THEN ╔ CONVERT THE RESULT TO A NEGATIVE IF THE
  724. RESULT IS SUPPOSED TO BE NEGATIVE.  ╘HE 32-BIT DIVIDE IS NOT ALL THAT
  725. COMPLICATED; IT IS DONE THE SAME WAY THAT YOU WOULD DO IT ON PAPER (REMEMBER
  726. THOSE DAYS) EXCEPT YOU USE BINARY DIGITS.  ╘HE DIVIDE SUBROUTINE DOES NOT
  727. EXACTLY RIVAL SUPERCOMPUTER SPEEDS, BUT IT DOES GET THE JOB DONE.
  728.  
  729. 6.2. ═┴├╚╔╬┼ ╠┴╬╟╒┴╟┼ ╧╨┼╥┴╘╔╧╬
  730.  
  731. ╫HILE DRAWING THE LINE, THE ╪ AND ┘ COORDINATES ARE 32-BIT SIGNED FRACTIONAL
  732. NUMBERS AS WELL AS THE "GX" AND "GY" VECTOR COMPONENTS ("GO" VALUES).  ╠INES
  733. 20 AND 30 REQUIRE QUITE A BIT OF WORK IN 6502 MACHINE LANGUAGE AND USE THE
  734. 32-BIT ADD, SUBTRACT, 2'S COMPLEMENT, AND DIVIDE OPERATIONS DESCRIBED IN THE
  735. PREVIOUS SECTION.  ╘O FIND THE ┴┬╙OLUTE VALUE OF A NUMBER, CHECK TO SEE
  736. WHETHER IT IS POSITIVE OR NEGATIVE.  ╔F IT IS POSITIVE, YOU ARE DONE.  ╔F IT
  737. IS NEGATIVE, JUST DO A 2'S COMPLEMENT ON IT (MAKES SENSE: 0 - (-X) = X).
  738.  
  739. ╠INE 40 IS DONE BY SIMPLY TAKING THE PIXEL CURSOR ╪ AND ┘ COORDINATES (WHICH
  740. ARE STORED AS UNSIGNED INTEGERS AND ARE REMEMBERED BETWEEN LINE DRAW CALLS)
  741. AND PUT THEM INTO THE HIGH WORD OF A 32-BIT FIELD AND THEN PUT $8000 (32768)
  742. INTO THE LOW WORD (WHICH GIVES ╓ + 1/2).
  743.  
  744. ╠INE 50 IS EASILY IMPLEMENTED AS A LOOP THAT DECREMENTS THE "R" WORD UNTIL IT
  745. REACHES ZERO, WHILE CALLING THE POINT PLOT ROUTINE AND DOING THE 32-BIT ADD TO
  746. ADD THE "G" VALUES TO THE ╪ AND ┘ COORDINATES.  ╫HEN THE LINE IS FINISHED, THE
  747. FINAL ╪ AND ┘ COORDINATES ARE PUT BACK INTO THE PIXEL CURSOR POSITION STORAGE
  748. AND THE PACKAGE IS READY FOR THE NEXT CALL.
  749.  
  750. 7. ├╧╬├╠╒╙╔╧╬
  751.  
  752. ╚A!  ╘HIS AIN'T NO FORMAL PAPER SO ╔ DON'T HAVE TO WRITE A CONCLUSION.
  753. ╙O THERE! [┼D.╬OTE - ╚E IS CURRENTLY WORKING ON HIS ═ASTERS THESIS, SO YOU'LL
  754. HAVE TO PARDON 'EM HERE.. (GRIN) ]
  755.  
  756. ================================================================================ 
  757. ;*****************************************************************************
  758. ;*  "╚╔╥┼╙80.┬╔╬" HIRES LINE PLOTTING PACKAGE FOR THE ├OMMODORE 128 80-COL   *
  759. ;*  SCREEN.                                                                  *
  760. ;*                                                                           *
  761. ;*  ╘HIS PACKAGE CONTAINS A COUPLE OF IRREGULARITIES THAT ╔ DISCOVERED       *
  762. ;*  WHILE ╔ WAS COMMENTING IT.  ╔ LEFT THEM IN RATHER THAN START ALL OVER,   *
  763. ;*  SINCE THIS PACKAGE WAS WRITTEN WITH A MONITOR RATHER THAN AN ASSEMBLER.  *
  764. ;*****************************************************************************
  765.  
  766. ;*****************************************************************************
  767. ;*  PACKAGE ENTRY POINTS                                                     *
  768. ;*****************************************************************************
  769.  
  770. .$1300  [4C 01 15]  JMP $1501     ;JMP TO DRAW LINE/POSITION PIXEL CURSOR
  771. .$1303  [4C 11 13]  JMP $1311     ;JMP TO ENTER HIRES MODE
  772. .$1306  [4C 48 13]  JMP $1348     ;JMP TO EXIT HIRES MODE
  773. .$1309  [4C 10 13]  JMP $1310     ;RESERVED
  774. .$130C  [4C 10 13]  JMP $1310     ;RESERVED
  775. .$130F: $B3                       ;LIBRARY LOADED IDENTIFIER
  776. .$1310  [60      ]  RTS
  777.  
  778. ;*****************************************************************************
  779. ;*  ENTER HIRES MODE                                                         *
  780. ;*****************************************************************************
  781.  
  782. .$1311  [A9 00   ]  LDA #$00      ;SWITCH TO BANK 15 (KERNAL BANK)
  783. .$1313  [8D 00 FF]  STA $FF00
  784. .$1316  [A9 E0   ]  LDA #$E0      ;SET COLOR TO LIGHT GREY ON BLACK
  785. .$1318  [A2 1A   ]  LDX #$1A
  786. .$131A  [20 CC CD]  JSR $CDCC
  787. .$131D  [A9 87   ]  LDA #$87      ;ENTER BITMAP MODE (NOTE - FOR VERSION 2 ╓─├)
  788. .$131F  [A2 19   ]  LDX #$19
  789. .$1321  [20 CC CD]  JSR $CDCC
  790. .$1324  [A9 00   ]  LDA #$00      ;SET ╓─├ ╥┴═ ADDRESS HIGH
  791. .$1326  [A2 12   ]  LDX #$12
  792. .$1328  [20 CC CD]  JSR $CDCC
  793. .$132B  [E8      ]  INX           ;SET ╓─├ ╥┴═ ADDRESS LOW
  794. .$132C  [20 CC CD]  JSR $CDCC
  795. .$132F  [A9 00   ]  LDA #$00      ;SET ╓─├ ╥┴═ DATA REGISTER TO $00
  796. .$1331  [20 CA CD]  JSR $CDCA
  797. .$1334  [A9 20   ]  LDA #$20      ;SELECT BLOCK FILL MODE
  798. .$1336  [A2 18   ]  LDX #$18
  799. .$1338  [20 CC CD]  JSR $CDCC
  800. .$133B  [A9 00   ]  LDA #$00      ;FILL 256*63 ╓─├ BYTES WITH 0
  801. .$133D  [A2 1E   ]  LDX #$1E      ;  TO CLEAR THE HIRES SCREEN
  802. .$133F  [A0 3F   ]  LDY #$3F
  803. .$1341  [20 CC CD]  JSR $CDCC
  804. .$1344  [88      ]  DEY
  805. .$1345  [D0 FA   ]  BNE $1341
  806. .$1347  [60      ]  RTS
  807.  
  808. ;*****************************************************************************
  809. ;*  EXIT HIRES MODE                                                          *
  810. ;*****************************************************************************
  811.  
  812. .$1348  [20 0C CE]  JSR $CE0C     ;RELOAD THE CHARACTER SETS
  813. .$134B  [A9 93   ]  LDA #$93      ;CLEAR THE TEXT SCREEN
  814. .$134D  [20 D2 FF]  JSR $FFD2
  815. .$1350  [A2 19   ]  LDX #$19      ;RESTORE COLOR TEXT MODE
  816. .$1352  [A9 47   ]  LDA #$47
  817. .$1354  [4C CC CD]  JMP $CDCC
  818.  
  819. ;*****************************************************************************
  820. ;*CALCULATE THE BITMAP BYTE ADDRESS AND BIT VALUE FOR PIXEL GIVEN X=.┴╪,Y=.┘ *
  821. ;*****************************************************************************
  822.  
  823. .$1357  [84 FA   ]  STY $FA       ;SAVE .┴ AND .┘
  824. .$1359  [85 FC   ]  STA $FC
  825. .$135B  [98      ]  TYA           ;PUT PIXEL CURSOR Y POSITION INTO .┴
  826. .$135C  [A0 00   ]  LDY #$00      ;CLEAR PIXEL CURSOR Y POSITION HIGH BYTE
  827. .$135E  [84 FB   ]  STY $FB
  828. .$1360  [0A      ]  ASL A         ;MULTIPLY PIXEL CURSOR Y BY 2 GIVING Y*2
  829. .$1361  [26 FB   ]  ROL $FB       ;  AND WE MUST SHIFT THE HIGH BYTE TO
  830. .$1363  [0A      ]  ASL A         ;AGAIN, GIVING Y*4
  831. .$1364  [26 FB   ]  ROL $FB
  832. .$1366  [18      ]  CLC           ;ADD THE ORIGINAL Y, GIVING Y*5
  833. .$1367  [65 FA   ]  ADC $FA
  834. .$1369  [90 02   ]  BCC $136D
  835. .$136B  [E6 FB   ]  INC $FB
  836. .$136D  [0A      ]  ASL A         ;MULTIPLY BY 2 AGAIN, GIVING Y*10
  837. .$136E  [26 FB   ]  ROL $FB
  838. .$1370  [0A      ]  ASL A         ;AGAIN, GIVING Y*20
  839. .$1371  [26 FB   ]  ROL $FB
  840. .$1373  [0A      ]  ASL A         ;AGAIN, GIVING Y*40
  841. .$1374  [26 FB   ]  ROL $FB
  842. .$1376  [0A      ]  ASL A         ;AGAIN, GIVING Y*80: HA!  WE ARE DONE
  843. .$1377  [26 FB   ]  ROL $FB
  844. .$1379  [85 FA   ]  STA $FA       ;SAVE LOW BYTE OF Y*80
  845. .$137B  [A5 FC   ]  LDA $FC       ;RESTORE X COORDINATE LOW BYTE
  846. .$137D  [86 FD   ]  STX $FD       ;SET UP X COORDINATE HIGH BYTE
  847. .$137F  [46 FD   ]  LSR $FD       ;DIVIDE THE X COORDINATE BY 2 GIVING X/2
  848. .$1381  [6A      ]  ROR A         ;  WE MUST ROR THE HIGH BYTE, THEN THE LOW
  849. .$1382  [46 FD   ]  LSR $FD       ;AGAIN, GIVING X/4
  850. .$1384  [6A      ]  ROR A
  851. .$1385  [46 FD   ]  LSR $FD       ;AGAIN, GIVING X/8: DONE
  852. .$1387  [6A      ]  ROR A
  853. .$1388  [18      ]  CLC           ;NOW ADD Y*80 AND X/8
  854. .$1389  [65 FA   ]  ADC $FA
  855. .$138B  [85 FA   ]  STA $FA
  856. .$138D  [A5 FD   ]  LDA $FD
  857. .$138F  [65 FB   ]  ADC $FB
  858. .$1391  [85 FB   ]  STA $FB       ;GIVING US THE PIXEL BYTE ADDRESS IN ($FA)
  859. .$1393  [A5 FC   ]  LDA $FC       ;GET X MOD 8
  860. .$1395  [29 07   ]  AND #$07      ;  HA! WE CAN JUST EXTRACT THE LOW THREE BITS
  861. .$1397  [AA      ]  TAX
  862. .$1398  [BD 9E 13]  LDA $139E,X   ;LOOK UP THE BIT VALUE IN THE TABLE
  863. .$139B  [85 FC   ]  STA $FC       ;  AND SAVE IT AT $FC
  864. .$139D  [60      ]  RTS           ;EXIT WITH ADDRESS IN ($FA) AND VALUE IN $FC
  865.  
  866. ;*****************************************************************************
  867. ;*  BIT VALUE TABLE                                                          *
  868. ;*****************************************************************************
  869.  
  870. .$139E: $80  $40  $20  $10        ;BIT VALUES STORED LEFT TO RIGHT
  871. .$13A2: $08  $04  $02  $01
  872.  
  873. .$13A6  [00      ]  BRK                  ;FILLER - ╔ FORGET WHY ╔ PUT IT HERE
  874. .$13A7  [00      ]  BRK
  875.  
  876. ;*****************************************************************************
  877. ;*  PLOT PIXEL AT X=.┴╪, Y=.┘ ON BITMAP SCREEN                               *
  878. ;*****************************************************************************
  879.  
  880. .$13A8  [20 57 13]  JSR $1357     ;CALCULATE THE PIXEL ADDRESS AND VALUE
  881. .$13AB  [A5 FB   ]  LDA $FB       ;SET ╓─├ ╥┴╬ ADDRESS HIGH TO PIXEL ADDRESS
  882. .$13AD  [A2 12   ]  LDX #$12
  883. .$13AF  [20 CC CD]  JSR $CDCC
  884. .$13B2  [A5 FA   ]  LDA $FA       ;SET ╓─├ ╥┴═ ADDRESS LOW TO PIXEL ADDRESS
  885. .$13B4  [E8      ]  INX
  886. .$13B5  [20 CC CD]  JSR $CDCC
  887. .$13B8  [20 D8 CD]  JSR $CDD8     ;PEEK THE ╓─├ ╥┴═ ADDRESS
  888. .$13BB  [05 FC   ]  ORA $FC       ;╧╥ ON THE NEW PIXEL VALUE
  889. .$13BD  [A8      ]  TAY           ;  AND SAVE THE RESULT (BYTE TO POKE BACK)
  890. .$13BE  [A5 FB   ]  LDA $FB       ;RESET THE ╓─├ ╥┴═ ADDRESS TO THE PIXEL
  891. .$13C0  [A2 12   ]  LDX #$12      ;  ADDRESS; THIS IS NECESSARY SINCE THE
  892. .$13C2  [20 CC CD]  JSR $CDCC     ;  ╓─├ WILL INCREMENT ITS ╥┴═ ADDRESS ON
  893. .$13C5  [A5 FA   ]  LDA $FA       ;  EVERY ACCESS
  894. .$13C7  [E8      ]  INX
  895. .$13C8  [20 CC CD]  JSR $CDCC
  896. .$13CB  [98      ]  TYA
  897. .$13CC  [4C CA CD]  JMP $CDCA     ;AND POKE THE NEW PIXEL BYTE VALUE
  898.  
  899. ;*****************************************************************************
  900. ;*  PERFORM THE UNSIGNED 32-BIT DIVIDE WITH 16-BIT DENOMINATOR (BOTTOM)      *
  901. ;*    [$63 $62 $61 $60] IS THE NUMERATOR (TOP)                               *
  902. ;*            [$51 $50] IS THE DENOMINATOR (BOTTOM)                          *
  903. ;*    [$67 $66 $65 $64] IS THE QUOTIENT (RESULT)                             *
  904. ;*        [$54 $53 $52] IS THE REMAINDER                                     *
  905. ;*****************************************************************************
  906.  
  907. .$13CF  [A9 00   ]  LDA #$00      ;SET THE RESULT TO 0
  908. .$13D1  [85 64   ]  STA $64
  909. .$13D3  [85 65   ]  STA $65
  910. .$13D5  [85 66   ]  STA $66
  911. .$13D7  [85 67   ]  STA $67
  912.  
  913. .$13D9  [85 52   ]  STA $52       ;CLEAR THE REMAINDER
  914. .$13DB  [85 53   ]  STA $53
  915. .$13DD  [85 54   ]  STA $54
  916.  
  917. .$13DF  [A2 20   ]  LDX #$20      ;SET THE LOOP COUNT TO 32 BITS
  918. .$13E1  [06 60   ]  ASL $60       ;SHIFT OUT THE HIGH BIT OF THE NUMERATOR
  919. .$13E3  [26 61   ]  ROL $61
  920. .$13E5  [26 62   ]  ROL $62
  921. .$13E7  [26 63   ]  ROL $63
  922. .$13E9  [26 52   ]  ROL $52       ;SHIFT IT INTO THE REMAINDER
  923. .$13EB  [26 53   ]  ROL $53
  924. .$13ED  [26 54   ]  ROL $54
  925. .$13EF  [A5 54   ]  LDA $54       ;CHECK IF THE REMAINDER IS >= THE DENOMINATOR
  926. .$13F1  [D0 0A   ]  BNE $13FD
  927. .$13F3  [A5 52   ]  LDA $52
  928. .$13F5  [C5 50   ]  CMP $50
  929. .$13F7  [A5 53   ]  LDA $53
  930. .$13F9  [E5 51   ]  SBC $51
  931. .$13FB  [90 11   ]  BCC $140E     ;IF NOT, GO TO NEXT BIT
  932. .$13FD  [38      ]  SEC           ;SUBRACT THE DENOMINATOR FROM THE REMAINDER
  933. .$13FE  [A5 52   ]  LDA $52
  934. .$1400  [E5 50   ]  SBC $50
  935. .$1402  [85 52   ]  STA $52
  936. .$1404  [A5 53   ]  LDA $53
  937. .$1406  [E5 51   ]  SBC $51
  938. .$1408  [85 53   ]  STA $53
  939. .$140A  [B0 02   ]  BCS $140E
  940. .$140C  [C6 54   ]  DEC $54
  941. .$140E  [26 64   ]  ROL $64       ;SHIFT A "1" BIT INTO THE DENOMINATOR.  ╬OTE
  942. .$1410  [26 65   ]  ROL $65       ;  THE FIRST "ROL" SHOULD HAVE BEEN PRECEEDED
  943. .$1412  [26 66   ]  ROL $66       ;  BY A "SEC"; THIS IS A ┬╒╟!  ╚OWEVER, IT
  944. .$1414  [26 67   ]  ROL $67       ;  WILL FAIL ONLY IF DENOM >=32768 WHICH
  945.                                   ;  CANNOT HAPPEN IN THIS APPLICATION.
  946. .$1416  [CA      ]  DEX           ;GO ON TO THE NEXT BIT
  947. .$1417  [D0 C8   ]  BNE $13E1
  948. .$1419  [60      ]  RTS
  949.  
  950. ;*****************************************************************************
  951. ;*  GET THE ABSOLUTE VALUE OF THE 2'S COMP NUMBER IN .┴┘ -> .┴┘              *
  952. ;*****************************************************************************
  953.  
  954. .$141A  [84 50   ]  STY $50
  955. .$141C  [A6 50   ]  LDX $50
  956. .$141E  [10 10   ]  BPL $1430     ;IF THE NUMBER IS POSITIVE, EXIT
  957. .$1420  [38      ]  SEC           ;ELSE TAKE THE 2'S COMPLEMENT OF THE NEGATIVE
  958. .$1421  [85 50   ]  STA $50       ;  VALUE TO GET THE POSITIVE VALUE
  959. .$1423  [A9 00   ]  LDA #$00
  960. .$1425  [E5 50   ]  SBC $50
  961. .$1427  [48      ]  PHA
  962. .$1428  [84 50   ]  STY $50
  963. .$142A  [A9 00   ]  LDA #$00
  964. .$142C  [E5 50   ]  SBC $50
  965. .$142E  [A8      ]  TAY
  966. .$142F  [68      ]  PLA
  967. .$1430  [60      ]  RTS
  968.  
  969. ;*****************************************************************************
  970. ;*  PERFORM THE FRACTIONAL SIGNED 32-BIT DIVIDE                              *
  971. ;*****************************************************************************
  972.  
  973. .$1431  [48      ]  PHA           ;REMEMBER THE SIGN OF THE RESULT
  974. .$1432  [A9 00   ]  LDA #$00      ;SET THE NUMERATOR FRACTIONAL PORTION TO .0
  975. .$1434  [85 60   ]  STA $60
  976. .$1436  [85 61   ]  STA $61
  977. .$1438  [20 CF 13]  JSR $13CF     ;32-BIT DIVIDE
  978. .$143B  [68      ]  PLA           ;IF THE SIGN OF THE RESULT IS SUPPOSED TO BE
  979. .$143C  [10 19   ]  BPL $1457     ;  POSITIVE, THEN EXIT
  980. .$143E  [38      ]  SEC           ;IF THE SIGN OF THE RESULT IS NEGATIVE, TAKE
  981. .$143F  [A9 00   ]  LDA #$00      ;  GET THE 2'S COMPLEMENT OF THE POSITIVE
  982. .$1441  [E5 64   ]  SBC $64       ;  RESULT
  983. .$1443  [85 64   ]  STA $64
  984. .$1445  [A9 00   ]  LDA #$00
  985. .$1447  [E5 65   ]  SBC $65
  986. .$1449  [85 65   ]  STA $65
  987. .$144B  [A9 00   ]  LDA #$00
  988. .$144D  [E5 66   ]  SBC $66
  989. .$144F  [85 66   ]  STA $66
  990. .$1451  [A9 00   ]  LDA #$00
  991. .$1453  [E5 67   ]  SBC $67
  992. .$1455  [85 67   ]  STA $67
  993. .$1457  [60      ]  RTS
  994.  
  995. ;*****************************************************************************
  996. ;*  GET THE ╪ AND ┘ PLOTTING INCREMENTS AND THE PIXELS-TO-PLOT COUNT         *
  997. ;*****************************************************************************
  998.  
  999. .$1458  [A5 0C   ]  LDA $0C       ;GET ┴┬╙(─╪)
  1000. .$145A  [A4 0D   ]  LDY $0D
  1001. .$145C  [20 1A 14]  JSR $141A
  1002. .$145F  [85 FA   ]  STA $FA
  1003. .$1461  [84 FB   ]  STY $FB
  1004.  
  1005. .$1463  [A5 10   ]  LDA $10       ;GET ┴┬╙(─┘)
  1006. .$1465  [A4 11   ]  LDY $11
  1007. .$1467  [20 1A 14]  JSR $141A
  1008. .$146A  [85 FC   ]  STA $FC
  1009. .$146C  [84 FD   ]  STY $FD
  1010.  
  1011. .$146E  [A5 FC   ]  LDA $FC       ;COMPARE ┴┬╙(─┘) TO ┴┬╙(─╪)
  1012. .$1470  [C5 FA   ]  CMP $FA
  1013. .$1472  [A5 FD   ]  LDA $FD
  1014. .$1474  [E5 FB   ]  SBC $FB
  1015. .$1476  [B0 44   ]  BCS $14BC     ;IF ┴┬╙(─┘) >= ┴┬╙(─╪) THEN BRANCH AHEAD
  1016.  
  1017. .$1478  [A5 FA   ]  LDA $FA       ;SET PIXELS-TO-PLOT COUNT TO ┴┬╙(─╪)
  1018. .$147A  [85 12   ]  STA $12
  1019. .$147C  [85 50   ]  STA $50
  1020. .$147E  [A5 FB   ]  LDA $FB
  1021. .$1480  [85 13   ]  STA $13
  1022. .$1482  [85 51   ]  STA $51       ;SET THE NUMERATOR (TOP) TO ─┘ AND THE
  1023. .$1484  [A5 FC   ]  LDA $FC       ;  DENOMINATOR (BOTTOM) TO ┴┬╙(─╪)
  1024. .$1486  [85 62   ]  STA $62
  1025. .$1488  [A5 FD   ]  LDA $FD
  1026. .$148A  [85 63   ]  STA $63
  1027. .$148C  [A5 11   ]  LDA $11       ;GET THE SIGN OF ─┘ - WILL BE THE SIGN OF DIV
  1028. .$148E  [20 31 14]  JSR $1431     ;PERFORM THE SIGNED FRACTIONAL DIVISION
  1029. .$1491  [A2 03   ]  LDX #$03      ;STORE THE RESULT IN THE ┘ INCREMENT VALUE
  1030. .$1493  [B5 64   ]  LDA $64,X
  1031. .$1495  [95 0E   ]  STA $0E,X
  1032. .$1497  [CA      ]  DEX
  1033. .$1498  [10 F9   ]  BPL $1493
  1034. .$149A  [A5 0D   ]  LDA $0D       ;GET THE ╪ INCREMENT
  1035. .$149C  [30 0A   ]  BMI $14A8
  1036. .$149E  [A9 00   ]  LDA #$00      ;IF ─╪ IS POSITIVE, ╪ INC IS +1
  1037. .$14A0  [85 0D   ]  STA $0D       ;  (NOTE THAT ─╪ CANNOT BE 0 HERE SO WE DON'T
  1038. .$14A2  [A9 01   ]  LDA #$01      ;   HAVE TO WORRY ABOUT THAT CASE)
  1039. .$14A4  [85 0C   ]  STA $0C
  1040. .$14A6  [D0 06   ]  BNE $14AE
  1041. .$14A8  [A9 FF   ]  LDA #$FF      ;IF ─╪ IS NEGATIVE, ╪ INC IS -1
  1042. .$14AA  [85 0D   ]  STA $0D
  1043. .$14AC  [85 0C   ]  STA $0C
  1044.  
  1045. .$14AE  [38      ]  SEC           ;TAKE THE NEGATIVE OF THE NUMBER OF PIXELS
  1046. .$14AF  [A9 00   ]  LDA #$00      ;  TO PLOT AND EXIT
  1047. .$14B1  [E5 12   ]  SBC $12       ;╔ DON'T REMEMBER EXACTLY WHY ╔ USE THE
  1048. .$14B3  [85 12   ]  STA $12       ;  NEGATIVE; THERE IS NOT MUCH OF A SPEED
  1049. .$14B5  [A9 00   ]  LDA #$00      ;  IMPROVEMENT.  ╧H WELL, T'IS DONE.
  1050. .$14B7  [E5 13   ]  SBC $13
  1051. .$14B9  [85 13   ]  STA $13
  1052. .$14BB  [60      ]  RTS
  1053.  
  1054. .$14BC  [A5 FC   ]  LDA $FC       ;SET THE PIXELS-TO-PLOT COUNT TO ┴┬╙(─┘)
  1055. .$14BE  [85 12   ]  STA $12
  1056. .$14C0  [85 50   ]  STA $50
  1057. .$14C2  [A5 FD   ]  LDA $FD
  1058. .$14C4  [85 13   ]  STA $13
  1059. .$14C6  [85 51   ]  STA $51       ;SET THE NUMERATOR (TOP) TO ─╪ AND THE
  1060. .$14C8  [A5 FA   ]  LDA $FA       ;  DENOMINATOR(BOTTOM) TO ┴┬╙(─┘)
  1061. .$14CA  [85 62   ]  STA $62
  1062. .$14CC  [A5 FB   ]  LDA $FB
  1063. .$14CE  [85 63   ]  STA $63
  1064. .$14D0  [A5 0D   ]  LDA $0D       ;GET THE SIGN OF ─╪ - WILL BE THE SIGN OF DIV
  1065. .$14D2  [20 31 14]  JSR $1431     ;DO THE 32-BIT SIGNED FRACTIONAL DIVISION
  1066. .$14D5  [A2 03   ]  LDX #$03      ;STORE THE RESULT IN THE ╪ INCREMENT
  1067. .$14D7  [B5 64   ]  LDA $64,X
  1068. .$14D9  [95 0A   ]  STA $0A,X
  1069. .$14DB  [CA      ]  DEX
  1070. .$14DC  [10 F9   ]  BPL $14D7
  1071. .$14DE  [4C EA 14]  JMP $14EA     ;JUMP OVER THE NEXT SECTION
  1072. ;-------
  1073. .$14E1  [2C FF FF]  BIT $FFFF     ;╘HIS SECTION CONTAINED JUNK BEFORE AND ╔
  1074. .$14E4  [2C FF FF]  BIT $FFFF     ;  DON'T KNOW HOW IT GOT HERE.  ╔ REPLACED
  1075. .$14E7  [2C FF FF]  BIT $FFFF     ;  IT WITH ┬╔╘S AND NOW JUMP OVER IT.
  1076. ;-------
  1077. .$14EA  [A5 11   ]  LDA $11
  1078. .$14EC  [30 0A   ]  BMI $14F8
  1079. .$14EE  [A9 00   ]  LDA #$00      ;IF ─┘ IS POSITIVE THEN ┘ INC IS +1
  1080. .$14F0  [85 11   ]  STA $11       ;  (WE DO NOT HAVE TO WORRY ABOUT THE CASE
  1081. .$14F2  [A9 01   ]  LDA #$01      ;   OF ─┘ BEING ZERO SINCE THEN THE INCREMENT
  1082. .$14F4  [85 10   ]  STA $10       ;   WOULD NOT BE IMPORTANT)
  1083. .$14F6  [D0 06   ]  BNE $14FE
  1084. .$14F8  [A9 FF   ]  LDA #$FF      ;IF ─┘ IS NEGATIVE THEN ┘ INC IS -1
  1085. .$14FA  [85 11   ]  STA $11
  1086. .$14FC  [85 10   ]  STA $10
  1087. .$14FE  [4C AE 14]  JMP $14AE     ;JUMP BACK TO THE EXIT
  1088.  
  1089. ;*****************************************************************************
  1090. ;*  MAIN ROUTINE: DRAW LINE OR SET PIXEL CURSOR POSITION                     *
  1091. ;*****************************************************************************
  1092.  
  1093. .$1501  [B0 07   ]  BCS $150A     ;GOTO DRAW ROUTINE IF .├=1
  1094. .$1503  [85 8B   ]  STA $8B       ;STORE X AND Y PIXEL CURSOR COORDINATES
  1095. .$1505  [86 8C   ]  STX $8C
  1096. .$1507  [84 8D   ]  STY $8D
  1097. .$1509  [60      ]  RTS           ;EXIT SET PIXEL CURSOR
  1098.  
  1099. .$150A  [85 04   ]  STA $04       ;SAVE DRAW-TO COORDINATES
  1100. .$150C  [86 05   ]  STX $05
  1101. .$150E  [84 08   ]  STY $08
  1102. .$1510  [A2 07   ]  LDX #$07      ;CLEAR $0A-$0D AND $0E-$11
  1103. .$1512  [A9 00   ]  LDA #$00
  1104. .$1514  [95 0A   ]  STA $0A,X
  1105. .$1516  [CA      ]  DEX
  1106. .$1517  [10 FB   ]  BPL $1514
  1107.  
  1108. .$1519  [38      ]  SEC           ;GET DX VALUE = ─RAW╘O╪ - ╨IXEL├URSOR╪
  1109. .$151A  [A5 04   ]  LDA $04       ;  DX IS AT [$0D $0C . $0B $0A]
  1110. .$151C  [E5 8B   ]  SBC $8B
  1111. .$151E  [85 0C   ]  STA $0C
  1112. .$1520  [A5 05   ]  LDA $05
  1113. .$1522  [E5 8C   ]  SBC $8C
  1114. .$1524  [85 0D   ]  STA $0D
  1115.  
  1116. .$1526  [38      ]  SEC           ;GET DY VALUE = ─RAW╘O┘ - ╨IXEL├URSOR┘
  1117. .$1527  [A5 08   ]  LDA $08       ;  DY IS AT [$11 $10 . $0F $0E]
  1118. .$1529  [E5 8D   ]  SBC $8D
  1119. .$152B  [85 10   ]  STA $10
  1120. .$152D  [A9 00   ]  LDA #$00
  1121. .$152F  [B0 02   ]  BCS $1533
  1122. .$1531  [A9 FF   ]  LDA #$FF
  1123. .$1533  [85 11   ]  STA $11
  1124.  
  1125. .$1535  [20 58 14]  JSR $1458     ;CALCULATE THE ╪ AND ┘ PLOTTING INCREMENTS
  1126.  
  1127. .$1538  [A5 8B   ]  LDA $8B       ;SET THE DRAWING ╪ POSITION TO X+0.5
  1128. .$153A  [85 04   ]  STA $04       ;  ╪ IS AT [$05 $04 . $03 $02]
  1129. .$153C  [A5 8C   ]  LDA $8C
  1130. .$153E  [85 05   ]  STA $05
  1131. .$1540  [A9 80   ]  LDA #$80
  1132. .$1542  [85 03   ]  STA $03
  1133. .$1544  [85 07   ]  STA $07
  1134. .$1546  [A9 00   ]  LDA #$00
  1135. .$1548  [85 02   ]  STA $02
  1136. .$154A  [85 06   ]  STA $06
  1137. .$154C  [A5 8D   ]  LDA $8D       ;SET THE DRAWING ┘ POSITION TO Y+0.5
  1138. .$154E  [85 08   ]  STA $08       ;  ┘ IS AT [$09 $08 . $07 $06]
  1139. .$1550  [A9 00   ]  LDA #$00
  1140. .$1552  [85 09   ]  STA $09
  1141.  
  1142. .$1554  [A5 04   ]  LDA $04       ;GET THE PIXEL ╪ AND ┘ COORDINATES
  1143. .$1556  [A6 05   ]  LDX $05
  1144. .$1558  [A4 08   ]  LDY $08
  1145. .$155A  [20 A8 13]  JSR $13A8     ;PLOT THE PIXEL
  1146. .$155D  [A5 12   ]  LDA $12       ;CHECK THE PIXELS-TO-PLOT COUNT FOR ZERO
  1147. .$155F  [05 13   ]  ORA $13
  1148. .$1561  [F0 3B   ]  BEQ $159E     ;IF NO MORE PIXELS TO PLOT, EXIT LOOP
  1149. .$1563  [18      ]  CLC           ;ADD THE ╪ INCREMENT TO THE ╪ COORDINATE
  1150. .$1564  [A5 02   ]  LDA $02
  1151. .$1566  [65 0A   ]  ADC $0A
  1152. .$1568  [85 02   ]  STA $02
  1153. .$156A  [A5 03   ]  LDA $03
  1154. .$156C  [65 0B   ]  ADC $0B
  1155. .$156E  [85 03   ]  STA $03
  1156. .$1570  [A5 04   ]  LDA $04
  1157. .$1572  [65 0C   ]  ADC $0C
  1158. .$1574  [85 04   ]  STA $04
  1159. .$1576  [A5 05   ]  LDA $05
  1160. .$1578  [65 0D   ]  ADC $0D
  1161. .$157A  [85 05   ]  STA $05
  1162. .$157C  [18      ]  CLC           ;ADD THE ┘ INCREMENT TO THE ┘ COORDINATE
  1163. .$157D  [A5 06   ]  LDA $06
  1164. .$157F  [65 0E   ]  ADC $0E
  1165. .$1581  [85 06   ]  STA $06
  1166. .$1583  [A5 07   ]  LDA $07
  1167. .$1585  [65 0F   ]  ADC $0F
  1168. .$1587  [85 07   ]  STA $07
  1169. .$1589  [A5 08   ]  LDA $08
  1170. .$158B  [65 10   ]  ADC $10
  1171. .$158D  [85 08   ]  STA $08
  1172. .$158F  [A5 09   ]  LDA $09
  1173. .$1591  [65 11   ]  ADC $11
  1174. .$1593  [85 09   ]  STA $09
  1175. .$1595  [E6 12   ]  INC $12       ;INCREMENT THE PIXELS TO PLOT COUNT
  1176. .$1597  [D0 BB   ]  BNE $1554     ;  NOTE THAT IT IS STORED AS THE NEGATIVE OF
  1177. .$1599  [E6 13   ]  INC $13       ;  THE COUNT
  1178. .$159B  [4C 54 15]  JMP $1554     ;REPEAT PLOTTING LOOP
  1179.  
  1180. .$159E  [A5 04   ]  LDA $04       ;EXIT - SET THE PIXEL CURSOR POSITION TO THE
  1181. .$15A0  [A6 05   ]  LDX $05       ;  LAST PIXEL PLOTTED ON THE LINE
  1182. .$15A2  [A4 08   ]  LDY $08
  1183. .$15A4  [4C 03 15]  JMP $1503
  1184.  
  1185.