This is something not achievable with the Pascal case statement. It's just different.
Which is a good thing! Broken code shouldn't compile.
And why do you call it broken? Apart from the unpretty macro definitions, which can reside in a separate include file, the code looks very decent.
As a matter of fact, I'm using it on a daily basis in production code, it is simple, predictable, not clogged by synchronization primitives, etc. The big drawback is that the locals gets lost on each call and if you want to reuse a function, you must pass to it a frame pointer to the locals data (much like
self).
But if you have a flat main loop with a few (co-)routines it just works.