> On Oct 2, 2024, at 5:23 PM, Van Snyder via cctalk <cctalk@classiccmp.org>
> wrote:
>
> On Wed, 2024-10-02 at 16:39 -0400, Paul Koning via cctalk wrote:
>> For the earlier 1311, lack of overlap made perfect sense. After all,
>> the 1620 has no interrupts, no parallelism of any kind: every I/O
>> operation stalls the CPU until the operation is finished. (That and
>> the BB instruction are among the reasons why Dijkstra rejected the
>> 1620.)
>
> 1401 had overlap, but as far as I can tell, only for cards and tape.
> The 1403 had a buffer, and 1401 had instructions to test whether the
> printer or carriage were busy, but that "overlap" didn't work the same
> as for cards and tape.
>
> I remember the 1620 being called CADET, but not because it was a
> beginner computer. It didn't have arithmetic hardware. It was done by
> table lookup. CADET meant "Can't Add, Doesn't Even Try." One of my
> colleagues exploited the table-based arithmetic to do octal arithmetic
> for satellite telemetry processing.
That would be the Model 1, which had "add-multiply tables" in lowcore. Adding
and multiplying was done by looking up entries in those tables. I assume the
address was formed from the two input digits, producing a two-digit result (or
for add, maybe a one digit result plus a carry bit encoded in the sign bit).
Core memory of course is non-volatile so unless you had a program scribble
wildly, those tables would carry from one run to the next. When in doubt, you
could boot the add-multiply tables card deck to load the correct values.
And yes, you could do octal arithmetic that way, in the sense of interpreting a
string of digits in memory as octal rather than decimal digits. Neat hack.
Ours was a Model 2, which differs in a number of ways; one major difference is
that it has add and multiply hardware. So while we did have an add-multiply
card deck sitting around, it wasn't actually needed.
A fun aspect of both machines is that they would do arithmetic on variable
length operands, of any length if you were patient enough. So you could add a
pair of 5000 digit numbers. The same was true for floating point (I don't know
if that was only in Model 2), the mantissa was variable length (the exponent
always two digits). I remember the Fortran compiler had a compiler option
setting to choose the "field length" (number of digits) for the integer and
real data types, allowing you to pick any length up to 20 digits separately for
each.
Speaking of interrupts vs. blocking I/O, there's an interesting hybrid
technique I've seen only in one place: the Electrologica X1 will interrupt on
completion of an I/O, but also allows you to start a new I/O on a device that's
still busy with the preceding one. If you do that, the second I/O command will
block the CPU until the first one is done, then it will issue the I/O start and
the instruction is then complete. In practice, I/O was interrupt driven, but
with the help of what is arguably the world's first BIOS, a set of ROM resident
I/O library routines originally written by Dijkstra for his Ph.D. project. As
far as I can tell, the X1 was the world's first production computer with
interrupts as a standard feature.
paul