Converting from Hex Microcode to Micro Assembly Language
The above diagram illustrates the layout of the microinstruction for Mic-1.
Each bit represents a line to the data path.
It is inconvenient to use this representation when discussing the microcode,
so the book adopts a Micro Assembly Language (MAL). It is a straight forward
process to change the hex microcode into MAL.
Notice that the hex instruction has 6 areas
  - 
    Next Address
  
 - 
    JAM
  
 - 
    ALU and Shifter
  
 - 
    C Bus Registers
  
 - 
    Memory
  
 - 
    B Bus register
 
Each part corresponds to a section of a MAL instruction.
  B Bus Register
The 4 bits for the B Bus Register are sent through a decoder so that one
of the nine input registers is gated onto the B Bus.
  ALU and Shifter
The ALU operation is set from the above table. The shifter is capable of:
don't shift, shift right arithmetic 1, and shift left logical 8. The ALU
uses the A and B buses as input. In the data path, H is always wired to the
A Bus, and the register for the B Bus is specifed by the B Section of the
hex microinstruction. Whereas the ALU operation should be specified as A
+ B, we will always use H for A, and use the name of the register that is
sent to the B Bus, eg. H + OPC.
  C Bus Registers
For each bit that is set in this section, the corresponding register is written
with the results of the ALU operation. For instance, if the OPC and PC bits
are set, then both will get the result of the operation. 
OPC = PC = ALU operation
The calculation from the ALU and Shifter will commute to each of the registers
on the left of each equal sign.
  Next Address and JAM
These fields are used to determine the next address.
  - 
    JMPC
  
 - 
    If JMPC is set, then the MAL instruction will have: 
goto(MBR or
    NEXT_ADDRESS). Examples of instructions with JMPC set are
    wide1 and Main1.
   - 
    JAMN
  
 - 
    If  JAMN is set, then the MAL instruction will have: 
if (N) goto
    true_label else goto false_label
    Be aware that in the layout of the microcode, the address for
    true_label is 256 greater than the address for false_label.
   - 
    JAMZ
  
 - 
    If  JAMZ is set, then the MAL instruction will have: 
if (Z) goto
    true_label else goto false_label
    Be aware that in the layout of the microcode, the address for
    true_label is 256 greater than the address for false_label.
   - 
    None
  
 - 
    If none of the JAM bits are set, then the MAL instruction will have: 
goto
    (NEXT_ADDRESS)
    Please note that for brevity, the microcode in the book omits this statement
    from all of the MAL statements. On a homework or an exam, I will expect you
    to include this statement in the MAL instruction.
 
  Memory
These bits indicate when the corresponding operation will begin. It is possible
to perform a READ and a FETCH at the same time, as well as performing a WRITE
and a FETCH at the same time. It is not allowed to perform a READ and a WRITE
at the same time. This is done for simplicity: we are assuming that there
is always a hit in the code and data caches, and that both caches can be
accessed simultaneously.
  Examples of changing MAL into hex, and hex into MAL
Consider a few instructions from the microcode for Mic-1
  - 
    Main1: PC = PC + 1; fetch; goto (MBR)
  
 - 
    The fields of the hex microinstruction can be filled in as follows
    
      - 
	JMPC is set, since the MBR is referenced in the goto. JAM Field: 100
      
 - 
	NEXT_ADDRESS is 0x000. Since this is a JMPC, and the format is goto (MBR
	or NEXT_ADDRESS), then the NEXT_ADDRESS field must be 0.
      
 - 
	Shifter is not used, so its two bits are 0.
      
 - 
	ALU operation is B + 1: 110101
      
 - 
	Only PC is being written. C Fields: 000000100
      
 - 
	Code is being fetched. Memory Field: 001
      
 - 
	PC is being gated onto the B Bus. B Field: 0001
    
 
    
    Binary Format
    000000000 100 00110101 000000100 001 0001
    Hex Format
    004350211
  
 - 
    iflt1: MAR = SP = SP - 1;rd
  
 - 
    The fields of the hex microinstruction can be filled in as follows
    
      - 
	The JAM bits are all 0.
      
 - 
	NEXT_ADDRESS is 0x023. There is actually a
	
goto(iflt2) implied. I will assume that iflt2 has
	address 0x023.
       - 
	Shifter is not used, so its two bits are 0.
      
 - 
	ALU operation is B - 1: 110110
      
 - 
	MAR and SP are being written. C Fields: 000001001
      
 - 
	Data is being read. Memory Field: 010
      
 - 
	SP is being gated onto the B Bus. B Field: 0100
    
 
    
    Binary Format
    000100011 000 00110110 000001001 010 0100
    Hex Format
    1183604A4
  
 - 
    42A140008
  
 - 
    
      - 
	binary format
	010000101 010 00010100 000000000 000 1000
       - 
	NEXT_ADDRESS is 0x085. Note that the high bit of the NEXT_ADDRESS field is
	0. This is essential for the conditional branch to work. If the branch is
	taken, then the address will be modified by placing a 1 in the high bit of
	NEXT_ADDRESS. If the branch is not taken, then the address will not be modified.
	If the high bit of NEXT_ADDRESS were already a 1, then the destination of
	both branches would be the same.
      
 - 
	JAM bits. JAMN is set, so there will be a 
if (N) goto 0x185 else goto
	0x085. Note that the true-label address is 256 greater than
	the false-label address
       - 
	Shift Operation: 00. No shifting.
      
 - 
	ALU operation is: 010100. B OR 0.
      
 - 
	C Fields: 00000000. Since they are all 0, and the JAMN bit is set, there
	will be a N = ALU operation in the MAL instruction.
      
 - 
	Memory Field: 000. No memory function.
      
 - 
	B Field: 1000. OPC is being sent onto the B BUS
    
 
    
    MAL Instruction
    N = OPC; if (N) goto 0x185 else goto 0x085
  
 - 
    8F8948003
  
 - 
    
      - 
	binary format
	100011111 000 10010100 100000000 000 0011
       - 
	NEXT_ADDRESS is 0x11F. 
      
 - The JAM bits are all 0. The next address will be the address in the NEXT_ADDRESS portion of the instruction. So there is a 
goto (0x11F).
       - 
	Shift Operation: 10. ALU Operation << 8.
      
 - 
	ALU operation is: 010100. B OR 0.
      
 - 
	C Fields: 10000000. H = ALU Operation.
      
 - 
	Memory Field: 000. No memory function.
      
 - 
	B Field: 0011. MBRU is being sent onto the B BUS
    
 
    
    MAL Instruction
    H = MBRU << 8; goto (0x11F)