Microsoft CP/M 2.20 vs 2.23: Digital Research's CP/M base also changed (2.0 → 2.2)

5 min read
z80cpmsoftcardreverse-engineeringretrocomputingcpm-videx-series

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 $E5 filler).
  • 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:

  1. 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.)
  2. 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.