On Fri, 27 Nov 2020, Noel Chiappa wrote:
From: Steve
Nickolas
there's no easy way to do preemptive
multitasking without extra
hardware.
Perhaps you're using some idiosyncratic definition of "preemptive" and
"multitasking", but to me that statement's not accurate.
Let's take the "multitasking" part first: that just means 'two or
more
computations can run at the same time, sharing the machine' - and that's not
hard to do, without special hardware, provided there's some way (in the
organization of the software) to save the state of one when the other is
running. Many simple systems do this; e.g. the MOS system that I used on
LSI-11's, BITD.
That's cooperative multitasking, though. And there's actually a program
for the Apple //e that lets you do it from *BASIC*, "Extra.Apple" from
Beagle Bros (they did a ton of "enhancement" utilities like this).
"Preemptive" is a bit trickier, because
things have to be organized so that
one 'task' can be temporarily stopped arbitrarily (i.e. without it explicitly
giving up the processor, which is what e.g.MOS did) to let another run. There
does need to be some asynchronous way of inciting the second 'task' to run,
but interrupts (either clock, or device) do that, and pretty much every
machine has those. MINI-UNIX, for example, has premptive multitasking.
You'd at least need interrupts, but a stock Apple //e literally doesn't
have any way to generate a hardware interrupt.
I do believe the //c (which has a built-in mouse controller which is
interrupt-driven) can be programmed to do that, but without something like
a 6522 card, a //e can't. It's pretty primordial, really.
-uso.