Inferno #08
30 ноября 2005 |
|
Iron - CD-ROM - a device and Tricks connection.
Talks on CD CD-ROM - a very moody ustroystvo.Ma locally that it is not completely documented (Incidentally, that details how you can drowning) - Various models are quite different software from one druga.Naibolshy experience This issue has become Budder (Constantine Hares), which tested a bunch of drives and wrote a decent copier. SMT, author Emulator Unreal Speccy, rely more for documentation. In the brainstorming part, of course, Not only me (Alone Coder), Budder and SMT, and Vega, Kury, ZET-9, AmoNik, etc. While Many questions still decide not to managed, but I think some of the intermediate main results published useful. Prev assumed that the reader is already familiar with Article Vega in Paragraph # 25. There is wrong races write commands READ TOC (read table sessions). Judging by the standard INF-8020 (it the same original document defining schy behavior of CD-ROMs, but there's a lot shamefully hushed up - there is even Reference "ATA-ATAPI errata"), FUNC - then the same number as FORMAT, but shifted by 6 bit to the left. FUNC>> 6 and FORMAT must coincide give t.k.novye drives may not support vat FUNC (ptsshnye devices are often spread propagate with the drivers, and each company can understand the "standard" as he wants). To read the data from all sessions need to specify BEGTRK = 0 FORMAT = 0. If only the latter - that FORMAT = 1. LENGTN Well zhno bet the maximum (2048, senior byte forward), and drive himself to determine how many bytes to transfer (the number of bytes before exchange is placed in the registers of the cylinder ATA). The command does not work on the first try! That she worked before her execution should be considered, such as sector 0. But I run ahead. So go on: SMT: S>> According to the standard ATAPI device after reset S>> proof required to keep the status of the origin, S>> to the old pre-atapishnye BIOSes do not S>> identified him for the screw. And most importantly, no one S>> does not require CD-ROM set DRDY after S>> command, it is at the discretion of razrabotchi S>> Cove device. DB> And when it is on the status of a unit? After completion of the first ATAPI-command (# A0). But after a reset necessarily 0; This differs from the ATA. DB> And what does the situation, when a reg. DB> able to read # D0 (I mean the employment DB> then) and no prog do not want to see DB> CD-ROM? As his soft reset to DB> this situation? Helps to just chill DB> LIMITED reset: ( Bit SRST (Soft Reset - # 0C, then # 08 in Device Control Register (at Nemo port # C8)) Then it is necessary to give the command # 08, wait removal of BSY. The ATA software reset mechanism, SRST, (Bit 2 in the Device Control Register) cannot be used for ATAPI Devices, because resets issued by the ATAPI driver would also reset any attached hard disk and vice versa. To solve this ATAPI defines an ATAPI Soft Reset command using a reserved ATA opcode which could be decoded by the interface controller hardware. To maintain Master / Slave compatibility with ATA disk drives and prevent detection of ATAPI Devices by non ATAPI-aware BIOS, ATAPI Devices shall implement the following upon receipt of an ATA SRST: 1. Perform SRST PDIAG sequence see "5.18.2 SRST Initialization Sequence "on page 46. 2. Initialize the task file with Status = 00h or 10h, Error = According to SRST Sequence, Sector Count = 01h, Sector Number = 01h, Cylinder Low = 14h, Cylinder High = EBh and Drive / Head = 00h. Note that Device 0 will be seleted after the completion of the SRST sequence. 3. The functionality of the DRDY and DSC bits shall be restored on the first command following an SRST. 4. Continue executing commands or play operations. 5. Leave Mode settings or Set Feature settings unchanged. 6. If a selected ATAPI Device detects SRST while its own DRQ or BSY is set (one), then the command in progress shall be stopped. DB> And you are not lying around instructions on how to DB> adjust the speed of rotation DB> CD-ROM'е? 10.8.23 SET CD SPEED Command The SET CD SPEED command provides a means for the Nost to set the spindle speed to be used while reading and writing CD data. Note that the Play commands may not use the speed set by this command. 0 Operation code (BBh) 1 Reserved 2 MSB Read Drive Speed in Kbytes / Second 3 LSB 4 MSB Reserved for Write Drive Speed in Kbytes / Second 5 LSB 6 Reserved 7 Reserved 8 Reserved 9 Reserved 10 Reserved 11 Reserved The Drive Speed parameter contains the requested Data Rate the drive should use. The drive may choose to select the speed specified or any slower rate. A value of FFFFh will set the Drive Speed to the Maximum supported. Requesting a speed faster than the drive supports will not generate an error. The actual maximum speed supported is returned in the Capabilities Mode Sense page (See "10.8.6.4 CD-ROM Capabilities and Mechanical Status Page "on page 115.) Comments on the speed of the site insidePro.com: ----------------------------------------- Hacker secrets or Recipes brake fluid for CD The emergence of high-speed CDROM drives led to a huge number of problems and, reputedly users, plus here is much smaller than minusov.Eto reaction tive hum, vibration, torn to shreds Wheels - tell me what the hell it all to you need? In addition, many of the algorithms for binding to the CD at high speeds feel itself is extremely unstable, and secure disk runs are not the first time, if general zapuskaetsya.Kakoy same from all of this exit? Of course - slow! Fortunately, to Mandu SET CD SEED (opcode 0BBh), most drives still support them. Seemed would set the options you want and go! But no - Everything is not so simple ... Trouble first (small, but annoying). Speed is not specified in the "iksah" in kilobytes per second (just a kilo bytes, not bytes!). And once rate corresponds to the bandwidth capacity of 176 kilobytes per second. A twice? Think, 176 * 2 = 352? And here No - 353! But three times the rate calculated slyaetsya in full accordance with the usual our math: 176 * 3 = 528, but 4-fold radial velocity again deviates from the "x's": 176 * 4 = 704, against 706 for the standard. Non correctly specified speed leads to mouth suggesting the speed at level less than expected my, and the correspondence between actions and Steps away from unique. Assume drive supports the following series of velocity Tei: 16x, 24x, 32x and 40x. If the specified rate growth (in kilobytes per second) is not dotyagi increases to the normative rate of 32 "xXx", then drive moves in the near bottom "under he supported the speed t.e.v our case 16x. The moral: to translate "'X' in kilobytes per second, they should not multiply at 176 and 177! Trouble the second (larger and annoyance it). Command, issuing a full list at supported the velocities in the standard special fication is not, and get this information when hoditsya only brute force. Correctly running program before beginning Scrap this enumeration must be satisfied by presence of media in the drive, and if he is there is - to force open the tray. The point that the unwinding of defective CDROM drive to a high velocity may at lead to its rupture and consequent deterioration of the drive. The user must be absolutely sure that the established lenny in the drive will rotate names but with the speed with which it is asked, and your program will not spontaneously increase speed without any visible reasons. Trouble third (or quiet horror). Some drives (in particular, TEAC 522E) successfully swallow the SET CD SPEED command and confirm the change of speed, WHO rotating in the MODE SENSE its new value, one However, the physical velocity of the disk remains betrayal until as long as it has not happen or that treatment. Poe Besides following the SET CD SPEED thumbs up to give read command sector from the disk, if the horse chno, the disc is present at all. Change the same speed drive with no disc in the tray - Board rshenno senseless operation, suitable except for the construction of a number of supports Mykh velocity t.k.posle insertion of a new di ska to drive past fast-track fail, and most optimal (in terms of driving!) rate rate for each disk is determined by indie vidual. Also, the drive may change speed drive on your own pony Multiplying it, if reading is not important, and accordingly respectively, increasing the speed, if all going well. ----------------------------------------- Last paragraph - pure truth itself with it hurts. Budder: Definition HDD (Master) and CDD (Slave): ----------------------------------------- DETECT CALL SEL_MAS CALL DRDET LD A, D: OR E: LD A, 0: JR NZ, ENDC INC A ENDC LD (HDEN), A CALL SEL_SLA LD A, # 08: CALL COMM LD A, 1, (CDEN), A CALL CDDET: RET Z NoCD LD A, 201, (PTCD), A XOR A: LD (CDEN), A RET CDEN NOP; 1-have device, HDEN NOP; 0-device is not ----------------------------------------- The output of the result will be a CDEN and HDEN! ----------------------------------------- COMM LD BC, # F0: OUT A : RET XPOZI LD (LTHL), HL, (LTDE), DE; LBA on! LD A, H, H, D, D, E, E, A ; DE, cyl H, head L, sec POZI LD A, H: AND% 00001111: LD H, A LD A, (DRVRE) OR H LD BC, # D0: OUT A LD A, L, C, # 70: OUT A LD A, D, C, # B0: OUT A LD A, E, C, # 90: OUT A RET RPOZ LD BC, # D0: IN A: AND # 0F LD H, A, C, # 70: IN A LD L, A, C, # B0: IN A LD D, A, C, # 90: IN A LD E, A RET ;---------------------------------------- CDDET CALL SEL_SLA DRDET LD DE, 0 LD H, D, L, E CALL XPOZI LD A, # EC CALL COMM .3 HALT; delay in 3 / 50 sec , Giving the IDE device CALL RPOZ; time to think and LD HL, # EB14; whether it? ;) OR A: SBC HL, DE RET Z NFOC LD A, 1: OR A RET ;---------------------------------------- SEL_SLA LD A, # B0 LD (DRVRE), A LD BC, # D0: OUT A: LD C, # F0: IN A RLCA RET SEL_MAS LD A, # E0 JR SEL_SLA +2 ;---------------------------------------- DRVRE NOP LTHL DS 2 LTDE DS 2 ----------------------------------------- Procedure of waiting BSY: ----------------------------------------- RDY LD BC, # F0: IN A ; infinite RLCA: RET NC; waiting for BSY JR RDY READY LD E, 0, D, 0; waiting for BSY LD BC, # F0: IN A; with timeout RLCA: JR C, RY XOR A: OUT (254), A: RET RY LD BC, # F0, BC, # F0; idle DEC D: JR NZ, READY +4 DEC E: JR NZ, READY +2 LD A, 1: OUT (254), A CALL ECCOM EI: HALT JR READY ECCOM NOP: LD BC, # F0, A, # EC: OUT A: RET ; Working with the HDD in ECCOM to Record ; Value 201 (RET), and working with CDD ; Record 0 (NOP) The current engine WDC instead READY one hundred um READY2: ----------------------------------------- READY2 XOR A: LD (TMR), A; waiting for BSY REA LD BC, # F0: IN A; with timeout RLCA: JR NC, RY2; in 1 / 2 seconds LD A, (TMR): CP 25: JR C, REA LD A, 1: OUT (254), A CALL ECCOM EI: HALT JR READY2 RY2 XOR A: OUT (254), A RET TMR NOP I_N_T PUSH HL; should hang LD HL, TMR: INC (HL); interrupt POP HL EI RET ----------------------------------------- But such demands the presence of the counter interrupt ... In fact READY need to call ONLY before performing a new team, and In some cases, where such principles exponentially, causing the team after the regular RDY (Or does not cause neither one nor the other). Example: CALL READY; waiting / ; Job readiness CALL EJECT; Packet ; By pushing the tray CALL RDY; awaiting execution Another important place - the waiting DRQ before taking the data in the process of reading of the sector: -----------------------------------------; Procedure read sector ; HL = Kuzia else in the package seated READSE LD (HLAD), HL RETRYL XOR A: OUT (254), A CALL READY LD HL, READP: CALL SNDPAK , Instructs LOADSE1 LD A, 5: OUT (254), A; read sector CALL READY CALL ERROR_7: JR C, RETRYL LD D, 0 ; In some extra buggy CD-drive ; Here may hang, if you make just ; Call WAITDRQ WDQ LD BC, # F0: IN A BIT 3, A: JR NZ, WQR DEC D: JR Z, RETRYL JR WDQ WQR LD HL, (HLAD) GSLOD .4 CALL READS XOR A: OUT (254), A RET HLAD DS 2 READS LD C, # 10, D, # 80 RE1 INI: INC C INI: DEC C INI: INC C INI: DEC C DEC D: JR NZ, RE1 RET ;---------------------------------------- SNDPAK PUSH HL; IN HL ADDR OF PAK CALL READY CALL SEL_SLA LD HL, # 0800 CALL OUTRCIL; expose values ; Byte count LD A, # A0; give Komad of LD BC, # F0: OUT A; Packet POP HL LD BC, 12 TRANSOU PUSH BC CALL RDY CALL WAITDRQ POP BC OR A RR B, C JR NC, $ +3 INC BC TOUT1 PUSH BC INC HL LD A, (HL), BC, # 11 OUT A DEC HL LD A, (HL): DEC C OUT A INC HL, HL POP BC DEC BC LD A, B OR C JR NZ, TOUT1 RET OUTRCIL LD A, L, BC, # 90: OUT A LD A, H, C, # B0: OUT A RET ;------------- Reading packet -------------- ERRT POP BC RET TRANSIN; HL = BC = Kuzia lope PUSH BC CALL SEL_SLA CALL RDY, ERROR_7: JR C, ERRT CALL WAITDRQ POP BC OR A RR B, C JR NC, $ +3 INC BC T_I1 IN A, (# 10): LD (HL), A: INC HL IN A, (# 11): LD (HL), A: INC HL DEC BC LD A, B: OR C JR NZ, T_I1 RET HLTOLEN LD BC, # 90, A, L: OUT A LD BC, # B0, A, H: OUT A RET LENTOHL LD BC, # 90: IN A: LD L, A LD BC, # B0: IN A: LD H, A RET WAITDRQ LD BC, # F0: IN A BIT 3, A: RET NZ JR WAITDRQ ERROR_7 LD BC, # F0: IN A RRCA RET ----------------------------------------- In all other procedures can you be called simply WAITDRQ! (Where required is.) Waiting for a CD drive at any time Meaney: I can not describe in detail, t.k.mnogie stuff I can not remember. I can only say that in those most times when the drive is not ready, CD at Waters sees any team as a bug (Excl.. Some of them). BSY signal indicates employment, at least after the spacecraft Coy or team (for example, the transmission packet ma), but if there was no error! After packet transmission regardless of the fact On whether he was handed over, put procedure READY (look procedure read Sector) her inspection of the error signal in the register state. If an error, then repeat starting package, and thus is expected to ready sequence the CD drive at any time vreneni ... In my engine has another feature: Control of timeouts, a cat. must be in the process of waiting BSY (all drivers on the PC so done), I chose 1 / 2 seconds. On a PC, the restriction on waiting time Denmark is not only the BSY, but also to remain lnye signaly.Pri timeout in my engine command is # EC, cat. is necessarily Indeed for all ATAPI devices, and which Weigh BSY! (If you do not like # EC, then You can use # 00, but for any necessary another point in the subcommand code FR (register properties), in our case it is 0.) SMT: Still play a bit with direct access the CD-ROM, and realized how to grow legs give the package with the code # 00. Often the first on this on CD-ROM command is executed with error. But we need to watch that for an error, and do not try to repeat or give to another Mandu. Most likely, in the error register conditions stalled the MC [???] or MCR [Media Change Requested in ATAPI - D3 Registry errors] ie user pressed the eject or insert a new disc. In this case, the drive informs the host discarding the following command with acc. oshibkoy.A instead send the packet # 00, which "swallow" this alert need to repeat the operation if an error of level MC / MCR. After all, it is quite possible (although very unlikely) that the change of media or pressing eject will just between coma ndami # 00 and the working team, then working team broken off, despite the pre- passed # 00. 10.8.26 TEST UNIT READY Command The TEST UNIT READY command provides a means to check if the Device is ready. This is not a request for a self-test. If the Device would accept an appropriate medium-access command without returning CHECK CONDITION sta-tus, this command shall return a GOOD status. If the Device cannot become operational or is in a state such that an Host Computer action (e.g. START / STOP UNIT command with LoEj = 0 ' Start = 1) is required to make the unit ready, the ATAPI CD-ROM Drive shall return CHECK CONDITION status with a sense key of NOT READY. 10.8.26.1 Using the TEST UNIT READY Command The TEST UNIT READY command is useful in that it allows a Host Computer to poll a Device until it is ready without the need to allocate space for returned data. It is especially useful to check cartridge status. ATAPI CD-ROM Drives are expected to respond promptly to indicate the current status of the device. 0 Operation code (00h) 1 Reserved 2 Reserved 3 Reserved 4 Reserved 5 Reserved 6 Reserved 7 Reserved 8 Reserved 9 Reserved 10 Reserved 11 Reserved P.S. And then it becomes clear why in your case the package # 00 was required only once - you simply drive is not changed. DB> 1. When I form a reset control DB> that returns the register (# 0C, then through some DB> certain time # 08), how to determine DB> when I give the # 08? IMHO should be DB> some light on this? Removal of BSY. He immediately set after the # 08. Reset via ATA SRST does not interrupt the coma NDU ATAPI, but puts a signature as a result Giustra cylinder. However, it does not interfere. DB> 2. If you run the initialization until it DB> of how sidyuk after hard reset DB> (RES on the loop) has time to unwind, DB> a CD-ROM ignores the command. No matter how I DB> read status registers and error, but DB> difference between the two states (time to DB> / did not have time to unwind) did not notice. Error reads commands REQUEST SENSE (# 03). DB> 3. Some drives make a mistake on DB> command set the speed, after which DB> does not respond to commands. As DB> get them to work after this? Do not give the command. Ask about support through the MODE SENSE / CAPABILITIES. Ed.: There's no sign that the drive can change the speed! DB> 4. How do I know that the time has come again DB> file command speed setting DB> (ie how do you know that the drive its self DB> randomly changed)? Yes. Assume that the current speed through the MODE SENSE / CAPABILITIES (# 5A with a parameter # 2A). b. Usually the rate is reset when you change media. Put option after treatment MCR; If checked, before the team ask again the speed (for simplicity precede the reading of the catalog SET CD SPEED. Once the disc was replaced, the user is forced read, at the same time the rate is established).
Other articles:
Similar articles:
В этот день... 21 November