izapple2/storage/diskette16sectorTimed.go

41 lines
1.3 KiB
Go

package storage
type diskette16sectorTimed struct {
nib *fileNib
cycleOn uint64 // Cycle when the disk was last turned on
}
func (d *diskette16sectorTimed) PowerOn(cycle uint64) {
d.cycleOn = cycle
}
func (d *diskette16sectorTimed) PowerOff(_ uint64) {
// Not needed
}
func (d *diskette16sectorTimed) getBitPositionInTrack(cycle uint64) int {
// Calculate how long the disk has been spinning. We move one bit every 4 cycles.
// In this implementation we don't take into account how long the motor takes to be at full speed.
cycles := cycle - d.cycleOn
position := cycles / cyclesPerBit
return int(position % (8 * nibBytesPerTrack)) // Ignore full turns
}
func (d *diskette16sectorTimed) Read(quarterTrack int, cycle uint64) uint8 {
track := d.nib.track[quarterTrack/4]
bitPosition := d.getBitPositionInTrack(cycle)
bytePosition := bitPosition / 8
shift := uint(bitPosition % 8)
if shift == 1 {
// We continue having the unshifted byte for a little longer (4 cycles)
shift = 0
}
value := track[bytePosition]
value >>= shift
//fmt.Printf("%v, %v, %v, %x\n", bitPosition, shift, bytePosition, uint8(value))
return value
}
func (d *diskette16sectorTimed) Write(quarterTrack int, value uint8, _ uint64) {
panic("Write not implemented on time based disk implementation")
}