You may also find useful this other schematic, which I find
easier to read, though some of the design details differ. It's from
the NesDev wiki which is a fount of useful technical
information about older Nintendo consoles.
All of the chips you mention are low-level interface logic, and
probably not important for your emulation. You'll need to do the same
things that those chips help to do, but almost certainly in different
ways.
The 74LS373 is an 8-bit latch. When the ALE
("address latch
enable") line of the PPU is high, the latch reads the data from
AD0-7
and passes it through to A0-7
on the RAM chip. When ALE
goes low it "freezes" the data on its outputs and ignores any changes
to its inputs, basically "capturing" the low 8 bits of the address
being sent to the RAM.
This is necessary because the AD0-7
outputs from the PPU are
connected not only to A0-A7 of the RAM (though the latch), but also
D0-7
of the RAM. (This multiplexing saves pins.) This is very hard
to see due to blurred text on the schematic you linked, but much more
clear in the one I linked above. So here's what a read cycle looks
like:
- The PPU deasserts
R̅D̅
, generates an address on AD0-7
and
asserts ALE
.
- Because
R̅D̅
is not asserted, the RAM disables its D0-7
I/O pins
so that they will have no effect on the bus. Because ALE
is
asserted, the '373 reads its input pins and passes the address on
AD0-7
through to the A0-7
pins on the RAM.
- The PPU deasserts
ALE
. This causes the '347 to start ignoring its
inputs, and thus any data on AD0-7
, and maintain the old value on
its outputs, holding the address on RAM pins A0-7
.
- The PPU asserts
R̅D̅
, enabling the RAM data outputs D0-7
, and it
can now read those data on pins AD0-7
.
The 74LS139 is a decoder used for address decoding. Basically,
it's a pair of units that take a two bit binary number as input to the
A and B pins, and drive low one of Y0, Y1, Y2 or Y3 depending on what
the input number is. (Or it may leave all of the outputs high if the
chip is not selected.) Here's the function table (G̅
is the select
pin, which must be low to enable output):
G̅ A B Y0 Y1 Y2 Y3
0 0 0 → 0 1 1 1
0 1 0 → 1 0 1 1
0 0 1 → 1 1 0 1
0 1 1 → 1 1 1 0
1 x x → 1 1 1 1
In this particular case it's generating the enable signal for U1, the
2K static RAM. The inputs to the first half are the clock (φ2) and
A15; if these are 1 and 0 respectively, Y1 goes low. (The clock is
used here because the address and data for the memory are valid only
when it's high.) Y1 in turn enables the second two-bit decoder, which
takes A14 and A13 as inputs; if both are low then its Y0 output goes
low, and that enables the RAM.
The effect of this is that accessing any address between $8000 and
$AFFF will enable the RAM.
The 74368 is an inverting tri-state buffer, which has three
functions that can be used alone or in combination: 1) inverting the
signal going through it (changing low to high and high to low), 2)
buffering signals so that something on the other side is driven with
enough power, and 3) connecting or disconnecting whatever's on the
other side of the buffer.
In this case these are used to connect shift registers in the gamepads
to the data bus based on signals from the INP0 and INP1 pins, which
are asserted when you read the ports $4016 and $4017.
The 74HCU04 is just a package of six unbuffered inverters,
changing low to high and vice versa. This is not represented as a
single chip on the schematic; the individual inverters are the
triangles with small circles at the point that you see in various
places on the schematic.
Most of these are used at various places where they simply want to
invert a signal, but this particular form of 7404 can also be used as
an amplifier, and it's used as such in the audio output circuit.