Using the IRIS Assembler

The general syntax of the assembler program is …

# ASM object,  @listing,  source1,  source2,  source3

‘object’ == stand-alone binary file to be created by the assembly
‘listing’ == text file to contain the listing output by the asssembler
‘source1’, ‘source2’, etc. == Nova assembly source code
(for readability, extra spaces between filenames is optional)

Source files are assembled in the order given.


  1. Omit ‘@listing‘ parameter to output to the screen (drop following comma as well).
    example: # ASM object, mysource
  2. Replace ‘object‘ with a minus sign will output ONLY errors and ‘.EOT’ statements.
    example: # ASM -, R75PZ, R75DEFS, MYSOURCE
  3. Replace ‘object‘ with a space for listing only. The first comma is still required.
    for example: # ASM , R75PZ, R75DEFS, MYSOURCE
  4. Add a minus sign in front of any source file to eliminate it from the listing.
    for example: # ASM object, -R75PZ, -R75DEFS, mysource
    the listing will only contain text from ‘mysource’. No need to wade thru IRIS definitions.

Any program requiring IRIS services should include R75PZ (for page zero references) and R75DEFS (for structure definitions).


The ASM program provided with IRIS is limited to source files of 128 blocks each (64kb). It cannot process extended text files. Our distributions here include a modified version of ASM called ASMX which can handle any size text file. It also suppresses most of the page breaks and headings that were built into the original. Otherwise, it uses the same syntax and produces the same outputs.

# ASMX  object, @listing, source1, source2, source3

Note that ASM is a 2-pass assembler. The first pass defines labels and addresses (see below), and identifies gross errors (such as duplicate labels). The second pass creates the actual machine code from the syntax and identifies all errors.

After assembly, the object file is set to TYPE 3 (stand-alone). If it was designed as a stand-alone program, it can be executed via the SHUTDOWN command. Otherwise, use DSP to change the TYPE word in the Header (displacement 10) to whatever is appropriate. Usually one of the following will do:
36 = peripheral driver
77001 = system driver
33401 = processor

Special Assembler Directives

In addition to standard Nova assembly language syntax, the assembler recognizes various directives and special syntax. Known items at the present time are:

dot ( . )

The period / dot means “present assembly address” (examples below).

label: instruction, address, or value

This is actually normal assembly notation, included here for reference. Any instruction can be given a label, of which only the first 5 letters are significant. Labels must begin with a letter or a dot, but can contain letters, numbers and dots. Any such label can then be used in any memory reference command.
JMP label
JSR @label  ; using address in the ‘label’ location
LDA 1,label  ; load value at that address

Note: this kind of ‘label’ does NOT have to be defined before it is used. Instructions are allowed to reference labels that have yet to be assembled.

label = value

Any label can be created with a value to be used elsewhere in the program. For example, IRIS defines BPS = 10200  ; beginning of processor storage area. Only the first 5 letters of the ‘label’ are used internally and must be unique, although the label can be longer for readability. Note that any calculations in ‘value’ cannot contain any spaces. And calculations are done left to right regardless of the operators. Divisions result in integer quotients. For example,
NXTBK = .-BPS/400+1*400+BPS
equals present address (dot) less 10200 (BPS), then divided by 400 (block size) plus one, multiplied by 400 and then added to 10200. The result would be the next block boundary in the processor area.

.LOC value

Set assembler to address ‘value’. This is used to tell the assembler what address to use for the next instruction. For example, in order to assemble a driver at address 10200, use the syntax:
.LOC BPS  ; set address to Beginning of Processor Storage area
Note that any physical block being assembled at the time may be filled with halts (77377) and any offset into a block needed to set the .LOC may also be filled with halts.

.BLK value

Assembles a block of halts, ‘value’ in size. Often used to create a work space. For example:
WKSPC: .BLK 20  ; next 20 words will be 77377

.TXTF “string”

Assemble “string” at the current location, 2 bytes per word, ending with a null byte (or word if necessary). Control characters can be included via enclosing brackets and octal values.
TXT1:  .TXTF “<215>hello world<207>”  ; cr + text + bell
BTXT1: TXT1*2   ; byte address of TXT1
or — using IRIS support routines …

.TXTF "copy this text to I/O buffer"
STOUTPUT  ; now display it

.TXTM  1

Directs the assembler to pack ASCII from left to right, not right to left. Required before any .TXTF directive.

.EOT   ; name of file in comments

Helpful information-only directive that will display during pass 1 of ASM and also show up in listing. Should be the last line of code in every source file.

.END  ; closing statements

Similar to .EOT, except that it is normally used in the last of a series of source files. Not sure if ASM does anything special with this.