The Assembler of Diogenes is generated using YACC and LEX. It supports simple jump (call) labels that might either be a string or a number followed by a semicolon.
To jump to a label a branch instruction like brz (branch on zero) is followed by a semicolon and the label name.
brz h0, :a_label @ jump to "a_label" when register h0 is zero
Unlike Branches jumps (and calls) are always absolute jumps, that jump to the address stored in a register. As jump addresses are 32 Bit wide and only 8 Bit Load Immediate instructions are available on diogenes, four instructions are needed to load Jump addresses:
ldi h0, 0x12 lsi h0, 0x34 lsi h0, 0x56 lsi h0, 0x78
But the assembler supports the builtin macro LDL (Load Label) that can be used to write the above in yust one line:
LDL h0, 0x12345678
Furthermore LDL supports the loading of 32 Bit Label Addresses:
LDL h0, :a_label jump <h0>
The assembler binary is just called asm. It reads from stdin and writes to stdout. By default it produces a file suitable for direct download via the serial link. But with the parameters -h and -b it generates its output in hexadizimal respectively ACSII-coded binary format, that were use during development of the bootloader.
cat input.asm | ./asm > output.bin cat input.asm | ./asm -h > output.hex cat input.asm | ./asm -b > output.coe (without header, Binary ASCII)
The simulator expects its first parameter to be the name of a binary (downloadable) file. It generates its output to stdout, while stderr is used for debugging purposes (as far as the simulator is compiled with USE_DEBUG=1). So a common call of the simulator binary would look something like
./sim output.bin 2> debug.log
Example Run of the SimulatorEdit
UART input: "ABCD" $ ./sim ../examples/echo_scrambler.bin 2> t UART ad(1): 066 0x42 (B) -#-----#LED: 065 0x41 (A) UART ad(1): 067 0x43 (C) -#----#-LED: 066 0x42 (B) UART ad(1): 068 0x44 (D) -#----##LED: 067 0x43 (C) UART ad(1): 069 0x45 (E) -#---#--LED: 068 0x44 (D) UART ad(1): 011 0x0b (.) ----#-#-LED: 010 0x0a (.)
Simulation of the VGA portEdit
The Simulator is capable of simulating the output of the VGA port. Every few emulated cycles (for example every 40000) a snapshot of the display is stored in a file called picXXXX.tga where XXXX is a n increasing number. A demonstration of this feature can be seen here.
We made a simple utility that sends binary files to the target. It can be found in the download section in the simulator.tar.gz file. It reads from stdin and writes /dev/USB0 which is what we use for our serial cable.
cat output.bin | ./sendb