Thanks to everyone for their help.
It seems that while the low speed standard does not support bulk endpoints, one can still define an endpoint to be bulk on a low-speed device.
Since my first post, I have now been able to send and receive data under Windows (Windows 2000), but not Linux (Ubuntu Dapper). Perhaps Linux is being more true to the standard. I also receive announcements like SetLineEncoding, SetBreak, etc.
Anyway - I have to stop working on this project - it has taken too much time. I am attaching my abstract call model project. Perhaps someone who knows a little more about the ACM can have a look at it and point out the obvious problem that I am missing - I feel convinced that I am mis-handling some packets that arrive on EP0.
The project has two targets, a keyboard HID from elsewhere on this site, and the virtual com port CDC ACM project. If anyone makes any improvements, please could they post the updates here. I have also used parts from the USBDM and drawn inspiration from some other CDC ACM projects (Microchip and CMX).
The project is somewhat device independent - but it will take some work to reconfigure the register read/writes that access the USB peripheral on the JB16, to make it work with other devices.
The numerous DEBUG*_PULSE, etc, are my toggling bits lines that I monitor on an oscilloscope to confirm program flow.
To conclude, it mostly works under Win2K. It mounts as a /dev/ttyACM under Linux, but I can't write to it.
usb_hal_v_00_20081118_1143.zip