Load Multiplier and Collate Instructions
Rearranging Registers and ALU Functions
Until now I thought that I could keep the Multiplier and the
Accumulator in the same register file because they wouldn't both need
to be read at the same time. But it turns out that the Collate
instruction is supposed to do this:
Accumulator <-- (Memory AND Multiplier) + Accumulator
so I need to add an additional register file to hold the Multiplier.
It also means the logical AND function isn't in the right place where I
had it. I decided to move it out of the ALU and add an X input option
that selects the AND of the Multiplier register and data read from
memory. The ALU can then be configured to add this to the Accumulator,
accomplishing the Collate operation in one short or long word cycle.
This is the relevant part of the revised data path. There are now
separate register files for the Accumulator and Multiplier, and I also
added one for the Product register while I was at it. The RFA1
microinstruction field has been reduced to 2 bits and renamed simply
RFA, since it supplies the high-order address bits for all the register
files. The AND control signal has been removed.
The WRF1 field has been replaced with a 2-bit field that is decoded to produce write signals for the three register files:
Revised ALU with logical AND function removed:
Microcode
We can now microcode the H instruction, which loads a word from memory
into the Multiplier register, and the C (Collate) instruction.
# OPCODE L STAT : FETCH MASEL SHS EOI RFA WRF XSEL YSEL CMX CY1 CYP ODD MSW LSW HALT WMEM
# H - Load Multiplier
10101 0 0001 : 0 1 0 1 11 01 01 00 0 0 0 0 0 1 1 0 0
10101 1 0001 : 0 1 0 0 01 01 01 00 0 0 0 0 0 0 1 0 0
10101 1 0010 : 0 1 0 1 11 01 01 00 0 0 0 0 0 1 0 0 0
# C - Collate
11110 0 0001 : 0 1 0 1 11 10 10 01 0 0 0 0 0 1 1 0 0
11110 1 0001 : 0 1 0 0 01 10 10 01 0 0 0 0 0 0 1 0 0
11110 1 0010 : 0 1 0 1 11 10 10 01 0 0 0 0 1 1 0 0 0