[Coco] noob question
William Astle
lost at l-w.ca
Tue Nov 7 17:56:45 EST 2017
Your main question can be surprisingly complex (which I think you
already know based on your other comments). The only reason languages
like C# can do event driven behaviour so "cleanly" or "simply" is
because *something* is polling for events somewhere and managing wait
queues for those events.
That means you have to have an event poller of some kind. Whether it's
interrupt driven or a main loop that just busywaits until an event is
detected doesn't matter. Or some frankenhybrid.
I can describe one way I've seen an event driven scheme implemented on
the coco. That is the way Daggorath does it.
Daggorath uses the IRQ as a timer to "schedule" event processing. During
the IRQ, if a "process" becomes ready by whatever timer criteria was
sepcified, it is moved to a run queue. It is then up to that handler if
it wants to re-schedule for later. The only thing the IRQ handler does
is update timer counts and move things from the wait queues (different
queues per timer tick length) to the run queue.
Then, the main game loop running outside of the IRQ handler checks the
run queue. If there is nothing in it, it just waits for an interrupt and
checks again. Otherwise, it removes the first item from the run queue
and executes it. Later, rinse, repeat ad infinitum.
Now, Daggorath is entirely timer tick driven, but there's no reason you
couldn't have other queues working on other sources. It can get
arbitrarily complicated depending what you need to work with. (It also
doesn't need all that much code. You just need to make sure you handle
the concurrency issues correctly which is fairly straight forward on a
single CPU system.)
(If you want to see how Daggorath actually does it, I have a disassembly
at http://dod.projects.l-w.ca/ in the "hg" folder which is a mercurial
repository.)
There are, of course, many ways to accomplish the same thing. One thing
to consider is that you may not actually want an event driven structure
even if you think you do. Make sure you're not trying to do event driven
simply because that's what you're familiar with. Often times on a
machine like the coco, you're better off with simple procedural stuff
that just waits for the event that matters at the time (like a key press
during a line input loop). I'm not saying your particular case is such a
situation. Just that it is something to carefully consider since an
event driver loop adds complexity.
Also, to answer your question on what happens if your IRQ processing
overflows the "tick" length: it depends. The IRQ is level driven so as
long as the signal is still present when your service routine exits, you
will get an immediate re-entry to your service routine (not even a
single instruction will execute between). Depending what you do in that
IRQ service, other things could happen, including interrupts being
missed or the IRQ service routine itself being interrupted by the next
interrupt. Regardless, it's better not to do anything slow during an IRQ
service routine so you don't have that problem in the first place.
That's probably why Daggorath uses a run queue that the main loop
processes but there are other strategies, too, depending on just what
the use case is.
On 2017-11-07 02:23 PM, Randy Weaver wrote:
> I'm used to coding in c#... an event driven language.
>
>
>
> Actions are hooked to events that "raise" a function I wrote to do
> something.
>
>
>
> I'm trying to wrap my head around how you would achieve similar behavior on
> a coco.
>
>
>
> I suppose a loop that kept polling for statuses that I'm interested in.
>
>
>
> IRQs are interesting too but do they fire 60 times a second? And what
> happens when my check doesn't complete in 1/60th of a second. does it fire
> again?
>
>
>
> Guess I'm trying to get the basics here.
>
>
>
> Thanks!
>
> Randy
>
>
More information about the Coco
mailing list