CoCoAssembler
A Tandy Color Computer 1, 2, and 3 assembler written in Python
Install / Use
/learn @craigthomas/CoCoAssemblerREADME
CoCo Assembler and File Utility
Table of Contents
- What is it?
- Requirements
- License
- Installing
- The Assembler
- File Utility
- Common Examples
What is it?
This project is an assembler for the Tandy Color Computer 1, 2 and 3 written in Python 3.6+. More broadly speaking, it is an assembler that targets the Motorola 6809 processor, meaning it targets any computer that used the 6809 as it's main CPU (e.g. the Dragon 32 and 64, Vectrex, Thomson TO7, etc). It is intended to be statement compatible with any code written for the EDTASM+ assembler. The assembler is capable of taking EDTASM+ assembly language code and translating it into 6809 machine code. Current support is for 6809 CPU instructions, but future enhancements will add 6309 instructions.
This project also includes a general purpose file utility, used mainly for manipulating
CAS, DSK, and WAV files. The file utility specifically targets the disk file formats and
cassette formats used by the Color Computer line of personal computers.
License
This project makes use of an MIT style license. Generally speaking, the license is extremely permissive, allowing you to copy, modify, distribute, sell, or distribute it for personal or commercial purposes. Please see the file called LICENSE for more information.
Requirements
The assembler can be run on any OS platform, including but not limited to:
- Windows (XP, Vista, 7, 8, 10, 11, etc)
- Linux (Ubuntu, Debian, Arch, Raspbian, etc)
- Mac (Mojave, Catalina, Big Sur, Monterey, Ventura, etc)
The only requirement is Python 3.6 or greater will need to be installed and
available on the search path, along with the Package Installer for Python (pip).
To download Python, visit the Downloads
section on the Python website. See the Python installation documentation for more
information on ensuring the Python interpreter is installed on the search path,
and that pip is installed along with it.
Installing
There is no specific installer that needs to be run in order to install the assembler. Simply copy the source files to a directory of your choice. A zipfile containing the latest release of the source files can be downloaded from the Releases section of the code repository. Unzip the contents to a directory of your choice.
Next, you will need to install the required packages for the file:
pip install -r requirements.txt
The Assembler
The assembler is contained in a file called assmbler.py and can be invoked with:
python3 assembler.py
In general, the assembler recognizes EDTASM+ mnemonics, along with a few other somewhat standardized mnemonics to make program compilation easier. By default, the assembler assumes it is assembling statements in 6809 machine code. Future releases will include a 6309 extension.
Assembler Usage
To run the assembler:
python3 assembler.py input_file
This will assemble the instructions found in file input_file and will generate
the associated Color Computer machine instructions in binary format. You will need
to save the assembled contents to a file to be useful. There are several switches
that are available:
--print- prints out the assembled statements--symbols- prints out the symbol table--to_bin- save assembled contents to a binary file--to_cas- save assembled contents to a cassette file--to_dsk- save assembled contents to a virtual disk file--name- saves the program with the specified name on a cassette or virtual disk file
Input File Format
The input file needs to follow the format below:
LABEL MNEMONIC OPERANDS COMMENT
Where:
LABELis a 10 character label for the statementMNEMONICis a 6809 operation mnemonic from the Mnemonic Table belowOPERANDSare registers, values, expressions, or labelsCOMMENTis a 40 character comment describing the statement (must have a;preceding it)
An example file:
; Print HELLO WORLD on the screen
NAM HELLO ; Name of the program
CHROUT EQU $A30A ; Location of CHROUT routine
POLCAT EQU $A000 ; Location of POLCAT routine
ORG $0E00 ; Originate at $0E00
START JSR $A928 ; Clear the screen
LDX #MESSAGE ; Load X index with start of message
PRINT LDA ,X+ ; Load next character of message
CMPA #0 ; Check for null terminator
BEQ FINISH ; Done printing, wait for keypress
JSR CHROUT ; Print out the character
BRA PRINT ; Print next char
MESSAGE FCC "HELLO WORLD"
FDB $0 ; Null terminator
FINISH JSR [POLCAT] ; Read keyboard
BEQ FINISH ; No key pressed, wait for keypress
JMP $A027 ; Restart BASIC
END START
Print Symbol Table
To print the symbol table that is generated during assembly, use the --symbols
switch:
python3 assembler.py test.asm --symbols
Which will have the following output:
-- Symbol Table --
$A30A CHROUT
$A000 POLCAT
$0E00 START
$0E06 PRINT
$0E11 MESSAGE
$0E1E FINISH
The first column of output is the hex value of the symbol. This may be the address in
memory where the symbol exits if it labels a mnemonic, or it may be the value that the
symbol is defined as being if it references an EQU statement. The second columns is
the symbol name itself.
Print Assembled Statements
To print out the assembled version of the program, use the --print switch:
python3 assembler.py test.asm --print
Which will have the following output:
-- Assembled Statements --
$0000 NAM HELLO ; Name of the program
$0000 CHROUT EQU $A30A ; Location of CHROUT routine
$0000 POLCAT EQU $A000 ; Location of POLCAT routine
$0E00 ORG $0E00 ; Originate at $0E00
$0E00 BDA928 START JSR $A928 ; Clear the screen
$0E03 8E0E11 LDX #MESSAGE ; Load X index with start of message
$0E06 A680 PRINT LDA ,X+ ; Load next character of message
$0E08 8100 CMPA #0 ; Check for null terminator
$0E0A 2712 BEQ FINISH ; Done printing, wait for keypress
$0E0C BDA30A JSR CHROUT ; Print out the character
$0E0F 20F5 BRA PRINT ; Print next char
$0E11 48454C4C4F MESSAGE FCC "HELLO WORLD" ;
$0E1C 0000 FDB $0 ; Null terminator
$0E1E AD9FA000 FINISH JSR [POLCAT] ; Read keyboard
$0E22 27FA BEQ FINISH ; No key pressed, wait for keypress
$0E24 7EA027 JMP $A027 ; Restart BASIC
$0E27 END START ;
A single line of output is composed of 6 columns:
Line: $0E00 BDA928 START JSR $A928 ; Clear the screen
----- ------ ----- --- ----- ------------------
Column: 1 2
