The CD-i system is notoriously difficult to program. There are toolkits that are supposed to make it easier, but in my opinition sticking with the "base" system is, in the long run, better.
The Microware OS9 C compiler/assembler/linker set with all the required headers and libraries can be downloaded from somewhere (don't have the link handy, sorry), but it's not very useful without some sample code or a copy of the Green Book. And you also need a disc mastering tool (vcdmastr from the Video CD toolkit works fine) and probably some audio/video format conversion tools (I think these can also be downloaded somewhere).
Using 68K assembly language is certainly possible and might even be the best approach for simple or high-performance titles, but it's generally easier to debug C applications. There is supposed to be a GNU C/C++ port for OS9...
I may at some point release source for a small 68K assembly sample for a two-plane CLUT7 display with simple mouse operations; there are a few players out there that need a more intelligent CD-i Stub to get their ROMs and this would be needed for that. The sources to the current CD-i Stub are already available
here do in fact constitute a fully working (if very simple) CD-i application. There is a bit of documentation and the source is commented.
According to the Green Book, you are
not allowed to "bash on the hardware" at all. However, audio and video buffers can be provided by the application and thus be accessed directly (there are APIs to perform common tasks, but custom code is usually faster).
Many CD-i titles perform a bit of trickery to get direct memory access to the screen control tables, but this is a bit involved. I think one of the Interactive Engineers has an article that describes how to do it. This relies on a few subtle implications of the Green Book and works on all CD-i hardware.
All other direct hardware manipulation is risky; the interfaces differ considerably between player models (and believe me, as the author of CD-i Emulator I know!). The differences include the CPU type (68000, 68020, 68070 and 68341 have all been used) which means that even the instruction set and instruction timing aren't constant. Most titles optimize for the 68070 which is the one most commonly used.
Hope this helps?