Here's a small Hello, World! in Z80 Assembly, built entirely through cross-assembly and emulation:
;; hello-msx.asm - hello world for msx - scruss
CHPUT: equ $00A2
ld hl, msg
puts: ; print 0-terminated string in HL
call CHPUT ; displays one character in A
msg: defm "Hello, world!",13,10,0
Compile it to a simple binary image with z80asm:
z80asm -o hello-msx.bin hello-msx.asm
Convert this to an MSX binary with header using z88dk's appmake command:
appmake +msx -b hello-msx.bin -o hellomsx.msx
This MSX binary can be copied to a disk image. MSX disks were 720 KB DSDD FAT images, so there are lots of ways of making these. I used MSX Disk Image, mainly because remembering all the right commands for dd, mkfs and mount are too much for me to remember.
With openmsx and suitable ROMs, you can run it from disk:
openmsx -machine msx2 -diska msx1.dsk
z80asm is supposed to include some MSX-specific library files. As I only used one BIOS call, including them was a bit much.
z88dk also has an assembler called z80asm, and it's not compatible with the one I used. z88dk has some MSX specific options: MSX hints & tools — though if you're using a packaged Linux distribution, it may not support all of the newer options.
Although shown running on an MSX2, this code is MSX 1 compatible. I only used MSX2 as it has obvious disk suport, and my version of z88dk didn't seem to support audio for making cassette images.
z88dk can also develop from a Small C dialect, creating MSX binaries directly:
zcc +msx -create-app -o hello-c hello.c