Thanks, Big Ed.
I see that defining the base address and linking the object file produces an executable that I can load into py65.
jeffl@ubuntu:/tmp$ ~/development/cc65/bin/ca65 main.s -D BASE=0x8000
jeffl@ubuntu:/tmp$ ~/development/cc65/bin/cl65 main.o --target none --start-addr 0x8000 -o main.bin
(py65-venv)jeffl@ubuntu:~/development/py65-venv/bin$ ./py65mon -l /tmp/main.bin
Wrote +6 bytes from $0000 to $0005
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110000
Py65 Monitor
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110000
.mem $00:$10
0000: a9 80 85 01 65 01 00 00 00 00 00 00 00 00 00 00 00
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110000
.
I have much to learn.