Adventurer #09
30 апреля 1999 |
|
Exchange of experience - TR-DOS: the disk included with interrupts.
(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.
Other articles:
Similar articles:
В этот день... 21 November