I am using SWI to execute a single instruction of a "new" virtual machine, which I call the IVM. The IVM uses the WVM (Sys 11 Pinbol) interpreter as a "plug-in", so all the useful WVM instructions are available in-line (setBits, killThreads, exitThread, etc.). This alone saves tons of space in Bad Cats. In the IVM I reuse some of the WVM opcodes that are not useful as "one shots"; for example, opcode $01 (noOperation in WVM) starts WVM mode. I added new system calls, including display_str16 which you can use both in WVM_mode and as one shots. Finally, I added M6800 extension opcodes, such as PSHX, PULX, AAX, A2BX, etc. I have not yet implemented any string compression but I am pretty sure that I will at some stage. Eventually I would like to make this available to other interested parties.
What I like best about the IVM is that it is "boot-strappable": The first stage is a patch to the original WVM interpreter that adds one-shot capability while making the code 1-byte smaller. Therefore I can add the IVM to a game with zero bytes of free ROM. The space I get with the first stage is sufficient to implement the 2nd, etc.