The Z80 CPU is clocked by a 4 MHz TTL oscillator module. 

Next to the CPU, there is a 128 Kilobyte static RAM chip, of which the Z80 uses 64 Kilobytes, the maximum it can address. The RAM is battery buffered, so it can remanently store the programs and data. This significantly eases the design, because it doesn´t need any address decoder logic in this case. Programs can directly by written to memory by an Arduino Mega that accesses the address and data bus and also the memory control pins RD, WR, MREQ and BUSRQ. After the program has been loaded into memory, the Arduino can be removed from the pin header, and the programs run by themselves

The computer is equipped with the DART (Dual Asynchronous Receiver and Transmitter) chip from Zilog, a serial interface chip that has been tailored for use with the Z80. The DART has two asynchronous serial interfaces that allow to connect the computer to serial devices like consoles, keyboards, printers and so on. So I use an FTDI and Putty, a free terminal emulation program to operate its programs.

Watch this video to find out more about the details:

In the next step I adapted CP/M to my computer and ran it with some of the most popular programs of this time. A small Windows application, the serial port of the Arduino and the second interface of the DART emulate two harddisks with 8 Megabyte of capcity each. With this configuration, the CP/M programs are physically stored on a PC, that acs as a kind of fileserver here. The second serial interface of the DART serves as a crude network adapter. The picture below shows how they interact.

Learn more about CP/M itself, about how it was used and see common office programs and games in this video: