The structure of the ROMs usable in both PX-4 and PX-8 is very like that of the floppy disks, with some adaptions to make optimal use of the limited space. The ROM starts with a variable size directory, of which the first entry is the header. The actual directory size is specified in this header and is always a multiple of four extends, up to 32. The 'disk' geometry uses 1 kByte blocks, so one extend can address 16 kByte.
This ROM format is the 'M'-type. The other ROM format is the 'P'-type, only for the PX-4. It is described below. As the PX-4 has the ROMs appear in the Z80 processor memory map, code can be executed directly from the ROM, instead of loading it into RAM first .
For 8k and 16k ROMs the header is found at the start of the ROM, at 0x0000, for 32k it is at 0x4000. The header is followed by the directory entries. After this, rounded up to a 128 byte boundary, the CP/M data blocks start. For 32k ROMs, blocks wraps around at 0x7FFF to 0x000 and then up to 0x3F7F. PX-4 OSRM, II-347
bytes | description |
---|---|
0x00 | Always: 0xE5, making this extend 'unused'. |
0x01 | Format: 0x37 - 'M' format, 0x50 - 'P' format |
0x02 | Capacity: 0x08 single 8 kByte ROM 0x88 double 8 kByte ROMs 0x10 single 16 kByte ROM 0x90 double ROMs, first part 16 kByte 0x20 single 32 kByte ROM 0xA0 double ROMs, first part 32 kByte |
0x03 - 0x04 | Checksum: sum of the data area bytes && 0xFF. Big-endian. Not checked by the system. |
0x05 - 0x07 | System Name: Epson used 'H80', even for PX-4 ROMs. |
0x08 - 0x15 | ROM Name |
0x16 | Number of directory entries. One of: 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20 |
0x17 | Always: 0x56 - 'V' |
0x18 - 0x19 | Version number |
0x1A - 0x1F | ROM Production date in 'MMDDYY' format |
The organisation of the data in the ROM is not straight forward for all sizes. The 8 kByte and 16 kByte ROMs have the directory at the start, but the more popular 32 kByte has it halfway, at 0x4000.
The PX-4 and PX-8 support several configurations of single and double ROMs. In case of a double ROM configuration, both ROMs appear as one drive, usually B:. Curiously, only the size of the first ROM is specified in the header, the size of the second is implicit in the highest block number used.
As the allocation block size is one kByte, and the directory size can vary from 128 byte to one kByte, the number of available data space is the ROM size minus 1 kByte. As the data begins directly after the latest used set of four extends, there could be the part of a block available after the last complete one. Unclear is wheather this space (128 bytes to 896 bytes) can be used as partial block.
The directory extends are identical to the original CP/M format using 1 kByte allocation blocks and one logical extend in a physical one. This is different from the format used on floppy disks.
Apart from the format indicator the smaller P-format ROMS look very much like the M-format types. The ROM-based programs have a special header:
For resident programs the header is extended with a cold start entry, a warm start entry (both three bytes), 68 bytes of fixed data, the program name (eight bytes) and the extension (3 bytes).
Another difference with the 32 kByte ROMs is the directory location. For P-format ROMs the directory starts at 0x6000 (M-format ROMs use 0x4000).
Latest update: 2022-06-10