Logically it's a simple project, though the devil is always in the details!
In terms of paging I was thinking of paging in later layers of data from disk, perhaps from a large file, perhaps from a series of files. But CP/M certainly did have support for paging RAM, in 3.x, if your hardware supported it.
(My own emulator, and the hardware I have running genuine CP/M are all running 2.x so no paged RAM there. Shame!)
If you were using a 6502 or Z80 in the late 70s you wouldn't have to write the floating-point routines; you could just call the ones in the BASIC interpreter you probably had in ROM. They'd still be slow.
As for paging RAM, do you mean bank switching? The 8085 and Z80 didn't have MMUs, so you couldn't do "paging" in the sense people normally understand it today.
The FP routines in the Arduino library take about 5 µs for a multiply on an AVR (e.g. Uno).
That's 1000 times faster.
Factors in that include:
- 16x faster clock speed
- typically 1 cycle per instruction vs 3
- 32 8-bit registers can easily hold all the data for operands and result and temporary values, vs Zero-page on the 6502
- single-cycle register to register 8 bit arithmetic vs three instructions needed per 8 bits on 6502
So that's a factor of around 1633 = 144x combined.
All the above apply equally to add/sub and multiply, but also:
- AVR has 2-cycle 8x8 -> 16 multiply instructions, for signed, unsigned, or mixed operands, and for fixed point 1.7 format as well. That's hundreds of clock cycles on 6502 or z80.
Also, the Microsoft BASIC interpreters used a 40 bit floating point format (32 bits of mantissa) instead of 32 bit. That's another factor of 16/9 for multiply.
The 8080/z80 and 8086 have more registers than the 6502, but not enough to implement soft FP keeping values in registers like AVR can.