home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / ACE14E.SFX / ace14-as.doc next >
Encoding:
Text File  |  1990-02-12  |  43.5 KB  |  897 lines

  1.  
  2. ┴├┼ ┴SSEMBLER ─OCUMENTATION  FOR VERSION 1.00   [╧CTOBER 23, 1994]
  3. ------------------------------------------------------------------------------
  4. 1. ╔╬╘╥╧─╒├╘╔╧╬
  5.  
  6. ╘HE ┴├┼ ASSEMBLER IS A ONE-PASS ASSEMBLER.  ╘HE ONLY REAL LIMITATION ON THE
  7. SIZE OF ASSEMBLY JOBS IS THE AMOUNT OF NEAR+FAR MEMORY YOU HAVE AVAILABLE.
  8. ╠ABELS ARE "LIMITED" TO 240 CHARACTERS (ALL SIGNIFICANT), AND THE OBJECT SIZE
  9. IS LIMITED TO 64╦ (OF COURSE).  ╬UMERICAL VALUES ARE "LIMITED" TO 32-BITS OR
  10. LESS.  ╥ELATIVE LABELS ("+" AND "-" LABELS) ARE IMPLEMENTED IN THE SAME WAY AS
  11. IN THE ┬UDDY ASSEMBLER.  ╧NLY ADD AND SUBTRACT DYADIC OPERATORS ARE CURRENTLY
  12. IMPLEMENTED FOR EXPRESSIONS WITH POSITIVE, NEGATE, HIGH-BYTE, AND LOW-BYTE
  13. MONADIC OPARATORS, AND THE PLANNED MACRO AND CONDITIONAL ASSEMBLY FEATURES ARE
  14. NOT YET IMPLEMENTED.  ┼XPRESSIONS ARE LIMITED TO 17 OPERANDS (WITH 255 MONADIC
  15. OPERATORS EACH), BUT REFERENCES TO UNRESOLVED IDENTIFIERS ARE ALLOWED
  16. ANYWHERE, INCLUDING EQUATE DEFINITIONS.  ╚IERARCHICAL INCLUSION OF SOURCE
  17. FILES IS NOT YET IMPLEMENTED.  ╘HE ┴├┼ SOURCE CODE WILL EVENTUALLY BE
  18. CONVERTED TO USE THIS ASSEMBLER.  ╘HE ASSEMBLER CODE ITSELF HAS BEEN
  19. CONVERTED.
  20.  
  21. ╘HE ASSEMBLER IS DESIGNED TO BE A "HEAVY HITTER", OPERATES AT MODERATE SPEED,
  22. AND USES A FAIR AMOUNT OF DYNAMICALLY ALLOCATED MEMORY.  ╔N FACT, ON AN
  23. UNEXPANDED 64, YOU WON'T BE ABLE TO ASSEMBLE PROGRAMS THAT ARE TOO LARGE,
  24. INCLUDING THE ASSEMBLER ITSELF (85╦ OF SOURCE).  ┘OU'LL BE ABLE TO DO LARGER
  25. JOBS ON AN UNEXPANDED 64 IF YOU DEACTIVATE THE SOFT-80 SCREEN IN THE
  26. CONFIGURATION.  ╔'LL BE WORKING ON MAKING MORE ╥┴═0 MEMORY AVAILABLE TO ┴├┼
  27. APPLICATIONS.  (╧F COURSE, ONE COULD ARGUE THAT ANY SERIOUS 64 HACKER WOULD
  28. HAVE EXPANDED MEMORY ANYWAYS...).
  29.  
  30. ╔N ADDITION TO THE REGULAR 6502 INSTRUCTIONS, THIS RELEASE OF THE ASSEMBLER
  31. HAS THE FOLLOWING DIRECTIVES:
  32.  
  33. LABEL = VALUE               ;ASSIGN GIVEN VALUE TO THE LABEL
  34. LABEL:                      ;ASSIGN THE CURRENT ASSEMBLY ADDRESS TO LABEL
  35. +                           ;GENERATE A TEMPORARY LABEL, ASSIGN CUR ADDRESS
  36. -                           ;GENERATE A TEMPORARY LABEL, ASSIGN CUR ADDRESS
  37. ORG ADDRESS                 ;SET THE ORIGIN OF THE ASSEMBLY
  38. BUF SIZE                    ;RESERVE "SIZE" BYTES OF SPACE,FILLED WITH ZEROES
  39. DB VAL1, VAL2, ..., VAL╬    ;PUT BYTE VALUES INTO MEMORY
  40. DW VAL1, VAL2, ..., VAL╬    ;PUT WORD VALUES INTO MEMORY
  41. DT VAL1, VAL2, ..., VAL╬    ;PUT "TRIPLE" (3-BYTE) VALUES INTO MEMORY, LO->HI
  42. DL VAL1, VAL2, ..., VAL╬    ;PUT "LONG" (4-BYTE) VALUES INTO MEMORY, LO->HI
  43.  
  44. ╘HESE FEATURES IS DESCRIBED IN MORE DETAIL BELOW.  ╬OTE THAT THROUGHOUT THE
  45. DOCUMENTATION, ╔ USE THE TERMS "IDENTIFIER", "SYMBOL", AND "LABEL"
  46. INTERCHANGEABLY.
  47. ------------------------------------------------------------------------------
  48. 2. ╒╙┴╟┼
  49.  
  50. ╘HE USAGE FOR THE AS COMMAND IS, STATED IN ╒NIX NOTATION:
  51.  
  52. USAGE: AS [-HELP] [-S] [-D] [FILE ...]
  53.  
  54. ╘HE "-HELP" FLAG WILL CAUSE THE ASSEMBLER DISPLAY THE USAGE INFORMATION AND
  55. THEN EXIT, WITHOUT ASSEMBLING ANY CODE.  ┴CTUALLY, ANY FLAG THAT IT DOESN'T
  56. UNDERSTAND WILL BE TAKEN AS IF YOU HAD SAID "-HELP", BUT NOTE THAT IF YOU TYPE
  57. THE "AS" COMMAND ALONE ON A COMMAND LINE THAT USAGE INFORMATION WILL NOT BE
  58. GIVEN.
  59.  
  60. ╘HE "-S" FLAG TELLS THE ASSEMBLER TO GENERATE A SYMBOL-TABLE LISTING WHEN THE
  61. ASSEMBLY JOB IS FINISHED.  ╘HE TABLE IS FORMATTED FOR AN 80-COLUMN DISPLAY.
  62. INDICATES THAT A SYMBOL TABLE SHOULD BE GENERATED WHEN THE ASSEMBLY JOB IS
  63. DONE.  ╘HE TABLE WILL LOOK LIKE:
  64.  
  65. ╘HE "-D" FLAG TELLS THE ASSEMBLER TO PRODUCE DEBUGGING INFORMATION WHILE IT IS
  66. WORKING.  ╔T WILL GENERATE A LOT OF OUTPUT, SO YOU CAN SEE EXACTLY WHAT IS
  67. GOING ON.
  68.  
  69. ╘HE OBJECT-CODE MODULE NAME WILL BE "A.OUT" UNLESS THE NAME OF THE FIRST
  70. SOURCE FILE ENDS WITH A ".S" EXTENSION, IN WHICH CASE THE OBJECT MODULE WILL
  71. BE THE BASE NAME OF FIRST SOURCE FILE (WITHOUT THE EXTENSION).  ╘HE OBJECT
  72. MODULE WILL BE WRITTEN AS A ╨╥╟ FILE AND WILL BE IN ├OMMODORE-─╧╙ PROGRAM
  73. FORMAT: THE FIRST TWO BYTES WILL BE THE LOW AND HIGH BYTES OF THE CODE
  74. ADDRESS, AND THE REST WILL BE THE BINARY IMAGE OF THE ASSEMBLED CODE.
  75.  
  76. ╔F NO SOURCE FILENAME IS GIVEN ON THE COMMAND LINE, THEN INPUT IS TAKEN FROM
  77. THE STDIN FILE STREAM (AND WRITTEN TO "A.OUT").  ╔F MORE THAN ONE FILENAME IS
  78. GIVEN, THE EACH IS READ, IN TURN, INTO THE SAME ASSEMBLY JOB (AS IF THE FILES
  79. WERE "CAT"TED TOGETHER INTO ONE SOURCE FILE).  (╘HIS WILL CHANGE SUBTLY WHEN
  80. THE ASSEMBLER IS COMPLETED).
  81.  
  82. ╘HIS ASSEMBLER DOES NOT PRODUCE A LISTING OF THE CODE ASSEMBLED AND WILL
  83. STOP THE WHOLE ASSEMBLY JOB ON THE FIRST ERROR IT ENCOUNTERS.
  84. ------------------------------------------------------------------------------
  85. 3. ╘╧╦┼╬╙
  86.  
  87. ╫HILE READING YOUR SOURCE CODE, THE ASSEMBLER GROUPS CHARACTERS INTO TOKENS
  88. AND INTERPRETS THEM AS A COMPLETE UNIT.  ╘HE ASSEMBLER WORKS WITH FIVE
  89. DIFFERENT TYPES OF TOKENS: IDENTIFIERS, NUMERIC LITERALS, STRING LITERALS,
  90. SPECIAL CHARACTERS, AND END-OF-FILE (EOF).  ┼OF IS SPECIAL SINCE IT DOESN'T
  91. ACTUALLY INCLUDE ANY CHARACTERS, AND ITS ONLY MEANING IS TO STOP READING FROM
  92. THE CURRENT SOURCE.  ┘OUR INPUT SOURCE FILE SHOULD CONSIST ONLY OF CHARACTERS
  93. THAT ARE PRINTABLE IN STANDARD ┴╙├╔╔ (DON'T BE CONFUSED BY THIS; THE ASSEMBLER
  94. EXPECTS ITS INPUT TO BE IN ╨┼╘╙├╔╔) PLUS ╘┴┬ AND ├ARRIAGE-╥ETURN.  ╧THER
  95. CHARACTERS MAY CONFUSE THE ASSEMBLER.
  96.  
  97. ╔DENTIFIERS CONSIST OF A LOWECASE OR UPPERCASE LETTER OR AN UNDERSCORE
  98. FOLLOWED BY A SEQUENCE OF SUCH LETTERS OR DECIMAL DIGITS.  ╘HIS IS A PRETTY
  99. STANDARD DEFINITION OF AN IDENTIFIER.  ╔DENTIFIERS ARE LIMITED TO 240
  100. CHARACTERS IN LENGTH AND AN ERROR WILL BE REPORTED IF YOU TRY TO USE ONE
  101. LONGER THAN THAT.  ┴LL OF THE CHARACTERS OF ALL IDENTIFIERS ARE SIGNIFICANT,
  102. AND LETTERS ARE CASE-SENSITIVE.  ╚ERE ARE SOME EXAMPLES OF ALL-UNIQUE
  103. IDENTIFIERS:
  104.  
  105. HELLO  ╚ELLO  _TIME4  A1_X140╩  ╚ELLO╘HERE╘HIS╔S┴_╠ONG╧NE
  106.  
  107. ╬UMERIC LITERALS COME IN THREE TYPES: DECIMAL, HEXADECIMAL, AND BINARY.
  108. ─ECIMAL LITERALS CONSIST OF AN INITIAL DIGIT FROM 0 TO 9 FOLLOWED BY ANY
  109. NUMBER OF DIGITS, PROVIDED THAT THE VALUE DOES NOT EXCEED 2^32-1 (APPROX. 4
  110. BILLION).  ┴LL TYPES OF LITERALS CAN ALSO HAVE EMBEDDED UNDERSCORE CHARACTERS,
  111. WHICH ARE IGNORED BY THE ASSEMBLER.  ╒SE THEM GROUPING DIGITS (LIKE THE COMMA
  112. FOR BIG ┴MERICAN NUMBERS).
  113.  
  114. ╚EXADECIMAL LITERALS CONSIST OF A DOLLAR SIGN ($) FOLLOWED BY ANY NUMBER OF
  115. HEXADECIMAL DIGITS, PROVIDED THE VALUE DOESN'T OVERFLOW 32 BITS.  ╚EXADECIMAL
  116. DIGITS INCLUDE THE DECIMAL DIGITS (0-9), AND THE FIRST SIX UPPERCASE OR
  117. LOWERCASE LETTERS OF THE ALPHABET (EITHER A-F OR ┴-╞).  ╚EXADECIMAL LITERALS
  118. CAN ALSO HAVE EMBEDDED UNDERSCORE CHARACTERS FOR SEPARATORS.
  119.  
  120. ┬INARY LITERALS CONSIST OF A PERCENT SIGN (%) FOLLOWED BY ANY NUMBER OF BINARY
  121. DIGITS THAT DON'T OVERFLOW 32-BITS VALUES.  ╘HE BINARY DIGITS ARE, OF COURSE,
  122. 0 AND 1, AND LITERALS MAY INCLUDE EMBEDDED UNDERSCORE CHARACTERS.  ╬OTE THAT
  123. NEGATIVE VALUES ARE NOT LITERALS.  ╚ERE ARE SOME EXAMPLES OF VALID LITERALS:
  124.  
  125. 0  123  0001  4_294_967_295  $AE╞╞  $0123_4567  %010100 %110_1010_0111_1010
  126.  
  127. ╙TRING LITERALS ARE SEQUENCES OF CHARACTERS ENCLOSED IN EITHER SINGLE (') OR
  128. DOUBLE (") QUOTATION MARKS.  ╘HE ENCLOSED CHARACTERS ARE NOT INTERPRETED TO BE
  129. INDEPENDENT TOKENS, NOMATTER WHAT THEY ARE.  ╧NE EXCEPTION IS THAT THE
  130. CARRIAGE-RETURN CHARACTER CANNOT BE ENCLOSED IN A STRING (THIS NORMALLY
  131. INDICATES AN ERROR ANYWAY).  ╘O GET SPECIAL NON-PRINTABLE CHARACTERS INTO YOUR
  132. STRINGS, AN "ESCAPE" CHARACTER IS PROVIDED: THE BACKSLASH (\).  ╔F THE
  133. BACKSLASH CHARACTER IS ENCOUNTERED, THEN THE CHARACTER FOLLOWING IT IS
  134. INTERPRETED AND A SPECIAL CHARACTER CODE IS PUT INTO THE STRING IN PLACE
  135. OF THE BACKSLASH AND THE FOLLOWING CHARACTER.  ╚ERE ARE THE CHARACTERS
  136. ALLOWED TO FOLLOW A BACKSLASH:
  137.  
  138. ├╚┴╥   ├╧─┼   ═┼┴╬╔╬╟
  139. ----   ----   --------
  140. \        92   BACKSLASH CHARACTER (\)
  141. N        13   CARRIAGE RETURN (NEWLINE)
  142. B        20   BACKSPACE (THIS IS A NON-DESTRUCTIVE BACKSPACE FOR ┴├┼)
  143. T         9   TAB
  144. R        10   GOTO BEGINNING OF LINE (FOR ┴├┼, LINEFEED FOR ├┬═)
  145. A         7   BELL SOUND
  146. Z         0   NULL CHARACTER (OFTEN USED AS A STRING TERMINATOR IN ┴├┼)
  147. '        39   SINGLE QUOTE (')
  148. E        27   ESCAPE
  149. 0         0   NULL CHARACTER
  150. Q        34   QUOTATION MARK
  151. "        34   QUOTATION MARK
  152.  
  153. ╙O, IF YOU REALLY WANT A BACKSLASH THEN YOU HAVE TO USE TWO OF THEM.  ╔F YOU
  154. WISH TO INCLUDE AN ARBITRARY CHARACTER IN A LITER STRING, NO FACILITY IS
  155. PROVIDED FOR DOING THAT.  ╚OWEVER, THE ASSEMBLER WILL ALLOW YOU TO INTERMIX
  156. STRINGS AND NUMERIC EXPRESSIONS AT A HIGHER LEVEL, SO YOU CAN DO IT THIS WAY.
  157. ╙TRINGS ARE LIMITED TO INCLUDE 240 (ENCODED) CHARACTERS OR LESS.  ╘HIS IS
  158. REALLY NO LIMITATION TO ASSEMBLING, SINCE YOU CAN PUT AS MANY STRING LITERALS
  159. CONTIGUOUSLY INTO MEMORY AS YOU WISH.  ╚ERE ARE SOME EXAMPLES:
  160.  
  161. "╚ELLO THERE"  "ERROR!\A\A"  'FILE "OUTPUT" COULD NOT BE OPENED\N\0'
  162. "YOU 'DUMMY'!"  'YOU \'DUMMY\'!'  "╚ERE ARE TWO BACKSLASHES: \\\\"
  163.  
  164. ╙PECIAL CHARACTERS ARE SINGLE CHARACTERS THAT CANNOT BE INTERPRETED AS ANY OF
  165. THE OTHER TYPES OF TOKENS.  ╘HESE ARE USUALLY "PUNCTUATION" CHARACTERS, BUT
  166. CARRIAGE RETURN IS ALSO A SPECIAL-CHARACTER TOKEN (IT IS A STATEMENT
  167. SEPARATOR).  ╙OME EXAMPLES FOLLOW:
  168.  
  169. ,  (  #  &  )  =  /  ?  \  ▐  █
  170.  
  171. ╘OKENS ARE SEPARATED BY EITHER THE NEXT CHARACTER OF INPUT NOT BEING ALLOWED
  172. TO BELONG TO THE CURRENT TOKEN TYPE, OR ARE SEPARATED BY WHITESPACE.
  173. ╫HITESPACE CHARACTERS INCLUDE ╙╨┴├┼ (" ") AND ╘┴┬.  ╬OTE THAT CARRIAGE RETURN
  174. IS NOT COUNTED AS WHITESPACE.  ├OMMENTS ARE ALLOWED BY USING A ";" CHARACTER.
  175. ┼VERYTHING FOLLOWING THE SEMICOLON UP TO BUT NOT INCLUDING THE CARRIAGE RETURN
  176. AT THE END OF THE LINE WILL BE IGNORED BY THE ASSEMBLER.  (╔ MAY IMPLEMENT AN
  177. ARTIFICAL-INTELLIGENCE COMMENT PARSER TO MAKE SURE THE ASSEMBLER DOES WHAT YOU
  178. WANT IT TO, BUT THIS WILL BE STRICTLY AN OPTIONAL, TIME-PERMITTING FEATURE).
  179. ------------------------------------------------------------------------------
  180. 4. ┼╪╨╥┼╙╙╔╧╬╙
  181.  
  182. ╬UMERIC EXPRESSIONS CONSIST OF OPERANDS AND OPERATORS.  ╔F YOU DON'T KNOW WHAT
  183. OPERANDS AND OPERATORS ARE, THEN GO BUY AN ELEMENTARY-SCHOOL MATH BOOK.  ╘HERE
  184. ARE SIX TYPES OF OPERANDS: NUMERIC LITERALS, SINGLE-CHARACTER STRING LITERALS,
  185. IDENTIFIERS, THE ASTERISK CHARACTER, ONE OR MORE PLUS SIGNS, AND ONE OR MORE
  186. MINUS SIGNS.  ╘HESE LAST THREE TYPES CAN MAKE PARSING AN EXPRESSION A BIT
  187. CONFUSING, BUT THEY ARE NECESSARY AND USEFUL.
  188.  
  189. ╬UMERIC LITERALS ARE PRETTY EASY TO THINK ABOUT.  ╘HEY'RE JUST 32-BIT NUMBERS
  190. AND WORK IN THE USUAL WAY.  ╙INGLE-CHARACTER STRING LITERALS ARE ALSO
  191. INTERPRETED (IN THE CONTEXT OF A NUMERIC EXPRESSION) AS BEING A NUMERIC
  192. LITERAL.  ╘HE VALUE OF A SINGLE-CHARACTER STRING IS SIMPLY THE ╨┼╘╙├╔╔
  193. CODE FOR THE CHARACTER.
  194.  
  195. ╔DENTIFIERS OR "SYMBOLS" OR "LABELS" USED IN EXPRESSIONS REFER TO NUMERIC
  196. VALUES THAT HAVE BEEN OR WILL BE ASSIGNED TO THE IDENTIFIERS.  ┬INDING VALUES
  197. TO IDENTIFIERS IS DONE BY ASSEMBLER DIRECTIVES DISCUSSED IN A LATER SECTION.
  198. ╔F AN IDENTIFIER ALREADY HAS A VALUE ASSIGNED TO IT BY THE TIME THAT THE
  199. CURRENT EXPRESSION IS REACHED IN ASSEMBLY, THEN IT IS TREATED AS IF IT WERE A
  200. NUMERIC LITERAL OF THE VALUE ASSIGNED TO THE IDENTIFIER.  ╔F THE IDENTIFIER
  201. CURRENTLY HAS NO VALUE ASSIGNED TO IT (I.E., IT IS "UNRESOLVED"), THEN THE
  202. ENTIRE EXPRESSION WILL BE UNRESOLVED.  ╔N THIS CASE, THE EXPRESSION WILL BE
  203. RECORDED AND WILL BE EVALUATED AT A LATER TIME WHEN ALL OF ITS IDENTIFIERS
  204. BECOME RESOLVED.  ┴ "HOLE" WILL BE CREATED WHERE THE EXPRESSION SHOULD GO, AND
  205. THE HOLE WILL BE "FILLED IN" LATER.  ╬OTE THAT THERE ARE A COUPLE OF
  206. DIRECTIVES FOR WHICH AN EXPRESSION MUST BE RESOLVED AT THE TIME IT IS
  207. REFERENCED.
  208.  
  209. ╘HE ASTERISK CHARACTER OPERATES MUCH LIKE A NUMERIC LITERAL, EXCEPT THAT ITS
  210. VALUE IS THE CURRENT CODE ADDRESS RATHER THAN A CONSTANT.  ╘HE CURRENT CODE
  211. ADDRESS WILL ALWAYS BE FOR THE START OF AN ASSEMBLER INSTRUCTION.  ╔.E., THE
  212. CURRENT CODE ADDRESS IS INCREMENTED ONLY AFTER AN INSTRUCTION IS ASSEMBLED.
  213. ╘HIS HAS SOME SUBTLE IMPLICATIONS, AND OTHER ASSEMBLERS MAY IMPLEMENT SLIGHTLY
  214. DIFFERENT SEMANTICS.  ─IRECTIVES ARE A LITTLE DIFFERENT IN THAT THE ADDRESS IS
  215. INCREMENTED AFTER EVERY VALUE IN A "COMMALIST" IS PUT INTO MEMORY.
  216.  
  217. ╥ELATIVE REFERENCES, OPERANDS CONSISTING OF A NUMBER OF PLUSES OR MINUSES,
  218. OPERATE MUCH LIKE IDENTIFIERS.  ╘HEY ARE PROVIDED FOR CONVENIENCE AND
  219. WORK EXACTLY HOW THEY DO IN THE ┬UDDY ASSEMBLER.  ╧PERANDS OF ALL MINUSES
  220. ARE BACKWARD REFERENCES AND OPERANDS OF ALL PLUSES ARE FORWARD REFERENCES.
  221. ┬ECAUSE OF PARSING DIFFICULTIES, RELATIVE-REFERENCE OPERANDS MUST EITHER
  222. BE THE LAST OPERAND IN AN EXPRESSION OR MUST BE FOLLOWED BY A ":" CHARACTER.
  223.  
  224. ╘HE NUMBER OF PLUSES OR MINUSES TELL WHICH RELATIVE REFERENCE "POINT"
  225. IS BEING REFERRED TO.  ┴ REFERENCE POINT IS SET BY THE "+" AND "-"
  226. ASSEMBLER DIRECTIVES DISCUSSED LATER.  ╘HIS GETS DIFFICULT TO EXPLAIN WITH
  227. WORDS, SO HERE IS A CODE EXAMPLE:
  228.  
  229.    LDY #5
  230. -  LDX #0
  231. -  LDA NAME1,X
  232.    STA NAME2,X
  233.    BEQ +
  234.    CMP #"X"
  235.    BEQ ++
  236.    INX
  237.    BNE -
  238. +  DEY
  239.    BNE --
  240. +  RTS
  241.  
  242. ╘HIS RELATIVELY BOGUS SUBROUTINE WILL COPY A NULL-TERMINATED CHARACTER STRING
  243. FROM NAME1 TO NAME2 FIVE TIMES, UNLESS THE STRING CONTAINS AN "X" CHARACTER,
  244. IN WHICH CASE THE COPY OPERATION TERMINATES IMMEDIATELY UPON ENCOUNTERING THE
  245. "X".  ╘HE "BEQ +" BRANCHES TO THE NEXT "+" LABEL TO OCCUR IN THE CODE, TO THE
  246. "DEY" INSTRUCTION.  ╘HE "BEQ ++" BRANCHES TO THE "RTS", TO THE "+" LABEL
  247. FOLLOWING THE NEXT "+" LABEL ENCOUNTERED.  ╘HE "-" AND "--" REFERENCES WORK
  248. SIMILARLY, EXCEPT THAT THEY REFER TO THE PREVIOUS "-" LABEL AND THE PREVIOUS
  249. TO THE PREVIOUS "-" LABEL.  ┘OU CAN USE UP TO 255 PLUSES OR MINUS SIGNS IN
  250. A RELATIVE-REFERENCE OPERAND TO REFER TO THAT MANY REFERENCE POINTS AWAY.
  251.  
  252. ╘HAT ╔ SAID RELATIVE-REFERENCE OPERANDS WORK MUCH LIKE IDENTIFIERS ABOVE
  253. IS NO COOINCIDENCE.  ╞OR EACH DEFINITION OF A REFERENCE POINT AND REFERENCE
  254. TO A POINT, AN INTERNAL IDENTIFIER IS GENERATED THAT LOOKS LIKE "╠+123C" OR
  255. "╠-123C".  ╬OTE THAT YOU CAN'T DEFINE OR REFER TO THESE IDENTIFIERS YOURSELF.
  256.  
  257. ╘HERE ARE TWO TYPES OF OPERATORS THAT CAN BE USED IN EXPRESSIONS: MONADIC AND
  258. DIADIC OPERATORS.  ═ONADIC OPERATORS AFFECT ONE OPERAND, AND DYADIC OPERATORS
  259. AFFECT TWO OPERANDS.  ┴T ABOUT THIS POINT, ╔ SHOULD SPELL OUT THE ACTUAL FORM
  260. OF AN EXPRESSION.  ╔T IS:
  261.  
  262. [MONADIC_OPERATORS] OPERAND [ OPERATOR [MONADIC_OPERATORS] OPERAND [...] ]
  263.  
  264. OR:
  265.  
  266. 1 + 2
  267. -1 + -+-2 + 3
  268.  
  269. ┴N EXPRESSION MAY HAVE UP TO 17 OPERANDS.
  270.  
  271. ╘HE MONADIC (ONE-OPERAND) OPERATORS ARE: POSITIVE (+), NEGATIVE (-), LOW-BYTE
  272. (<), AND HIGH-BYTES (>).  ┘OU CAN HAVE UP TO 255 OF EACH OF THESE MONADIC
  273. OPERATORS FOR EACH OPERAND OF AN EXPRESSION.  ╨OSITIVE DOESN'T ACTUALLY DO
  274. ANYTHING.  ╬EGATIVE WILL RETURN THE 32-BIT 2'S COMPLEMENT OF THE OPERAND THAT
  275. IT IS ATTACHED TO.  ╠OW-BYTE WILL RETURN THE LOWEST EIGHT BITS OF THE OPERAND
  276. IT IS ATTACHED TO.  ╚IGH-BYTE WILL RETURN THE HIGH-ORDER 24-BITS OF THE 32-BIT
  277. OPERAND IT IS ATTACHED TO.  ┴LL EXPRESSIONS ARE EVALUATED IN FULL 32-BIT
  278. PRECISION.  ╬OTE THAT YOU CAN USE THE HIGH-BYTES OPERATOR MORE THAN ONCE TO
  279. EXTRACT EVEN HIGHER.  ╞OR EXAMPLE, "<>>VALUE" WILL EXTRACT THE SECOND-HIGHEST
  280. BYTE OF THE 32-BIT VALUE.
  281.  
  282. ╘HE DYADIC (TWO-OPERAND) OPERATORS ARE CURRENTLY ONLY ADD (+) AND SUBTRACT
  283. (-).  ┘ES, THE PLUS AND MINUS SYMBOLS ARE HORRIBLY OVERLOADED.  ╔ HOPE THAT WE
  284. ALL KNOW WHAT ADD AND SUBTRACT DO.  ╔ AM PLANNING TO IMPLEMENT MORE DYADIC
  285. OPERATORS IN THE FUTURE (MULTIPLY, DIVIDE, AND, OR, NOT, EXCLUSIVE-OR).
  286.  
  287. ┼VALUATION OF DYADIC OPERATORS IS STRICTLY LEFT-TO-RIGHT, AND VALUE OVERFLOWS
  288. AND UNDERFLOWS ARE IGNORED.  ╓ALUES ARE ALWAYS CONSIDERED TO BE POSITIVE,
  289. BUT THIS DOESN'T IMPACT 2'S COMPLEMENT NEGATIVE ARITHMETIC FOR ADD AND SUBTRACT
  290. DYADIC OPERATORS.
  291.  
  292. ═ONADIC OPERATORS TAKE PRECEDENCE OVER DYADIC OPERATORS.  ┼VALUATION OF
  293. MONADIC OPERATORS IS DONE A LITTLE DIFFERENTLY.  ┴LL POSITIVE OPERATORS ARE
  294. THROWN OUT SINCE THEY DON'T ACTUALLY DO ANYTHING.  ╘HEN, IF THERE IS AN EVEN
  295. NUMBER OF NEGATIVE OPERATORS, THEY ARE THROWN OUT.  ╔F THERE IS AN ODD NUMBER
  296. OF NEGATIVE OPERATORS, THEN THE 2'S COMPLEMENT NEGATIVE OF THE OPERAND IS
  297. RETURNED.  ╘HEN, IF THERE ARE ANY HIGH-BYTES OPERATORS, THE VALUE IS SHIFTED
  298. THAT NUMBER OF BYTES TO THE RIGHT AND THE HIGHEST-ORDER BYTE OF THE VALUE IS
  299. SET TO ZERO.  ╬OTE THAT IT REALLY DOESN'T MAKE ANY SENSE TO PERFORM ANY MORE
  300. THAN THREE HIGH-BYTES OPERATORS.  ╘HEN, THE LOW-BYTE OPERATOR IS PREFORMED, IF
  301. ASKED FOR.  ╔T IS EQUIVALENT TO TAKING ANDING THE VALUE WITH $000000FF.  ╔T
  302. REALLY DOESN'T MAKE MUCH SENSE TO PERFORM THIS OPERATOR MORE THAN ONCE.  ┴LSO,
  303. IT DOESN'T MAKE ANY DIFFERENCE IN WHICH ORDER YOU PLACE THE MONADIC OPERATORS
  304. IN AN EXPRESSION; THEY ARE ALWAYS EVALUATED IN THE STATIC ORDER GIVEN ABOVE.
  305.  
  306. ╘HERE IS ONE EXCEPTION HERE.  ╔F THE FIRST OPERAND OF AN EXPRESSION HAS
  307. HIGH-BYTES AND/OR LOW-BYTE MONADIC OPERATORS, THEN THE REST OF THE EXPRESSION
  308. IS EVALUATED FIRST AND THEN THE HIGH/LOW-BYTE MONADIC OPERATORS ARE PERFORMED
  309. ON THE RESULT.  ╘HIS IS DONE TO BE CONSISTENT WITH OTHER ASSEMBLERS AND WITH
  310. USER EXPECTATIONS.
  311.  
  312. ╨ARENTHESES ARE NOT SUPPORTED.  ╚ERE ARE SOME EXAMPLES OF VALID EXPRESSIONS:
  313.  
  314. 2
  315. +2+1
  316. 2+-1
  317. 2+-------------------------------------1
  318. ++++:-+++:+---
  319. 1+"X"-"A"+"┴"
  320. <>>>4_000_000_000
  321. <LABEL+1
  322. >LABEL+1
  323. -1
  324.  
  325. ╘HIS LAST ONE ENDS UP WITH A VALUE OF NEGATIVE ONE, WHICH IS INTERPRETED
  326. AS REALLY BEING 4_294_967_295.  ╔F YOU WERE TO TRY AND DO SOMETHING LIKE
  327. "LDA #-1", YOU WOULD GET AN ERROR BECAUSE THE VALUE WOULD BE INTERPRETED
  328. AS BEING WAY TOO BIG.
  329.  
  330. ┼XPRESSIONS RESULTS ARE CURRENTLY CONSIDERED TO BE ONE OF TWO TYPES: VALUE AND
  331. ADDRESS.  (╘HE COMPLETE SET MUST BE VALUE, ADDRESS, ADDRESS-LOW-BYTE, AND
  332. ADDRESS-HIGH-BYTE IN ORDER TO BE ACTUALLY USEFUL).  ╓ALUES ARE WHAT YOU WOULD
  333. EXPECT AND COME FROM NUMERIC AND SINGLE-CHARACTER-STRING-LITERAL OPERANDS.
  334. ╘HE ADDRESS TYPE COMES FROM THE ASTERISK AND RELATIVE REFERENCE OPERANDS AND
  335. FROM IDENTIFIER OPERANDS WHICH ARE DEFINED TO BE ADDRESSES.  ┴N ADDRESS IS
  336. DEFINED TO BE ONLY AN ADDRESS IN THE RANGE OF THE ASSEMBLED CODE.  ┴DDRESSES
  337. OUTSIDE OF THIS RANGE ARE CONSIDERED TO BE VALUES.  ╘HE DISTINCTION OF VALUES
  338. AND ADDRESSES IS CURRENTLY NOT USED, BUT WILL BE IN THE FUTURE WHEN CODE
  339. RELOCATION FEATURES ARE IMPLEMENTED.  ╦EEPING TRACK OF EXPRESSION TYPES MAKES
  340. IT POSSIBLE TO GENERATE A LIST OF ALL VALUES IN MEMORY THAT MUST BE MODIFIED
  341. IN ORDER TO RELOCATE A PROGRAM TO A NEW ADDRESS WITHOUT REASSEMBLING IT.
  342.  
  343. ╙TRING "EXPRESSIONS" CONSIST OF ONLY A SINGLE STRING LITERAL.  ╬O OPERATORS
  344. ARE ALLOWED.  ╙OME ASSEMBLER DIRECTIVES ACCEPT EITHER NUMERIC OR STRING
  345. EXPRESSIONS AND INTERPRET THEM APPROPRIATELY (LIKE "DB").
  346. ------------------------------------------------------------------------------
  347. 5. ╨╥╧├┼╙╙╧╥ ╔╬╙╘╥╒├╘╔╧╬╙
  348.  
  349. ╘HIS ASSEMBLER ACCEPTS THE 56 STANDARD 6502 PROCESSOR INSTRUCTIONS.  ╔T DOES
  350. NOT PROVIDE UN-DOCUMENTED 6502 INSTRUCTIONS NOR 65C02 NOR 65816 INSTRUCTIONS
  351. NOR CUSTOM PSEUDO-OPS.  ╘HE LATTER WILL BE PROVIDED BY FUTURE MACRO FEATURES.
  352. ┴LL OF THE ASSEMBLER INSTRUCTIONS MUST BE IN LOWERCASE OR THEY WILL NOT BE
  353. RECOGNIZED.  ╚ERE ARE THE INSTRUCTIONS:
  354.  
  355. ╬╒═  ╔╬╙      ╬╒═  ╔╬╙      ╬╒═  ╔╬╙      ╬╒═  ╔╬╙      ╬╒═  ╔╬╙
  356. ---  ---      12.  BVC      24.  EOR      36.  PHA      48.  STA
  357. 01.  ADC      13.  BVS      25.  INC      37.  PHP      49.  STX
  358. 02.  AND      14.  CLC      26.  INX      38.  PLA      50.  STY
  359. 03.  ASL      15.  CLD      27.  INY      39.  PLP      51.  TAX
  360. 04.  BCC      16.  CLI      28.  JMP      40.  ROL      52.  TAY
  361. 05.  BCS      17.  CLV      29.  JSR      41.  ROR      53.  TSX
  362. 06.  BEQ      18.  CMP      30.  LDA      42.  RTI      54.  TXA
  363. 07.  BIT      19.  CPX      31.  LDX      43.  RTS      55.  TXS
  364. 08.  BMI      20.  CPY      32.  LDY      44.  SBC      56.  TYA
  365. 09.  BNE      21.  DEC      33.  LSR      45.  SEC
  366. 10.  BPL      22.  DEX      34.  NOP      46.  SED
  367. 11.  BRK      23.  DEY      35.  ORA      47.  SEI
  368.  
  369. ╘HE ASSEMBLER ALSO SUPPORTS 12 ADDRESSING MODES.  ╘HE "ACCUMULATOR" ADDRESSING
  370. MODE THAT CAN BE USED WITH THE ROTATE AND SHIFT INSTRUCTIONS IS TREATED LIKE
  371. THE IMMEDIATE ADDRESSING MODE, SO A SHIFT-LEFT-ACCUMULATOR INSTRUCTION WOULD
  372. BE JUST "ASL" RATHER THAN "ASL A".  ═ANY OTHER ASSEMBLERS GET RID OF THE
  373. ACCUMULATOR ADDRESSING MODE ALSO.  ┴LSO, THE ",X" AND ",Y" ADDRESSING MODES
  374. MUST BE GIVEN WITH A LOWERCASE "X" OR "Y" OR THEY WILL NOT BE RECOGNIZED.
  375. ╚ERE IS THE TOKEN SYNTAX FOR THE ADDRESSING MODES (├╥ MEANS CARRIAGE RETURN):
  376.  
  377. NUM  NAME       GEN  BYT  EXAMPLE   TOKENS
  378. ---  ---------  ---  ---  -------   -------
  379. 01.  IMPLIED    00.    1            ├╥
  380. 02.  IMMEDIATE  00.    2  #123      #     / EXP8  / ├╥
  381. 03.  RELATIVE   00.    2  *+20      EXP16 / ├╥
  382. 04.  ZEROPAGE   07.    2  123       EXP8  / ├╥
  383. 05.  ZP,X       08.    2  123,X     EXP8  / ,     / X   / ├╥
  384. 06.  ZP,Y       09.    2  123,Y     EXP8  / ,     / Y   / ├╥
  385. 07.  ABSOLUTE   00.    3  12345     EXP16 / ├╥
  386. 08.  ABS,X      00.    3  12345,X   EXP16 / ,     / X   / ├╥
  387. 09.  ABS,Y      00.    3  12345,Y   EXP16 / ,     / Y   / ├╥
  388. 10.  INDIRECT   00.    3  (12345)   (     / EXP16 / )   / ├╥
  389. 11.  (IND,X)    00.    2  (123,X)   (     / EXP8  / ,   / X   / )  / ├╥
  390. 12.  (IND),Y    00.    2  (123),Y   (     / EXP8  / )   / ,   / Y  / ├╥
  391.  
  392. ┼ACH INSTRUCTION TAKES A COMPLETE LINE AND EACH ADDRESSING MODE MUST BE
  393. TERMINATED BY A CARRIAGE RETURN TOKEN (COMMENTS ARE SKIPPED).  ╘HE FORMAT OF
  394. AN INSTRUCTION LINE IS AS FOLLOWS:
  395.  
  396. [PREFIX_DIRECTIVES] INSTRUCTION ADDRESS_MODE_OPERAND
  397.  
  398. ╔N THE CASE THAT AN EXPRESSION IN AN ADDRESSING MODE IS RESOLVED AT THE POINT
  399. IT IS ENCOUNTERED AND ITS VALUE IS LESS THAN 256, THE ASSEMBLER WILL TRY TO
  400. USE THE ZERO-PAGE ADDRESSING MODES IF POSSIBLE.  ╧N THE OTHER HAND, IF A
  401. ZERO-PAGE ADDRESSING MODE IS UNAVAILABLE FOR AN INSTRUCTION, THEN THE
  402. ASSEMBLER WILL PROMOTE OR GENERALIZE THE ZERO-PAGE ADDRESSING MODE TO
  403. AN ABSOLUTE ADDRESSING MODE, IF POSSIBLE.  ╘HIS IS WHAT THE "GEN" COLUMN IN
  404. THE TABLE ABOVE SHOWS.  ╔F AFTER ATTEMPTING TO GENERALIZE THE ADDRESSING
  405. MODE THE GIVEN ADDRESSING MODE STILL NOT VALID WITH THE GIVEN INSTRUCTION,
  406. THEN AN ERROR WILL BE GENERATED.
  407.  
  408. ╔N THE CASE THAT AN EXPRESSION IN AN ADDRESSING MODE CANNOT BE RESOLVED AT
  409. THE POINT WHERE IT IS ENCOUNTERED IN THE ASSEMBLER'S SINGLE PASS, A HOLE IS
  410. LEFT BEHIND, AND THAT HOLE IS MADE AS "LARGE" AS POSSIBLE; IT IS ASSUMED
  411. THAT YOU WILL FILL IN THE HOLE WITH THE LARGEST VALUE POSSIBLE.  ╘HIS MEANS,
  412. FOR EXAMPLE, IF YOU WERE TO ASSEMBLE THE FOLLOWING INSTRUCTION:
  413.  
  414. LDA VAR,X
  415.  
  416. THEN THE ASSEMBLER WOULD ASSUME THIS IS AN ABSOLUTE MODE, AND WILL FILL IN THE
  417. HOLE LATER AS SUCH, EVEN IF IT TURNS OUT THAT "VAR" IS ASSIGNED A VALUE LESS
  418. THAN 256 LATER ON.  ╘HIS RESULTS IN SLIGHT INEFFICIENCY IN THE CODE PRODUCED
  419. BY THIS ASSEMBLER, BUT IT CAUSES MOST TWO-PASS ASSEMBLERS TO FAIL COMPLETELY
  420. ON A "PHASE ERROR".  ┴N EASY WAY TO AVOID THIS CIRCUMSTANCE IS TO MAKE SURE
  421. THAT ALL ZERO-PAGE LABELS ARE DEFINED BEFORE THEY ARE REFERRED TO.
  422.  
  423. ╘HE ADDRESSING MODES THAT REQUIRE A SINGLE BYTE VALUE AND THAT WILL NOT
  424. "GENERALIZE" TO AN ABSOLUTE MODE WILL HAVE A SINGLE-BYTE HOLE CREATED FOR
  425. THEM.  ╧NLY THE BRANCHING INSTRUCTIONS WILL BE INTERPRETED AS HAVING THE
  426. RELATIVE ADDRESSING MODE, AND A SINGLE-BYTE HOLE WILL BE LEFT.  ╘WO EXCEPTIONS
  427. TO THE ABOVE RULES ARE THE "STX ZP,Y" AND "STY ZP,X", WHICH WILL LEAVE A
  428. SINGLE-BYTE HOLE ON AN UNRESOLVED EXPRESSION, SINCE THE ABSOLUTE-MODE
  429. GENERALIZATIONS FOR THESE INSTRUCTIONS ARE NOT SUPPORTED BY THE PROCESSOR.
  430. ------------------------------------------------------------------------------
  431. 6. ─╔╥┼├╘╔╓┼╙
  432.  
  433. ╘HERE ARE CURRENTLY FIVE CLASSES OF ASSEMBLER DIRECTIVES; THERE WILL BE
  434. MORE IN THE FUTURE.
  435.  
  436. 6.1. ─╧-╬╧╘╚╔╬╟ ─╔╥┼├╘╔╓┼╙
  437.  
  438. ╘HERE ARE TWO DO-NOTHING DIRECTIVES:
  439.  
  440. #                           ;DOES NOTHING
  441.                             ;BLANK LINE--DOES NOTHING
  442.  
  443. ┴ BLANK LINE IN YOUR SOURCE CODE WILL SIMPLY BE IGNORED.  ╘HIS HELPS TO MAKE
  444. CODE MUCH MORE READABLE.  ╘HE "#" DIRECTIVE IS A PREFIX DIRECTIVE.  ╘HIS MEANS
  445. THAT IT DOES NOT OCCUPY AN ENTIRE LINE BUT ALLOWS OTHER DIRECTIVES AND
  446. PROCESSOR INSTRUCTIONS TO FOLLOW IT ON THE SAME LINE (INCLUDING OTHER PREFIX
  447. DIRECTIVES). (┬UT NOTE THAT YOU CAN FOLLOW ANY PREFIX DIRECTIVE BY THE
  448. BLANK-LINE DIRECTIVE, EFFECTIVELY ALLOWING PREFIX DIRECTIVES TO BE REGULAR
  449. FULL-LINE DIRECTIVES (POWERFUL COMBINING FORMS)).  ╘HE "#" DIRECTIVE IS SIMPLY
  450. IGNORED BY THE ASSEMBLER, BUT YOU CAN USE IT TO HIGHLIGHT CERTAIN LINES OF
  451. CODE OR OTHER DIRECTIVES, LIKE THE FUTURE "INCLUDE" DIRECTIVE.
  452.  
  453. 6.2. ┴╙╙╔╟╬═┼╬╘ ─╔╥┼├╘╔╓┼╙
  454.  
  455. ╘HERE ARE FOUR ASSIGNMENT DIRECTIVES.  ╘HEY ALL ASSIGN (BIND) A VALUE TO AN
  456. IDENTIFIER.  ╚ERE THEY ARE:
  457.  
  458. LABEL = EXPRESSION          ;ASSIGN GIVEN VALUE TO THE LABEL
  459. LABEL:                      ;ASSIGN THE CURRENT ASSEMBLY ADDRESS TO LABEL
  460. +                           ;GENERATE A TEMPORARY LABEL, ASSIGN CUR ADDRESS
  461. -                           ;GENERATE A TEMPORARY LABEL, ASSIGN CUR ADDRESS
  462.  
  463. ╘HE FIRST (LABEL=EXPR) IS THE MOST GENERAL.  ╔T ASSIGNS THE RESULT OF
  464. EVALUATING THE EXPRESSION TO THE GIVEN LABEL.  ┬ECAUSE THIS ASSEMBLER IS SO
  465. GOSH-DARNED AWESOME, THE EXPRESSION DOESN'T EVEN HAVE TO BE RESOLVED; A "HOLE"
  466. WILL BE CREATED SAYING TO FILL IN THE ASSIGNED LABEL WHEN ALL OF THE
  467. UNRESOLVED IDENTIFIERS IN THE EXPRESSION EVENTUALLY BECOME RESOLVED.  ═OST
  468. OTHER ASSEMBLERS (IN FACT, ALL THAT ╔ HAVE EVER HEARD OF) CAN'T DO THIS
  469. BECAUSE IT CAUSES UGLY IMPLEMENTATION PROBLEMS, LIKE CASCADING LABEL
  470. RESOLUTIONS.  ├ONSIDER THE FOLLOWING EXAMPLE:
  471.  
  472. LDA #A
  473. STA B,X
  474. A = B+3
  475. B = C-1
  476. C = 5
  477.  
  478. ┴T THE POINT WHERE C BECOMES DEFINED, THERE ARE NO "MEMORY HOLES" BUT THE
  479. LABEL HOLE "B" MUST BE EVALUATED AND FILLED IN.  "B" GETS ASSIGNED THE VALUE
  480. 4.  ┴T THIS POINT, THERE ARE TWO HOLES: THE ONE IN THE "STA" INSTRUCTION AND
  481. THE LABEL "A".  ╫E FILL THEM BOTH IN, ASSIGNING "A" THE VALUE 8, AND WE
  482. DISCOVER THAT WE CAN FILL IN A HEW HOLE: THE ONE IN THE "LDA" INSTRUCTION.  ╫E
  483. DO THAT AND WE ARE FINALLY DONE.  ╘HE IMPLEMENTATION CAN HANDLE ANY NUMBER OF
  484. THESE RECURSIVE LABEL HOLE-FILLINGS, LIMITED ONLY BY THE AMOUNT OF NEAR+FAR
  485. MEMORY YOU HAVE.
  486.  
  487. ┴ LABEL CAN ONLY BE ASSIGNED A VALUE ONCE, AND YOU WILL GET AN ERROR IF YOU
  488. TRY TO REDEFINE A LABEL, EVEN IF IT IS CURRENTLY UNRESOLVED.  ┴LSO, ALL
  489. EXRESSIONS MUST BE RESOLVED BY THE END OF THE ASSEMBLY JOB, OR AN ERROR WILL
  490. BE REPORTED (BUT ONLY ONE--NAMING THE FIRST UNRESOLVED LABEL THAT THE
  491. ASSEMBLER RUNS ACROSS; ╔ MAY FIX THIS UP IN THE FUTURE).
  492.  
  493. ╘HE SECOND ASSIGNMENT DIRECTIVE IS EQUIVALENT TO "LABEL = *", BUT IT IS MORE
  494. CONVENIENT AND IS ALSO A PREFIX DIRECTIVE.  ╔T ASSIGNS THE CURRENT ADDRESS (AS
  495. OF THE START OF THE CURRENT LINE) TO THE GIVEN IDENTIFIER.  ╘HE COLON IS USED
  496. WITH THIS DIRECTIVE TO MAKE IT EASY AND EFFICIENT TO PARSE, AND TO MAKE IT
  497. EASY FOR A HUMAN TO SEE THAT A LABEL IS BEING DEFINED.  ═ANY OTHER ASSEMBLERS
  498. FOLLOW THIS DIRECTIVE WITH JUST WHITESPACE AND RELY ON OTHER TRICKS, LIKE
  499. PUTTING AN UGLY DOT BEFORE EACH DIRECTIVE, TO BAIL THEM OUT.
  500.  
  501. ╘HE THIRD AND FOURTH SET RELATIVE REFERENCE POINTS.  ╘HEY ARE EQUIVALENT
  502. TO "REL_LABEL = *", WHERE "REL_LABEL" IS A SPECIALLY GENERATED INTERNAL
  503. IDENTIFIER OF THE FORM "╠+123C" MENTIONED IN THE EXPRESSION SECTION.  ╘HE
  504. LABELS DEFINED BY THESE DIRECTIVES SHOW UP IN THE SYMBOL TABLE DUMP, IF YOU
  505. ASK FOR ONE ON THE COMMAND LINE.  ╘HESE ARE ALSO PREFIX DIRECTIVES, SO IF
  506. YOU WANTED TO SET A FORWARD AND A BACKWARD REFERENCE TO THE SAME ADDRESS,
  507. THEN YOU WOULD DO SOMETHING LIKE:
  508.  
  509. +- LDA #1
  510.  
  511. ╔N FACT, YOU COULD PUT AS MANY OR THESE DIRECTIVES ON THE FRONT OF A LINE AS
  512. YOU WANT, THOUGH MORE THAN ONE OF EACH WILL BE OF LITTLE USE.  ╬OTE THAT
  513. BACKWARD RELATIVE LABELS WILL ALWAYS BE DEFINED AT THE POINT THAT THEY ARE
  514. REFERENCED AND FORWARD RELATIVE LABELS WILL ALWAYS BE UNDEFINED (UNRESOLVED)
  515. WHEN THEY ARE REFERENCED.  ╔F AT THE END OF YOUR ASSEMBLY JOB THE ASSEMBLER
  516. COMPLAINS OF AN UNRESOLVED REFERENCE INVOLVING A LABEL OF THE FORM "╠+123C",
  517. THEN YOU REFER TO A FORWARD-RELATIVE POINT THAT YOU DON'T SET, AND IF THE
  518. LABEL IS OF THE FORM "╠-4000000000C", THEN YOU REFER TO A BACKWARD RELATIVE
  519. POINT THAT YOU DON'T DEFINE.
  520.  
  521. 6.3. ╧╥╔╟╔╬ ─╔╥┼├╘╔╓┼
  522.  
  523. ORG ADDRESS_EXPRESSION      ;SET THE ORIGIN OF THE ASSEMBLY
  524.  
  525. ╘HIS DIRECTIVE WILL SET THE CODE ORIGIN TO THE GIVEN EXPRESSION.  ╘HE
  526. EXPRESSION ═╒╙╘ BE RESOLVED AT THE POINT WHERE IT APPEARS, SINCE IT
  527. WOULD BE VERY DIFFICULT TO FILL IN THE TYPE OF HOLE THIS WOULD LEAVE
  528. BEHIND (THOUGH NOT IMPOSSIBLE, HMMM...).  ╘HE ORIGIN MUST BE SET BEFORE
  529. ANY PROCESSOR INSTRUCTION OR ASSEMBLER DIRECTIVE THAT GENERATES MEMORY
  530. VALUES IS ENCOUNTERED, AND THE CODE ORIGIN CAN ONLY BE SET ONCE.  ╘HIS
  531. RESULTS IN A CONTIGUOUS CODE REGION, WHICH IS WHAT ┴├┼ AND THE ├OMMODORE
  532. ╦ERNAL REQUIRE.
  533.  
  534. 6.4. ─┼╞╔╬┼-┬┘╘┼╙ ─╔╥┼├╘╔╓┼╙
  535.  
  536. DB EXP1, EXP2, ..., EXP╬    ;PUT BYTE VALUES INTO MEMORY
  537. DW EXP1, EXP2, ..., EXP╬    ;PUT WORD VALUES INTO MEMORY
  538. DT EXP1, EXP2, ..., EXP╬    ;PUT "TRIPLE" (3-BYTE) VALUES INTO MEMORY, LO->HI
  539. DL EXP1, EXP2, ..., EXP╬    ;PUT "LONG" (4-BYTE) VALUES INTO MEMORY, LO->HI
  540.  
  541. ╘HESE DIRECTIVES ALL PUT BYTE VALUES INTO CODE MEMORY, AT THE CURRENT
  542. ADDRESS.  ╘HE ONLY DIFFERENCE BETWEEN THE FOUR OF THEM IS THE SIZE OF DATA
  543. VALUES THEY PUT INTO MEMORY: BYTES (8 BITS), WORDS (16 BITS), TRIPLES (24
  544. BITS), AND LONGS (32 BITS).  ╘HE CODE ADDRESS IS INCREMENTED BY THE
  545. APPROPRIATE NUMBER OF BYTES BETWEEN PUTTING EACH VALUE INTO MEMORY.  ┴NY
  546. NUMBER OF VALUES CAN BE SPECIFIED BY SEPARATING THEM BY COMMAS.  ┴LL
  547. EXPRESSIONS ARE EVALUATED IN FULL 32 BITS, BUT MUST FIT INTO THE SIZE FOR THE
  548. DIRECTIVE.  ╘HE EXPRESSIONS DON'T HAVE TO BE RESOLVED AT THE TIME THEY
  549. APPEAR.
  550.  
  551. ╘HESE DIRECTIVES CAN ALSO BE GIVEN STRINGS FOR ARGUMENTS, WHICH MEANS THAT
  552. EACH CHARACTER OF THE STRING WILL BE STORED AS ONE BYTE/WORD/ETC. IN MEMORY,
  553. FOR EXAMPLE:
  554.  
  555. DB 123, ABC+XYZ+%1101-"A"+$1, "HELLO", 0, "YO!", "KEEP ON HACKIN'\0"
  556.  
  557. 6.5. ┬╒╞ ─╔╥┼├╘╔╓┼
  558.  
  559. BUF SIZE_EXPRESSION         ;RESERVE "SIZE" BYTES OF SPACE, FILLED WITH ZEROES
  560.  
  561. ╘HIS DIRECTIVE RESERVES THE GIVEN NUMBER OF BYTES OF SPACE FROM THE CURRENT
  562. CODE ADDRESS AND FILLS THEM WITH ZEROES.  ╘HE EXPRESSION MUST BE RESOLVED,
  563. AND CAN BE ANY VALUE FROM 0 UP TO 65535 OR THE NUMBER OF BYTES REMAINING
  564. UNTIL THE CODE ADDRESS OVERFLOWS THE 64╦ CODE SPACE LIMIT.
  565.  
  566. 6.6. ╨┴╥╙╔╬╟
  567.  
  568. ┬ECAUSE OF THE WAY THAT THE ASSEMBLER PARSES THE SOURCE CODE (IT USES A
  569. ONE-CHARACTER-PEEK-AHEAD AD-HOC PARSER), YOU CAN DEFINE LABELS THAT ARE ALSO
  570. DIRECTIVE NAMES OR PROCESSOR-INSTRUCTION NAMES.  ╘HIS IS NOT A RECOMMENDED
  571. PRACTICE, SINCE YOU CAN END UP WITH LINES THAT LOOK LIKE:
  572.  
  573. X: LDA: LDA LDA,X
  574.  
  575. ╘HE PARSER WILL KNOW WHAT TO DO, BUT MOST HUMANS WON'T.  ┴LSO, BECAUSE OF THE
  576. TOKENIZER, CAN PUT ARBITRARY SPACING BETWEEN TOKENS, EXCEPT BETWEEN TOKENS
  577. THAT WOULD OTHERWISE MERGE TOGETHER (LIKE TWO ADJACENT IDENTIFIERS OR DECIMAL
  578. NUMBERS).
  579. ------------------------------------------------------------------------------
  580. 7. ┼╥╥╧╥ ╚┴╬─╠╔╬╟
  581.  
  582. ╫HEN AN ERROR IS DETECTED, THE ASSEMBLER WILL STOP THE WHOLE ASSEMBLY JOB AND
  583. PRINT OUT ONE ERROR MESSAGE (TO THE STDERR FILE STREAM).  ╚ERE ARE TWO
  584. EXAMPLES OF ERROR MESSAGES:
  585.  
  586. ERR ("K:":2:0) ╓ALUE IS TOO LARGE OR NEGATIVE
  587.  
  588. ERR ("K:":3:0), REF("K:":2:0) ╓ALUE IS TOO LARGE OR NEGATIVE
  589.  
  590. ╔N BOTH ERROR MESSAGES, THE STUFF INSIDE OF THE PARENTHESES IS THE FILENAME OF
  591. THE SOURCE FILE (THE KEYBOARD HERE), THE SOURCE LINE WHERE THE ERROR WAS
  592. DETECTED, AND THE COLUMN NUMBER WHERE THE ERROR WAS DETECTED.  ├URRENTLY, THE
  593. COLUMN NUMBER IS NOT IMPLEMENTED SO IT IS ALWAYS ZERO.  ╫HEN IT IS
  594. IMPLEMENTED, THE COLUMN NUMBERS WILL START FROM 1, LIKE IN THE ┌ED TEXT
  595. EDITOR, AND IT WILL POINT TO THE FIRST CHARACTER OF THE TOKEN WHERE THE
  596. ERROR WAS DISCOVERED.
  597.  
  598. ╔N THE FIRST EXAMPLE, THE ERROR OCCURRED BECAUSE THE EXPRESSION WAS RESOLVED
  599. AND THE VALUE WAS FOUND TO BE TOO LARGE FOR WHATEVER OPERATION WAS ATTEMPTED.
  600. ╔N THE SECOND EXAMPLE, AN EXPRESSION WAS USED BUT UNRESOLVED ON LINE 2 OF THE
  601. SOURCE FILE, AND WHEN ITS UNRESOLVED IDENTIFIER(S) WAS FINALLY FILLED IN IN
  602. LINE 3 OF THE SOURCE, THE "HOLE" TO BE FILLED IN WAS FOUND TO BE TOO SMALL FOR
  603. THE VALUE, SO AN ERROR RESULTED.  ╘HIS IS WHAT THE "REF" FILE POSITION MEANS.
  604. ╞ILENAMES ARE INCLUDED IN ERROR MESSAGES BECAUSE IN THE FUTURE, IT WILL BE
  605. POSSIBLE TO HAVE ERRORS CROP UP IN INCLUDED FILES AND ELSEWHERE.
  606.  
  607. ╚ERE IS THE ENTIRE LIST OF POSSIBLE ERROR MESSAGES:
  608.  
  609. ╬╒═  ═┼┴╬╔╬╟
  610. ---  -------
  611. 01.  "┴N IDENTIFIER TOKEN EXCEEDS 240 CHARS IN LENGTH"
  612. 02.  "┴ STRING LITERAL EXCEEDS 240 CHARS IN LENGTH"
  613. 03.  "╥AN INTO A ├╥ BEFORE END OF STRING LITERAL"
  614. 04.  "╔NVALID NUMERIC LITERAL"
  615. 05.  "╬UMERIC LITERAL VALUE OVERFLOWS 32-BITS"
  616. 06.  "╙YNTAX ERROR"
  617. 07.  "┴TTEMPT TO PERFORM NUMERIC OPERATORS ON A STRING"
  618. 08.  "┼XPRESSION HAS MORE THAN 17 OPERANDS"
  619. 09.  "╥AN OUT OF MEMORY DURING COMPILATION PROCESS"
  620. 10.  "┴TTEMPT TO REDEFINE A SYMBOL"
  621. 11.  "┴TTEMPT TO ASSEMBLE CODE WITH CODE ORIGIN NOT SET"
  622. 12.  "╔NTERNAL ERROR: ATTEMPT TO ASSIGN TO UNEXPECTED ID"
  623. 13.  "╬ON-NUMERIC SYMBOL IN A NUMERIC EXPRESSION"
  624. 14.  "┼XPECTING AN OPERATOR"
  625. 15.  "┼XPECTING AN OPERAND"
  626. 16.  "┼XPECTING A COMMAND"
  627. 17.  "╓ALUE IS TOO LARGE OR NEGATIVE"
  628. 18.  "┬RANCH OUT OF RANGE"
  629. 19.  "╞EATURE IS NOT (YET) IMPLEMENTED"
  630. 20.  "╔NSTRUCTION DOES NOT SUPPORT GIVEN ADDRESS MODE"
  631. 21.  "┴DDRESS WRAPED AROUND 64╦ CODE ADDRESS SPACE"
  632. 22.  "┼RROR TRYING TO WRITE OUTPUT OBJECT FILE"
  633. 23.  "─IRECTIVE REQUIRES RESOLVED EXPRESSION"
  634. 24.  "├ODE ORIGIN ALREADY SET; YOU CAN'T SET IT TWICE"
  635. 25.  "╒NRESOLVED SYMBOL: "
  636. 26.  "╘HUS ASSEMBLER DOESN'T ACCEPT .DOT COMMANDS, ┬UDDY!"
  637.  
  638. ┴ "╙YNTAX ERROR" (#06) WILL BE REPORTED WHENEVER A TOKEN OTHER THAN ONE THAT
  639. WAS EXPECTED IS FOUND.  "╥AN OUT OF MEMORY" (#09) MAY TURN UP OFTEN ON AN
  640. UNEXPANDED 64.  "┼XPECTING COMMAND" (#16) MEANS THAT THE ASSEMBLER WAS
  641. EXPECTING EITHER A PROCESSOR INSTRUCTION OR DIRECTIVE BUT FOUND SOMETHING ELSE
  642. INSTEAD.  "╬OT IMPLEMENTED" (#19) MEANS THAT YOU'VE TRIED TO USE A DIRECTIVE
  643. THAT ISN'T IMPLEMENTED YET.  "╒NRESOLVED SYMBOL" (#25) WILL BE PRINTED WITH A
  644. RANDOMLY CHOSEN UNRESOLVED SYMBOL, WITH THE LAST PLACE IN THE SOURCE CODE
  645. WHERE IT WAS REFERENCED.  "─OT COMMANDS" (#26) IS A REMINDER THAT DIRECTIVES
  646. IN THIS ASSEMBLER ARE NOT PREFIXED WITH A DOT (.).
  647.  
  648. ╘HERE ARE TWO MAIN REASONS BEHIND THE IDEA OF STOPPING AT THE FIRST ERROR
  649. ENCOUNTERED: SIMPLICITY AND INTEROPERABILITY.  ╫HEN ┌ED IS IMPLEMENTED FOR
  650. ┴├┼, IT WILL HAVE A FEATURE THAT WILL ALLOW IT TO INVOKE THE ASSEMBLER (AS A
  651. SUB-PROCESS) AND HAVE THE ASSEMBLER RETURN AN ERROR LOCATION AND MESSAGE TO
  652. ┌ED, WHICH WILL DISPLAY THE ERROR MESSAGE AND POSITION THE CURSOR TO THE ERROR
  653. LOCATION (IF THE SOURCE FILE IS LOADED).
  654.  
  655. ╫HILE ON THE SUBJECT OF MESSAGES COMING OUT OF THE ASSEMBLER, HERE IS AN
  656. EXAMPLE OF THE FORMAT OF THE SYMBOL TABLE DUMP THAT YOU CAN ASK FOR ON THE
  657. COMMAND LINE.  ╧NE LINE IS PRINTED FOR EACH IDENTIFIER.  ╘HE "HASH" VALUE IS
  658. THE BUCKET IN THE HASH TABLE CHOSEN FOR THE IDENTIFIER.  ╘HIS MAY NOT HAVE A
  659. WHOLE LOT OF MEANING FOR A USER, BUT A GOOD DISTRIBUTION OF THESE HASH BUCKETS
  660. IN THE SYMBOL TABLE IS A GOOD THING.  ╬EXT IS THE 32-BIT "HEXVALUE" OF THE
  661. LABEL FOLLOWED BY THE VALUE IN "DECIMAL".  ╘HEN COMES THE TYPE.  ┴ TYPE OF "V"
  662. MEANS VALUE AND "A" MEANS AN IN-CODE-RANGE ADDRESS.  ╘HEN COMES THE NAME OF
  663. THE IDENTIFIER.  ╔T COMES LAST TO GIVE LOTS OF SPACE TO PRINT IT.  ╔F AN
  664. IDENTIFIER IS TEN OR FEWER CHARACTERS LONG, ITS SYMBOL-TABLE-DUMP LINE WILL
  665. FIT ON A 40-COLUMN SCREEN.  ┴T THE BOTTOM, THE NUMBER OF SYMBOLS IS PRINTED.
  666. ╘HIS TABLE IS DIRECTED TO THE STDOUT FILE STREAM, SO YOU CAN REDIRECT IT TO A
  667. FILE IN ORDER TO SAVE IT.
  668.  
  669. ╚┴╙╚  ╚┼╪╓┴╠╒┼    ─┼├╔═┴╠  ╘  ╬┴═┼
  670. ----  -------- ----------  -  -----
  671.    8  00000F06       3846  V  ACE┴RGV
  672.  469  00007008      28680  A  MAIN
  673. --
  674. ╬UMBER OF SYMBOLS: 2
  675. ------------------------------------------------------------------------------
  676. 8. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  677.  
  678. ╔N EACH OF THE WAYS IN WHICH IT IS HEAVY-WEIGHT AND SLOWED-DOWN COMPARED TO
  679. OTHER ASSEMBLERS, IT IS ALSO MORE POWERFUL AND MORE FLEXIBLE.
  680.  
  681. - ╔T USES FAR MEMORY FOR STORING SYMBOLS, SO THERE IS NO STATIC OR ARBITRARILY
  682.   SMALL LIMIT ON THE NUMBER OF SYMBOLS.  ═ACRO SIZES WILL ALSO BE LIMITED BY
  683.   ONLY THE AMOUNT OF MEMORY AVAILABLE, AS WELL AS THE "HOLE TABLE".
  684.  
  685. - ╔T HAS TO MAINTAIN A "HOLE TABLE" BECAUSE OF ITS STRUCTURE, BUT THIS MEANS
  686.   THAT YOU CAN DEFINE LABELS IN TERMS OF OTHER UNRESOLVED LABELS, THAT YOU
  687.   WILL NEVER GET A "SYNC ERROR" BECAUSE OF INCORRECT ASSUMPTIONS MADE (AND NOT
  688.   RECORDED) ABOUT UNRESOLVED LABELS, AND THAT MODULAR ASSEMBLY CAN BE
  689.   IMPLEMENTED WITHOUT TOO MUCH FURTHER EFFORT (I.E., ".O" OR ".OBJ" FILES),
  690.   SINCE AN UNRESOLVED EXTERNAL REFERENCE HANDLING MECHANISM IS ALREADY
  691.   IMPLEMENTED.
  692.  
  693. - ╘HE ASSEMBLER KEEPS TRACK OF THE "TYPES" OF LABELS, EITHER "ADDRESS" OR
  694.   "VALUE" THAT MAKES IT POSSIBLE TO PROVIDE CODE RELOCATION INFORMATION THAT
  695.   WILL BE NEEDED BY MODULAR ASSEMBLY AND BY FUTURE MULTITASKING OPERATING
  696.   SYSTEMS.
  697.  
  698. - ┬ECAUSE A "HOLE TABLE" APPROACH IS USED, THE RAW OBJECT CODE MUST BE STORED
  699.   INTERNALLY UNTIL THE ASSEMBLY IS COMPLETE AND THEN IT CAN BE WRITTEN OUT TO
  700.   A FILE, BUT THIS ALSO MEANS THAT HEADER INFORMATION CAN BE PROVIDED IN AN
  701.   OUTPUT FILE SINCE ALL ASSEMBLY RESULTS WILL BE KNOWN BEFORE ANY OUTPUT IS
  702.   WRITTEN.
  703.  
  704. - ╔ TOOK THE EASY WAY OUT FOR HANDLING ERRORS; WHEN AN ERROR IS DETECTED, AN
  705.   ERROR MESSAGE IS GENERATED AND PRINTED AND THE ASSEMBLER ╙╘╧╨S.  ┬UT THE
  706.   EXIT MECHANISM PROVIDED BY ┴├┼ MAKES IT POSSIBLE TO INTEGRATE THE ASSEMBLER
  707.   WITH OTHER PROGRAMS, LIKE A TEXT EDITOR, TO MOVE THE TEXT EDITOR CURSOR TO
  708.   THE LINE AND COLUMN CONTAINING THE ERROR AND DISPLAY A MESSAGE IN THE TEXT
  709.   EDITOR.
  710.  
  711. ╘HERE ARE TWO SPEED ADVANTAGES THAT THIS ASSEMBLER HAS OVER (SOME?) OTHERS:
  712.  
  713. - ╔T USES A 1024-ENTRY HASH TABLE OF POINTERS TO CHAINS OF LABELS, SO, FOR A
  714.   PROGRAM THAT HAS 800 OR SO SYMBOLS, EACH CAN BE ACCESSED IN SOMETHING LIKE
  715.   1.3 TRIES.  ╞OR ╬ TOTAL SYMBOLS, THE REQUIRED NUMBER OF REFERENCES IS
  716.   APPROXIMATELY ═┴╪( ╬/1024, 1 ).
  717.  
  718. - ╔T IS ONE-PASS, SO IT ONLY HAS TO GO THROUGH THE OVERHEAD OF READING THE
  719.   SOURCE FILE ONCE.  ─EPENDING ON THE TYPE OF DEVICE THE FILE IS STORED ON,
  720.   THIS MAY GIVE A CONSIDERABLE SAVINGS.  ╘HIS ALSO MAKES IT POSSIBLE TO
  721.   "PIPE" THE OUTPUT OF ANOTHER PROGRAM INTO THE ASSEMBLER, WITHOUT ANY
  722.   "REWIND" PROBLEMS.
  723.  
  724. ╚ERE ARE SOME PERFORMACE FIGURES, COMPARED TO THE ┬UDDY ASSEMBLER FOR THE 128.
  725. ┴LL TEST CASES WERE RUN ON A ├128 IN 2-═╚Z MODE WITH A ╥┴═╠INK, ╥┼╒, AND 1571
  726. AVAILABLE.
  727.  
  728. ┴╙╙┼═┬   ╘╔═┼(SEC)   ╞╔╠┼ ─┼╓╔├┼   ╞┴╥ ╙╘╧╥┴╟┼
  729. ------   ---------   -----------   -----------
  730. ┬UDDY         45.5   ╥┴═╠INK       N/A
  731. ┴├┼-AS        61.5   ╥┴═╠INK       ╥┼╒
  732. ┴├┼-AS        49.5   ┴├┼ RAMDISK   ╥┼╒
  733. ┴├┼-AS        75.6   ╥┴═╠INK       ╥┴═0+╥┴═1
  734. ┴├┼-AS       150.5   1571          ╥┴═0+╥┴═1
  735. ┬UDDY        240.0   1571          N/A
  736.  
  737. ╨ART OF THE ASSEMBLY JOB WAS LOADED INTO MEMORY FOR THE ┬UDDY ASSEMBLER, BUT
  738. THE LOAD TIME IS INCLUDED IN THE FIGURE.  ┴S YOU CAN SEE, BUDDY PERFORMS
  739. FASTER WITH A FAST FILE DEVICE AND SLOWER WITH A SLOW FILE DEVICE (BECAUSE IT
  740. REQUIRES TWO PASSES).  ╔ HAVE A COUPLE OF TRICKS UP MY SLEEVE TO IMPROVE THE
  741. ┴├┼ ASSEMBLER'S PERFORMANCE.
  742.  
  743. ╘HERE ARE ALSO A COUPLE OF SUBTLE ERRORS IN THIS IMPLEMENTATION.  ╞IRST, IF IT
  744. RECEIVES A "SHORT BLOCK" FROM THE SOURCE DEVICE, IT WILL PUT WHITESPACE
  745. BETWEEN THE CURRENT BLOCK AND THE NEXT, THUS POTENTIALLY SPLITTING A TOKEN.
  746. ┴LSO, IF MULTIPLE FILES ARE USED, THE "REF" FILENAME MAY NOT BE VALID.
  747.  
  748. ╚ERE ARE A FEW DATA STRUCTURES FOR YOUR ENJOYMENT.
  749.  
  750. ╔DENTIFIER DESCRIPTOR:
  751.  
  752. ╧╞╞   ╙╔┌   ─┼╙├╥╔╨╘╔╧╬
  753. ---   ---   ------------
  754.   0     4   NEXT LINK IN HASH TABLE BUCKET
  755.   4     4   VALUE OF SYMBOL, POINTER TO REFERENCE LIST, OR PTR TO MACRO DEFN
  756.   8     1   OFFSET OF REFERENCE IN EXPRESSION OF REFERENCE LIST
  757.   9     1   TYPE: $00=VALUE, $01=ADDRESS, $80=UNRESOLVED, $FF=UNRESOLVED DEFINE
  758.  10     1   CLASS: $00=NORMAL, $01=PRIVATE, $80=GLOBAL (NOT USED YET)
  759.  11     1   NAME LENGTH
  760.  12     *   NULL-TERMINATED NAME STRING (1-240 CHARS)
  761.  
  762. ┼XPRESSION/╚OLE DESCRIPTOR:
  763.  
  764. ╧╞╞   ╙╔┌   ─┼╙├╥╔╨╘╔╧╬
  765. ---   ---   -----------
  766.   0     1   HOLE TYPE: $01=BYTE, $02=WORD, $03=TRIPLE, $04=LONG, $40=BRANCH,
  767.             $80=LABEL
  768.   1     1   EXPRESSION LENGTH: MAXIMUM OFFSET+1 IN BYTES
  769.   2     1   NUMBER OF UNRESOLVED REFERENCES IN EXPRESSION
  770.   3     1   SOURCE COLUMN OF REFERENCE
  771.   4     4   ADDRESS OF HOLE
  772.   8     4   SOURCE LINE OF REFERENCE
  773.  12     4   SOURCE FILE POINTER
  774.  16    14   EXPRESSION OPERAND DESCRIPTOR SLOT #1
  775.  30    14   EXPRESSION OPERAND DESCRIPTOR SLOT #2
  776.  44    14   EXPRESSION OPERAND DESCRIPTOR SLOT #3
  777.  58    14   EXPRESSION OPERAND DESCRIPTOR SLOT #4
  778.  72    14   EXPRESSION OPERAND DESCRIPTOR SLOT #5
  779.  86    14   EXPRESSION OPERAND DESCRIPTOR SLOT #6
  780. 100    14   EXPRESSION OPERAND DESCRIPTOR SLOT #7
  781. 114    14   EXPRESSION OPERAND DESCRIPTOR SLOT #8
  782. 128    14   EXPRESSION OPERAND DESCRIPTOR SLOT #9
  783. 142    14   EXPRESSION OPERAND DESCRIPTOR SLOT #10
  784. 156    14   EXPRESSION OPERAND DESCRIPTOR SLOT #11
  785. 170    14   EXPRESSION OPERAND DESCRIPTOR SLOT #12
  786. 184    14   EXPRESSION OPERAND DESCRIPTOR SLOT #13
  787. 198    14   EXPRESSION OPERAND DESCRIPTOR SLOT #14
  788. 212    14   EXPRESSION OPERAND DESCRIPTOR SLOT #15
  789. 226    14   EXPRESSION OPERAND DESCRIPTOR SLOT #16
  790. 240    14   EXPRESSION OPERAND DESCRIPTOR SLOT #17
  791. 254     -   ┼╬─+1
  792.  
  793. ┼XPRESSION OPERAND DESCRIPTOR:
  794.  
  795. ╧╞╞   ╙╔┌   ─┼╙├╥╔╨╘╔╧╬
  796. ---   ---   -----------
  797.   0     1   OPERATOR: "+" OR "-"
  798.   1     1   TYPE OF VALUE: $00=NUMBER, $01=ADDRESS, $80=UNRESOLVED IDENTIFIER
  799.   2     1   MONADIC-OPERATOR RESULT SIGN OF VALUE: $00=POSITIVE, $80=NEGATIVE
  800.   3     1   HI/LO OPERATOR COUNTS: HIGH_NYBBLE=">" COUNT, LOW_NYBBLE="<" CNT
  801.   4     4   NUMERIC VALUE OR UNRESOLVED-IDENTIFIER POINTER
  802.   8     4   NEXT UNRESOLVED REFERENCE IN CHAIN FOR UNRESOLVED IDENTIFIER
  803.  12     1   OFFSET IN HOLE STRUCTURE OF NEXT UNRESOLVED REFERENCE (OPERAND)
  804.  13     1   RESERVED
  805.  14     -   ┼╬─+1
  806. ------------------------------------------------------------------------------
  807. 9. ╘╚┼ ╞╒╘╒╥┼
  808.  
  809. ╘HIS SECTION IS JUST RANDOM NOTES SINCE ╔ DON'T HAVE THE TIME RIGHT NOW TO
  810. FILL IT IN.  ╔ WILL BE IMPLEMENTING INCLUDE FILES, CONDITIONAL ASSEMBLY, AND
  811. MACRO ASSEMBLY FEATURES IN THE FUTURE.  ═ODULAR ASSEMBLY AND RELOCATABLE-
  812. CODE GENERATION ARE ALSO IN MY PLANS.
  813.  
  814. ;TODO: -IMPLEMENT STORAGE CLASSES: $00=INTERNAL, $01=REL.LABEL, $80=EXPORTED
  815. ;      -IMPLEMENT ALL VAR TYPES: 0=VALUE, 1=ADDRESS, 2=ADDR.HIGH, 3=ADDR.LOW
  816. ;      -IMPLEMENT SOURCE COLUMN, MAKE LINE:COL POINT TO START OF CUR TOKEN
  817. ;      -MAKE IT SO YOU CAN USE A "\<├╥>" TO CONTINUE A LINE
  818. ;      -ADD MORE OPERATORS: * / & ▄ ▐  FULL PRECEDENCE?
  819. ;      -CACHE CURRENT SYMBOL
  820. ;
  821. ; USAGE: AS [-HELP] [-S] [-D] [-B] [-R] [-L] [-A ADDR] [FILE ...] [-O FILENAME]
  822. ;
  823. ;     -HELP : PRODUCE THIS INFORMATION, DON'T RUN
  824. ;        -S : PRODUCE SYMBOL TABLE DUMP AT END
  825. ;        -D : PROVIDE DEBUGGING INFORMATION (LOTS)
  826. ;        -B : PRODUCE BINARY MODULE AT END (DEFAULT)
  827. ;        -R : PRODUCE RELOCATABLE MODULE RATHER THAN BINARY MODULE
  828. ;        -L : PRODUCE LINKABLE ".O" MODULE(S)
  829. ;        -A : SET GLOBAL CODE ORIGIN TO GIVEN ADDRESS
  830. ;        -O : PUT OUTPUT INTO GIVEN FILENAME
  831. ;
  832. ;     ╔F -L OPTION IS NOT USED, ALL FILES, INCLUDING SOURCE AND OBJECT MODULES,
  833. ; WILL BE ASSEMBLED TOGETHER.  ╘HE OUTPUT MODULE NAME WILL BE THE BASE NAME OF
  834. ; THE FIRST FILE GIVEN IF IT HAS A ".S" OR ".O" EXTENSION, "A.OUT" IF THE FIRST
  835. ; FILE HAS NONE OF THESE EXTENSIONS, OR WILL BE THE FILENAME GIVEN BY THE -O
  836. ; OPTION IF USED.
  837. ;     ╔F THE -L OPTION IS USED, THEN EACH GIVEN SOURCE MODULE WILL BE
  838. ; ASSEMBLED INDEPENDENTLY INTO ITS OWN ".O" MODULE.  ╧BJECT MODULES WILL BE
  839. ; IGNORED.
  840. ;     ╘HE GLOBAL ORIGIN WILL BE EITHER THAT GIVEN BY THE -A OPTION (IF IT IS
  841. ; USED) OR BY THE LOCAL ORIGIN OF THE FIRST SOURCE/OBJECT MODULE.  ┼ACH
  842. ; SOURCE MODULE THAT GENERATES CODE MUST HAVE A LOCAL CODE ORIGIN.
  843.  
  844. ═ORE ─IRECTIVES:
  845.  
  846. INCLUDE "FILENAME"
  847. IF <EXPRESSION> <RELOP> <EXPRESSION>
  848. ELSIF <EXPRESSION> <RELOP> <EXPRESSION>
  849. ELSE
  850. ENDIF
  851. MACRO MACRONAME
  852. ENDMACRO
  853. EXPORT LABEL1, LABEL2, ..., LABEL╬
  854. BSS SIZE_EXPRESSION
  855.  
  856. MACRO BLT ;?1=ADDR
  857.    BCC ?1
  858. ENDMACRO
  859.  
  860. MACRO ADD ;?1=OPERAND
  861.    CLC
  862.    ADC ?1
  863. ENDMACRO
  864.  
  865. MACRO LDW ;?1=DEST, ?2=SOURCE
  866.  IF ?# != 2
  867.    ERROR "THE LDW MACRO INSTANCE DOESN'T HAVE TWO ARGUMENTS"
  868.  ENDIF
  869.  IF @1 = #
  870.    ARGSHIFT 2 0
  871.    LDA #<?2
  872.    STA ?1+0
  873.    LDA #>?2
  874.    STA ?1+1
  875.  ELSE
  876.    LDA ?2+0
  877.    STA ?1+0
  878.    LDA ?2+1
  879.    STA ?1+1
  880.  ENDIF
  881. ENDMACRO
  882. ------------------------------------------------------------------------------
  883. ╙O, THERE IS FINALLY A POWERFUL AND CONVENIENT ASSEMBLER UNIVERSALLY AVAILABLE
  884. FOR BOTH THE 64 AND 128... FOR FREE.  ╘HE SOURCE CODE FOR THE ASSEMBLER
  885. (WRITTEN IN THE ASSEMBLER'S OWN ASSEMBLY FORMAT, OF COURSE) IS ALSO AVAILABLE
  886. FOR FREE.  ╘HERE ARE A FEW MORE FEATURES THAT NEED TO BE IMPLEMENTED, BUT ╔
  887. KNOW EXACTLY HOW TO IMPLEMENT THEM.
  888.  
  889. ╦EEP ON ╚ACKIN'!
  890.  
  891. -├RAIG ┬RUCE
  892. CSBRUCE@CCNGA.UWATERLOO.CA
  893. "╟IVE THEM APPLICATIONS AND THEY WILL ONLY WANT MORE; GIVE THEM DEVELOPMENT
  894.  TOOLS AND THEY WILL GIVE YOU APPLICATIONS, AND MORE."
  895. ------------------------------------------------------------------------┼╬─---
  896.  
  897.