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
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: