On Tuesday, November 20, 2012 11:16:06 AM UTC-5,
doo...@gmail.com wrote:
> After initial coding the flowchart in Fig 8-1 for implementing the Appending unit in my simulator it quickly became apparent that Fig 8-1 alone is quite insufficient for reverse engineering the APU. While it seems to give a good flow for effective segment generation and operation of the ring mechanism it doesn't give a comprehensive cycle-by-cycle breakdown of what happens and, sometimes, when -- surprise, surprise.
I suspect this is derived from the Cambridge copy of a spec used to design the
645F->H6180->DPS8. The Phoenix copy probably had a lot of annotations from
verbal communications to clarify the terse conditional boxes. Flowcharts make
sequential what probably happens simultaneously (in combinatorial logic) so
the only observable states would be at traps taken or final success.
The first page is thoroughly muddled. It is trying to say that instruction
bit A29 is applied once per instruction, before any other operation, and even
if the MMU will not be invoked (as for the EA* instructions). (It's
too late now to verify, but I suspect A29 even applied to RPT and DU.)
Instruction fetch is mentioned because it also has to initialize the TPR.
RTCD shouldn't even be mentioned on this page.
Elsewhere references to last cycle being RTCD operand fetch should just say
RTCD is now fetching the first instruction (or pair) of the destination, as
all transfers do. (This is a programmer-friendly feature since jumps to
invalid addresses will show where you jumped from. It may also have
simplified the hardware since sequential fetch doesn't have to handle the
case of an odd address.)
I noticed several plain old bugs:
In case B, both reads and writes check TRR against SDW.R2; writes should be
limited to R1, as the text explains just a few pages back.
The instruction fetch path winds through case L, where it tests OPCODE;
that should only apply in the transfer path.
I didn't see
TPR.CA get set anywhere.
In case K it appears that RTCD always sets the ring number of each pointer
register to TRR. This would be a serious bug if a pointer had a higher
ring number (because it originated in an outer ring) but luckily :) the
compiler and standard calling sequence make sure no register survives a
call :(