DMG-CPU Research
On this page
  1. IR
  2. a
  3. d
  4. w
  5. x
  6. DL
  7. DV - ALU Operand2
  8. alu - ALU Operand1
  9. Res
  10. Internal bottom buses
  11. Bidirectional bus multiplexing

Internal Buses

IR

The current value of the IR register. It is used to obtain decoder inputs, and in various places in the logic.

a

Decoder input.

d

Decoder1 outputs.

w

Decoder2 outputs.

x

Decoder3 outputs.

DL

The bus between the lower part and the DataMux. Most likely it is actually just an internal data bus (DB), but already named as DL.

DV - ALU Operand2

The value from the bottom for the DataMux/ALU.

alu - ALU Operand1

The value from the bottom for the ALU.

Res

ALU result to bottom/DataMux.

Internal bottom buses

Bus From Reg To Reg Precharge Bus Polarity
abus H, L, A, SPL, SPH, PCL alu[7:0] to top (no reg) CLK2=0 inverse hold
bbus B, C, D, E, H, L, A, Z, SPL, SPH DV[7:0] to top (no reg) CLK2=0 inverse hold
cbus C, E, L, Z, SPL, PCL IDU Lo CLK2=0 inverse hold
dbus B, D, H, W, SPH, PCH IDU Hi CLK2=0 inverse hold
ebus Dedicated circuit C, E, L CLK4=0
fbus Dedicated circuit B, D, H, A CLK4=0
zbus Z SPL, PCL
wbus W SPH, PCH
adl IDU Lo SPL, PCL, Z
adh IDU Hi SPH, PCH, W

The names of some internal bottom buses are arbitrary (do not make sense).

Bidirectional bus multiplexing

This section describes the approach used in SM83 to connect bidirectional buses to consumers.

buses

A few words if the schematic doesn't look very clear.

From the above, it will be clear why the SM83 uses "inverse hold" for registers.

⚠️ Such organization of data output on the bus has one disadvantage: if some producer has placed 0 on the bus, no one will be able to place value 1, because the bus can be driven only by value 0 (using znand), and value 1 gets there only during precharge. Actually a typical case was found recently: https://github.com/msinger/dmg-sim/pull/4 (there is a long discussion there, but you can fill a big cup of coffee, I think it will be interesting reading).