Formatting a disk in CP/M is hardware dependant. This is a bit strange because the intent of CP/M was to move the hardware dependencies to a common Basic Input Output System or BIOS, so you could run any program on any CP/M system.
They either forgot about formatting disks, or didn’t consider it happened often enough to warrant inclusion. The result is every system needs its own disk formatting program and Cromemco called theirs INIT.COM.
INIT.COM was originally fairly simple. It used to ask if you wanted to format a “Mini disk” (5″ disk) or a normal (“Maxi” / 8″) one. That program worked well and it ran under Cromemco’s CDOS operating system or under normal CP/M.
As disk formats evolved to allow double-sided disks and double-density (more data in the same amount of space), things got more complicated. Cromemco included features in INIT.COM that made it easier for a user to get the correct format; but these required things that CP/M doesn’t provide. Their solution was to include them in CDOS and, as a result, later versions of Cromemco’s INIT.COM won’t run under CP/M any more.
So how did I end up with the picture above, which shows an advanced INIT.COM running under CP/M?
I wrote my own. You can download the CP/M program from INIT.COM. You can also download the source code from INIT.C if you want to rebuild INIT.COM, modify it, or see how it works.
The source code is written in the dialect of C that existed at the time. This means it will compile with a CP/M C compiler but probably won’t with a modern C compiler. The dialect is Kernigan & Ritchie (K&R) C, the original. C was later standardised into ANSI C and they made a few changes to the original.
How Disk Formatting Works
Despite the complexity and amount of work involved (mostly in combining choices into the format to use), disk formatting is really simple. Regardless of the format chosen, it always comes down to four sets of numbers:
– the track lead-in,
– the sector,
– the between sectors region, and
– the end of track
Every track starts with a “getting ready” series of bytes. The disk drive reads these bytes and knows that a sector is coming soon. It could be a series of FFs, a series of 00s, or a combination of something then something else. It just flags the start. It is probably also used by the hardware to measure the bit rate so it can adapt to fluctuations in speed. From a software or user’s perspective it’s just a series of bytes at the start of a track.
Every sector contains data. However, at a low level, it also contains the track number, side, sector number, sector size, and some cyclic redundancy checksums (CRCs). This means a sector is a slightly longer series of bytes than we might normally expect. The OS or BIOS asks for data and gets, typically, 128 bytes or 512 bytes; but there is more in the sector than just that. When formatting (or INITializing) a disk, we need to write the additional information too. Again, from our perspective, it’s a series of bytes.
Between sectors is a set of “there’s more to come” bytes.
After the last sector of a track, there isn’t more to come so there is a different series of bytes to end the track. This series is interesting because the disk drive controls how many bytes there are in this set. It isn’t difficult though because this series of bytes ends with “a lot” of one value and you just keep outputting that value until it says, “I’m done”.
The Formats
This applies to the WD1793 controller chip. Others should create disks that can be read by drives of the same type so they should use the same (or very similar) sequences. What you’ll see here are what INIT.COM Ver 2.71 uses.
8″ Single Density (8SD)
CDOS version 02.58 Cromemco Disk Operating System Copyright (C) 1977, 1983 Cromemco, Inc. A.debug init0271.com DEBUG version 00.20 NEXT = 2D00 NEXTM = 2D00 -g/93d Initialize Disks version 02.71 Press: RETURN to supply default answers ESC to abort formatting CTRL-C to abort program Warning: INIT can destroy all disk data Disk to initialize (A,B,C,D)? b Testing: Index pulses being received correctly Rotational speed: 110 RPM Formatting: Disk type (C=CDOS, X=Cromix)?Single or double sided (S/D)? s Single or double density (S/D)? s First cylinder (0-4CH)? <0H> Last cylinder (0-4CH)? <4CH> Cylinder, Surface: restore ZHV E A =FF BC =0000 DE =4964 HL =4963 SP=2E20 PC=093D CALL 0614 A'=00 BC'=0A6B DE'=0A6D HL'=0A6F IX=FBE2 IY=0000 I=00 -d3237 3237 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 3247 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 3257 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 FC FF ..............|. 3267 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 3277 FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 FE ...............~ 3287 00 00 01 00 F7 FF FF FF FF FF FF FF FF FF FF FF ....w........... 3297 00 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 ......{eeeeeeeee 32A7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee -d ... 3307 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 4C eeeeeeeeeeeeeeeL 3317 47 53 53 53 44 E5 E5 F7 FF FF FF FF FF FF FF FF GSSSDeew........ 3327 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ -d 3337 FF FF FF 00 00 00 00 00 00 FE 00 00 02 00 F7 FF .........~....w. 3347 FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 ................ 3357 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 {eeeeeeeeeeeeeee ... 4487 E5 E5 E5 E5 E5 E5 E5 F7 FF FF FF FF FF FF FF FF eeeeeeew........ 4497 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ -d 44A7 FF FF FF 00 00 00 00 00 00 FE 00 00 1A 00 F7 FF .........~....w. 44B7 FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 ................ 44C7 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 {eeeeeeeeeeeeeee ... 4537 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 4547 E5 F7 FF FF FF FF FF FF FF FF FF FF FF FF FF FF ew.............. ... 4957 FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 ................ 4967 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -
You can see the 128 E5 bytes in the sectors.
You can also see the disk type that Cromemco writes to the end of the boot sector: 3316 contains “LGSSSD”.
The track starts with 40xFF,6×00,FC,26xFF then 6×00
Each sector consists of: FE,track,side,sector,00,F7; then 11xFF,6×00,FB,128xE5,F7
Between sectors is: 27xFF then 6×00
After the last sector is about 1000xFF.
There are 77 tracks (0-76,”cylinder (0-4CH)”) on an 8″ disk.
Single density format has 26 sectors (01-1A in the sector). Each has 128 data bytes.
5″ Single Density (5SD)
A.debug init0271.com DEBUG version 00.20 NEXT = 2D00 NEXTM = 2D00 -g/93d Initialize Disks version 02.71 Press: RETURN to supply default answers ESC to abort formatting CTRL-C to abort program Warning: INIT can destroy all disk data Disk to initialize (A,B,C,D)? c Testing: Index pulses being received correctly Rotational speed: 110 RPM Formatting: Disk type (C=CDOS, X=Cromix)?Single or double sided (S/D)? s Single or double density (S/D)? s First cylinder (0-27H)? <0H> Last cylinder (0-27H)? <27H> Cylinder, Surface: restore ZHV E A =FF BC =0000 DE =4207 HL =4206 SP=2E20 PC=093D CALL 0614 A'=00 BC'=0AE9 DE'=0AEB HL'=0AED IX=FC19 IY=0000 I=00 -d3237 3237 FF FF FF FF FF FF FF FF FF FF 00 00 00 00 FE 00 ..............~. 3247 00 01 00 F7 FF FF FF FF FF FF FF FF FF FF FF 00 ...w............ 3257 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 .....{eeeeeeeeee ... 32C7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 53 4D eeeeeeeeeeeeeeSM 32D7 53 53 53 44 E5 E5 F7 FF FF FF FF FF FF FF FF FF SSSDeew......... 32E7 FF FF 00 00 00 00 FE 00 00 02 00 F7 FF FF FF FF ......~....w.... 32F7 FF FF FF FF FF FF FF 00 00 00 00 00 00 FB E5 E5 .............{ee ... 3377 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 FF eeeeeeeeeeeeeew. 3387 FF FF FF FF FF FF FF FF FF FF 00 00 00 00 FE 00 ..............~. 3397 00 03 00 F7 FF FF FF FF FF FF FF FF FF FF FF 00 ...w............ 33A7 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 .....{eeeeeeeeee ... 3D57 E5 E5 E5 E5 E5 E5 F7 FF FF FF FF FF FF FF FF FF eeeeeew......... 3D67 FF FF 00 00 00 00 FE 00 00 12 00 F7 FF FF FF FF ......~....w.... 3D77 FF FF FF FF FF FF FF 00 00 00 00 00 00 FB E5 E5 .............{ee 3D87 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee ... 3DF7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 FF eeeeeeeeeeeeeew. 3E07 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ ... 41F7 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 4207 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 4217 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 4227 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -g0 A.
You can see the 128 E5 bytes in the sectors.
You can also see the disk type at the end of the boot sector. This time it is “SMSSSD”.
The track starts with 10xFF then 4×00.
Each sector consists of: FE,track,side,sector,00,F7; then 11xFF,6×00,FB,128xE5,F7
Between sectors is: 11xFF then 4×00
After the last sector is about 4000xFF.
There are 18 (01-12H) sectors per track. Each sector contains 128 data bytes.
8″ Double Density (8DD)
Cromemco always write Track 0 side 0 in single density format. This allows their Resident Disk Operating System (RDOS) to always boot a 128 byte sector, regardless of the format of the rest of the disk. However, it does mean we need to look at track 1 if we want to see what double-density formatting looks like.
A.debug init0271.com DEBUG version 00.20 NEXT = 2D00 NEXTM = 2D00 -g/93d Initialize Disks version 02.71 Press: RETURN to supply default answers ESC to abort formatting CTRL-C to abort program Warning: INIT can destroy all disk data Disk to initialize (A,B,C,D)? b Testing: Index pulses being received correctly Rotational speed: 110 RPM Formatting: Disk type (C=CDOS, X=Cromix)?Single or double sided (S/D)? s Single or double density (S/D)? First cylinder (0-4CH)? <0H> Last cylinder (0-4CH)? <4CH> Cylinder, Surface: restore ZHV E A =FF BC =0000 DE =4964 HL =4963 SP=2E20 PC=093D CALL 0614 A'=00 BC'=0A6B DE'=0A6D HL'=0A6F IX=FBE2 IY=0000 I=00 -t ZHV E A =FF BC =0000 DE =4964 HL =4963 SP=2E1E PC=0614 PUSH AF A'=00 BC'=0A6B DE'=0A6D HL'=0A6F IX=FBE2 IY=0000 I=00 -g/93d 00H, 0 (writes track 0 side 0) ZHV E A =4E BC =0000 DE =5DE9 HL =5DE8 SP=2E20 PC=093D CALL 0614 A'=00 BC'=0A99 DE'=0A9B HL'=0A9D IX=FBE2 IY=0000 I=00 -d3237 (track 1 side 0) 3237 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3247 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3257 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3267 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3277 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3287 00 00 00 00 00 00 00 00 00 00 00 00 F6 F6 F6 FC ............vvv| 3297 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 32A7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN -d 32B7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 32C7 4E 4E 00 00 00 00 00 00 00 00 00 00 00 00 F5 F5 NN............uu 32D7 F5 FE 01 00 01 02 F7 4E 4E 4E 4E 4E 4E 4E 4E 4E u~....wNNNNNNNNN 32E7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 00 00 NNNNNNNNNNNNN... 32F7 00 00 00 00 00 00 00 00 00 F5 F5 F5 FB E5 E5 E5 .........uuu{eee 3307 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 3317 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 3327 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee -d ... 34B7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 34C7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 34D7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 34E7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 34F7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 4E 4E eeeeeeeeeeeeewNN 3507 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3517 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3527 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN -d 3537 4E 4E 4E 4E 00 00 00 00 00 00 00 00 00 00 00 00 NNNN............ 3547 F5 F5 F5 FE 01 00 02 02 F7 4E 4E 4E 4E 4E 4E 4E uuu~....wNNNNNNN 3557 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 NNNNNNNNNNNNNNN. 3567 00 00 00 00 00 00 00 00 00 00 00 F5 F5 F5 FB E5 ...........uuu{e 3577 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 3587 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 3597 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 35A7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee -d 5717 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 5727 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 5737 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 4E 4E 4E 4E 4E 4E eeeeeeeeewNNNNNN 5747 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 5757 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 5767 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 5777 00 00 00 00 00 00 00 00 00 00 00 00 F5 F5 F5 FE ............uuu~ 5787 01 00 10 02 F7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E ....wNNNNNNNNNNN 5797 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 00 00 00 00 NNNNNNNNNNN..... 57A7 00 00 00 00 00 00 00 F5 F5 F5 FB E5 E5 E5 E5 E5 .......uuu{eeeee -d ... 59A7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 4E 4E 4E 4E eeeeeeeeeeewNNNN -d 59B7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN ... 5DD7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 5DE7 4E 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 NN.............. -
The track starts with 80x4E,12×00,3xF6,FC,50x4E,12×00,3xF5.
Each sector consists of: FE,track,side,sector,02,F7;22xFE,12×00,3xF5,FB,512xE5,F7
Between sectors is: 54x4E,12×00,3xF5
After the last sector is about 1000x4E.
There are 16 (01-10H) sectors per track. Each sector contains 512 data bytes.
5″ Double Density (5DD)
A.debug init0271.com DEBUG version 00.20 NEXT = 2D00 NEXTM = 2D00 -g/93d Initialize Disks version 02.71 Press: RETURN to supply default answers ESC to abort formatting CTRL-C to abort program Warning: INIT can destroy all disk data Disk to initialize (A,B,C,D)? c Testing: Index pulses being received correctly Rotational speed: 110 RPM Formatting: Disk type (C=CDOS, X=Cromix)?Single or double sided (S/D)? s Single or double density (S/D)? First cylinder (0-27H)? <0H> Last cylinder (0-27H)? <27H> Cylinder, Surface: restore ZHV E A =FF BC =0000 DE =4207 HL =4206 SP=2E20 PC=093D CALL 0614 A'=00 BC'=0AE9 DE'=0AEB HL'=0AED IX=FC19 IY=0000 I=00 -d3237 (track 0 side 0) (identical to 5SD, so still SD, but 32D5="SMSSDD") -t ZHV E A =FF BC =0000 DE =4207 HL =4206 SP=2E1E PC=0614 PUSH AF A'=00 BC'=0AE9 DE'=0AEB HL'=0AED IX=FC19 IY=0000 I=00 -g/93d 00H, 0 (writing track 0 side 0) ZHV E A =4E BC =0000 DE =4E4B HL =4E4A SP=2E20 PC=093D CALL 0614 A'=00 BC'=0B0F DE'=0B11 HL'=0B13 IX=FC19 IY=0000 I=00 -d3237 (now track 1 side 0) 3237 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 3247 4E 4E 4E 4E 4E 4E 4E 4E 00 00 00 00 00 00 00 00 NNNNNNNN........ 3257 F5 F5 F5 FE 01 00 01 02 F7 4E 4E 4E 4E 4E 4E 4E uuu~....wNNNNNNN 3267 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 NNNNNNNNNNNNNNN. 3277 00 00 00 00 00 00 00 00 00 00 00 F5 F5 F5 FB E5 ...........uuu{e 3287 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee ... 3477 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 eeeeeeeeeeeeeeew 3487 FF 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E .NNNNNNNNNNNNNNN 3497 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 34A7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 00 NNNNNNNNNNNNNN.. -d 34B7 00 00 00 00 00 00 F5 F5 F5 FE 01 00 02 02 F7 4E ......uuu~....wN 34C7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 34D7 4E 4E 4E 4E 4E 00 00 00 00 00 00 00 00 00 00 00 NNNNN........... 34E7 00 F5 F5 F5 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 .uuu{eeeeeeeeeee ... 47A7 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 F7 eeeeeeeeeeeeeeew -d 47B7 FF 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E .NNNNNNNNNNNNNNN 47C7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 47D7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 00 00 NNNNNNNNNNNNNN.. 47E7 00 00 00 00 00 00 F5 F5 F5 FE 01 00 0A 02 F7 4E ......uuu~....wN 47F7 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN 4807 4E 4E 4E 4E 4E 00 00 00 00 00 00 00 00 00 00 00 NNNNN........... 4817 00 F5 F5 F5 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 .uuu{eeeeeeeeeee ... 4A17 E5 E5 E5 E5 E5 F7 FF 4E 4E 4E 4E 4E 4E 4E 4E 4E eeeeew.NNNNNNNNN 4A27 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN -d 4A37 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E NNNNNNNNNNNNNNNN ... 4E47 4E 4E 4E 4E 00 00 00 00 00 00 00 00 00 00 00 00 NNNN............ -g0 A.
Again, Cromemco always format track 0 of side 0 as single density, so we “t”race a step then “g”o until (“/”) 93d again to stop before writing track 1. This is the double density format that it is about to write to disk.
The track starts with: 24x4E, 8×00 then 3xF5.
Each sector is: FE,track,side,sector,02,F7,6x4E,12×00,3xF5,FB,512xE5,F7
Between sectors is: FF,45x4E,8×00,3xF5
At the end of a track is: FF then about 1080x4E
There are 10 (0AH) sectors per track. Each sector contains 512 data bytes.
4FDC
The 16FDC manual states, “The 16FDC may not be able to read small (5-1/4 inch) diskettes which were initialized using versions of the Cromemco Init program prior to version 2.15”. I remember the guy that owned the Cromemco Z2D that I used being furious about this when he found out. He either had to stick to single density disks (a 4FDC controller card) or upgrade and lose all his data. The Cromemco workaround was to read existing data using a 4FDC and copy it onto new disks using a 16FDC. That probably worked fine if you could afford to buy two systems but it was rather expensive for individuals or small businesses.
Here’s what happens when you INITialize disks with INIT 00.04:
8SD:
A.debug init0004.com DEBUG version 00.20 NEXT = 0500 NEXTM = 0500 -g/204 INITIALIZE DISKS version 00.04 Drive Number (A-D)? b Mini Disk (Y/N)? n Z E A =1B BC =0000 DE =1A6D HL =02F6 SP=053E PC=0204 LD HL,0540 A'=00 BC'=0000 DE'=0000 HL'=0000 IX=0000 IY=0000 I=00 -d540 0540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0550 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FC 00 ..............|. 0570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE ...............~ 0590 00 00 01 00 F7 00 00 00 00 00 00 00 00 00 00 00 ....w........... 05A0 00 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 ......{eeeeeeeee 05B0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee -d 05C0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05D0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05E0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05F0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0600 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0610 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0620 E5 E5 E5 E5 E5 E5 E5 F7 00 00 00 00 00 00 00 00 eeeeeeew........ 0630 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -d 0640 00 00 00 00 00 00 00 00 00 FE 00 00 02 00 F7 00 .........~....w. 0650 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0660 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 {eeeeeeeeeeeeeee 0670 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0680 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0690 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 06A0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 06B0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee - 1780 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1790 E5 E5 E5 E5 E5 E5 E5 F7 00 00 00 00 00 00 00 00 eeeeeeew........ 17A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 17B0 00 00 00 00 00 00 00 00 00 FE 00 00 1A 00 F7 00 .........~....w. 17C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 17D0 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 {eeeeeeeeeeeeeee 17E0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 17F0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1800 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1810 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1820 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1830 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1840 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1850 E5 F7 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ew.............. 1860 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 1870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ...
You can see that the 8″ SD format is different (but is said to be still readable by a 16FDC card).
5SD:
A.debug init0004.com DEBUG version 00.20 NEXT = 0500 NEXTM = 0500 -g/204 INITIALIZE DISKS version 00.04 Drive Number (A-D)? c Mini Disk (Y/N)? y Z E A =13 BC =0000 DE =12DA HL =02F6 SP=053E PC=0204 LD HL,0540 A'=00 BC'=0000 DE'=0000 HL'=0000 IX=0000 IY=0000 I=00 -d540 0540 FF FF FF FF FF FF FF 00 00 00 00 FE 00 00 01 00 ...........~.... 0550 F7 FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 w............... 0560 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 ..{eeeeeeeeeeeee 0570 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0580 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0590 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05A0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05B0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee -d 05C0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05D0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 05E0 E5 E5 E5 F7 FF FF FF FF FF FF FF FF 00 00 00 00 eeew............ 05F0 FE 00 00 02 00 F7 FF FF FF FF FF FF FF FF FF FF ~....w.......... 0600 FF 00 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 .......{eeeeeeee 0610 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0620 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 0630 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee ... 1040 FE 00 00 12 00 F7 FF FF FF FF FF FF FF FF FF FF ~....w.......... 1050 FF 00 00 00 00 00 00 FB E5 E5 E5 E5 E5 E5 E5 E5 .......{eeeeeeee 1060 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1070 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1080 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 1090 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 10A0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 10B0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 10C0 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 eeeeeeeeeeeeeeee 10D0 E5 E5 E5 E5 E5 E5 E5 E5 F7 FF 00 00 00 00 00 00 eeeeeeeew....... 10E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 10F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Again, the 5SD format is different. However, per the manual, this time it cannot be read by a 16FDC card.
Cromix
One of the surprising things about INIT0271.COM is that it includes Cromix System calls in a CDOS program. One of the first things that INIT0271.COM checks is the operating system version. It must be running on a version of CDOS that provides the information it needs, so it checks first. However, if the result says it is actually running under Cromix, it switches to using Cromix calls for many things. Amazing. The one program can used under either OS and it adapts. Previously, I just assumed that running INIT.COM under Cromix would trigger the CDOS emulator and just run it as a CDOS program.
INIT Ver 2.71 can also create Cromix format disks. If you’re interested in those formats, just run debug.com as per my examples above and examine what it creates (also as per the above). It can create Cromix disks even if it is running under CDOS.
FAQ
How do I know if I’m running Cromemco INIT.COM or this INIT.COM?
If you’re on CP/M and running a later Cromemco INIT.COM, it will be pretty obvious. It will say “Incompatible”. It looks like this:
It used to be a dead end. At the time, you had to insert a CDOS disk, boot from that, format your new disk from there, and then reload and reboot your CP/M disk.
If you’re on CP/M and running the INIT.COM from here, it will just run. It will also say it’s from here in the signon message:
Can I use it with other hardware?
Yep. You’ll need to modify a few parts of the program to suit your hardware; but the rest of it can stay the same.
I compiled it using BDS C ver 1.60 which has unix stdio.h functions but no initializers or “asm” keyword. You’ll see workarounds for both of those in the INIT.C source code. BDS C does have a tool for creating linkable ASM code but I found it easier to just poke bytes into an array and run that.
More
You can download a copy of:
INIT0004.COM
INIT0271.COM
I used run-cpm22L which has a BIOS that supports 4×8″DSSD disks, and run-bdsc160 during development. Each of those unZIPs to create a CP/M computer (click run.bat). As you’ll see above, I also used run-cdos0258-2; but I needed to use CDOSGEN from there to create a system with 5″ drives for C: and D: to see the 5″ disk formats.
You can use R.COM and W.COM to read files into, or write files out from, the CP/M environment to the host; and to or from other simulated systems from there (eg from a CDOS system to a CP/M system). It’s usually easier than using PIP (or XFER in CDOS) and then swapping entire disks.
“A>X h” (X.COM) will tell you which simulation (host directory) you’re in. It does require z80sim-0.13.exe.
This is part of the CP/M topic.