(C) Ivan Roshchin
Work with disk
included in the interrupt
1. Theoretical information
The computer ZX SPECTRUM execution
teams exchange of information between memory and disk is the
direct participation of the CPU Z80:
RAM <-> Z80 <-> VG93 <-> disk
As you can see, if during execution
this command will interrupt, Z80
distracted by his handling of the team will fail "data loss". So
way to work with the disk superimposed
certain restrictions.
It should be noted that in modern
computers use the so-called
direct memory access, when the exchange of information between
the memory and any external device occurs without the
participation of the CPU:
<-> RAM <HD
CPU
<-> Controller <>
drive <
disc
Spectrum - out-of-date computer,
and lack of hardware that
would allow "parallel" to work with
disk and do something else, we have
compensate for software support. For
this we must first understand how
by executing commands VG93
(Eg, "read sector") are included in the interruption.
Note: Of course, everything said about the instructions
read refers to write command.
The speed of data exchange between VG93
and Z80 is 250 kbit / s, and the disk rotates
a speed of 300 rpm. Based on these
data define the number of bytes per track (note that
rate of 1 kbit = 1000 bits, not 1024):
(250 * 1000 / 8) * 60/300 = 6250 bytes
Approximately the same value (plus or minus five bytes)
can be obtained by using to determine the length of the track
program Afrodita 3.0.
Now calculate how many interruptions
occurs within one revolution of the disk, if their frequency is
known and equal to 50 Hz:
50 * 60/300 = 10
Thus, at every turn of the disc has just ten interrupts.
As already stated, if the termination
happen during the reading of the sector, then
this sector will not be read. It turns out that this sector
will not be able to read and drive back the next time, since
while it is read again will interrupt. And we come to the
conclusion that reading sectors in interrupt enable quite
impossible.
Note: there is still a way to implement reading in such
conditions. If not Could not read sector, the process must be
out of sync the disk rotation and the time of the interruption.
Do it can be very simple: stop the engine
drive, and then run it.
After this it remains only to repeat
read the desired sector.
And what, you ask, run various demo, in which the reading
of sectors combined with playing music on an interrupt? It
turns out that not all that bad. The fact is that in fact such
a strict synchronization is not. Thus, the "Pentagon" when
clocked at 3, 5 MHz gap between interrupts is about 71,680
cycles. In this case, the frequency interrupt is:
3500000/71680 = 48, 83 Hz
Note: accordingly, such
will be the same framerate connected
to the "Pentagon" monitor or TV.
As you can see, this is a little different from
standard (50 Hz). Also, this leads to
that is used in many programs the timer that runs on interrupts
will lose 1 to 4 seconds per minute,
as can be easily verified.
Now, during one revolution of the disk will 48, 83 *
60/300 = 9, 77, interrupts. Consider how many bytes is a
magnetic head in the gap between two interruptions:
6250 / 9, 77 = 640 bytes
If we assume that the first interruption
came at a time when the magnetic
head was in the beginning of the track, we get the following
table:
sequence number offset from the beginning
Interrupt track, bytes
1 0
2 640
March 1280
April 1920
May 2560
6 3200
7 3840
8 4480
9 5120
10 5760
11150 (next turn)
12 790
13 1430
14 2070
15 2710
16 3350
17 3990
18 4630
19 5270
20 5910
21300 (next turn)
... ...
It is seen that even if the sector does not read a single
turnover of the track, it is possible that it will be read at
the next traffic, since the onset of interrupt will be shifted
to 150 bytes.
Note: On my "Pentagon" in the
The experiments showed that due to the reduced speed of
rotation of the disc (299, 4 rpm instead of 300) the time of
the interrupt shift than 150, and 138 bytes. In further
calculations to figure this is the
value. For each computer it
own, and, as we shall see, it depends on the degree of her slow
reading of sectors.
We calculate what would be equal to the time
full disk access with illegal interrupts:
0, 2 * 160 = 32 seconds
Now let's try to estimate how many
time will slow down reading a single track standard TR-DOS disk
included with interrupts.
Note: we assume that
reading tracks, the program first reads all the sectors in a
row (in this case some of them, obviously, will not be
correctly read because of an interruption), and
then every time you drive back
tries to read all previously incorrectly
a few sectors, and so on until
all sectors have been read.
Please note that if the sequence is read multiple tracks
(Eg, 4), and each track is read, for example, 2, 5 turnover disc
all 4 lanes will be read not for the 4 * 2,
5 = 10, and a 4 * 3 = 12 rpm disc. This
due to the fact that when we give a command position on another
track, and then give the command reading the sector, SH
does not immediately begin to read the sector, and will
expect the index pulse, indicating
at the beginning of the track.
It is obvious that reading a single track (measured in
revolutions the disk) will be determined by the time read
"worst" sector, ie, a sector for reading
which will be allocated the largest number of attempts.
The length of the sector on the disk is equal to TR-DOS
256 bytes. Consider the scheme, how can
reads this sector in the worst case:
1 0 <- shows at
reading of
2138 <- byte happened
interruption
3
That is, during the first turnover of the disk interrupt
occurs while reading the bytes from offset 0, the second moment
of turnover the onset of interruption to shift to 138
bytes so that the sector will not be read again, and finally,
the third of the turnover, he read.
Thus, we see that the reading of one track to slow down in
3 times. Accordingly, the entire disk read by 32 * 3 = 96
seconds, which is perfectly consistent with experimental data.
Now consider the process of reading a single track disk
MS-DOS. Sector Size 512 bytes. In this case, reading the
"worst" of the sector can occur in two possible scenarios:
either it reads on the fifth turnover of the disc, or on the
ninth. This is shown in the diagram:
1 0
2 138
3 276
4 414
5
January 1993
2 231
3 369
4 507
May 5
6 143
7 281
8 419
9
Practice shows that the reading of a single track MS-DOS
disk in the middle increases of 7 and 6 times, then have a
second option is implemented a bit more first.
It is evident that because of the greater length of sector
reading slows even more than a drive TR-DOS. In the TR-DOS gets
at least some advantage.
But to work with the IS-DOS disk with
interrupts can not be included at all. I think you've guessed
why - sector of 1024 bytes will be read for so long
that during this time will happen
interrupt, but maybe not one. By
the same reason, when included interrupts
can not format the drive or to perform
read command track.
How do you implement simultaneous
playing music and reading a disc (without
any delay!) in the demo, as
POWER UP EYE ACHE and 2? Apparently, there
used this method: procedure
Music playback is started after
reading the next sector. But at the same
procedure call is not synchronized with
interrupts, and read errors are accompanied by unpleasant
howling.