CEF (the Computer Emulation Framework) is a specification describing an OOP framework for the creation of computer emulators. The basic idea is that each virtual computer component (memory, CPU, I/O devices, terminals, etc) is a stand-alone component with a standard API that allows components to be easily connected together.
The CEF specification can be found at sourceforge.
CEF32 is the reference implementation of CEF for 32-bit Windows. Under this implementation, each CEF component is provided via a DLL that serves up an instance of the object. The CEF32 application manages the loading of these DLLs and initialization of the objects according to a CEF script. Each emulator thus consists of a CEF script which indicates which components to load and how to connect them together. CEF32 also provides several services to reduce the burden of coding new components, including a master assembler, symbol manager, multi-threading management, and a UI. The UI provides an IDE-like interface to CPU, Memory, and other components. It provides for manual connection of components and allows signal monitoring and manipulation. The CEFUtil.DLL provides several additional utilities, such as watchpoint management, key mapping, and character set management.
The CEF site has links to CEF32, which is public domain source.
Inherent in the CEF specification for CPUs is optional support for profiling, breakpoints/watchpoints, assembly and disassembly. This overhead, plus the overhead of calls between the components, means that tCEF emulators almost surely run slower than dedicated emulations, but should not be noticeable for older computers. On the other hand, the advantages are that it is often quicker to develop a new emulator since much of the common feature set is already present. For instance, you can use an existing RAM component (with its support for latency, access restrictions, and watchpoints) instead of writing your own. And the UI provides GUI access to that memory, plus the ability to load/store/modify/examine the memory contents.
CEF32 was written in Delphi, but so long as the components are CORBA compliant, they can be written in any language. Note: CORBA objects are like OLE objects, but without the Object Factory method.
CEF/CEF32 are updated about once or twice a year, although with component contributors, that could become more often. Currently, CEF32 comes with the following emulators: Altari 8800, Cosmac Elf, Intellec8, and PDP-11. (I've been concentrating on those systems for which I have personal experience and adequate documentation.) A SOL-20 emulator is also available, but with no ROMs.
The available CPU components are DEC PDP-11 (up to 11/34), Intel 8008, Intel 8080/8085, Zilog Z80, RCA CDP1802/1806, and Fairchild 3850/3853.
Available peripheral components are DEC EAE, DEC DL11 and DL11W, IMM860 serial I/O, MITS 88-SIO, DEC VT05/VT52, generic front panel, S100 VDM-1, various keyboards, master clock, and several types of RAM (64Kb, 4Mb, and 64-bit address).
Available Bus/System Unit components are UNIBUS (with PDP-11 front panel), SOL-20, Altair 8800/IMSI 8080 (with front panel), and Cosmac Elf.
The next CEF32 release will probably include only bug fixes and a Media Manager. The Media Manager is the next step before I start to release I/O devices, which include DEC RL11 disk drives (in final debugging), Paper tape reader/punches (in final testing), and so forth. Today I was able to create a DOS-11 tape using the Media Manager and copy the files to disk under RSTS/E running on a SimH PDP-11. I only need to fix a couple of minor UI issues and it should be ready for prime time. But I will probably add support for CEF media containers (at least for tapes) and do a little code clean-up before I package it all up for distribution - hopefully sometime this summer.