CEDA uses two 5¼" floppy drive unit. Both drives are manufactured by YE-DATA, model YD-480.
Floppy drives are both controlled by a uPD765A Single/Double Density Floppy-Disk Controller, which can handle up to 4 drives. The ROM code seems able to address all 4 drives, although not physically present.
Each drive has few jumpers to configure its behavior, as reported in following table
| Jumper name | Jumper behavior | is shorted? |
|---|---|---|
| DS0 - DS3 | Drive select as drive 0 - 3 | DS0 shorted on drive 0, DS1 shorted on drive 1 |
| HS | Drive enabled by the "drive select" signal | shorted |
| HM | Drive enabled by the "motor on" signal | not shorted |
| MX | DS is ignored, drive is always selected | not shorted |
Drive 1 has a missing resistor net in socket MT (component value on drive 0: 760-3-R150).
Warning IDEA According to the schematic of a similar model (YD-380), this resistor net may be mandatory only for one drive at a time. Then, if only drive 1 is used, this component must be installed in the missing spot.
Note Motor control: I'm quite sure that drive motor can be manually turned on and off, since I accidentally did this. But the correct procedure is not yet documented nor even understood.
BIOS ROM provides an one-man-band routine to interface with the floppy drives.
Routine is located at address fdc_rwfs = $c19d.
The name was given by us during reverse engineering process and was inspired by Apple's RWTS routine, which has a similar behavior.
fdc_rwfs routine performs different operations depending on the arguments, passed from a, bc, de, hl registers.
The routine changes the content of three memory blocks.
First block is the descriptor of operation and has a fixed location at $ffb8 and size of 9 bytes.
This area is mostly populated by the data passed as argument (arg reg column).
| Arg reg | Offset | Bit | Description |
|---|---|---|---|
| a | 0 | [1:0] | SSF: Sector size factor. See below for conversion to actual bytes |
| c | 1 | [2] | Head number, i.e. which side of a double side floppy must be used |
| c | 1 | [1:0] | Addressed drive (0 to 3) |
| b | 2 | [7:4] | Operation command: read, write, seek, format, recalibrate |
| b | 2 | [3:0] | SB: sector burst. See below |
| e | 3 | [7] | SBE: sector burst enable, see below |
| e | 3 | [6:0] | Sector (record) number, 0 to 25 |
| d | 4 | - | Track (cylinder) number, 0 to 76 |
| hl | 5-6 | - | Address of the data buffer for read/write/format operations |
| - | 7 | - | Number of retry for read/write/format operations |
Second block is the data buffer, which will contain the actual data read or written from the floppy. A particular usage is made when format operation is started. In this case, the data buffer must contain a list of id fields, which describe the physical sector order upon a track.
A single id field is 4 byte long:
| Offset | Description |
|---|---|
| 0 | track number, 0 to 76 |
| 1 | side number, 0 to 1 |
| 2 | sector number, 1 to 26 |
| 3 | sector size factor |
Last block is a return block, which has a fixed location at $ffc0 and size of 7 bytes.
It contains the return value from fdc_rwfs routine.
| Offset | Description |
|---|---|
| 0 | Status Register 0 |
| 1 | Status Register 1 |
| 2 | Status Register 2 |
| 3 | Accessed track number |
| 4 | Accessed head (i.e. side) |
| 5 | Accessed sector |
| 6 | Number of bytes moved |
| 7 | Bitfield of already accessed drives. Initialized by BIOS to 0 |
See the datasheet for explanation of Status Register content.
Floppy drive controller can handle a wide set of operations, described in its datasheet. But only a few of them are actually exposed:
| Code | Operation |
|---|---|
| 0 | (recalibrate) move head to track 0 |
| 4 | read sector |
| 8 | write sector |
| 2 | seek (move to track) |
| f | format track |
The only value written to the FDC chip is the SSF value, and that's enough for him.
To convert SSF in sector size and viceversa, refer to the following equation:
Hence, each sector may be 128, 256, 512 or 1024 bytes long.
fdc_rwfs routine allows to read multiple sectors at once by using SB and SBE parameters.
Then, if SBE = 1, the actual number of bytes read will be:
| SSF | sector size | bytes read |
|---|---|---|
| 0 | 128 | 128 + 256 * SB |
| 1 | 256 | 256 + 256 * SB |
| 2 | 512 | 256 + 256 * SB |
| 3 | 1024 | 1024 + 1024 * SB |
Note Hypothesis: To operate with sector size = 512, SB must be at least 1.
One of the drive was tested successfully with a generic x86 computer. The drive communicates with the PC with a standard 34-pin edge connector. Drive is powered through a standard 4-pin molex connector.
Drive was tested as a 5¼ 360KB drive in unit A. Hence, it must be connected after the ribbon cable twist.
A change in the jumper must be done:
- in DS 0-3 group, only DS 1 must be shorted;
- in HS-HM group, only HM must be shorted;
- MX is unchanged.
Some tests were done to access drive as B drive, without success.
- Floppy drives information, YD-480 is mentioned;
- Controller information.


