english
version "1.0"
identify "xyz"
#: This module implements a microcontroller assembler op:odes.
module opcodes
#: Some routines for constructing expressions:
procedure bit_addr
takes
data_address expression
bit_number unsigned
returns expression
#: This procedure will create and return a bit address expression
#, consisting of {data_address} and {bit_number}.
procedure chr
takes
character string
returns expression
#: This procedure will create and return a character expression
#, containing the first character of {character}.
procedure code_addr
takes
code_address unsigned
returns expression
#: This procedure will create and return an address expression
#, containing {code_address}.
procedure d
takes
decimal unsigned
returns expression
#: This procedure will create and return a decimal expression
#, containing {decimal}.
procedure data_addr
takes
data_address unsigned
returns expression
#: This procedure will create and return an address expression
#, containing {data_address}.
procedure h
takes
hexadecimal unsigned
returns expression
#: This procedure will create and return a hexadecimal expression
#, containing {hexadecimal}.
procedure o
takes
octal unsigned
returns expression
#: This procedure will create and return a hexadecimal expression
#, containing {octal}.
procedure s
takes
symbol_name string
returns expression
#: This procedure will create and return a symbol expression
#, containing the symbol named {symbol_name}.
#: {expression} routines:
procedure add@expression
takes
expression1 expression
expression2 expression
returns expression
#: This procedure will return an expression that represents the
#, addition of {expression1} to {expression2}.
procedure value_get@expression
takes
expression expression
returns value
#: This procedure will return the {value} of {expression}.
procedure buffer_append@expression
takes
expression expression
buffer string
returns_nothing
#: This procedure will append {expression} to {buffer}.
procedure subtract@expression
takes
expression1 expression
expression2 expression
returns expression
#: This procedure will return an expression that represents the
#, addition of {expression1} to {expression2}.
#: {assembler} routines:
procedure address_process@assembler
takes
assembler assembler
address expression
returns_nothing
#: This procedure will process emit a 2-bytes of 16-bit address.
procedure absolute_process@assembler
takes
assembler assembler
opcode_value unsigned
address expression
returns_nothing
#: This procedure will process emit a 2-byte instruction with
#, an 11-bit address
procedure arithmetic_process@assembler
takes
assembler assembler
expression expression
opcode_base unsigned
returns_nothing
#: This procedure will process an arithmetic opcode using {assembler}
#, with a base of {opcode_base} and an expression of {expression}
procedure bit_process@assembler
takes
assembler assembler
bit expression
returns_nothing
#: This procedure will process emit {bit} using {assembler}.
procedure byte_process@assembler
takes
assembler assembler
byte unsigned
returns_nothing
#: This procedure will process emit {byte} using {assembler}.
procedure constant_process@assembler
takes
assembler assembler
constant unsigned
returns_nothing
#: This procedure will process emit {constant} as an 8-bit constant
#, using {assembler}.
procedure create@assembler
takes
standard_out out_stream
error_stream out_stream
returns assembler
#: This procedure will create and return a new {assembler} object.
procedure data_address_process@assembler
takes
assembler assembler
data_address unsigned
returns_nothing
#: This procedure will process emit a 1 byte 8-bit address.
procedure direct_process@assembler
takes
assembler assembler
address expression
returns_nothing
#: This procedure will process emit a 1 byte 8-bit address.
procedure error@assembler
takes
assembler assembler
bytes unsigned
message string
returns_nothing
#: This procedure will output an error message of {message} for
#, using {assembler}. {bytes} specifies how many bytes long
#, the instruction is; use 0 if the error is not instruction
#, specific.
procedure error_pad@assembler
takes
assembler assembler
bytes unsigned
returns_nothing
#: This procedure will pad the output stream with {bytes} bytes.
procedure error_announce@assembler
takes
assembler assembler
returns_nothing
#: This procedure will will generate an error announce header
#, for the current {statement} in {assembler}.
procedure immediate_process@assembler
takes
assembler assembler
expression expression
returns_nothing
#: This procedure will process {expression} as an immediate
#, (constant) byte value and output it.
procedure immediate16_process@assembler
takes
assembler assembler
expression expression
returns_nothing
#: This procedure will process {expression} as an immediate
#, (constant) byte value and output it.
procedure logical_process@assembler
takes
assembler assembler
binary binary
opcode_base unsigned
bit_opcode unsigned
returns_nothing
#: This procedure will process an arithmetic opcode using {assembler}
#, with a base of {opcode_base} and {binary} for expressions. If
#, {bit_opcode} is non-zero, it is used for the "op C,bit" insturction
#, opcode. Otherwise, it is an XOR which does not have a bit operation.
procedure move_process@assembler
takes
assembler assembler
binary binary
returns_nothing
#: This procedure will process a move opcode using {assembler}
#, {binary} for expressions.
procedure output_close@assembler
takes
assembler assembler
out_stream out_stream
returns_nothing
#: This procedure will ensure that {out_stream} is properly
#, closed (for a file) or flushed (for standard output.)
procedure output_open@assembler
takes
assembler assembler
file_name string
file_type string
returns out_stream
#: This procedure will output an output file named {file_name}.
#, If {file_name} is the empty string, ??@{out_stream} is returned.
#, If {file_name} is a single hyphe (-), standard output is returned.
#, In all other cases, an attempt is made to open {file_name} for
#, writing. If the file is not successfully opened, an error
#, message is generated that contains {file_type} in it and
#, ??@{out_stream} is returned.
procedure opcode_process@assembler
takes
assembler assembler
opcode opcode
returns_nothing
#: This procedure will process {opcode} for {assembler}.
procedure process@assembler
takes
assembler assembler
program program
pass unsigned
listing_stream out_stream
returns_nothing
#: This procedure will produce a listing of {program} to {listing_stream}
#, using {program}.
procedure relative_process@assembler
takes
assembler assembler
address expression
returns_nothing
#: This procedure will emit a relative address byte for {address}
#, using {assembler}.
procedure statement_process@assembler
takes
assembler assembler
statement statement
returns_nothing
#: This procedure will process {statement} using {assembler}.
#: {binary} routines:
procedure buffer_append@binary
takes
binary binary
buffer string
returns_nothing
#: This procedure will append {binary} to {buffer}.
procedure create@binary
takes
expression1 expression
expression2 expression
returns binary
#: This procedure will create and return a {binary} object
#, containing {expression1} and {expression2}.
procedure operator_buffer_append@binary
takes
binary binary
operator string
buffer string
returns_nothing
#: This procedure will append {binary} to {bufer} as two
#, expressions separated by {operator}.
#: {assembler1} routines:
procedure error@assembler1[type1]
takes
assembler assembler
bytes unsigned
message string
expression1 type1
returns_nothing
needs
procedure format@type1
takes type1, out_stream, string, unsigned
returns_nothing
#: This procedure will output an error message of {message} for
#, using {assembler}. {message} is formatted to contain {expression1}.
#, {bytes} is the number bytes for the instruction; use 0 if the
#, error is not instruction specific.
#: {assembler2} routines:
procedure error@assembler2[type1, type2]
takes
assembler assembler
bytes unsigned
message string
expression1 type1
expression2 type2
returns_nothing
needs
procedure format@type1
takes type1, out_stream, string, unsigned
returns_nothing
procedure format@type2
takes type2, out_stream, string, unsigned
returns_nothing
#: This procedure will output an error message of {message}
#, using {assembler}. {message} is formatted to contain
#, {expression1} and {expression2}. {bytes} is the number
#, bytes for the instruction; use 0 if the error is not
#, instruction specific.
#: {assembler3} routines:
procedure error@assembler3[type1, type2, type3]
takes
assembler assembler
bytes unsigned
message string
expression1 type1
expression2 type2
expression3 type3
returns_nothing
needs
procedure format@type1
takes type1, out_stream, string, unsigned
returns_nothing
procedure format@type2
takes type2, out_stream, string, unsigned
returns_nothing
procedure format@type3
takes type3, out_stream, string, unsigned
returns_nothing
#: This procedure will output an error message of {message}
#, using {assembler}. {message} is formatted to contain
#, {expression1}, {expression2}, and {expression3}. {bytes} is
#, the number bytes for the instruction; use 0 if the error is
#, not instruction specific.
#: {bit_address} routines:
procedure create@bit_address
takes
data_address unsigned
bit_number unsigned
returns bit_address
#: {opcode} routines:
procedure buffer_append@opcode
takes
opcode opcode
buffer string
returns_nothing
#: This procedure will append {opcode} to {buffer}.
#: {memory_image} routines:
procedure clear@memory_image
takes
memory_image memory_image
returns_nothing
#: This procedure will clear out the contents of {memory_image}.
procedure create@memory_image
takes_nothing
returns memory_image
#: This procedure will create and return an empty {memory} object.
procedure fetch1@memory_image
takes
memory_image memory_image
index unsigned
returns unsigned
#: This procedure will the {index}'th byte of {memory_image}.
#, 0xffffffff is returned if the memory_image location was never
#, initialized.
procedure store1@memory_image
takes
memory_image memory_image
index unsigned
value unsigned
returns_nothing
#: This procedure will store {value} into the {index}'th byte of
#, {memory_image}.
#: {statement} routines:
procedure create@statement
takes
line_number unsigned
opcode opcode
comment string
returns statement
#: This procedure will create and return a new {statement} object
#, that contains {line_number}, {label}, {opcode}, and {comment}.
procedure buffer_append@statement
takes
statement statement
buffer string
returns_nothing
#: This procedure will output {statement} to {buffer}.
#: {symbol} routines:
procedure buffer_append@symbol
takes
symbol symbol
buffer string
returns_nothing
#: This procedure will append {symbol} to {buffer}.
procedure create@symbol
takes
name string
returns symbol
#: This procedure will create and return a new {symbol} object.
procedure equal@symbol
takes
symbol1 symbol
symbol2 symbol
returns logical
#: This proceudre will return {true} if {symbol1} has the same name
#, as {symbol2}.
procedure hash@symbol
takes
symbol symbol
returns unsigned
#: This procudure will return a hash value for {symbol}.
#: {symbol_table} routines:
procedure bit_address_insert@symbol_table
takes
symbol_table symbol_table
name string
address unsigned
number unsigned
returns_nothing
#: This procedure will insert {name} into {symbol_table} as a bit
#, address with data address of {address} and a bit number of {number}.
procedure create@symbol_table
takes_nothing
returns symbol_table
#: This procedure will create and return a new {symbol_table} object.
procedure data_address_insert@symbol_table
takes
symbol_table symbol_table
name string
address unsigned
returns_nothing
#: This procedure will insert {name} into {symbol_table} as a
#, data address with a value of {address}.
procedure fetch1@symbol_table
takes
symbol_table symbol_table
name string
returns symbol
#: This procedure will return the symbol associated with {name}
#, from {symbol_table}. A new symbol is created if {name} is
#, not already in {symbol_table}. {name} is assumed to be
#, immutable; if it is not, a fresh immutable copy needs to
#, be created by the caller and passed in.
#: {trinary} routines:
procedure buffer_append@trinary
takes
trinary trinary
buffer string
returns_nothing
#: This procedure will append {trinary} to {buffer}.
procedure create@trinary
takes
expression1 expression
expression2 expression
expression3 expression
returns trinary
#: This procedure will create and return a {trinary} object
#, containing {expression1}, {expression2}, and {expression3}
#: Some stand-alone routines:
procedure opcode_name_append
takes
opcode_name string
buffer string
returns_nothing
#: This procedure wil append {opcode_name} to {buffer} and
#, pad it will enough extra spaces so that a total of 8
#, spaces are appended.