This program takes ASCII source code files for the Texas Instruments'
TMS-7000 series microprocessors and assembles them into executable object code
files ready to be burned into an EPROM. The Assembler can operate with several
different types of input source files. The length of the source file is
limited only by the amount of memory in your PC. The maximum length of the
assembled object code file is 64K.
This assembler is fast, but achieves this speed by hogging memory.
It allocates 1 64K segment for itself and the Symbol Table, 1 64K segment for
the assembled object code file, and the remainder of memory for the source
file. I assembled a 271K source file into a 16K object file in 16 seconds on
an 8 MHz PC-XT Clone with 640K.
The TMS-7000 Assembler has a number of features for the VCII software
experimenter. I have included a pseudo-op for assembling packed strings for
display using the VCII U6 chip. The "DM" pseudo-op takes all text inside
quotation marks and converts it into the equivalent U6 packed character set.
In addition, the Define Word "DW" and the Define Byte "DB" pseudo-ops can
perform limited math functions to locate addresses based on the values of
symbols.
This is release 2.1 of this assembler and most of the rough spots
have been worked out. Several bugs were fixed and some enhancements added to
make the Assembler easier to use. I would appreciate any comments you may have
regarding its ease of use and functionality. The following sections describe
the features of the Assembler.
Send comments or suggestions to -
Bill Meeks
1918 Tap Road
Vidalia, GA 30474
NEW FEATURES OF THE ASM7000 TMS-7000 ASSEMBLER
Several new features have been added with release 2.1 of the Assembler.
These are explained below.
1) The Assembler can now take the Source and Object Code filenames
directly from the command invocation line. The filenames must be
separated by a space and must be a valid MS-DOS pathname/filename.
The Syntax from the DOS prompt is as follows --
C:> ASM7000 sourcefile.ext objectfile.ext
where sourcefile.ext is the Source Code Filename
and objectfile.ext is the Object Code Filename.
If no filenames are given on the command invocation line, the
Assembler will prompt you for them as before.
2) The Assembler also has been given a much expanded error reporting
routine, with more detailed Error Messages and the offending line
of source code is displayed on the screen so that the error is more
easily identified.
For SYMBOLS/LABELS, the name of the referenced symbol or label is
printed whenever an error is encountered involving it.
3) The Assembler will now take up to 10 characters in a SYMBOL/LABEL
name. This 10 character count does not include the Symbol/Label
identifier (a, d, or L). The requirement for an identifier was
retained in this release to insure compatability with most of
the disassemblers.
4) The sorting routine for sorting the Symbol Table prior to beginning
the second assembly pass has been greatly improved for speed. The
routine now uses a Shell/Metzner sort algorithm and completes the
sort in about 1/5 of the time of the old Bubble Sort algorithm.
KNOWN BUGS REPAIRED IN RELEASE 2.1
1) Release 1.0 had a potential bug in the loading of Source Code
files of over 64K in length. The bug was intermittent in that
only occassionaly would it cause an assembly error. The cause
has been identified and corrected in release 2.1.
2) The Assembler now correctly recognizes PUSHST or POPST as the same
instruction as PUSH ST or POP ST. Release 1.0 reported an error
with the PUSH ST or POP ST form of the instruction.
3) Release 1.0 would go ahead and create the object code file on the
disk with a length of 0 bytes before actually doing the assembly.
The file would be written at the end of the assembly process.
Errors during assembly resulted in the file being left on the disk
with a 0 length. Release 2.1 only checks to see if the object
code filename already exists on the disk and reports if it does.
It does not actually create the file until after assembly when it
is ready to write to it. This eliminates the 0 file length bug.
PSEUDO-OPS ---
RADIX -- The Radix pseudo-op establishes the default base for CPU
register numbers. It is a required statement in all
source files and must come before any Instruction Mnemonics.
The only valid arguments for Radix are 10 and 16 for decimal
and hexadecimal bases respectively.
Example - RADIX 10 ;sets base to 10
RADIX 16 ;sets base to hex
ORG -- The Origin pseudo-op establishes the beginning address for
the assembled object code. Multiple ORG statements are
allowed, however; in release 2.1, ORG statements with an
address below the current assembly address are ignored.
Example - ORG >F000 ;sets address to F000
ORG >FFD0 ;sets address to FFD0
The ">" sign is optional and denotes a hex number follows.
In release 2.1, only hexadecimal addresses are allowed.
EQU -- The Equate pseudo-op sets a value for a symbol. Subsequent
references to that symbol cause the value given by EQU to
be substituted.
Example - APORT: EQU >0104
Subsequent references to APORT cause the assembler to return
the value 0104.
DB -- The Define Byte (DB) pseudo-op converts the value following
the DB statement into a hexadecimal byte. Special cases
allow the 2 arithmetic operators "/" and "MOD" when used
with Symbols.
Example - DB >4D ;causes 4D to be stored at
;current address
DB aDPORT/256 ;causes the value
;of DPORT to be
;divided by 256 and
;the high byte saved ;at the current
;address
DB aDPORT MOD 256 ;causes the
;value of DPORT
;to be divided
;by 256 and the
;low byte saved
;at the current
;address
DM -- The Define Message (DM) psuedo-op generates VCII packed
strings from the ASCII string following the statement.
The text string must be delimited by quotation marks.
Example - DM " DIAGNOSTIC DATA "
causes the assembler to generate the following 15 byte
sequence in the object code segment -
BA EB 83 20 01 90 45 55 88 0A E0 C0 58 0B AE
All strings must be an even multiple of 4 characters, such
as 4, 20, 160, etc. Only valid U6 characters will be
assembled. Invalid U6 characters will be treated as spaces.
DW -- The Define Word (DW) psuedo-op causes the value following
the DW statement to be converted into a 16-Bit word value
and inserted into the object code at the current address.
Example - DW >CCD7 ;CCD7 is converted to a hex
;word and stored at the current
;object code address
DW dHERE1 ;the hex value of HERE1 is
;stored at the current object
;code address
END -- The END psuedo-op is an optional parameter that tells the
assembler it is at the end of the source file. This is
an optional statement however. The TMS-7000 Assembler is
smart enough to know it is at the end of the source file.
The END psuedo-op has no arguments.
NOTES -- The TMS-7000 Assembler assembles the entire instruction set of the
TMS-7000 series CPU's.
Because I wrote the assembler to directly take the output of a
disassembler, I wrote it so that it can sort through the address
field and op-code field and locate the symbols and instructions.
There are a couple of catches, however.
Example -- F0E3 88 62 47 35 MOVD %>6247,R35 ;put 6247 in R35
In this line from a typical disassembler, F0E3 is the
address and "88 62 47 35" is the op-code sequence.
My assembler will skip everything until it detects a
valid instruction sequence, such as the MOVD. This
does leave the assembler vulnerable to some loopholes
from time to time. First, ALL instructions must have
a space between the instruction mnemonic and the operands for the instruction. Second, some lines of source may
have to be modified to delete the address field if it
happens to contain an instruction mnemonic. For example
the line below would generate an assembler error.
FADC 88 62 47 35 MOVD %>6247,R35
The error comes from the F (ADC) part of the address
field because ADC is a valid TMS-7000 instruction.
This line in the source would have to have the FADC
part deleted. There are several other combinations
that will confuse the assembler, all involving the
address field hex numbers matching instructions, such
as FDEC (DEC), CDAC (DAC), etc.
There is one other requirement that is peculiar to this assembler.
It requires that all labels and or symbols be preceeded by either
an "a", "d", or "L". This is necessary so the assembler can pick
labels from the other data on the line from typical disassemblers.
The only time the "a", "d" or "L" designator is not needed is when
the symbol is referenced in the Peripheral File instructions, such
as MOVP, ANDP, BTJZP, etc.
Also, the assembler treats all memory references less than C000 as
absolute values regardless of the preceeding symbol designator.
For example, LDA @a6247 would be assembled as 8A 62 47 even though
the "a" character denoted a symbol.
Labels and Symbols may end either with a space or with the ":"
character. The maximum length for labels and symbols is 10 characters.
The assembler has a symbol table large enough for approximately 3500
symbols, which should satisfy all requirements.