home *** CD-ROM | disk | FTP | other *** search
Text File | 1987-07-29 | 68.6 KB | 1,710 lines |
- .pl 88
-
-
-
-
-
-
- ZZZZZZZZZZZ MMMM MMMM
- ZZ MM MM MM MM
- ZZ MM MM MM MM
- ZZ MM MM MM MM
- ZZ MM MM MM MM
- ZZ MM MMMM MM
- ZZ MM MM MM
- ZZ MM MM
- ZZ MM MM
- ZZZZZZZZZZZ MM MM
-
-
-
-
-
- Copyright (c) 1983
- Roger E. Donais
-
-
-
-
- If you have ant questions concerning ZM,
- contact the author:
-
- Roger E. Donais, USA Ret
- 7506 Republic Ct. #201
- Alexandria, VA 22306
- (703) 765-0615
-
-
-
-
-
- C O N T E N T S
-
- INTRODUCTION .................................... 1
- STATEMENT SYNTAX ................................ 4
- OPCODES ......................................... 5
- OPERANDS ........................................ 5
- OPERATORS ....................................... 7
- DIRECTIVES ...................................... 9
- PREDEFINED USER SYMBOLS ......................... 13
- TERMINAL ERRORS ................................. 14
- FATAL ERRORS .................................... 16
- WARNING MESSAGES ................................ 18
- RUNTIME REQUIREMENTS ............................ 19
- RESERVED SYMBOLS ................................ 20
- Z80 SYNTAX SUMMARY .............................. 21
- ALTERATION ...................................... 23
- INDEX ........................................... 27
-
-
-
-
-
-
-
- I N T R O D U C T I O N
-
- ZM translates symbolic language source files into machine
- executable code in either (.COM) or Intel loader (.HEX) format.
- It has been designed to be easily used by the novice, yet provide
- a variety of capabilities powerful enough for the expert. ZM can
- be used to assemble large files on relatively small systems.
-
- TO USE: Enter ZM drive:filename.type options
-
- Where "drive" is the CP/M drive which will receive the
- assembled object file, "filename.type" is any valid CP/M
- file, and "options" are one or more of the following:
-
- L to get an assembled Listing
- H to get a .HEX type object file
- C to get a .COM type object file
- 1 for printer setup #1 (see alteration notes)
- 2 for printer setup #2 (see alteration notes)
- = to enter subject text (see listing)
-
- All options, except "=", may be entered in any order. When
- used, the "=" option must always be entered last. Default
- settings are NO listing, NO object file and a blank subject line.
- ZM uses the same resources to produce both a .HEX and .COM Object
- file, therefore only one or the other may be requested.
-
-
- NOTE: ^C may be used to abort assembly from the keyboard.
- ^S may be used to pause and restart assembly.
-
-
- EXAMPLE: C>ZM B:JUNK.PDQ C
-
- Will cause ZM to create the object file B:JUNK.COM
- using the first JUNK.PDQ found on the designated
- drive, default drive, an internally defined drive
- or drive A:. If JUNK.PDQ cannot be found on any
- of these drives, ZM will prompt with the message:
-
- --Insert disk with JUNK.PDQ and press <RETURN>
-
- The disk may then be inserted in any of the
- previously mentioned drives, EXCEPT the drive
- destined to receive the object file (in this
- example B:). The process will repeat until
- JUNK.PDQ is found, or a ^C is entered in response
- to the prompt.
-
-
-
-
-
-
-
-
-
- PAGE 1
-
-
-
-
- LISTING: A two line heading is printed on each page:
-
- SUBJECT: __________________________________________
- SOURCE FILE: _______ PAGE - nn DATE: yy/mm/dd
-
- The source file is the name of the file currently being
- assembled (see INCL directive). The subject will contain the
- text immediately following an equal sign. Control characters
- may be entered to initialize specific printer options. Maximum
- text length is 63 characters.
-
- An assembly listing is printed only when the "L" option has
- been selected. The actual listing may then be disabled/enabled
- by LIST directive. A partial listing, consisting of all source
- statements containing warning and fatal assembly error messages,
- will be displayed whenever the "L" option has not been selected.
-
- The console is the default list device. Use options 1 or 2
- to obtain printer output. Used by themselves, they will direct
- the error and warning messages to the printer. Used with the "L"
- option, they direct the entire assembly listing to the printer.
- If the printer is NOT ready when ZM begins to print, output will
- automatically be set to the console. ZM will wait indefinately
- if the printer goes off line, or otherwise becomes unavailable,
- once printer output has started.
-
- EXAMPLES:
-
- ZM JUNK error messages will be sent to
- the console.
-
- ZM JUNK 1 error messages will be sent to
- the printer using printer setup
- string #1. If the printer is
- not ready, messages will be
- sent to the console.
-
- ZM JUNK L listing will be sent to the
- console.
-
- ZM JUNK L2 listing will be sent to the
- printer using printer setup
- string #2. If the printer is
- not ready, listing will be sent
- to the console.
-
-
-
-
-
-
-
-
-
-
-
- PAGE 2
-
-
-
- END OF ASSEMBLY: The following will be displayed:
-
- NEXT ADDRESS nnnnH
- NEXT DATA nnnnH
- FREE MEMORY nnnnH
- STACK SPACE nnnn
- ERROR COUNT nnnn/nnnn
-
- NEXT ADDRESS is the first hexadecimal address following the last
- item of assembled code.
-
- NEXT DATA is the hexadecimal value currently assigned to the
- predefined symbol DATA. (see directives and predefined
- symbols). Depending upon how the DATA directive/symbol was
- used, NEXT ADDRESS or NEXT DATA could be used as the origin
- for a co-resident or chained program or program overlay.
-
- FREE MEMORY is the hexadecimal amount of memory available for
- symbols and object file buffer (see RUNTIME requirements).
-
- STACK SPACE is the decimal amount of unused buffer/stack memory
- which is available for expression evaluation and source file
- inclusion (see RUNTIME requirements).
-
- ERROR COUNT is a two part decimal number corresponding to the
- number of statements tagged with fatal/warning messages.
- The sum of these numbers reflect the total number of
- statements, not the total number of error messages.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 3
-
-
-
- _ _ _ _ _ _ _ _ S T A T E M E N T S Y N T A X _ _ _ _ _ _ _ _
-
- The general format of an assembly statement is:
-
- LABEL OPCODE OPERAND(s) COMMENT
-
- UNDERSCORE and COLON characters are ignored, except when used
- between quotes. An exaggerated example is _L_D_: and LD
- being equivalent.
-
- SPACES are used only to identify an item boundary, otherwise they
- may be used without restriction between any element,
- including parts of an expression.
-
- TABS (ascii 09h or ^I) are treated as spaces during assembly and
- expanded to every eighth print position within the listing.
-
- LINE FEED (ascii 0Ah or ^J) and CARRIAGE RETURN (ascii 0Dh or ^M)
- are always recognized as the end of a source statement and
- may NOT be embedded within a statement.
-
- FORM FEED (ascii 0Ch or ^L) will assemble when embedded in quotes,
- however, always cause the list driver to perform a page eject.
-
- CONTROL CHARACTERS (ascii 00h through 1Fh) are similiar to spaces
- in that they mark the boundary of an item, otherwise they may
- appear at any point within a statement. They are not processed
- during assembly, but sent to the printer "as is". Note that
- this applies to all control characters except tabs (ascii
- 09h or ^I), line feed (ascii 0Ah or ^J) and carriage returns
- (0Dh or ^M) which are explained above.
-
- BIT-7 is removed from all characters in the source file before
- processing. This eliminates the need to preprocess files
- that have been edited as a WordStar document.
-
- DECIMAL POINTS, entered as the first character in a statement,
- are assumed to be WordStar DOT COMMANDS. The statement is
- ignored and will not appear on the listing.
-
- LABELS or SYMBOLS are items, 1 to 31 character long whose first
- character is a letter (A thru Z) and subsequent characters
- are the letters A thru Z and numbers 0 thru 9. They used
- to represent an address or value. Embedded underscores and
- colons are ignored and do NOT count toward the 31 character
- limit. Upper and lower case may be used interchangeably.
- SYMBOL and S_y_m_b_o_l: are the same. Labels are optional
- for all statements except MARK an d DATA. When omited from
- an EQU statement, the value of the resolved expression wiil
- be printed, but will not be retained. Labels on a line by
- themselves are assigned the value of the current assembly
- address. NO reserved word (opcode, directive, operand or
- condition code) may be used as a label. Labels do not have
- to begin in the first character position, but must be the
- first item in a statement.
-
-
- PAGE 4
-
-
-
- OPCODES are Z80 instruction mnemonics or assembler directives.
- (See Z80 instruction syntax for additional details)
-
- OPERANDS are numeric constants, reserved symbols, user defined
- labels or expressions. Their use is strictly dependent upon
- the OPCODE used in the source statement. ZM recognizes two
- special symbols in the operand field.
-
- $ The dollar sign is used in an expression to represent
- the current assembly address. It may be used alone or
- as part of an arithmetic expression.
-
- \ The backslash is used in place of any 8 or 16-bit
- immediate operand to "cut" the instruction. This
- allows a formal means of representing and documenting
- an advanced assembly language technique where the
- immediate operand for one instruction is itself an
- instruction. The practice is often used to create a
- one or two byte relative jump by using an 8 or 16 bit
- register to load the in-line code, or to flag the entry
- of a single routine that must later continue with
- separate procedures.
-
- EXAMPLE:
-
- ENTRY_1 OR \ ;OR 0AFh makes NZ
- ENTRY_2 XOR A ;Makes Z True
- PUSH AF ;Save entry flag
-
- (procedure common to both)
-
- POP AF ;Retrieve entry flag
- JP Z,PROC_2 ;
-
- (procedure unique to Entry_1)
- RET
-
- PROC_2 (procedure unique to Entry_2)
- RET
-
- EXAMPLE:
-
- ERROR_1 LD A,0
- LD BC,\ ;Skip-2
- ERROR_2 LD A,2
- LD BC,\ ;Skip-2
- ERROR_3 LD A,4
-
- (Continue with common routine)
-
-
-
-
-
-
-
-
- PAGE 5
-
-
-
- NUMERIC CONSTANTS are literal values 1 to 31 characters long
- whose first character is always a number (0 thru 9).
- Embedded underscores and colons are ignored and do NOT count
- toward the 31 character limit. Both upper and lower case
- may be used interchangeably. A suffix is used to indicate
- the desired base. Any overflow while evaluating a number is
- IGNORED, with only the lower 2 bytes being retained.
-
- BINARY CONSTANTS are a sequence of 0's and 1's followed by
- the letter B.
-
- OCTAL CONSTANTS are a sequence of the digits 0 through 7
- followed by the letter O or the letter Q.
-
- DECIMAL CONSTANTS are a sequence of the digits 0 through 9
- with no base designation suffix. ( 0d is NOT decimal zero,
- but an illegal number! )
-
- HEXADECIMAL CONSTANTS are a sequence of the digits 0 through
- 9 and the letters A through F followed by the letter H.
-
- STRING CONSTANTS are a sequence of ANY ascii characters, except
- line feeds (ascii 0Ah) and carriage returns (ascii 0Dh),
- enclosed between apostrophes ('). Lower case letters are
- not converted to uppercase, nor are tab characters (ascii
- 09h) expanded within the assembled code. Tabs are, however,
- expanded on the printed listing. An apostrophe may be
- included within a string by immediately following it with a
- second one. To include an apostrophe at the end of a string
- requires three in a row (one to indicate end of string). A
- string constant containing a carriage return (ascii 0Dh) or
- line feed (ascii 0Ah) will generate a fatal error for that
- statement. String constants may NOT be used in an
- arithmetic expression.
-
- CHARACTER CONSTANTS are a SINGLE ascii character, except line
- feed and carriage return, enclosed between apostrophes (').
- Lower case letters are not converted to upper case. An
- apostrophe may also be quoted ('''). Character constants
- may be used in an arithmetic expression (the assembler
- assigns a zero value to the most significant byte).
-
- EXPRESSIONS are a sequence of constants and user defined labels
- separated by arithmetic or logical operators. During
- assembly each expression is evaluated in a strict left to
- right sequence and reduced to a single word (two byte)
- value. Any overflow during evaluation is ignored.
-
-
-
-
-
-
-
-
-
-
- PAGE 6
-
-
-
- OPERATORS:
-
- [ ] Brackets are used in an expression to control the
- strict left to right evaluation process, or to make the
- expression easier to read. Remember that Z80 syntax
- uses parentheses "( )" to denote memory addressing and
- are therefore not an integral part of an expression.
- An expression contained in brackets is treated as a
- single item.
-
- + ADDS the next item to the current value (may also be
- used as a unary operator).
-
- - SUBTRACTS the next item from the current value (may
- also be used as a unary operator).
-
- * MULTIPLIES the current value by the next item.
-
- & Logically ANDs the current value with the next item.
-
- # Logically XORs the current value with the next item.
-
- < SHIFTS the current value left the amount of the next
- item. High order bits are discarded and low order bits
- are replaced with zeros.
-
- > SHIFTS the current value right the amount of the next
- item. Low order bits are discarded and high order bits
- are replaced with zeros.
-
- ! Compares the current value with the next item and keeps
- the LARGER of the two.
-
- = Sets the current value TRUE (-1, all bits set) if the
- current item and next item are equal, otherwise sets
- the current value equal to zero.
-
- ^ Is a unary operator used to create an ascii control
- character. It must exactly precede (no spaces) the
- unquoted character. (e.g. ^Z or ^z give a control Z)
-
- @ Is a unary operator designed to return the integer
- value from a memory location at assembly time. Its use
- should be restricted to very special occasions since
- the resulting code will function properly only if the
- same values exist at runtime. Its primary use is to
- create system specific extensions, or overlays.
-
- EXAMPLE:
- LD HL,(06) ; Runtime BDOS entry
- LD DE,@6 ; Assembly Time BDOS entry
- OR A
- SBC HL,DE ; test runtime compatibility
- JP NZ,IMPROPER
-
-
-
- PAGE 7
-
-
-
-
- ? Is a kludged operator for use with MARK and IF
- directives to provide a primitive library capability
- that assembles only required functions.
-
- MARK symbol = ?
- will create symbol if it does not exist, otherwise
- it does nothing.
-
- IF? symbol
- is TRUE only if symbol has been previously
- defined.
-
- EXAMPLE:
- (main program) MARK CON_INP = ?, PRINT = ?, ...etc
- INCL B:LIBRARY.C13
-
- (library source) IF? PRINT
- PRINT MARK CON_OUT = ?
- (code for print subroutine)
- ENDIF ; PRINT subroutine
-
- IF? CON_OUT
- CON_OUT
- (code for con_out subroutine)
- ENDIF ; CON_OUT subroutine
-
-
- ADDRESSING involves the Z80 registers, memory references and
- expressions used in the operand field of a assembly source
- statement and are covered in greater detail in the many
- books on Z80 assembly language programming. The main
- inconsistency amongst these texts is the form used to
- address 8-bit Z80 arithmetic and logic instructions. Some
- use only a single operand, omitting the A-register from
- the source statement entirely. Another uses two operands
- only for those instructions having a 16-bit counterpart and
- one operand for the remaining instructions. A third method
- requires two operands for all 8-bit arithmetic and logic
- instructions. Since chosing one of these technique depends
- upon personal preference, ZM will recognize and process both
- the first and third. This means you may chose to use two
- operands, or a single operand for all 8-bit arithmetic and
- logic instructions. A record is kept on the particular
- method used, and if not consistent, will generate a single
- warning message.
-
- NOTE: ZM also recognizes INTEL style port i/o instructions
- ( IN nn and OUT nn ) as well as their ZILOG counter
- parts ( IN A,(nn) and OUT (nn),A ) and includes their
- use when generating the 8-Bit mixed address warning.
-
-
-
-
-
-
- PAGE 8
-
-
-
- DIRECTIVES are commands to direct the assembler during the
- assembly process and have no meaning to the Z80 processor.
-
- EQU assigns the value of an expression to a label. If
- there is no label, the value will appear on the listing
- without error, but the value is not retained.
-
- label EQU expression
- EQU expression
-
- DEFS and DS define storage by reserving the the number of
- bytes for storage represented by the expression. If
- the expression is not resolved, ZM will display an
- appropriate message and terminate assembly after
- completing the first pass.
-
- DS expression
- DEFS expression
-
- DEFB and DB assemble an expression a byte at a time. The
- expression may be arithmetic or string. Supports
- multiple expressions seperated by comas.
-
- DB expression, expression
- DEFB expression, expression
-
- DEFW and DW assemble an expression a word at a time (Z80
- fashion with LSB first). Supports multiple expressions
- separated by comas.
-
- DW expression, expression
- DEFW expression, expression
-
- DEFM and DM assemble one or more expressions a byte at a
- time. The expressions may be arithmetic or string, or
- a combination of both. The length of the assembled
- code is placed at the current assembly address followed
- by the code itself.
-
- DM expression,expression
- DEFM expression,expression
-
- ORG initializes the assembly address to the value of the
- expression. A label on this line will be assigned
- this value. If the expression is not resolved, ZM
- will display an appropriate message and terminate
- assembly after completing the first pass.
-
- ORG expression
-
-
-
-
-
-
-
-
- PAGE 9
-
-
-
- RUN accepts the value of an expression as the logical
- execution address. An offset is then determined and
- used to define all subsequent labels and in evaluating
- the assembly operand "$". This allows assembling code
- that will be moved from the current physical address to
- be executed at a different address. Uses include ROM
- resident code and bank switching requirements. A label
- on this line will be assigned the assembly address
- before the RUN evaluation. If the expression is not
- resolved, ZM will display an appropriate message and
- terminate assembly after completing the first pass.
-
- RUN expression ;execute at expression
- RUN $ ;execute at physical
-
- EXAMPLE:
- ORG 100h
- LD HL,LoMem
- LD DE,HiMem
- LD BC,CodeLength
- LDIR
- JP HiMem
- LoMem RUN 8000h
- HiMem ( code to execute
- at address 8000h)
- CodeLength equ $-HiMem
-
- INCL merges another source file with the current one. The
- file name can contain only the letters A to Z and
- numbers 0 to 9. An optional drive identifier may be
- given. If no file type is specified, a null type is
- assumed. Once the end of file or END directive is
- reached, assembly will resume with the statement
- following the INCL. The included file may also
- contain INCL directives. ZM will search for the
- included file on the designated drive, default drive,
- drive A: and internally defined drive. You will be
- allowed to change disks if the file cannot be found.
- Do NOT change the disk that is to receive the .COM or
- .HEX file as it will cause a CP/M disk write error
- when ZM attempts to write the file to disk. Prompting
- continues until the file is found, or a ^C is entered.
-
- INCL <drive:><filename><.type>
-
- END marks the logical end of a source file. Assembly will
- NOT proceed beyond that point. The END statement is
- optional. If not used, assembly will continue to the
- physical end of the file.
-
- END
-
-
-
-
-
-
- PAGE 10
-
-
-
- LIST turns the listing ON or OFF only if the "L" option was
- requested. A non-zero expression enables the listing,
- and a zero disables the listing. Statements containing
- errors are always listed with their associated messages
- regardless of the LIST setting or "L" option.
-
- LIST expression
-
- IF, ELSE, and ENDIF provide conditional assembly. When the
- evaluated expression is NOT zero, all statements will
- be assembled until the corresponding ELSE or ENDIF is
- reached. The ELSE directive is optional. IF's may be
- nested seven deep.
-
- EXAMPLE:
- IF expression1
- (following statements will assemble
- only if the expression1 is NOT zero)
- IF expression2
- (following statements assemble
- only if expression1 is NOT zero
- AND expression2 is NOT zero)
- ENDIF
- (following statements assemble
- only if expression1 is NOT zero)
- ELSE
- (following statements assemble
- only if expression1 is ZERO)
- IF expression3
- (following statements assemble
- only if expression1 is ZERO
- AND expression3 is NOT zero)
- ELSE
- (following statements assemble
- only if expression1 is ZERO
- AND expression3 is ZERO)
- ENDIF
- (following statements assemble
- only if expression1 is ZERO)
- ENDIF
- (assembly resumes in a normal manner)
-
- MARK sets a label to the current assembly address or to the
- value of an expression following an equal sign "=".
- If the label has been previously defined and not
- marked, an error will occur. MARK supports multiple
- labels seperated by commas. MARK'd labels may be used
- in any desired manner. They differ from normal labels
- in that they may be reused. The most recently defined
- value is used when a marked label appears in an
- expression (see ? operator).
-
- MARK label1,label2 = expression, ...etc
-
-
-
-
- PAGE 11
-
-
-
- DATA exists both as a directive and as a predefined label.
- The directive assigns the current value of DATA to a
- label, then reassigns DATA = DATA + expression This
- allows defining internal data overlays or data areas
- outside the physical program. Using DATA without a
- label will cause a fatal error (missing data). (See
- user defined sysbols for additional information).
-
- label DATA expression
-
- MSG evaluates an expression similar to a DEFB and displays
- it on the console. The expression used must contain
- all necessary screen control characters, including
- carriage return and line feed. A dollar sign ($) is
- the only character that may not appear in the evaluated
- text. No text will appear afterward, and no error will
- be generated.
-
- GET Accepts 1 to 80 characters from the console and
- appends them to the end of the current statement. The
- statement is then assembled as usual. Remember to
- leave any necessary spaces or puntuation at the end of
- the incomplete statement. Use MSG to provide the
- necessary prompting.
-
- MSG 'ENTER PRINTER SELECTION:', cr, lf, lf
- MSG '1. Epson mx-80/100', cr, lf
- MSG '2. Okidata 82a', cr, lf
- MSG '3. Anderson Jacobson', tab
- GET MARK PRINTER =
-
- IF Printer =1
- (epson code assembles here)
- ENDIF
- IF Printer =2
- (okidata code assembles here)
- ENDIF
- IF Printer =3
- (anderson code assembles here)
- ENDIF
- (normal program code continues here)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 12
-
-
-
- PREDEFINED USER SYMBOLS
-
- DATA is a progressive counter used with the DATA directive.
- It is NOT altered between passes, therefore it MUST be
- initialized with the MARK directive before it is used.
-
- EXAMPLE:
- ORG 100H
- MARK DATA, LOOP
- CALL INITIALIZE
- DB 'Initial Program signon message$'
- DB 'Additional text for "TYPE .COM"', 1AH
- FCB2 DATA 33
- COUNT DATA 2
- ORG DATA ! $
-
- FCB2 overlays the beginning of the program at 100h and
- COUNT is assigned 121h. The assembly address is then
- adjusted to the larger value of "$" or "DATA".
-
- IX and IY are used to evaluate memory references using
- their respective index registers. They must always be
- defined using a negative value.
-
- EXAMPLE:
-
- FLAGS DEFB 0 ;One byte flag variable
- IX EQU -$ ;<--<< IX BASE ADDRESS <--<<
- TEMP DEFW 0
-
- IX has been defined as the current assembly address.
- SET 0,(IX+FLAGS) will assemble correctly and is the
- same as SET 0,(IX+FLAGS-BASEX) used with the following:
-
- EXAMPLE:
-
- FLAGS DEFB 0 ;One byte flag variable
- BASEX EQU $ ;<--<< IX BASE ADDRESS <--<<
- TEMP DEFW 0
-
- NOTE: Loading the index register must use the
- negative of these symbols.
-
- LD IX,-IX ;Initialize IX base position
-
- NOTE: Since the predefined symbols IX and IY are initially
- zero, NOT using them will cause assembly to take place in
- the usual manner. If you do use them, remember they are
- redefinable and affect only those expressions FORWARD of
- themselves. Also realize that the beginning of the file is
- AFTER its END during the second pass. If you plan on using
- ANY redefinable symbol, but expect them to be zero at the
- beginning, MARK THEM BEFORE YOU SET THE ORIGIN or EQUATE
- THEM TO ZERO !
-
-
-
- PAGE 13
-
-
-
-
- _ _ _ _ _ _ _ _ _ _ _ _ _ E R R O R S _ _ _ _ _ _ _ _ _ _ _ _ _
-
- There are three types of errors: Terminal, Fatal and Warning:
-
- TERMINAL errors terminate the program! All Terminal errors
- are displayed on the console and control is immediately
- returned to CP/M.
-
- Fatal errors result in the offending source statement not
- being processed. NO CODE IS GENERATED!
-
- WARNINGS are provided when the integrity of the assembled
- code is questionable. In other words, what you got, might
- not be what you wanted!
-
- Warning and Fatal error messages are always displayed with
- the offending source statement, even if the "L" option was not
- selected. The format includes the current file name if it has
- not yet been displayed. The offending statement is then printed,
- followed by a line of carats (^) to indicate those points that
- caused ZM to choke. The appropriate warning and fatal error
- messages are then lsited. Finally, the current statement number,
- which matches WordStar's FL number, or ED.COM's line number, is
- printed. Any relationship between the carats and the ordering of
- error messages is purely coincidental.
-
- EXAMPLE:
-
- SOURCE FILE: JUNK.PDQ
-
- db tab,'LINE OF TEXT',0D,0Ah,
- ^ ^ ^
- -- WARNING -- 17: BAD NUMBER
- 15: UNDEFINED LABEL
- *** FATAL *** 1: MISSING INFORMATION
- - Line No 1263 -
-
- _______________________________________________________________
- TERMINAL ERRORS: Assembly stops and control is returned to CP/M.
-
- USE: ZM <file> <option>
-
- WHERE <option> is one or more of the following:
-
- L = Listing
- H = Hex object file
- C = Com object file
- 1 = 10 lpi x 10 cpi
- 2 = 8 lpi x 17 cpi
-
- Cause: No file was provided, or an unrecognized option was
- given.
- Solution: Examine and reenter the command line. Remember the the
- "=" must be the last option.
-
-
- PAGE 14
-
-
-
-
-
- ** CANNOT HAVE BOTH ".HEX" & ".COM" OUTPUTS **
- Cause: Both the H and C options were requested.
- Solution: Reenter the command line with an H option, then use
- CP/M's LOAD.COM utility to provide the .COM file.
-
-
- ** CANNOT CREATE/OPEN OBJECT FILE **
- Cause: This will most likely result from a FULL Directory.
- Solution: Erase a few files to make room.
-
-
- ** DISK or DIRECTORY FULL **
- Cause: The system reported it could NOT write the object file.
- Solution: Erase a few file to make room.
-
-
- ** SYMBOL TABLE OVERFLOW **
- Cause: Symbol and GET storage have collided!
- Solution: Shorten Symbol names, use more MARK'd symbols, or
- separate the source file into two or more smaller ones
- and assemble them separately.
- NOTE: See RUNTIME requirements for additional information.
-
-
- ** STACK OVERFLOW **
- Cause: The hardware stack and source statements have collided.
- Solution: Reduce the INCL nest level, simplify complex
- expressions, use shorter source statements.
- NOTE: See RUNTIME requirements for additional information.
-
-
- ** CANNOT CLOSE OBJECT FILE **
- Cause: Something prevented CP/M from closing the output file.
- Solution: Read the CP/M manual for causes and solutions.
-
-
- ** INVALID OBJECT (.COM) FILE ABANDONED **
- Cause: The initial ORG was not 100h, or was less than the
- current assembly address.
- Solution: Reorganize or Rewrite the assembly source file.
- NOTE: This error is not terminal. Assembly will continue,
- providing a listing and/or additional error messages.
-
-
- ** NESTING TOO DEEP **
- Cause: The current statement brings the IF/ELSE/ENDIF to more
- than 7-levels.
- Solution: Rewrite the file using fewer IF/ELSE/ENDIF levels.
-
-
-
-
-
-
-
- PAGE 15
-
-
-
- ________________________________________________________________
- FATAL ERRORS: No code is generated for the statement containing
- the error. Assembly continues with the next statement.
-
-
- 0: BAD/UNRESOLVED EXPRESSION
- Cause: An INCL statement contained a bad filename, or an ORG
- RUN, or DS/DEFS statement contained an unresolved
- expression
- NOTE: Assembly will terminate at the end of the first pass.
-
-
- 1: MISSING INFORMATION
- Cause: The expression was missing an operand, a comma, or a
- parenthesis; or a statement ended with a comma.
-
-
- 2: ILLEGAL ADDRESSING
- Cause: The operand(s) violate Z80 addressing options for the
- opcode used.
-
-
- 4: ILLEGAL OPCODE
- Cause: The item being processed was not a recognized opcode or
- assembler directive. (This relates to the second item,
- the first was processed as a symbol). This usually
- occurs when a reserved symbol (opcode, register,
- condition code or directive) was used as a label, or an
- opcode or directive was misspelled.
-
-
- 5: EXPRESSION TOO LONG
- Cause: A statement generated more than 82 bytes of code.
-
-
- 6: ITEM TOO LONG
- Cause: A single item (symbol or number) exceeded 31
- characters.
-
-
- 7: EXPRESSION ERROR
- Cause: An expression had two successive operators, two
- successive items, a missing operator, a missing item,
- a missing right parentheses, included extraneous
- characters, or contained unbalanced braces.
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 16
-
-
-
- _______________________________________________________________
- WARNINGS: The assembled code may NOT be what was intended.
-
-
- 8: MIXED 8-Bit ADDRESSING MODES
- Cause: The source file contains a mixture of one and two
- operand address for 8-bit arithmetic or logic
- instructions.
- Result: Since ZM handles both methods, the code was properly
- assembled. However, had the intention been to use
- only one of the two addressing methods, then one or
- more statements are not what was intended.
-
-
- 10: ORIGIN NOT IN SEQUENCE
- Cause: The expression for an ORG resolved to an address
- smaller than the current assembly address.
- Result: Any .COM file is abandoned, but assembly resumes.
-
-
- 11: BRANCH (origin - target) OUT OF RANGE
- Cause: The target for a relative jump (JR or DJNZ) was not in
- the range -128 to +127
- Result: The target for the jump becomes the instruction itself.
-
-
- 12: ILLEGAL LABEL
- Cause: The symbol being defined is a reserved operand. (See #4)
- Result: The symbol is ignored.
-
-
- 13: LABEL NOT MARKED
- Cause: The symbol has been defined more than once.
- Result: The first assigned value is used.
- Hint: Use the MARK directive to define symbols you wish to
- use more than once.
-
-
- 14: UNPROCESSED CHARACTERS
- Cause: After the statement was assembled the end of the line
- had not been reached.
- Result: The assembled code may/may not be appropriate.
-
-
- 15: UNDEFINED LABEL
- Cause: An expression contains a symbol that has not been
- defined.
- Result: The symbol defaults to a value of zero.
-
-
- 16: MULTIPLY DEFINED
- Cause: An expression contains a symbol that was defined more
- than once.
- Result: The original symbol's value is used.
-
-
-
- PAGE 17
-
-
-
- 17: BAD NUMBER
- Cause: A item beginning with 0 thru 9 contained a character
- not appropriate for the assigned base.
- Result: The number defaults to a value of zero.
-
-
- 20: UNBALANCED IF/ENDIF
- Cause: An END directive, or the end of a file was reached
- without enough ENDIF's to complete all IF directives.
- Result: If the unbalance occurred while processing an included
- file, the previous file's IF/ENDIF stack was restored.
- Assembly will terminate at the end of the first pass.
-
-
- 22: NO ASSOCIATED "IF" STATEMENT
- Cause: An ENDIF statement was processed without first having
- processed an "IF" statement.
- Result: The statement was ignored. Assembly will terminate at
- the end of the first pass.
-
-
- 23: STATEMENT TRUNCATED
- Cause: A source statement was longer than 215 characters.
- Result: The excess was discarded. May cause additional errors
- if the discarded portion was not a comment.
-
- 24: INVERTED ORIGIN
- Cause: Source file contained no ORG statement or an ORG
- has an expression that is less than 100H
- Result: A .COM file will be abandoned, but assembly continues.
-
-
- 25: LABEL ADDRESS CHANGES
- Cause: The Label had a different address on the second pass
- than it had on the first pass.
- Result: Very dubious code!
- Hint: Look for a previous statement that adjusts the assembly
- address using a MARK'd symbol that is later redefined,
- or a previous IF/ENDIF that generated code on one pass,
- but was FALSE on the other pass.
-
-
- 26: FIELD OVERFLOW
- Cause: The evaluated expression exceeded the size limits for
- the opcode. (Example. IM n where 'n' is not 0, 1 or 2).
- Result: A "mask" is used to force a legal value.
-
-
- 27: BYTE VALUE OVERFLOW
- Cause: All expressions are reduced to an unsigned 16-bit
- integer. The least significant byte is used for
- instructions requiring an 8-bit value, however, the
- original value was neither 0 to 255 nor -128 to +127
- Result: The least significant byte was used, "as is".
-
-
-
-
- PAGE 18
-
-
-
- ------------------------------------------------------------
- R U N T I M E R E Q U I R E M E N T S
-
- PROGRAM MEMORY MAP
-
- 100h ______________________________________________________ BDOS
- | | | | < ? > |
- | fixed | src stk | program | get wrk obj symbol |
- Pass1 => | 216 100 | | >>--> 31 xxx <---<< |
- Pass2 => | 216 100 | | ????? 31 128 ?????? |
-
- A substantial portion of the program (initialization
- section) is reclaimed and used for runtime data storage. All
- memory beyond ZM's original size, is used for symbol table and
- output file buffer.
-
- A fixed 216 byte buffer is allocated for the source
- statement. No statement may exceed 215 characters.
-
- A 100 byte (50 level) stack is provided. The stack, however,
- is not rigid. It is allowed to wander into the unused portion of
- the source statement buffer, but is NOT allowed to overwrite a
- statement. Should the program attempt to overwrite a statement,
- ** STACK OVERFLOW ** occurs and control is imediately returuned
- to CP/M. Minimum runtime requirement is approximately 15 levels.
- Each recurssive INCL consumes 22 bytes. Evaluation recursion
- (brackets) consumes 6 bytes. A typical source file containing 80
- character lines can contain 8-Levels of INCL nesting and 5-Levels
- of brackets. STACK SPACE reported at the end of assembly is the
- minimum distance reached between any source statement and the
- stack. In other words, a stack crash barometer!
-
- GET responses begin at the end of the program and expand
- toward high memory and are stored as entered, with a byte count
- preceding each entry.
-
- Symbols are stored just below BDOS and expand toward low
- memory. Each symbol requires three bytes in addition to the
- actual symbol length.
-
- A 31 byte work space continually relocates at the end of the
- GET storage area during pass1. During pass2, all tables are
- fixed and this work space becomes stationary.
-
- All remaining space between the end of the 31 byte work
- space and the bottom of the symbol table is used to buffer the
- object file output. More space means less disk access, providing
- faster assembly. If at any time this space should become less
- than 128 bytes (one file sector) ** TABLE OVERFLOW ** occurs and
- assembly ceases. FREE MEMORY displayed at the end of assembly is
- the amount of memory available to expand the object file buffer
- beyond a single 128 byte sector. When less than 128, the object
- file buffering is limited to this one sector. Assembly may be
- slow, but still running. Less than zero, and it's dead.
-
-
-
- PAGE 19
-
-
-
- ____________________________________________________________
- R E S E R V E D S Y M B O L S
-
- ________________________Z80 Opcodes_________________________
- EXX LDI LDIR LDD LDDR CPI CPIR CPD
- CPDR DAA CPL NEG CCF SCF NOP HALT
- DI EI IM RLCA RLA RRCA RRA RETI
- RETN INI INIR IND INDR OUTI OTIR OUTD
- OTDR LD RLC RL RRC RR SLA SRA
- SRL RLD RRD PUSH POP EX ADD ADC
- SBC SUB AND OR XOR CP INC DEC
- BIT SET RES JP CALL JR DJNZ RET
- RST IN OUT
-
-
-
- __________________Assembler Directives______________________
- DS DEFS DB DEFB DW DEFW DM DEFM
- ORG RUN END INCL MARK EQU DATA LIST
- IF ELSE ENDIF MSG GET
-
-
-
-
- _________________________Operands________________________
- Z NZ C NC PO PE P M
- A B C D E H L
- BC DE HL IX IY SP AF
- I R $ \ ?
-
-
-
- _______________Predefined User Symbols_______________________
- DATA IX IY
-
-
-
- _____________________Operators___________________________________
- + - * & # < > !
- ? @ = [ ] ^
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 20
-
-
-
- _________________________________________________________________
- _______________________ Z80 SYNTAX SUMMARY ______________________
-
- _ _ _ _ _ _ _ _ _ _ D A T A T R A N S F E R _ _ _ _ _ _ _ _ _
- 8 Bit Transfers 16 bit transfers Block Transfers
-
- LD r,r' LD ss,nnnn LDI
- LD r,nn LD ss,(nnnn) LDIR
- LD (nnnn),ss
- LD r,(m) LDD
- LD (m),r LD SP,HL LDDR
- LD (m),nn LD SP,IX
- LD SP,IY
- LD A,(BC)
- LD A,(DE) PUSH qq
- LD A,(nnnn) POP qq
- LD (nnnn),A
- LD (DE),A EX DE,HL NOTE: ZM is NOT sensitive
- LD (BC),A EX (SP),HL to the sequence of
- EX (SP),IX exchange operands.
- LD A,I EX (SP),IY EX HL,DE
- LD I,A EX AF,AF' is equivilent to
- LD A,R EXX EX DE,HL
- LD R,A
- _ _ _ _ _ _ _ _ _ _ _ _ A R I T H M E T I C _ _ _ _ _ _ _ _ _ _ _
- 8 Bit Arithmetic 16 Bit Arithmetic Misc
-
- ADD r ADD A,r ADD HL,ss DAA
- ADD (m) ADD A,(m) ADD IX,xx CPL
- ADD nn ADD A,nn ADD IY,yy NEG
- SCF
- ADC r ADC A,r ADC HL,ss CCF
- ADC (m) ADC A,(m)
- ADC nn ADC A,nn
-
- SUB r SUB A,r
- SUB (m) SUB A,(m)
- SUB nn SUB A,nn
-
- SBC r SBC A,r SBC HL,ss
- SBC (m) SBC A,(m)
- SBC nn SBC A,nn
-
- INC r INC pp
- INC (m)
-
- DEC r DEC pp
- DEC (m)
-
- r = A, B, C, D, E, H, d ss = BC, DE, HL, IX, IY or SP
- nn = any 8-Bit expression qq = AF, BC, DE, HL, IX or IY
- nnnn = any 16-Bit expression xx = BC, DE, SP, IX
- (m) = (HL), (IX+d) or (IY+d) yy = BC, DE, SP, IY
- d = displacement (-128 to +127)
-
-
-
- PAGE 21
-
-
-
- _________________________________________________________________
- _ _ _ _ _ _ _ _ _ _ _ _ L O G I C _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- 8-Bit Logic Block Operations
-
- AND r AND A,r CPI
- AND (m) AND A,(m) CPIR
- AND nn AND nn
-
- OR r OR A,r CPD
- OR (m) OR A,(m) CPDR
- OR nn OR A,nn
-
- XOR r XOR A,r
- XOR (m) XOR A,(m)
- XOR nn XOR A,nn
-
- CP r CP A,r
- CP (m) CP A,(m)
- CP nn CP A,nn
-
- _ _ _ _ _ _ _ SHIFT, ROTATE and BIT INSTRUCTIONS _ _ _ _ _ _ _ _
-
- RLCA RLC r RLC (m) BIT n,r
- RLA RL r RL (m) BIT n,(m)
- RRCA RRC r RRC (m)
- RRA RR r RR (m) SET n,r
- SLA r SLA (m) SET n,(m)
- SRA r SRA (m)
- RLD SRL r SRL (m) RES n,r
- RRD RES n,(m)
-
- _ _ _ _ _ _ _ _ I/O I N S T R U C T I O N S _ _ _ _ _ _ _ _
-
- IN nn OUT nn INI OUTI
- IN A,(nn) OUT (nn),A INIR OTIR
- IN r,(C) OUT (C),A IND OUTD
- INDR OTDR
-
- _ _ _ _ _ _ _ _ _ G E N E R A L P U R P O S E _ _ _ _ _ _ _ _
-
- DAA CCF NOP DI
- CPL SCF HALT EI
- NEG IM 0 IM 1 IM 2
-
- _ _ _ _ _ _ _ _ _ _ _ _ C O N T R O L _ _ _ _ _ _ _ _ _ _ _ _ _ _
-
- JR e JP nnnn JP (HL) CALL nnnn
- JR c,e JP cc,nnnn JP (IX) CALL cc,nnnn
- DJNZ e JP (IY)
-
- r = A, B, C, D, E, H, d c = NC, C, NZ, Z
- nn = any 8-Bit expression e = Relative Addree (-128 to +127)
- nnnn = any 16-Bit expression cc = NC, C, NZ, Z, M, P, PO, PE
- (m) = (HL), (IX+d) or (IY+d)
- d = displacement (-128 to +127)
-
-
- PAGE 22
-
-
-
-
- A L T E R A T I O N S
-
- ZM does not require special installation to run on a CP/M
- system. It may, however, be modified to take advantage of
- special system features. The method is to create the necessary
- source file, then use DDT to overlay ZM with the assembled .HEX
- file. This may seem a little too much to install an assembler,
- but the rewards are that ZM will not only setup and restore your
- printer, but automatically search for files on a drive of your
- choice, and date program listings.
-
- Using the following source listing as a guide, create a
- source file containing the assembly instructions necessary to
- alter ZM to meet your printer requirements. Then use ZM to
- assemble the file into an Intel hex format and DDT to overlay
- ZM. The following dialog assumes the source is B:ZM/SETUP.Z80
- and that a copies of ZM and DDT reside on drive A:
-
-
- A>B:
- B>A:ZM3P ZM-SETUP.Z80 H
- ZM v 1.3p - Z80 Assembler (c) 1984
-
- NEXT ADDRESS xxxx
- NEXT DATA xxxx
- FREE MEMORY xxxx
- STACK SPACE xxxx
- ERROR COUNT None/None
-
- B>A:DDT A:ZM3P.COM
- DDT VERS 2.2
- NEXT PC
- xxxx 0100
- -IZM-SETUP.HEX
- -R
- NEXT PC
- xxxx 0000
- -G0
-
- B>SAVE xx B:ZM.COM
- B>
-
- et viola, ZM has been configured for your printer.
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 23
-
-
-
- The INCL directive is programmed to search the specified
- drive (if given), the default drive, an internally defined drive,
- and finally drive A:. This four step search is repeated until
- the file is found or a ^C is entered. The internal drive may be
- defined by adjusting the value at 061Ch. Any CP/M drive may be
- specified using the convention that 0=default, 1=A, 2=B, etc.
-
- ZM contains three printer setup strings. The first two are
- concerned with printer initialization and listing format, and the
- third is used to restore the printer to its normal configuration.
- The number of lines per page is given as the first byte in the
- initialization strings followed by the number of characters in
- the string that follows. The first byte of the third string
- contains the number of characters that follow.
-
- There are two 32 character lines in 'USAGE MESSAGE' which
- should reflect the respective performance of the first two
- printer initialization strings.
-
- During initialization, ZM loads the 'DE' register pair to
- point to the date field in the header and calls 1D21h. The
- called routine is expected to fill the 8-character field pointed
- to by the 'DE' register pair with the current date. The routine
- may alter all registers (except IX) and can extend almost to the
- BDOS. IT MUST NOT ALTER MEMORY BELOW ITS ORIGIN! Look at the
- stack pointer (SP) if you are really concerned about the actual
- limit. Once the date has been obtained, the space occupied by
- the routine is reclaimed for runtime storage. If your system
- cannot provide the current date, or you do not wish to have dated
- listings, simply use a RET as the first instruction of the date
- routine.
-
- The following listing provides an example for creating an
- overlay to configure ZM for your particular requirements. The
- statements "ORG TIC + 18" and "ORG TIC + 17" are used to not
- only to adjust the current assebbly address, but to generate
- a warning (e.g. 10: ORIGIN NOT IN SEQUENCE) in the event the
- predefined size constraints are exceeded.
-
- ;ZM (Version 1.3p) Custom Setup for MX-100 printer
-
- MARK TIC
-
- Message1 equ 0300h ;Option 1 Usage Message
- Message2 equ 0324h ;Option 2 Usage Message
- Drive equ 0548h ;Drive & Print Parameters
- Date equ 1D20h ;Date Initialization Routine
-
- ORG Message_1
- ; !12345678901234567890123456789012! <--32 byte ruler
- DB '2 = 57 Lines (10 cpi at 6 lpi) '
-
- ORG Message_2
- ; !12345678901234567890123456789012! <--32 byte ruler
- DB '1 = 80 Lines (16.5 cpi at 8 lpi)'
-
-
- PAGE 24
- ORG Drive
- DB 2 ;Add Drive B: to the search path
-
- TIC DB 57 ;57 lines per page
- DM ^[, ^F, ^R, ^[, 2 ;Emphasized OFF, condensed OFF, 6 lpi
- ORG tic + 18 ; <--<< ERROR IF SPACE EXCEEDED
-
- TIC DB 80 ;80 lines per page
- DM ^[, 'F', ^O, ^[, 0 ;Emphasized OFF, condensed ON, 8 lpi
- ORG tic + 18 ; <--<< ERROR IF SPACE EXCEEDED
-
- TIC DM ^R, ^[, 'N', 6 ;Condensed OFF, Skip 6 at perf
- ORG tic + 17 ; <--<< ERROR IF SPACE EXCEEDED
-
- ORG DATE ; PROMPT OPERATOR FOR DATE
-
- PUSH IX ;Preserve IX
- PUSH DE ; and date field pointer
-
- LD DE,DatePrompt ;Prompt operator for date
- LD C,9
- CALL 5
-
- LD DE,Buffer ;Accept date from console
- LD C,10
- CALL 5
-
- LD E,^j ;Punch line feed
- LD C,2
- CALL 5
-
- POP DE ;Restore registers now that
- POP IX ; we're done with system calls
-
- LD HL,BUFFER+1 ;Point to console input
- LD A,(HL) ; get length
- OR A
- RET Z ;Exit on null input
-
- DEC A ;Force length to range (1 to 8)
- AND 7
- INC A
-
- LD C,A ;Move string to header date field
- LD B,0
- INC HL
- LDIR
- RET
-
- DatePrompt db ^m,^j,^j,'ENTER LISTING DATE as (yy/mm/dd): $'
- Buffer db 40
-
- END
-
-
-
-
-
-
-
- PAGE 26
-
-
-
-
- I N D E X
-
- ! ............................................. 7
- # ............................................. 7
- $ ............................................. 4, 9,11
- & ............................................. 7
- ( ) ........................................... 7
- * ............................................. 7
- + ............................................. 7
- - ............................................. 7
- < ............................................. 7
- = ............................................. 7
- > ............................................. 7
- ? ............................................. 8
- @ ............................................. 7
- ABORT ......................................... 1
- ADDRESSING .................................... 8
- ALTERATION .................................... 23
- BINARY CONSTANTS .............................. 6
- BIT-7 ......................................... 4
- CARRIAGE RETURNS .............................. 4
- CHARACTER CONSTANTS ........................... 6
- COLON ......................................... 4, 6
- CONTROL CHARACTERS ............................ 2, 4, 7, 12
- DATA .......................................... 12,13
- DB ............................................ 9
- DECIMAL CONSTANTS ............................. 6
- DECIMAL POINTS ................................ 4
- DEFB .......................................... 9
- DEFM .......................................... 9
- DEFS .......................................... 9
- DEFW .......................................... 9
- DIRECTIVES .................................... 9,20
- DM ............................................ 9
- DS ............................................ 9
- DW ............................................ 9
- ELSE .......................................... 11
- END ........................................... 10
- ENDIF ......................................... 11
- EQU ........................................... 9
- ERROR COUNT ................................... 3
- ERRORS ........................................ 14
- EXPRESSIONS ................................... 6
- FATAL ERRORS .................................. 15,16
- FREE MEMORY ................................... 3,19
- GET ........................................... 12,19
- HEADING ....................................... 2
- HEXADECIMAL CONSTANTS ......................... 6
- IF ............................................ 8
- INCL .......................................... 10,19
- IX ............................................ 13
- IY ............................................ 13
- LABELS ........................................ 4
- LINE FEED ..................................... 4
-
-
- PAGE 27
-
-
-
- LIST .......................................... 11
- LISTING ....................................... 2, 3
- MARK .......................................... 11
- MSG ........................................... 12
- NEXT ADDRESS .................................. 3
- NEXT DATA ..................................... 3
- NUMERIC CONSTANTS ............................. 6
- OCTAL CONTSTANTS .............................. 6
- OPCODES ....................................... 5,20
- OPERANDS ...................................... 5,20
- OPERATORS ..................................... 7,20
- OPTIONS ....................................... 2
- ORG ........................................... 9
- PREDEFINED USER SYMBOLS ....................... 13,20
- PROGRAM MEMORY MAP ............................ 16
- RESERVED SYMBOLS .............................. 20
- RUNTIME REQUIREMENTS .......................... 19
- RUN ........................................... 10
- SPACES ........................................ 4
- STACK SPACE ................................... 3,19
- STRING CONSTANTS .............................. 6
- SYMBOLS ....................................... 4,13
- SYNTAX ........................................ 7,21
- TABS .......................................... 4, 6
- TERMINAL ERRORS ............................... 14,15
- UNDERSCORE .................................... 4, 6
- WARNING MESSAGES .............................. 17,18
- WORDSTAR DOT COMMANDS ......................... 4
- Z80 OPCODES ................................... 20
- Z80 SYNTAX SUMMARY ............................ 21
- [ ] ........................................... 7
- \ ............................................. 5
- ^ ............................................. 7
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGE 28