Microsoft CP/M 2.20 vs 2.23: Digital Research's CP/M base also changed (2.0 → 2.2)
Detail for Part 9 — Every Difference: A Complete Inventory.
Sanity check on the extraction: do 2.20 and 2.23 sysimg files (CCP + BDOS, the Digital Research portion) match byte-for-byte? They should, modulo a relocation offset for the different BDOS final positions ($CC06 in 2.20, $9C06 in 2.23).
Direct diff of sysimg_220.bin vs sysimg_223.bin (5888 bytes each):
Byte differences: 5807/5888 (98.6%)
That’s almost everything. Even accounting for absolute-address fields differing under relocation (which wouldn’t be every byte — only the address operands of JP/CALL/LD HL,$nnnn and similar), 98.6% is too much.
The simplest explanation is the right one: 2.20 and 2.23 sysimg files contain different versions of Digital Research’s code. Microsoft’s “2.20” / “2.23” version numbers are their numbering, not Digital Research’s. The CCP+BDOS in 2.20 is built on CP/M 2.0; the CCP+BDOS in 2.23 is built on CP/M 2.2.
Indirect evidence:
- 2.20 sysimg has no boot banner string (last 64 bytes are
$E5filler). - 2.23 sysimg ends with
Softcard CP/M\r\n 60K Ver. 2.23\r\n(c) 1980,1982 Microsoft\r\n\r\n\x00\xfa— the version line says “Ver. 2.23” and the copyright is “1980,1982” (the original CP/M was 1980; 2.2 is the 1982 release). - The CCP error strings (
READ ERROR,NO FILE,ALL (Y/N)?,NO SPACE,FILE EXISTS,BAD LOAD,Bdos Err On : $Bad Sector$Select$File R/O$) are in both at similar offsets, confirming both files are CCP+BDOS — just different CP/M versions. - 2.0 is widely documented as the first general CP/M 2.x release; 2.2 added various BDOS-internal improvements that show up as wholesale code changes throughout BDOS.
So the 2.20 → 2.23 jump in Microsoft’s product is two things stacked:
- The Videx fix proper — 11 bytes of slot-scanner code on the 6502 side and ~10 bytes of generator-branch code on the Z-80 side. (Documented in the BIOS factory devlog.)
- A CP/M base-version bump — replacing Digital Research’s CP/M 2.0 codebase with 2.2 underneath the SoftCard’s BIOS.
Microsoft’s 2.23 release date (1982) lines up: that’s the year DR shipped 2.2 widely. Microsoft picked up the 2.2 base and shipped a SoftCard-specific BIOS tailored to it. The Videx fix is part of the same release because 1982 was when 2.2 went out — not because Videx support drove the cadence.
This makes the BIOS-architecture diff between 2.20 and 2.23 less surprising. A “static handlers in BIOS page 6” structure (2.20) versus a “runtime-generated handlers via cold-boot generator” structure (2.23) is the kind of redesign Microsoft might do anyway when redoing the BIOS for a new CP/M base. The Videx fit fits inside that redesign.
What this doesn’t change:
- The 11-byte slot-scanner delta on the 6502 side is the same whether you run it under CP/M 2.0 or 2.2 — the slot scanner is in Microsoft’s loader, not in Digital Research’s code.
- The cold-boot generator’s device-6 branch on the Z-80 side is in Microsoft’s BIOS, not in Digital Research’s BDOS.
- So the Videx-specific code is independent of the CP/M version bump — the version bump just gives a context for why Microsoft would have rewritten the BIOS at all.
Status: sysimg version difference understood. The wholesale byte change between 2.20 and 2.23 sysimg is CP/M-version-driven, not Videx-driven. Keeps the Videx-fix scope clean: ~21 bytes across two CPUs, in two coordinated places.