home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG085.ARC / Z80MR.DOC < prev   
Text File  |  1979-12-31  |  25KB  |  687 lines

  1. Documentation for Z80MR
  2.  
  3.  
  4. Introduction
  5.  
  6. Z80MR is a Z80 macro assembler with syntax closely following RMAC and MAC.
  7. It assembles standard Z80 mnemonics into an Intel Hex format. The resulting
  8. file (which has a .HEX extension) can be translated to a .COM file with
  9. LOAD.COM (on your CP/M disk that you received with your Microbee) if it ORG's
  10. at 100 (hex). If it ORG's elsewhere the .HEX file may be read into memory
  11. and manipulated with DDT.COM.
  12.  
  13. Running Z80MR
  14.  
  15. The file to be assembled must have the extent *.AZM.  The syntax to
  16. load the assembler is Z80MR <filename> without the extent.
  17.  
  18. Why Z80
  19.  
  20. The assembler you received with your Microbee (ASM.COM) is an 8080 assembler.
  21. The Microbee actually runs a Z80 c.p.u. The reason this is possible is that
  22. the Z80 actually runs all of the 8080 instructions but in addition there
  23. are more instructions unknown to the 8080. The extra instructions were 
  24. designed for increased speed, easier programming, and more compact code.
  25. For this reason it is to your best advantage to program in Z80 code for
  26. the Microbee.
  27.  
  28. Z80 Mnemonics
  29.  
  30. Z80 mnemonics are a great improvement to 8080. Thought was given to
  31. logical, universal mnemonics that are much easier to remember and use. I
  32. learned assembly language on the 8080 and resisted the change to Z80 at
  33. first. But after using Z80 mnemonics for a short time I became very
  34. unwilling to  do anything with 8080 code. Now I run almost every 8080
  35. program that comes in through a 8080 to Z80 translating program
  36. (XLATE2.COM). Even if you are writing programs for the 8080 it is still far
  37. easier to  write in Z80 mnemonics. There is a special listing command that
  38. flags Z80- only instructions for this very reason (described later). 
  39.  
  40. Macros
  41.  
  42. Macros are a way of writing subroutines in assembly language and then 
  43. calling the subroutine by entering the 'macro name' into the source. The
  44. macro may be called as many times as necessary anywhere in the program.
  45. When the assembler is operated, the lines of source code that make up the
  46. macro will be inserted into the file by the assembler. Note that using
  47. a macro does not reduce the size of the object code that is produced since
  48. all the lines of code that make up the macro definition are assembled into
  49. the object file at assembly time. This is called expanding the macro. By
  50. using the *MACLIST ON option, the lines of code produced by the expansion
  51. of a macro are listed in the .PRN file. Then the code can be examined and
  52. at times optimized in certain locations. 
  53.  
  54.  
  55. Assembler Syntaxè
  56.  
  57. Components and General Form of Assembly Language Programs
  58.  
  59. The structure of an assembly language program is more important to an
  60. assembler than the actual instructions you write. A program that would run
  61. beautifully can fail to assemble if the syntax is not correct. A program
  62. with no errors at assembly time is not guaranteed to run correctly ( or as
  63. expected ). The assemblers report of 0 errors means that it understood all
  64. of the instructions you entered, not that your program is logically correct.
  65.  
  66. Fields
  67.  
  68. Assemblers are almost always field oriented some to a greater degree than
  69. others. A field is a flexible position in the line of code with respect to
  70. the right margin. This assembler recognizes 4 fields in an assembly language
  71. source line.
  72.  
  73.  
  74. label        operation    operand         comment
  75.  
  76.  
  77. The assembler knows when it has reached the end of a field when it sees a
  78. 'field delimiter'. This can be a space or a tab for this assembler though
  79. some require tabs so it is a good habit to always use tab characters as
  80. delimiters.
  81.  
  82. Label Field
  83.  
  84. A symbol is a word used to represent a number. Symbols that refer to 
  85. addresses are called labels. The assignment of a number to a label can
  86. either be defined as the lines below
  87.  
  88. TEN    EQU    10
  89. START    EQU    100H
  90.  
  91. or calculated by the assembler as an address for branching instructions.
  92.  
  93. START:    JP    FINISH
  94.     NOP
  95.     NOP
  96. FINISH:    JP    START
  97.  
  98. Also notice that the label is optional and is only for the programmers
  99. conveniance.
  100.  
  101. Labels must appear in the label field. Some assemblers allow you to indent
  102. labels but this one won't.
  103.  
  104.  
  105.     START    EQU    100H
  106. START:    JP    FINISH 
  107.  
  108. Will give you a problem. The EQU must be in the operation field and the
  109. label in the label field.è
  110. Most assemblers require that the undefined labels be terminated in a
  111. colon but this assembler does not require a colon for symbols in column 1.
  112.  
  113. START    JP    FINISH
  114.  
  115. will not generate an error but colons are another good habit and also
  116. make your code more readable.
  117.  
  118. This assembler only examines the first six characters of any label or symbol
  119. so that if the following labels were used in the same program
  120.  
  121. FINISH1    EQU    1000H
  122. FINISH2    EQU    2000H
  123.  
  124. A 'D' error (duplicate symbols) would be generated.
  125.  
  126. Operation and Operand Fields
  127.  
  128. The operation field follows the label field and may either contain a Z80
  129. op code mnemonic, an assembler directive (or pseudo op), or a macro call.
  130. Assembler directives and macros are described later in this file. This
  131. field will usally contain the mnemonic for a Z80 instruction. Some Z80
  132. instructions only use this field while others contain an operand which
  133. will be located in the operand field.
  134.  
  135.  
  136. GOBACK:    OR    A
  137.     RET    Z
  138.     LD    A,0FFH
  139.     RET
  140.  
  141. The way Z80 mnemonics were designed, the number of nmenonics in the operation
  142. portion of instructions is kept to a minimum since the operands really
  143. distinguish the differences between similar instructions. The first line
  144. above is a good example of this. The operation is an 'OR' operation on
  145. the number in the accumulator (implied) with another register. It makes
  146. sense that the operand should be the register containing the other number
  147. in the 'OR' operation. In Z80 assembly language this is the case. The first
  148. line OR's the accumulator with the accumualator (used to see if the
  149. accumulator contains a 0). Notice that the second line uses the operand
  150. field to contain the condition for a conditional jump (in this case the
  151. zero flag). The third line uses the operand field to contain both the
  152. target register for a load and the number to load. The last line is an
  153. unconditional return which uses the same operator (RET) as the conditional
  154. return but does not use the operand field because there are no conditons
  155. to place there. This structure makes Z80 programs much more readable
  156. than 8080 programs as well as making the instructions easier to remember.
  157. The following is the same code written with 8080 mnemonics. Notice the
  158. different philosophy on the use of the fields.
  159.  
  160. GOBACK:    ORA
  161.     RETZ
  162.     MVI    A,0FFH
  163.     RETè
  164. Also the LD command in the Z80 is used for all data moves while 8080 users
  165. must remember a different mnemonic for different types of moves.
  166.  
  167.     8080            Z80
  168.  
  169.     MOV    H,A        LD    H,A
  170.     MVI    H,00        LD    H,00
  171.     LXI    H,0000        LD    HL,0000
  172.  
  173.  
  174. The Comment Field
  175.  
  176. Comments are not limited to the comment field and can actually be the entire
  177. line. All assemblers recognize the semicolon as the beginning of a comment
  178. and most ignore the rest of the line. For compatability between assemblers
  179. it is a good to begin comments with a semicolon. But for this assembler 
  180. the following methods of inserting comments are good syntax.
  181.  
  182. 1. Beginning a line with an '*' in column one causes the assembler to ignore
  183. therest of the line except if one of the assembler commands (described below)
  184. immediately follows the asterisk (no embedded spaces).
  185.  
  186. 2. A semicolon will cause the assembler to consider everything following it
  187. to be considered a comment.
  188.  
  189. 3. The first blank encountered following the beginning of the operand field
  190. will cause the assembler to consider the rest of the line to be considered
  191. a comment.
  192.  
  193. ******************************************
  194. ;An adventure in Comments
  195. * A short tale
  196.  
  197. START:    JP    FINISH        ; finish this story
  198.     NOP              ASM can't handle this
  199. FINISH: RET     Thats all folks
  200.  
  201. Would assemble with no errors. Comments do not appear in the object code.
  202.  
  203.  
  204. Numbers and Bases
  205.  
  206. The assembler will accept numbers in HEX (base 16) BINARY (base 2) or
  207. DECIMAL. Hex numbers must end with an H and binary numbers must end in
  208. a B. Decimal numbers should have no suffix letter. When a HEX digit begins
  209. with a letter, the letter should be preceded with a 0.
  210.  
  211.     LD    A,0F3H
  212.     OR    01001000B
  213.     LD    HL,4000H+28
  214.         
  215.  
  216.  
  217. èCommanding the Assembler
  218.  
  219. The primary responsibility of the assembler is to translate Z80 mnemonics
  220. into object code. The assembler also recognizes certain commands and
  221. directives that the programmer can use to manipulate the assembler's output.
  222. These are often referred to as 'pseudo-ops'. This assembler requires these
  223. pseudo-ops to be in upper case.  A description of these commands follows:
  224.  
  225. ORG    <expr>    ; Sets the origin of the code or section of code. Actually
  226.         ; it sets the reference number that the assembler uses to
  227.         ; generate addresses for labels and instructions.
  228.         ; <expr> could be a number or a previously defined symbol.
  229.         ; e.g.    ORG    0
  230.         ;       ORG    START
  231.  
  232. END    <symb>    ; Determines the end of an assembly language program. <symb>
  233.         ; if present describes the first executable instruction of
  234.         ; the program.
  235.  
  236. DW    wordlist
  237. DEFW    wordlist
  238.         ; Both of these have identical meanings. In assembly language
  239.         ; programs, 8 bit values are called bytes and 16 bit
  240.         ; values are called words. Addresses are assembled with the
  241.         ; most significant byte (MSB) following the least significant
  242.         ; byte (LSB) because this is how the microprocessor handles
  243.         ; these values. The DW pseudo-op allows us to describe these
  244.         ; values in the way we are used to (MSB first) and still
  245.         ; assemble correctly for the processor.
  246.         ;    DW    8000H
  247.         ;             will assemble the same as 
  248.         ;    DB    00H
  249.         ;     DB    80H
  250.         ;
  251.         ; If more than one word is to follow a DW following values
  252.         ; should be seperated by commas
  253.         ; e.g.    DW    8000H,0F000H,0000H
  254.         ; The wordlist can also be symbols
  255.         ; e.g.    START:    JP    FINISH
  256.         ;        DW    START,FINISH
  257.         ;      FINISH:    JP    START
  258.  
  259. DDB    wordlist
  260.         ; This pseudo-op is a way of assembling 16 bit values with
  261.         ; the MSB first (opposite of DW).
  262.         ;    DDB    8000H
  263.         ;            will assemble the same as
  264.         ;    DB    80H
  265.         ;    DB    00H
  266.  
  267. DB    bytelist
  268. DEFB    bytelist
  269. DEFM    bytelist
  270. DATA    bytelist
  271.         ; These four pseudo-ops have identical meanings. The bytelistè        ; can be one byte or multiple bytes seperated with commas.
  272.         ; The bytes can be any mix of symbols, ascii characters in
  273.         ; quotes, or numbers on the same line. This is familiar
  274.         ; code in Microbee programs:
  275.         ;
  276.         ;ESC    EQU    1BH
  277.         ;CLRSCR    EQU    1AH
  278.         ;CRLF    DDB    0D0AH
  279.         ;
  280.         ;    ORG    100H    
  281.         ;
  282.         ;    LD    DE,MES
  283.         ;    LD    C,9
  284.         ;    CALL    5
  285.         ;    RET
  286.         ;
  287.         ;MES:    DB    CLRSCR
  288.         ;    DB       ESC,'=',12+20H,12+20H
  289.         ;    DB    '*Your Message Here *',CRLF
  290.         ;    DB    '*Or Here*','$'
  291.         ;
  292.         ;    END
  293.         ;
  294.         ; If you've been waiting for an example to enter assemble
  295.         ; and run, try this one out. Just enter it (with out the
  296.         ; semicolons of course) assemble it and run it as described
  297.         ; in AZM-COM.DOC.
  298.         ;
  299.         ; The program clears the screen, positions the cursor at
  300.         ; row 12 column 12 and prints the message using the BDOS
  301.         ; function 9 (print string).   
  302.         ;
  303.         ; The symbol CLRSCR is defined by an EQU to the hex code to
  304.         ; clear the screen on the Microbee (^Z).
  305.         ;
  306.         ; The cursor positioning sequence on the Microbee consists of
  307.         ; the two lead-in characters (escape and an equals sign) and
  308.         ; then the row+20H and the column+20H.
  309.         ;
  310.         ; Since the next bytes are just a carriage return, line feed
  311.         ; pair the second part of the message will appear at the
  312.         ; left side of the screen. We could include extra DB's to
  313.         ; position the cursor anywhere on the screen if we like.
  314.         ;
  315.         ; BDOS function 9 (summoned by loading a 9 in the C register
  316.         ; and calling 0005H) prints the characters it finds at the
  317.         ; address in the DE registers until it sees a '$'.
  318.         
  319. DS    n
  320. DEFS    n    ; Reserve data space ( n bytes ). This is used to position
  321.         ; allocate or label data storage space in a program. n is
  322.         ; a number describing the number of bytes reserved.
  323.         ;    DS    16
  324.         ; Reserves 16 bytes. The next instruction will be located
  325.         ; 16 bytes from the location counter when the DS was è        ; encountered.
  326.         
  327. label    EQU    <expr>
  328.         ;
  329.         ; The EQU sets the label equal to the expression. The
  330.         ; label should not be terminated with a colon when used
  331.         ; with an EQU pseudo-op. The label can be any symbol
  332.         ; (byte or word) and the <expr> a number in any of the
  333.         ; following forms:
  334.         ;        SWEET    EQU    16       ;decimal
  335.         ;        SWEET    EQU    10H       ;hex
  336.         ;        SWEET    EQU    00010000B  ;binary
  337.         ;
  338.         ; With this assembler the EQU must be located in the
  339.         ; operation field. 
  340.         ; A label defined with an EQU cannot be redefined later
  341.         ; in the program.
  342.  
  343. label    DEFL    <expr>
  344.         ;
  345.         ; This assigns the value of the <expr> to the label like
  346.         ; the EQU pseudo-op but a label defined with a DEFL can
  347.         ; be redefined later in the program.
  348.  
  349. *INCLUDE    <filename>
  350. *INCLUDE <filename>
  351.         ; This pseudo-op causes the assembler to stop assembling
  352.         ; lines in the file it is presently in and read in the
  353.         ; file <filename>. It then begins assembling lines in this
  354.         ; included file until it reaches the end of the file when
  355.         ; it returns to the original file and resumes assembling
  356.         ; lines in it once more. The <filename> can be any CPM
  357.         ; filename.ext though if the extent is left off it looks
  358.         ; for the given filename with an extent of .LIB. The asterisk
  359.         ; must appear in column 1 with the word INCLUDE immediately
  360.         ; following with no embedded spaces.
  361.         ;
  362.         ;*INCLUDE    DRIVER.AZM    ; will begin assembly on
  363.         ; the file DRIVER.AZM
  364.         ;*INCLUDE Z80MACRO    ; will begin assembly on
  365.         ; the file Z80MACRO.LIB    
  366.         ;
  367.  
  368. Conditional Assembly Pseudo-Ops............................................
  369.  
  370. IF    <expr>
  371. ELSE
  372. ENDIF
  373.     Conditional assembly is a way of writing a single program so that
  374.     it can be assembled different ways or with different options by
  375.     only changing a couple of lines of codes. When the assembler
  376.     encounters an IF pseudo-op it evaluates the symbol <expr>. IF
  377.     <expr> is non-zero it assembles the following lines until it reaches
  378.     an ELSE or an ENDIF. If <expr> is 0 the lines are ignored until
  379.     the assembler encounters an ELSE or an ENDIF. If the ELSE isè    encounter the assembler begins assembling lines again. The ENDIF
  380.     pseudo-op causes the assembler to resume assembling all lines.
  381.     You can not have an IF without an ENDIF.
  382.  
  383.     Any of these pseudo-ops must appear in the operation field. 
  384.  
  385. TRUE    EQU    0FFH
  386. FALSE    EQU    0
  387. KPRO2    EQU    TRUE
  388. KPRO10    EQU    FALSE
  389.     
  390.     IF    KPRO2
  391.     
  392. BITPRT    EQU    1CH
  393.  
  394.     ELSE
  395.  
  396. BITPRT    EQU    14H
  397.  
  398.     ENDIF
  399.  
  400.  
  401. Operators..................................................................
  402.  
  403. Operators allow the programmer to make the assembler do arithmetic and
  404. logical operations. They are usually used to manipulate operands or
  405. generate symbols. Some of them are used to create tests for conditional
  406. assembly. There should be no embedded spaces when using these operators as
  407. the first blank encountered terminates the operand field. The operands
  408. may be symbols or numbers in any of the bases. The operators supported
  409. by this assembler are:
  410.  
  411. Arithmetic Operators
  412.  
  413.     +        ; arithmetic addition.
  414.  
  415.     -        ; arithmetic subtraction
  416.  
  417.     *        ; arithmetic multiplication
  418.  
  419.     /        ; arithmetic division (truncating the result)
  420.  
  421. Logical Operators (Bit Manipulation)
  422.  
  423.     &
  424.     ( or .AND. )    ; logical AND operation
  425.  
  426.     ^ 
  427.     ( or .OR. )    ; logical OR operation
  428.  
  429.     .XOR.        ; logical exclusive OR operation
  430.  
  431.     \
  432.     ( or .NOT. )    ; logical inversion
  433. è    .SHR.        ; shift left operand to right by right operand
  434.  
  435.     .SHL.        ; shift left operand to left by right operand 
  436.  
  437.     .HIGH.        ; byte value is assigned the high byte of a
  438.             ; 16 bit value
  439.  
  440.     .LOW.        ; byte value is assigned the low byte of a 16
  441.             ; bit value
  442.  
  443.  
  444. Conditional Assembly Operators ( return    TRUE or FALSE to IF )
  445.  
  446.     =
  447.     ( or .EQU. )    ; logical equivalence
  448.  
  449.     >
  450.     ( or .GT. )    ; greater than
  451.     .UGT.        ; unsigned greater than
  452.  
  453.     <
  454.     ( or .LT. )    ; less than
  455.     .ULT.        ; unsigned less than
  456.              
  457.  
  458.  
  459. Listing Options Pseudo-Ops.................................................
  460.  
  461. There are a number of listing options. All of these options only effect
  462. the print file (.PRN). The options include some for debugging as well as
  463. some for the actual format of the file on the page. The .PRN file is the
  464. basic tool assembly language programmers have for examining the output of
  465. the assembler. The pseudo-ops beginning with an asterisk must begin in
  466. column 1.
  467.  
  468. *EJECT
  469. ( or EJEC )    ; The next line of the listing should be placed at the top
  470.         ; of the next page.
  471.  
  472. *HEADING    ; Place the text ( following this command ) on the top of
  473.         ; each page. Usually used to date the listing file.
  474.  
  475. TITLE 'text'    ; Place the text in the quotation marks (either double or
  476.         ; single on the top of each page in the listing file.
  477.  
  478. SPAC n        ; Leave n blank lines in the listing. Used to leave white
  479.         ; space in the file with out using a page break.
  480.  
  481. *LIST ON
  482. *LIST OFF    ; Turn the listing on or off. This is usually used to omit
  483.         ; long comments or certain sections from the .PRN file.
  484.  
  485. *MACLIST ON
  486. *MACLIST OFF    ; Turn the expansion of macros on or off. Seeing how the
  487.         ; macros are being expanded is handy for optimizing codeè        ; but can waste paper when that is no longer the area of
  488.         ; interest.
  489.  
  490. LIST options
  491. NLIST options    ; These pseudo-ops allow you to turn any of the supported
  492.         ; listing file options on (LIST) or off (NLIST) without
  493.         ; changing the other options. Both of these pseudo-ops
  494.         ; must be followed with one or more of the following option
  495.         ; letters. If these pseudo-ops is used some options are
  496.         ; on by default ( marked with (on) in the following list.
  497.         ;
  498.         ; A     ; List all bytes in DB, DW, DDB, etc. Otherwise
  499.         ;    ; only the bytes that can fit in one line are
  500.         ;    ; included in the listing ( others are implied ).
  501.         ; B    ; Place symbol table into object file.
  502.         ; G    ; Place system generated symbols into object files
  503.         ; I (on); List lines of conditional code following a false
  504.         ;    ; conditional. If off only the code actually 
  505.         ;       ; assembled is listed.
  506.         ; M (on); Expand macros in listing files
  507.         ; O (on); Produce an object module. That is show the bytes
  508.         ;       ; being generated by the assembler otherwise just
  509.         ;       ; the source and (optionally) macro expansions.
  510.         ; R     ; use absolute displacement for JR and DJNZ
  511.         ; S (on); List source code in listing file
  512.         ; T (on); List symbol table in listing file
  513.         ; X     ; Generate and list cross references in listing file
  514.         ; Z    ; Generate an error for Z80 only opcodes. Allows you
  515.         ;    ; to write in Z80 mnemonics for an 8080 processor.
  516.  
  517. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  518. Error Reporting
  519. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  520.  
  521. When the assembler is unable to understand what you are instructing it to
  522. do it generates an error message. These are almost always due to typo's or
  523. bad form. It displays the error code below and the line the error was found
  524. on to the console and also displays the error codes in the listing file. 
  525.  
  526.      D    ; Duplicate symbol definition. You will see this error
  527.         ; message if you do any of the following:
  528.         ;     Use the same symbol twice.
  529.         ;        FORMATX
  530.         ;        FORMATC
  531.         ;        will generate an error (only 6 significant
  532.         ;        characters).
  533.         ;    Upper and lower case symbols with the same letters
  534.         ;        FORMAT:
  535.         ;        format:
  536.         ;        are identical to the assembler.
  537.         ;    Assigning a different value to a symbol that was
  538.         ;        previously defined with a EQU pseudo-op.
  539.         ;        If you are going to reassign use DEFL.
  540.  
  541.     E    ; Relocation error. I believe this occurs if the assemblerè        ; cannot reassign an address as expected.
  542.  
  543.     F    ; Format Error. You will see this if you break any of the
  544.         ; rules regarding field use and macro format.
  545.  
  546.     K    ; Keyword error. This means you tried to use one of the
  547.         ; assemblers reserved words or pseudo-ops as a symbol.
  548.         ;    ORG:    JP    END
  549.         ;        NOP
  550.         ;    END:    JP    ORG
  551.         ;     is in very bad taste.
  552.  
  553.     L    ; Label error. The attempt to assign a value to a lable was
  554.         ; unsuccessful. Also remember that labels do not end in a 
  555.         ; colon when preceding EQU.
  556.         ;    START:    EQU    100H    ; is bad news
  557.         ;    START    EQU    100H    ; is perfect
  558.  
  559.     M    ; Missing label. The symbol you are using was never defined.
  560.  
  561.     N    ; Macro nesting error. Macros can be nested (that is a macro
  562.         ; can call another macro) but if the nesting gets to deep
  563.         ; the assembler will quit and give you one of these. Also,
  564.         ; you can only call macros that were previously defined.
  565.  
  566.     O    ; Op code error. If you see this, look in the operation and
  567.         ; operand fields. Consult the mnemonic table. People 
  568.         ; switching over from 8080 will see a few of these.
  569.  
  570.     P    ; Phase error. A 2 pass assembler builds a symbol table on
  571.         ; the first pass and generates the object code on the second.
  572.         ; If a number that it calculates for a symbol on the first
  573.         ; pass does not agree with a number it generates in the
  574.         ; pass this error is shown check the symbols in the line
  575.         ; the error appeared.
  576.  
  577.     Q    ; Questionable operand. Actually theres no question about it
  578.         ; it is a bad operand. Typo's give you these as well as 
  579.         ; blowing op code format. Usally easy to find your mistake.
  580.  
  581.     S    ; Syntax error. You broke one of the syntax rules described
  582.         ; above.
  583.  
  584.     T    ; Symbol table full. Not much you can do with this except
  585.         ; pare down the code.
  586.  
  587.     U    ; Undefined symbol. You used a symbol but forgot to define
  588.         ; it in with an EQU.
  589.  
  590.     V    ; Value error. Usually means you are trying to do a 16
  591.         ; bit operation with an 8 bit number or the other way 
  592.         ; around.
  593.  
  594.  
  595. Macrosè
  596. The macro is a powerful method of writing assembly language programs. It 
  597. makes it possible to write assembly language programs in a way that resembles
  598. higher level languages. In fact by creating a library of macros you are
  599. in essence creating your own language, and your own compiler.
  600.  
  601. Often times in assembly language (particularly writing for CP/M) each program
  602. contains source lines that are used again and again in other programs. By
  603. using macros the routines only need to be written once and then may be called
  604. in any program. The best thing about a macro library is that only the macros
  605. that are called produce object code. So there is no penalty in having a macro
  606. library that is large and complete even if you are only going to call one
  607. macro.
  608.  
  609. Macros have a form that is unique and must be followed closely for correct
  610. results. The general form of a macro is
  611.  
  612. name    MACRO    #parameter1,#parameter2,....
  613.     instruction
  614.     instruction
  615.     instruction
  616.     .
  617.     .
  618.     .
  619.     ENDM
  620.  
  621. The name is the symbol that will be used to invoke the macro. MACRO is a
  622. keyword that will indicate to the assembler that a macro is being defined.
  623. The parameters always must begin with a '#' sign in macros and they are
  624. seperated by commas. The instruction can be Z80 instructions, or any of the
  625. assembler commands listed above incuding conditionals. The instruction can
  626. also be another macro call (called nested macros) but only if the nested
  627. macro has been already defined. The ENDM keyword tells the assembler that it
  628. has reached the end of the code that must be assembled when this macro is
  629. called. Do not use a colon behind the macro name.
  630.  
  631. The previous message program example can be rewritten to look like this
  632. with macros.
  633.  
  634.       ORG    100H
  635.  
  636. *INCLUDE Z80MACRO
  637.  
  638.     BDOS    PRNSTR,MES
  639.     RET
  640.  
  641. MES:    DB    ESC,'=',12+20H,12+20H
  642.     DB    '*Your message here*'
  643.     DDB    CRLF
  644.     DB    '*Or here*'     
  645.     END
  646.  
  647. With the following macro library called Z80MACRO.LIB
  648.  
  649. è;Call Bdos function #FUNCT using paramater contained in #DE
  650.  
  651. ESC    EQU    1BH        ; ascii escape
  652. CRLF    EQU    0D0AH        ; ascii    carriage return line feed
  653. PRNSTR    EQU    9
  654.  
  655. BDOS    MACRO    #FUNCT,#DE
  656.     LD    C,#FUNCT    ; FUNCTION NUMBER GOES TO C
  657.     LD    DE,#DE        ; GET PARAMETER
  658.     CALL    5        ; CALL BDOS
  659.     ENDM
  660.  
  661. We could also rewrite the cursor positioning sequence into a macro. Note
  662. how just this small example can save us time in future programs. Also, the
  663. macro library is a great place to keep frequently used symbols like ESC and
  664. CRLF.
  665.  
  666. But what about using address symbols in macros? How can we avoid the 'D'
  667. error if we call the macro more than once. The other keyword unique to
  668. macros is LOCAL. This makes the assembler generate its own unique label
  669. every time the macro is expanded in a program. Following the word LOCAL
  670. ( which must be on the second line of the macro ) are the symbols we want
  671. the compiler to generate unique labels for. These symbols must also be
  672. proceded with a '#' sign.
  673.  
  674. AJUMP    MACRO
  675.     LOCAL    #ADR_Z,#BACK
  676.     OR    A
  677.     JR    Z,#ADR_Z
  678.     LD    A,40H
  679.     JR    #BACK
  680. #ADR_Z:    LD    A,04H
  681. #BACK:    LD    DE,0
  682.     ENDM
  683.  
  684. The macro itself is not really useful but it is correct and shows the use
  685. of local labels.
  686.  
  687.