INIT.COM for Cromemco CP/M

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.

It's only fair to share...Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUponDigg thisPin on PinterestEmail this to someone

Leave a Reply

Your email address will not be published. Required fields are marked *