[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Rescuing old 5.25" disks
Michael J. Mahon wrote:
Or don't worry about the fact that the image names are not ProDOS-
compatible names. Images are generally used by emulators, or by
transfer programs that can present any "name" they want to an
attached or emulated Apple II.
What I'm worried about is disk-imaging tools that run on actual Apple II
hardware. If you send the image over the serial port there's no problem, but
if you save it to a local disk then your naming options are limited.
An overall checksum is good, but we have managed for quite a while
without them. In fact, most computer files don't have checksums,
though they may have internal consistency checks.
If you have random bit-flip errors, it's time to work on your
hardware, since computers (and their users ;-) are completely
intolerant of such things.
I still think checksums are important for images of commercial software, and
I wish I could more clearly articulate why. It's related to my background in
functional programming, where there's a strong distinction drawn between
mutable and immutable data. I similarly want to distinguish between
canonical images of shipped commercial software on the one hand, and
ordinary disks containing files created by individual users, on the other
hand. In terms of physical disks, to a large extent this is just a matter of
the presence or absence of a write-enable notch. But the write-enable notch
is not merely advisory -- it's enforced by a hardware/firmware interlock.
What I want is a similar interlock in the file format. Since it's all done
in software it can't be perfect, but it can be made safe against everything
short of active malice. Zipping or gzipping the image works because then, to
silently modify it, you have to re-zip it afterwards, and it's simply
impossible for that to happen by accident. Adding a checksum works also.
Setting the OS read-only bit isn't as good, because that often isn't
preserved in transfers between machines. Setting a bit in the file is nearly
useless, because there's no enforcement.
So what I want, I guess, is simply to extend the write-protect bit in
formats like 2mg by including a checksum if and only if the disk is write
protected. Does that sound reasonable?
You don't need to simulate the full Woz machine, just add half track
and quarter track seeking and update the data register at four-cycle
intervals.
But even that updating needs to be done in accordance with the
Woz state machine [...]
Implicit in my statement above was that the data register should be
updated *correctly* at four-cycle intervals. [...]
The shift register is *not* updated every four cycles. The update time
depends on the state of the state machine. [...]
I know that. Let's get down to brass tacks. What I'm saying is that most of
the complexity of Woz's state machine on the read side is there to deal with
read pulses that may come in at any time. If you assume that read pulses
come in at regular intervals of eight 2MHz cycles, then the machine is
simplified from dozens of states down to just three. Namely:
state A:
if input bit is 1
go to state B
otherwise
remain in state A
state B:
data <- 2 + input bit
go to state C
state C:
data <- data * 2 + input bit
if data >= 128
go to state A
otherwise
remain in state C
This state machine runs at 0.25 MHz. Its behavior precisely matches the
original Woz machine, with one exception: the original takes 1.5 us to clear
the data register and shift in two bits, so the data register will contain
either 0 or 1 at 6502 cycle 4n, and the full two bits at cycle 4n+1.
Otherwise, data register updates happen only at cycles numbered 4n.
So accurate emulation of the state machine is much simpler than emulating
the whole state machine. Unless there's software that depends on the drive
not being perfect, in which case I'm sure it would be sufficient to
occasionally run the simplified state machine one cycle early or late.
As for "updates" to a canonical format disk image, I think that we
should only have to have *one* universal standard, so everything
reasonable that might be done to it should be considered in its
design. Tradeoffs come later.
How about this: the disk image is an ordered list of possibly overlapping
partial-track write descriptors. When you write (part of) a track, you just
append a new descriptor to the file. When you read a track, you recreate its
contents by starting with a blank unformatted track and applying the
relevant descriptors in order. You'd have to (K)runch the disk occasionally
to keep it from growing too large. (Or you could let it grow, and have a
persistent record of all previous states of the disk.) This is the best
compromise I can think of between a compact read-only format and a
convenient writable format.
You could also use whole-track descriptors instead of partial-track
descriptors. The disadvantage is that you couldn't simulate the corrupting
effect of a write on adjacent half- and quarter- tracks without updating
those tracks too. But really, is that ever going to matter? (I know I'll
regret asking that.)
-- Ben