I decided what to work on next on Suite8080, the suite of Intel 8080 Assembly cross-development tools I'm writing in Python. I'll add two features, the ability for the assembler to trim trailing uninitialized data and a macro assembler script.
Trimming uninitialized data
Consider this 8080 Assembly code, which declares a 1024 bytes uninitialized data area at the end of the program:
# . . .
data: ds 1024
end
For this ds
directive, the Suite8080 assembler asm80
emits a sequence of 1024 null bytes at the end of the binary program. Similarly, dw
emits 16-bit words. The executable file is thus longer and may be slower to load on the host system, typically CP/M.
The Digital Research CP/M assemblers, ASM.COM
and MAC.COM
, strip such trailing uninitialized data from binaries. After asking for feedback to r/asm, I decided to do the same with asm80
. I should be able to implement this optimization by adding just one line of Python, so the feature is a low-hanging fruit.
Macro assembler
asm80
can accept source files from standard input, which makes it possible to combine the assembler with an external macro preprocessor to get a macro assembler. Thanks to its ubiquity, M4 is the clear choice for a preprocessor.
Assuming prog.asm
is an 8080 Assembly source file containing M4 macros, this shell pipe can assemble it with asm80
:
$ cat prog.asm | m4 | asm80 - -o prog.com
The -
option accepts input from standard input and -o
sets the file name of the output binary program.
The other Suite8080 feature I'm going to implement is a mac80
helper script in Python to wrap such a shell pipe and make assembling macro files more convenient. In other words, syntactic sugar wrapping asm80
and M4.
The script will use the Python subprocess
module to set up the pipe, feed the proprocessed source to the assembler, and not much else.