> 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

Reply via email to