Skip to content

Latest commit

 

History

History
151 lines (112 loc) · 7.33 KB

File metadata and controls

151 lines (112 loc) · 7.33 KB

Floppy drive

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.

Drive board

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.

Accessing by software

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.

Operation command

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

Bytes per sector

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:

$$ bps = 0x80 << SSF $$

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.

Usage with x86 PC

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.

References