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