home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 348_01 / z80adoc.mm < prev    next >
Text File  |  1991-05-02  |  34KB  |  1,065 lines

  1. .nr N 4
  2. \" use "tbl -D z80adoc.mm |troff -Tps -mm |eps | lp -dpsript" 
  3. \" on altos86 to print
  4. .PF ""
  5. .PH ""
  6. .rs
  7. .sp 5
  8. .ce
  9. \s24 Z80 Cross Assembler\s10
  10. .sp 2
  11. .ce
  12. Portable Version
  13. .sp 20
  14. .AS
  15. This program lets you use your computer to assemble
  16. code for the Intel Z80 family of microprocessors.
  17. The program is written in portable C.
  18. All assembler features are supported except
  19. relocation, linkage, and macros.
  20. .AE
  21. .SK
  22. .nr P 1
  23. .PH ""
  24. .PF "''Page \\\\nP''"
  25. .ce
  26. Z80 Cross-Assembler (Portable)
  27. .ce
  28. Version 0.0
  29. .ce
  30. Copyright (c) 1988 Michael G. Panas
  31. .SA 1
  32. \" Use 3 for troff and 1 for nroff
  33. .ds HF 1 1 1
  34. \".ds HF 3 3 3
  35. .H 1 "Introduction"
  36. .P
  37. This assembler was developed to cross-assemble the Z80 assembly language
  38. mnemonics and pseudo opcodes defined by an assembler already
  39. running on a mini-computer.
  40. As such the mnemonics may look very strange, since they are not
  41. standard Zilog Z80 mnemonics but, extensions to the 8080 language.
  42. Many enhancements to the original mini-computer version have been made.
  43. .P
  44. This package assembles the dialect of Z80 source code
  45. defined in Appendix I into Z80 object code.
  46. It will run under DOS 2.x and up and also several 
  47. UNIX machines (see appendix II - portability).
  48. .H 1 "How to Use the Cross-Assembler"
  49. .P
  50. This program requires one input file (your Z80 source code) and 
  51. zero to two output files (the listing and the object).  The input 
  52. file MUST be specified, or the assembler will bomb on a fatal 
  53. error.  The listing and object files are optional.  If no listing 
  54. file is specified, no listing is generated, and if no object file 
  55. is specified, no object is generated.  If the object file is 
  56. specified, the object is written to this file in "Intel 
  57. hexadecimal" format.
  58.  
  59. .ti
  60. The command line for the cross-assembler looks like this:
  61.  
  62. .ti
  63. z80a source_file { -l list_file } { -o object_file }
  64.  
  65. .ti
  66. where the { } indicates that the specified item is optional.
  67. .DS I
  68. Some examples are in order:
  69.  
  70. z80a testz80.asm         source:    testz80.asm
  71.                 listing:    none
  72.                  object:    none
  73.  
  74. z80a testz80.asm -l testz80.prn     source:    testz80.asm
  75.                 listing:    testz80.prn
  76.                  object:    none
  77.  
  78. z80a testz80.asm -o testz80.hex     source:    testz80.asm
  79.                  listing:    none
  80.                  object:    testz80.hex
  81.  
  82. z80a testz80.asm -l testz80.prn -o testz80.hex
  83.                  source:    testz80.asm
  84.                 listing:    testz80.prn
  85.                  object:    testz80.hex
  86. .DE
  87. .P
  88. The order in which the source, listing, and object files are 
  89. specified does not matter.  Note that no default file name extensions
  90. are supplied by the assembler as this gives rise to portability problems.
  91. .H 1 "Format of Cross-Assembler Source Lines"
  92. .P
  93. The source file that the cross-assembler processes into a 
  94. listing and an object is an ASCII text file that you can prepare 
  95. with whatever editor you have at hand.  The most-significant 
  96. (parity) bit of each character is cleared as the character is 
  97. read from disk by the cross-assembler, so editors that set this 
  98. bit (such as WordStar's document mode) should not bother this 
  99. program.  All printing characters, the ASCII TAB character (09H), 
  100. and newline character(s) are processed by the assembler.  All 
  101. other characters are passed through to the listing file, but are 
  102. otherwise ignored.
  103. .P
  104. The source file is divided into lines by newline character(s).
  105. The internal buffers of the cross-assembler will 
  106. accommodate lines of up to 255 characters which should be more 
  107. than ample for almost any job.  If you must use longer lines, 
  108. change the constant MAXLINE in file z80a.h and recompile the 
  109. cross-assembler.  Otherwise, you will overflow the buffers, and 
  110. the program will mysteriously crash.
  111. .P
  112. Each source line is made up of three fields:  the label 
  113. field, the opcode field, and the argument field.
  114. The label field 
  115. is optional, but if it is present, it must begin in column 1.  
  116. The opcode field is optional, but if it is present, it must not 
  117. begin in column 1.
  118. If both a label and an opcode are present, 
  119. one or more spaces and/or TAB characters must separate the two.  
  120. If the opcode requires arguments, they are placed in the argument 
  121. field which is separated from the opcode field by one or more 
  122. spaces and/or TAB characters.
  123. Multiple arguments are separated by semicolons.
  124. Finally, an optional comment can 
  125. be added to the end of the line.  This comment can begin with an
  126. optional
  127. asterisk which signals the assembler to pass the rest of the 
  128. line to the listing and otherwise ignore it.
  129. The assembler ignores any text after the argument field, for this
  130. reason arguments must not contain any spaces.
  131. Thus, the source line looks like this:
  132. .DS I
  133. {label}{ opcode{ arguments}}{{*}commentary}
  134. .DE
  135. where the { } indicates that the specified item is optional.
  136. .DS I
  137. Some examples are in order:
  138. .DE
  139. .DF I
  140. column 1
  141. |
  142. v
  143. GRONK        JP    NC; LOOP    This line has everything.
  144.         INC    C        This line has no label.
  145.         BEEP            This line has no opcode.
  146. *                    This line has no label and no opcode.
  147.  
  148. * The previous line has nothing at all.
  149.         END            This line has no argument.
  150. .DE
  151. .H 2 Labels
  152. .P
  153. A label is any sequence of alphabetic or numeric characters 
  154. starting with an alphabetic.  The legal alphabetics are:
  155. .DS I
  156. ! $ % & , . : ? [ \\\ ] ^ _  ` { | }  ~  A-Z  a-z
  157. .DE
  158. .P
  159. The numeric characters are the digits 0-9.
  160. Note that "A" is not the same as "a" in a label.
  161. This is an enhancement from the mini-computer version which
  162. accepted only upper case labels.
  163. This can explain mysterious U (undefined label) errors occurring
  164. when a label appears to be defined.
  165. .P
  166. A label is permitted on any line except a line where the 
  167. opcode is LIST, ULIST, NCODE, CODE, TTL, PAG, PAGT, SKP, TYP,
  168. IF, ELS, or ENF.
  169. The label is assigned the value of 
  170. the assembly program counter before any of the rest of the line 
  171. is processed except when the opcode is EQU, ORG, or SET.
  172. .P
  173. Labels can have the same name as opcodes, but they cannot
  174. have the same name as operators or registers.  The reserved 
  175. (operator and register) names are:
  176. .DS 
  177.     *    A    AF    AND    B    BC    
  178.     C    D    DE    EQ    GE    GT
  179.     H    HIGH    HL    IX    IY    L
  180.     LE    LT    LOW    M    MOD    NC    
  181.     NE    NOT    NZ    OR    P    PE
  182.     PO    SHL    SHR    SP    XOR    Z
  183. .DE
  184. .P
  185. Labels may be pin-addressed by the use of an "@" as a prefix to the label.
  186. Pin-address labels are referenced in the code by the opposite side of the
  187. bytes than they normally would. For example this DC strings' label
  188. points to the right hand address of the string[B:
  189. .DS I
  190. LABEL    DC    "this is a normal string"
  191. .DE
  192. .P
  193. If you then generate a pin-addressed version of the
  194. same string the label refers to the left hand address of the string:
  195. .DS I
  196. @LABEL    DC    "this is a normal string"
  197. .DE
  198. .P
  199. It is neccessary to include pin-addressing in this assembler
  200. to remain compatable with existing source files written with
  201. the mini-computer version.
  202. The sense of byte addresses when referenced without pin-addressing
  203. is reversed from what one would expect in many pseudo ops such
  204. as DC and DAC.
  205. .P
  206. If a label is used in an expression before it is assigned a 
  207. value, the label is said to be "forward-referenced."  For 
  208. example:
  209. .DS
  210.     L1    EQU    L2+1    L2 is forward-referenced here.
  211.     L2
  212.     L3    EQU    L2+1    L2 is not forward-referenced here.
  213. .DE
  214. .P
  215. Note no space between operands or operators is allowed.
  216. .H 2 "Numeric Constants"
  217. .P
  218. Numeric constants can be formed in two ways; the mini-computer version,
  219. or by the Intel convention.
  220. The Intel convention was not part of the original mini-computer language,
  221. but has been added as an enhancement.
  222. .P
  223. The original standard used only decimal or hexadecimal numbers in the
  224. style of Motorola.
  225. Decimal numbers are formed by using the digits 0-9. 
  226. Hexadecimal numbers are formed by using a dollar sign ($) followed
  227. by one or more hexadecimal digits (0-9, A-F).
  228. The hex digits a-f are converted to upper case by the assembler.
  229. Also added as an enhancement was the (%) Motorola style prefix
  230. for binary numbers. In this case only 0 and 1 are allowed
  231. as digits.
  232. .P
  233. A numeric constant formed according to the Intel convention
  234. starts with a numeric character 
  235. (0-9), continues with zero or more digits (0-9, A-F), and ends 
  236. with an optional base designator.  The base designators are H for 
  237. hexadecimal, none or D for decimal, O or Q for octal, and B for 
  238. binary.  The hex digits a-f are converted to upper case by the 
  239. assembler.  Note that an Intel style numeric constant cannot begin
  240. with A-F as it would be indistinguishable from a label.
  241. .P
  242. Thus, all of the following evaluate to 255 (decimal):
  243. .DS I
  244. $ff  %11111111   0ffH   255   255D   377O   377Q   11111111B
  245. .DE
  246. .H 2 "String Constants"
  247. .P
  248. A string constant is zero or more characters enclosed in 
  249. either single quotes (' ') or double quotes (" ").  Single quotes 
  250. only match single quotes, and double quotes only match double 
  251. quotes, so if you want to put a single quote in a string, you can 
  252. do it like this:  "'".  In all contexts except the DB statement, 
  253. the first character or two of the string constant are all that 
  254. are used.  The rest is ignored.  Noting that the ASCII codes for 
  255. "A" and "B" are 041H and 042H, respectively, will explain the 
  256. following examples:
  257. .DS I
  258. "" and ''        evaluate to 0000H
  259. "A" and 'A'    evaluate to 0041H
  260. "AB"        evaluates to 4142H
  261. .DE
  262. Note that the null string "" is legal and evaluates to 0000H.
  263. .P
  264. Several escape sequences are also valid in strings:
  265. .DS I
  266. Character    HEX Gen    Function
  267. &N        00    Null
  268. &B        08    Backspace
  269. &T        09    Tab
  270. &V        0B    Vertical Tab
  271. &I        0D    Carridge Return
  272. &&        26    A single &
  273. &F        FF       -
  274. &$XX        XX    Embedded Hex data
  275. .DE
  276. .H 2 "Expressions"
  277. .P
  278. An expression is made up of labels, numeric constants, and 
  279. string constants glued together with arithmetic operators, 
  280. logical operators, and parentheses in the usual way that 
  281. algebraic expressions are made.  Operators have the following 
  282. fairly natural order of precedence:
  283. .DS I
  284. Highest        anything in parentheses
  285. unary +,  unary -
  286. *,  /,  MOD,  SHL,  SHR
  287. binary +,  binary -
  288. LT,  LE,  EQ,  GE,  GT,  NE
  289. NOT
  290. AND
  291. OR,  XOR
  292. Lowest        HIGH,  LOW
  293. .DE
  294. .ti
  295. A few notes about the various operators are in order:
  296. .VL 8
  297. .LI 1)
  298. The remainder operator MOD yields the remainder from 
  299. dividing its left operand by its right operand.
  300. .LI 2)
  301. The shifting operators SHL and SHR shift their left 
  302. operand to the left or right the number of bits 
  303. specified by their right operand.
  304. Since the exponentiation operator (**) is not supported
  305. the SHL operator can be used in most cases to replace it.
  306. .LI 3)
  307. The relational operators LT, LE, EQ, GE, GT, and NE can 
  308. also be written as <, <= or =<, =, >= or =>, and <> or 
  309. ><, respectively.  They evaluate to 0FFFFH if the 
  310. statement is true, 0 otherwise.
  311. .LI 4)
  312. The logical opeators NOT, AND, OR, and XOR do bitwise 
  313. operations on their operand(s).
  314. .LI 5)
  315. HIGH and LOW extract the high or low byte, of an expression.
  316. .LI 6)
  317. The special symbol * can be used in place of a label or 
  318. constant to represent the value of the program counter 
  319. before any of the current line has been processed.
  320. .LE
  321. .DS I
  322. Here are some examples of legal expressions:
  323. .DE
  324. .DF I
  325. 2+3*4                    evaluates to 14
  326. (2+3)*4                evaluates to 20
  327. NOT 11110000B XOR 00001010B    evaluates to 00000101B
  328. HIGH 1234H SHL 1            evaluates to 0024H
  329. 001Q EQ 0                evaluates to 0
  330. 001Q = 2 SHR 1                evaluates to 0FFFFH
  331. .DE
  332. .P
  333. All arithmetic is unsigned with overflow from the 16-bit word ignored.
  334. Thus:
  335. .DS I
  336. 32768 * 2            evaluates to 0
  337. .DE
  338. .H 1 "Machine Opcodes"
  339. .P
  340. The opcodes of the Z80 processor that are supported by
  341. this assembler are listed with thier syntax and Zilog
  342. equivalents in Appendix I.
  343. .H 1 "Pseudo Opcodes"
  344. .P
  345. Unlike Z80 opcodes, pseudo opcodes (pseudo-ops) do not 
  346. represent machine instructions.  They are, rather, directives to 
  347. the assembler.  These directives require various numbers and 
  348. types of arguments.  They will be listed individually below.
  349. .H 2 "Pseudo-ops -- DC and DATA"
  350. .P
  351. The DC and DATA pseudo-ops allow arbitrary bytes to be spliced into 
  352. the object code.  Its argument is a chain of zero or more 
  353. expressions that evaluate to -128 through 255 separated by 
  354. semicolons.
  355. If a semicolon occurs with no preceding expression, a 00H 
  356. byte is spliced into the object code.  The sequence of bytes 
  357. 0FEH, 0FFH, 00H, 01H, 02H could be spliced into the code with the 
  358. following statement:
  359. .DS
  360.     DC    -2;-1;;1;2
  361. .DE
  362. A special case exists here.  If a string constant is entered with 
  363. no arithmetic done on it, then the entire string is spliced into 
  364. the code stream.  Thus, the sequence of bytes 002H, 043H, 041H, 
  365. 054H, 044H could be spliced into the code with the following 
  366. statement:
  367. .DS
  368.     DC    1+1;"CAT";"C"+1
  369. .DE
  370. .P
  371. The label associated with a DC statement will point to the right-most
  372. byte of the entire definition.
  373. This can be changed to the left most byte by pin-addressing the label.
  374. Thus the label in the next statement
  375. points to the fifth byte (the null):
  376. .DS
  377. MESS    DC    "Mess";$00
  378. .DE
  379. .H 2 "Pseudo-ops -- DA"
  380. .P
  381. The DA pseudo-op is used to reserve a block of storage for 
  382. program variables, or whatever.  This storage is not initialized 
  383. in any way, so its value at run time will usually be random.  The 
  384. argument expression (which may contain no forward references) is 
  385. added to the assembly program counter.  The following statement 
  386. would reserve 10 bytes of storage called "STORAGE":
  387. .DS
  388.     STORAGE    DS    10
  389. .DE
  390. .P
  391. The label points to the right-most byte and may be changed
  392. to left by pin-addressing the label:
  393. .DS
  394.     @STORAGE    DS    10
  395. .DE
  396. .H 2 "Pseudo-ops -- DAC"
  397. .P
  398. The DAC pseudo-op allows 16-bit words to be spliced into the 
  399. object code.  Its argument is a chain of zero or more expressions 
  400. separated by semicolons.  If a semicolon occurs with no preceding 
  401. expression, a word of 0000H is spliced into the code.  The word 
  402. is placed into memory low byte in low address, high byte in high 
  403. address as per standard Intel order.  The sequence of bytes 
  404. 0FEH, 0FFH, 00H, 00H, 01H, 02H could be spliced into the code 
  405. with the following statement:
  406. .DS
  407.     DW    0FFFEH;;0201H
  408. .DE
  409. .P
  410. The label if present points to the right-most byte and may be changed
  411. to left by pin-addressing the label.
  412. .H 2 "Pseudo-ops -- CSECT"
  413. .P
  414. Used in the mini-computer version to enter a control section into
  415. the object code. In this assembler it is a nop provided for
  416. compatability only.
  417. .H 2 "Pseudo-ops -- NCODE"
  418. .P
  419. Turns off object code generation in the output file.
  420. NCODE allows RAM areas to be defined without the generation of any code.
  421. The listing is still enabled unless turned off by a SKP.
  422. .H 2 "Pseudo-ops -- CODE"
  423. .P
  424. Enables object code generation if previously disabled by NCODE.
  425. .H 2 "Pseudo-ops -- END"
  426. .P
  427. The END pseudo-op tells the assembler that the source 
  428. program is over.  Any further lines of the source file are 
  429. ignored and not passed on to the listing.  If an argument is 
  430. added to the END statement, the value of the argument will be 
  431. placed in the execution address slot in the Intel hex object 
  432. file.  The execution address defaults to the program counter 
  433. value at the point where the END was encountered.  Thus, to 
  434. specify that the program starts at label START, the END statement 
  435. would be:
  436. .DS
  437.     END    START
  438. .DE
  439. .P
  440. If end-of-file is encountered on the source file before an 
  441. END statement is reached, the assembler will add an END statement 
  442. to the listing and flag it with a * (missing statement) error.
  443. .H 2 "Pseudo-ops -- EQU"
  444. .P
  445. The EQU pseudo-op is used to assign a specific value to a 
  446. label, thus the label on this line is REQUIRED.  Once the value 
  447. is assigned, it cannot be reassigned by writing the label in 
  448. column 1, by another EQU statement by a REG statement, or by a 
  449. SET statement.  Thus, for example, the following statement 
  450. assigns the value 2 to the label TWO:
  451. .DS
  452.     TWO    EQU    1 + 1
  453. .DE
  454. .P
  455. The expression in the argument field must contain no forward 
  456. references.
  457. .H 2 "Pseudo-ops -- IF, ELS, ENF"
  458. .P
  459. These three pseudo-ops allow the assembler to choose whether 
  460. or not to assemble certain blocks of code based on the result of 
  461. an expression.  Code that is not assembled is passed through to 
  462. the listing but otherwise ignored by the assembler.  The IF 
  463. pseudo-op signals the beginning of a conditionally assembled 
  464. block.  It requires one argument that may contain no forward 
  465. references.  If the value of the argument is non-zero, the block 
  466. is assembled.  Otherwise, the block is ignored.  The ENF 
  467. pseudo-op signals the end of the conditionally assembled block.  
  468. For example:
  469. .DS
  470.     IF    EXPRESSION    ;This whole thing generates
  471.     DB    01H, 02H, 03H    ;  no code whatsoever if
  472.     ENF            ;  EXPRESSION is zero.
  473. .DE
  474. The ELS pseudo-op allows the assembly of either one of two 
  475. blocks, but not both.  The following two sequences are 
  476. equivalent:
  477. .DS I
  478.         IF    EXPRESSION
  479.         ... some stuff ...
  480.         ELS
  481.         ... some more stuff ...
  482.         ENF
  483.  
  484. TEMP_LAB    SET    EXPRESSION
  485.         IF    TEMP_LAB NE 0
  486.         ... some stuff ...
  487.         ENF
  488.         IF    TEMP_LAB EQ 0
  489.         ... some more stuff ...
  490.         ENF
  491. .DE
  492. .P
  493. The pseudo-ops in this group do NOT permit labels to exist 
  494. on the same line as the status of the label (ignored or not) 
  495. would be ambiguous.
  496. .P
  497. All IF statements (even those in ignored conditionally 
  498. assembled blocks) must have corresponding ENF statements and 
  499. all ELS and ENF statements must have a corresponding IF 
  500. statement.
  501. .P
  502. IF blocks can be nested up to 16 levels deep before the 
  503. assembler dies of a fatal error.  This should be adequate for any 
  504. conceivable job, but if you need more, change the constant 
  505. IFDEPTH in file z80a.H and recompile the assembler.
  506. .H 2 "Pseudo-ops -- USE"
  507. .P
  508. The USE pseudo-op is used to splice the contents of another 
  509. file into the current file at assembly time.  The name of the 
  510. file to be USEd is specified as a normal string constant, so 
  511. the following line would splice the contents of file "const.def" 
  512. into the source code stream:
  513. .DS
  514.     USE    "const.def"
  515. .DE
  516. .P
  517. USE files may, in turn, USE other files until four 
  518. files are open simultaneously.  This limit should be enough for 
  519. any conceivable job, but if you need more, change the constant 
  520. FILES in file z80a.H and recompile the assembler.
  521. .H 2 "Pseudo-ops -- ORG and RLC"
  522. .P
  523. The ORG pseudo-op is used to set the assembly program 
  524. counter to a particular value.  The expression that defines this 
  525. value may contain no forward references.  The default initial 
  526. value of the assembly program counter is 0000H.  The following 
  527. statement would change the assembly program counter to 0F000H:
  528. .DS
  529.     ORG    0F000H
  530. .DE
  531. .P
  532. If a label is present on the same line as an ORG statement, 
  533. it is assigned the new value of the assembly program counter.
  534. .P
  535. The RLC pseudo-op was used to relocate a block of code to run
  536. in a different address than it was loaded.
  537. It is provided here as an ORG statement since relocation is not
  538. supported.
  539. .H 2 "Pseudo-ops -- URLC"
  540. .P
  541. Nop provided for compatability.
  542. .H 2 "Pseudo-ops -- PAG"
  543. .P
  544. The PAG pseudo-op always causes an immediate page ejection 
  545. in the listing by inserting a form feed ('\\f') character before 
  546. the next line.  If an argument is specified, the argument 
  547. expression specifies the number of lines per page in the listing.  
  548. Legal values for the expression are any number except 1 and 2.  A 
  549. value of 0 turns the listing pagination off.  Thus, the following 
  550. statement cause a page ejection and would divide the listing into 
  551. 60-line pages:
  552. .DS
  553.     PAGE    60
  554. .DE
  555. .P
  556. Note arguments to PAG are an enhancement from the mini-computer version.
  557. .H 2 "Pseudo-ops -- SKP"
  558. .P
  559. Causes subsequent lines to not be printed on the listing
  560. until a TYP statment is encountered.
  561. SKP/TYP blocks may be nested.
  562. .H 2 "Pseudo-ops -- TYP"
  563. .P
  564. List output is resumed.
  565. .H 2 "Pseudo-ops -- LIST and ULIST"
  566. .P
  567. Nops provided for compatability. Originally altered assembly
  568. listing format.
  569. .H 2 "Pseudo-ops -- SET"
  570. .P
  571. The SET pseudo-op functions like the EQU pseudo-op except 
  572. that the SET statement can reassign the value of a label that has 
  573. already been assigned by another SET statement.  Like the EQU 
  574. statement, the argument expression may contain no forward 
  575. references.  A label defined by a SET statement cannot be 
  576. redefined by writing it in column 1 or with an EQU statement.  
  577. The following series of statements would set the value of label 
  578. "COUNT" to 1, 2, then 3:
  579. .DS
  580.     COUNT        SET    1
  581.     COUNT        SET    2
  582.     COUNT        SET    3
  583. .DE
  584. .H 2 "Pseudo-ops -- TTL"
  585. .P
  586. The TTL pseudo-op sets the running title for the listing.  
  587. The argument field is required and must be a string constant, 
  588. though the null string ("") is legal.  This title is printed 
  589. after every page ejection in the listing, therefore, if page 
  590. ejections have not been forced by the PAG pseudo-op, the title 
  591. will never be printed.  The following statement would print the 
  592. title "Random Bug Generator -- Ver 3.14159" at the top of every 
  593. page of the listing:
  594. .DS
  595.     TTL    "Random Bug Generator -- Ver 3.14159"
  596. .DE
  597. .P
  598. Subsequent title lines are used as subtitles.
  599. .H 2 "Pseudo-ops -- PAGT"
  600. .P
  601. Set the subtitle line to "string".
  602. This line is printed on the line following the TTL line on the
  603. listing after every page ejection. May be changed many times.
  604. .DS I
  605.     PAGT    "string"
  606. .DE
  607. .H 1 "Assembly Errors"
  608. .P
  609. When a source line contains an illegal construct, the line 
  610. is flagged in the listing with a single-letter code describing 
  611. the error.  The meaning of each code is listed below.  In 
  612. addition, a count of the number of lines with errors is kept and 
  613. printed on the C "stderr" device (by default, the console) after 
  614. the END statement is processed.  If more than one error occurs in 
  615. a given line, only the first is reported.  For example, the 
  616. illegal label "=$#*'(" would generate the following listing line:
  617. .DS
  618.     L   0000    FF 00 00    =$#*'(    LDI16    DE,1000H
  619. .DE
  620. .H 2 "Error * -- Illegal or Missing Statement"
  621. .P
  622. This error occurs when either:
  623. .VL 8
  624. .LI 1)
  625. the assembler reaches the end of the source file 
  626. without seeing an END statement, or
  627. .LI 2)
  628. an END statement is encountered in a USE file.
  629. .LE
  630. .P
  631. If you are "sure" that the END statement is present when the 
  632. assembler thinks that it is missing, it probably is in the 
  633. ignored section of an IF block.  If the END statement is missing, 
  634. supply it.
  635. If the END statement is in a USE file, delete 
  636. it.
  637. .H 2 "Error ( -- Parenthesis Imbalance"
  638. .P
  639. For every left parenthesis, there must be a right parenthesis.  Count them.
  640. .H 2 "Error `` -- Missing Quotation Mark"
  641. .P
  642. Strings have to begin and end with either " or '.  Remember 
  643. that " only matches " while ' only matches '.
  644. .H 2 "Error D -- Illegal Digit"
  645. .P
  646. This error occurs if a digit greater than or equal to the 
  647. base of a numeric constant is found.  For example, a 2 in a 
  648. binary number would cause a D error.  Especially, watch for 8 or 
  649. 9 in an octal number.
  650. .H 2 "Error E -- Illegal Expression"
  651. .P
  652. This error occurs because of:
  653. .VL 8
  654. .LI 1)
  655. a missing expression where one is required
  656. .LI 2)
  657. a unary operator used as a binary operator or vice-versa
  658. .LI 3)
  659. a missing binary operator
  660. .LI 4)
  661. a SHL or SHR count that is not 0 thru 15
  662. .LE
  663. .H 2 "Error I -- IF-ENF Imbalance"
  664. .P
  665. For every IF there must be a corresponding ENF.  If this 
  666. error occurs on an ELS or ENF statement, the corresponding IF 
  667. is missing.  If this error occurs on an END statement, one or 
  668. more ENF statements are missing.
  669. .H 2 "Error L -- Illegal Label"
  670. .P
  671. This error occurs because of:
  672. .VL 8
  673. .LI 1)
  674. a non-alphabetic in column 1
  675. .LI 2)
  676. a reserved word used as a label
  677. .LI 3)
  678. a missing label on an EQU, or SET statement
  679. .LI 4)
  680. a label on an IF, ELS, or ENF statement
  681. .LE
  682. .H 2 "Error M -- Multiply Defined Label"
  683. .P
  684. This error occurs because of:
  685. .VL 8
  686. .LI 1)
  687. a label defined in column 1 or with the EQU statement 
  688. being redefined
  689. .LI 2)
  690. a label defined by a SET statement being redefined 
  691. either in column 1 or with the EQU statement
  692. .LI 3)
  693. the value of the label changing between assembly passes
  694. .LE
  695. .H 2 "Error O -- Illegal Opcode"
  696. .P
  697. The opcode field of a source line may contain only a valid 
  698. machine opcode, a valid pseudo-op, or nothing at all.  Anything 
  699. else causes this error.
  700. .H 2 "Error P -- Phasing Error"
  701. .P
  702.      This error occurs because of:
  703. .VL 8
  704. .LI 1)
  705. a forward reference in a EQU, ORG, or SET 
  706. statement
  707. .LI 2)
  708. a label disappearing between assembly passes
  709. .LE
  710. .H 2 "Error S -- Illegal Syntax"
  711. .P
  712. This error means that an argument field is scrambled.  Sort 
  713. the mess out and reassemble.  In particular, look for use of 
  714. registers that don't apply to a particular opcode, missing 
  715. commas, and the like.
  716. .H 2 "Error T -- Too Many Arguments"
  717. .P
  718. This error occurs if there are more items (expressions, 
  719. register designators, etc.) in the argument field than the opcode 
  720. or pseudo-op requires.  The assembler ignores the extra items but 
  721. issues this error in case something is really mangled.
  722. .H 2 "Error U -- Undefined Label"
  723. .P
  724. This error occurs if a label is referenced in an expression 
  725. but not defined anywhere in the source program.  If you are 
  726. "sure" you have defined the label, note that upper and lower case 
  727. letters in labels are different.  Defining "LABEL" does not 
  728. define "Label."
  729. .H 2 "Error V -- Illegal Value"
  730. .P
  731. This error occurs because:
  732. .VL 8
  733. .LI 1)
  734. an 8 bit immediate value is not -128 thru 255, or
  735. .LI 2)
  736. a DC argument is not -128 thru 255, or
  737. .LI 3)
  738. a USE argument refers to a file that does not exist.
  739. .LE
  740. .H 1 "Warning Messages"
  741. .P
  742. Some errors that occur during the parsing of the cross-
  743. assembler command line are non-fatal.  The cross-assembler flags 
  744. these with a message on the C "stdout" device (by default, the 
  745. console) beginning with the word "Warning."  The messages are 
  746. listed below:
  747. .H 2 "Warning -- Illegal Option Ignored"
  748. .P
  749. The only options that the cross-assembler knows are -l and  
  750. -o.  Any other command line argument beginning with - will draw 
  751. this error.
  752. .H 2 "Warning -- -l Option Ignored -- No File Name"
  753. .H 2 "Warning -- -o Option Ignored -- No File Name"
  754. .P
  755. The -l and -o options require a file name to tell the 
  756. assembler where to put the listing file or object file.  If this 
  757. file name is missing, the option is ignored.
  758. .H 2 "Warning -- Extra Source File Ignored"
  759. .P
  760. The cross-assembler will only assemble one file at a time, 
  761. so source file names after the first are ignored.  To assemble a 
  762. second file, invoke the assembler again.  Note that under CP/M-
  763. 80, the old trick of reexecuting a core image will NOT work as 
  764. the initialized data areas are not reinitialized prior to the 
  765. second run.
  766. .H 2 "Warning -- Extra Listing File Ignored"
  767. .H 2 "Warning -- Extra Object File Ignored"
  768. .P
  769. The cross-assembler will only generate one listing and 
  770. object file per assembly run, so -l and -o options after the 
  771. first are ignored.
  772. .H 1 "Fatal Error Messages"
  773. .P
  774. Several errors that occur during the parsing of the cross-
  775. assembler command line or during the assembly run are fatal.  The 
  776. cross-assembler flags these with a message on the C "stdout" 
  777. device (by default, the console) beginning with the words "Fatal 
  778. Error."  The messages are explained below:
  779. .H 2 "Fatal Error -- No Source File Specified"
  780. .P
  781. This one is self-explanatory.  The assembler does not know 
  782. what to assemble.
  783. .H 2 "Fatal Error -- Source File Did Not Open"
  784. .P
  785. The assembler could not open the source file.  The most 
  786. likely cause is that the source file as specified on the command 
  787. line does not exist.  On larger systems, there could also be 
  788. priviledge violations.  Rarely, a read error in the disk 
  789. directory could cause this error.
  790. .H 2 "Fatal Error -- Listing File Did Not Open"
  791. .H 2 "Fatal Error -- Object File Did Not Open"
  792. .P
  793. This error indicates either a defective listing or object 
  794. file name or a full disk directory.  Correct the file name or 
  795. make more room on the disk.
  796. .H 2 "Fatal Error -- Error Reading Source File"
  797. .P
  798. This error generally indicates a read error in the disk data 
  799. space.  Use your backup copy of the source file (You do have one, 
  800. don't you?) to recreate the mangled file and reassemble.
  801. .H 2 "Fatal Error -- Disk or Directory Full"
  802. .P
  803. This one is self-explanatory.  Some more space must be found 
  804. either by deleting files or by using a disk with more room on it.
  805. .H 2 "Fatal Error -- File Stack Overflow"
  806. .P
  807. This error occurs if you exceed the INCLude file limit of 
  808. four files open simultaneously.  This limit can be increased by 
  809. increasing the constant FILES in file z80a.H and recompiling the 
  810. cross-assembler.
  811. .H 2 "Fatal Error -- If Stack Overflow"
  812. .P
  813. This error occurs if you exceed the nesting limit of 16 IF 
  814. blocks.  This limit can be increased by increasing the constant 
  815. IFDEPTH in file z80a.H and recompiling the cross-assembler.
  816. .H 2 "Fatal Error -- Too Many Symbols"
  817. .P
  818. Congratulations!  You have run out of memory.  The space for 
  819. the cross-assembler's symbol table is allocated at run-time using 
  820. the C library function malloc(), so the cross-assembler will use 
  821. all available memory.  The only solutions to this problem are to 
  822. lessen the number of labels in the source program or to add more 
  823. memory.
  824. .SK
  825. .PF ""
  826. .PH ""
  827. \" define appendix heading
  828. .nr Hu 1
  829. .nr a 0
  830. .af a I
  831. .nr Hc 1 \" centered headings
  832. .nr N 0
  833.  
  834. .de aH
  835. .nr a +1
  836. .nr P 1
  837. .PF "'''Appendix \\na-\\\\\\\\nP'"
  838. .SK
  839. .HU "Appendix \\na - \\$1"
  840. ..
  841. .aH "Z80 Opcode Table"
  842. \" Opcode table for the Z80 microprocessor
  843. .TS H
  844.  
  845. llll.
  846. FORMAT    ENCODING    ZILOG FORM    COMMENT
  847. .sp
  848. .TH
  849. ADC r        ADC A,r
  850. ADCI n        ADC A,n
  851. ADCHL d        ADC HL,d    T{
  852. d may be BC, DE, HL, SP
  853. T}
  854. ADD r        ADD A,r
  855. ADDI n        ADD A,n
  856. ADDHL d        ADD HL,d    T{
  857. d may be BC, DE, HL, SP
  858. T}
  859. ADDIX d        ADD IX,d    T{
  860. d may be BC, DE, IX, SP
  861. T}
  862. ADDIY d        ADD IY,d    T{
  863. d may be BC, DE, IY, SP
  864. T}
  865. AND r        AND A,r
  866. ANDI n        AND A,n
  867. BIT b;r        BIT b,r
  868. CALL nn        CALL nn
  869. CALLC c;nn        CALL c,nn
  870. CCF        CCF
  871. CMP r        CP r
  872. CP r        CP r    T{
  873. alternate form of CMP
  874. T}
  875. CMPI n        CP n
  876. CPDEC        CPD
  877. CPDR        CPDR
  878. CPINC        CPI
  879. CPIR        CPIR
  880. CPL        CPL
  881. DAA        DAA
  882. DEC r        DEC r
  883. DEC16 d        DEC d    T{
  884. d may be BC, DE, HL, IX, IY, SP
  885. T}
  886. DI        DI
  887. DJNZ nn        DJNZ nn    T{
  888. The assembler fills in the displacement.
  889. nn is the actual address to jump to.
  890. T}
  891. EI        EI
  892. EXSPHL        EX (SP),HL
  893. EXSPIX        EX (SP),IX
  894. EXSPIY        EX (SP),IY
  895. EXAFAF        EX AF,AF'
  896. EXDEHL        EX DE,HL
  897. EXX        EXX
  898. HALT        HALT
  899. IM0        IM 0
  900. IM1        IM 1
  901. IM2        IM 2
  902. IN n        IN A,(n)
  903. INPUT r        IN r,(C)    T{
  904. r may be A, B, C, D, E, H, L
  905. T}
  906. INC r        INC r
  907. INC16 d        INC d
  908. INDEC        IND
  909. INDR        INDR
  910. ININC        INI
  911. INIR        INIR
  912. JUMP nn        JP nn
  913. JP c;nn        JP c,nn
  914. JUMPI d        JP (d)    T{
  915. d may be HL, IX, IY
  916. T}
  917. JREL nn        JR nn    T{
  918. nn is the location to jump to
  919. T}
  920. JR c;nn        JR c,nn
  921. LD r1;r2        LD r1,r2
  922. LDI r;n        LD r,n
  923. LDABC        LD A,(BC)
  924. LDADE        LD A,(DE)
  925. LDBCA        LD (BC),A
  926. LDDEA        LD (DE),A
  927. LDA nn        LD A,(nn)
  928. STA nn        LD (nn),A
  929. LDI16 d;nn        LD d,nn    T{
  930. d may be BC, DE, HL, IX, IY, SP
  931. T}
  932. LD16 d;nn        LD d,(nn)
  933. ST16 nn;d        LD (nn),d
  934. LDAI        LD A,I
  935. LDAR        LD A,R
  936. LDIA        LD I,A
  937. LDRA        LD R,A
  938. LDSP d        LD SP,d    T{
  939. d may be HL, IX, IY
  940. T}
  941. LDDEC        LDD
  942. LDDR        LDDR
  943. LDINC        LDI
  944. LDIR        LDIR
  945. NEG        NEG
  946. NOP        NOP
  947. OR r        OR A,r
  948. ORI n        OR A,n
  949. OUTDR        OTDR
  950. OUTINC        OUTI
  951. OUTIR        OTIR
  952. OUT n        OUT (n),A
  953. OUTPUT r        OUT (C),r
  954. POP d        POP d    T{
  955. d may be AF, BC, DE, HL, IX, IY
  956. T}
  957. PUSH d        PUSH d    T{
  958. d may be AF, BC, DE, HL, IX, IY
  959. T}
  960. RES b;r        RES b,r
  961. RETURN        RET
  962. RET c        RET c
  963. RETI        RETI
  964. RETN        RETN
  965. RL r        RL r
  966. RLA        RLA    T{
  967. (short form RL A)
  968. T}
  969. ROLC r        RLC r
  970. RLCA        RLCA    T{
  971. (short form of RLC A)
  972. T}
  973. RLD        RLD
  974. RR r        RR r
  975. RRA        RRA    T{
  976. (short form of RR A)
  977. T}
  978. RRC r        RRC r
  979. RRCA        RRCA    T{
  980. (short form of RRC A)
  981. T}
  982. RRD        RRD
  983. RST x        RST x    T{
  984. x may be 0, 8, 16, 24,...,56
  985. T}
  986. SBC r        SBC A,r
  987. SBCI n        SBC A,n
  988. SBCHL d        SBC HL,d    T{
  989. d may be BC, DE, HL, SP
  990. T}
  991. SCF        SCF
  992. SETB b;r        SET b,r
  993. SLA r        SLA r
  994. SRA r        SRA r
  995. SRL r        SRL r
  996. SUB r        SUB A,r
  997. SUBI n        SUN A,n
  998. XOR r        XOR A,r
  999. XORI n        XOR A,n
  1000. .TE
  1001. .SK
  1002. NOTES:
  1003. .DS I
  1004. 8-bit registers (r):
  1005. A
  1006. B
  1007. C
  1008. D
  1009. E
  1010. H
  1011. L
  1012. M    This is (HL) in Zilog terms
  1013. IX,0    This is (IX+0)
  1014. IY,0    This is (IY+0)
  1015.  
  1016. 16-bit registers (d):
  1017. BC    B & C pair
  1018. DE    D & E pair
  1019. HL    H & L pair
  1020. IX    Index X
  1021. IY    Index Y
  1022. SP    Stack Pointer
  1023. AF    Accumulator & Flags
  1024.  
  1025. Condition flags (c):
  1026. Z or EQ    Zero/Equal
  1027. NZ or NE    Nonzero/Notequal
  1028. C
  1029. NC
  1030. P
  1031. M
  1032. PE
  1033. PO
  1034.  
  1035. n and nn are immediate expressions. n means an 8-bit value.
  1036. nn means a 16-bit address or value.
  1037.  
  1038. b refers to a bit position between 0 and 7. It may be
  1039. an expression evaluating to a number between 0 and 7.
  1040.  
  1041. Relative jumps allow only Z (EQ), NZ (NE),
  1042. C and NC for the condition (c).
  1043. .DE
  1044. .SK
  1045. .aH "Portability"
  1046. .P
  1047. This cross-assembler package has been compilied and run on the following
  1048. machines:
  1049. .VL 8
  1050. .LI 1.
  1051. MS DOS 2.x 3.x - Using Microsoft 'C' Version 3.0 and 5.1
  1052. .LI 2.
  1053. Altos System V UNIX - using makefile
  1054. .LI 3.
  1055. Xenix 3.0 - Using makefile
  1056. .LE
  1057.  
  1058.  
  1059.  
  1060. .VL 12
  1061. .umentation.
  1062. .LE
  1063. .nr Cl 3
  1064. .TC
  1065.