psx.wiki
Log in
Main page
Hardware
Hardware tests
System software
SDKs
File formats
Games
Tools
History
All pages
page
view source
history
View source for CD-ROM Controller With a Disc
← CD-ROM Controller With a Disc
You do not have permission to edit this page.
Log in
to edit.
--- title: CD-ROM Controller With a Disc type: test summary: Times reads, seeks, speed changes, Stop, MotorOn and Init on the CD-ROM controller with a disc in the drive. category: Hardware tests info: Machine = SCPH-5501 info: Program = cddisc --- ## Overview The program drives the CD-ROM controller the same way as the [no-disc test](/tests/cd-rom-no-disc/): interrupts are polled with HINTMSK 0 and CPU interrupts off, and root counter 2 counts system clock cycles from each command write. One second is 33868800 cycles.[^run] It waits for a disc to be put in, reads its ID and table of contents, then times ReadN at single and double speed, SeekL across the disc, a speed change, Stop, MotorOn and Init.[^run] See also: - [CD-ROM Audio and Data Commands](/tests/cd-rom-audio-data-commands/) - [CD-ROM Controller Commands and Reads](/tests/cd-rom-controller-commands/) ## Results ### Disc After the lid closed, GetID answered error 80h nineteen times before the drive was ready. GetID then answered INT3 42h and INT5 4Ah 80h 20h 00h 00h 00h 00h 00h. The commands 50h to 56h each answered INT5 43h 40h, and GetID answered the same before and after them.[^run] GetTN answered tracks 1 to 1. GetTD for the lead-out answered 26:30, which is sector 119100.[^run] ### Read Timing Sectors arrive once every 1/75 second at single speed and once every 1/150 second at double speed. At single speed the INT1 interrupts came 428816 to 469344 cycles apart. At double speed they came 198016 to 252320 cycles apart.[^run] Table: ReadN from sector 16 in cycles from the command | Speed | First INT1 | INT2 of the Pause that follows | | --- | --- | --- | | Single | 11325319 | 3678046 | | Single, second time | 14234903 | 4128860 | | Double | 3295459 | 2016059 | | Double, second time | 5637527 | 2006829 | In the second double speed read, one gap between sectors was 2472768 cycles where the others were near 225000.[^run] A ReadN from sector 118100, a thousand sectors before the lead-out, gave no INT1 at either speed, and GetlocL answered error 80h.[^run] ### Seek Timing SeekL answers INT3 within about 0.002 seconds and INT2 when the head arrives. The INT2 times varied widely and did not grow steadily with distance.[^run] Table: SeekL time to INT2 in cycles | From | To | Single speed | Double speed | | --- | --- | --- | --- | | 1000 | 1001 | 1568045 | 1338361 | | 1000 | 1016 | 11944584 | 2247613 | | 1000 | 2024 | 6703239 | 3663037 | | 16 | 14839 | 10467549 | 10470189 | | 16 | 59308 | 22669049 | 20911357 | | 16 | 118600 | none | 19638893 | | 118600 | 16 | 25610925 | 20483469 | At single speed, seeks from sector 16 to 74131 and beyond gave no INT2 within the limit, and GetlocP then reported the head well short of the target. At double speed only the seek to 103777 gave no INT2.[^run] ### Speed and Spin Table: Speed change and spin times in cycles | Action | Time | | --- | --- | | Single to double speed, then ReadN: first INT1 | 5850138 | | Double to single speed, then ReadN: first INT1 | 28432907 | | Stop: INT2 | 12902006 | | MotorOn after Stop: INT2 | 63162554 | | Init: INT2 | 4459785 | MotorOn after Stop took 63162554 cycles to INT2, which is 1.86 seconds. Changing from double to single speed delayed the first sector by 0.84 seconds, and changing from single to double by 0.17 seconds.[^run] ## Runs ### Run 5501a-card-i on 30 September 2026 Raw output: [00RUN.txt](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/00RUN.txt) · [01DID.txt](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/01DID.txt) · [02DRD.txt](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/02DRD.txt) · [03DSK.txt](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/03DSK.txt) · [04DSP.txt](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/04DSP.txt) 00RUN.txt: ``` ===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A 4 tests A chain program, linked at 80010000 Saved on the card in slot 2, from image 1 COP0 at start: BPC 00000000 BDA 00000000 TAR 80108CF0 DCIC 00000000 BadVaddr 00000480 BDAM 00000000 BPCM 00000000 SR 00000000 Cause 00000020 EPC 801098A4 PRId 00000002 ``` 01DID.txt: ``` ===== 01 DID CD DISC ID UNLOCK | BIOS 19951204 System ROM Version 3.0 11/18/96 A BadVaddr as the group starts: 00000480 The disc: GetID, the Secret Unlock 50h-56h, GetID again, GetTN, GetTD. Switches (Test 21h, bit1 door open, bit0 head at POS0): int3 02 @24912. Getstat: int3 10 @33234. Mode 20. HINTMSK was 1F. Put the disc in and close the lid now. Waited 582 tenths of a second for the disc. Getstat 02. GetID stopped answering error 80h after 19 tries. GetID before the unlock: int3 42 @24245 int5 4A 80 20 00 00 00 00 00 @44357 Unlock replies: 50: int5 43 40 @32379 51: int5 43 40 @108161 52: int5 43 40 @41446 53: int5 43 40 @63059 54: int5 43 40 @52017 55: int5 43 40 @64783 56: int5 43 40 @33290 GetID after the unlock: int3 42 @40012 int5 4A 80 20 00 00 00 00 00 @60092 GetTN: int3 42 01 01 @55089 GetTD 0 (the lead-out): int3 02 26 30 @61699 Last track 1. The disc ends at sector 119100. Done. ``` 02DRD.txt: ``` ===== 02 DRD CD READ TIMES | BIOS 19951204 System ROM Version 3.0 11/18/96 A BadVaddr as the group starts: 00000480 ReadN timing: the first INT1 and the gaps between them, single and double speed. Switches (Test 21h, bit1 door open, bit0 head at POS0): int3 00 @21786. Getstat: int3 02 @39332. Mode 20. HINTMSK was 1F. Single speed, mode 00, from sector 16: ReadN int3 02 @39527 INT1 at: 11325319 11767719 12219143 12663511 13116055 13574007 14022631 14481559 14926791 15377495 15837319 16276071 16728023 17186039 17631271 18082343 18537703 18992839 19459911 19888727 20340679 20792775 21256535 21697927 (24) GetlocL: int3 00 02 39 02 00 00 08 00 @54913 Pause: int3 22 @32334 int2 02 @3678046 Single speed again, mode 00, from sector 16: ReadN int3 02 @40343 INT1 at: 14234903 14684983 15130791 15584231 16048007 16489111 16947511 17384951 17843431 18295399 18742055 19193927 19651927 20104279 20571399 21000615 21451271 21911255 22355575 22807687 23266215 23714231 24159511 24628855 (24) GetlocL: int3 00 02 39 02 00 00 08 00 @43292 Pause: int3 22 @102589 int2 02 @4128860 Double speed, mode 80, from sector 16: ReadN int3 02 @45235 INT1 at: 3295459 3494915 3723027 3969155 4168227 4396355 4636899 4857155 5072499 5316387 5522323 5751411 5991075 6212243 6426611 6669171 6904227 7110131 7330851 7582259 7788195 8011971 8242675 8461539 (24) GetlocL: int3 00 02 39 02 00 00 08 00 @43388 Pause: int3 22 @48571 int2 02 @2016059 Double speed again, mode 80, from sector 16: ReadN int3 02 @25559 INT1 at: 5637527 5877159 6084103 6304263 6556583 6755655 6975895 7199543 7430791 7671495 7882519 8102663 8335495 8564903 8783767 9005783 9253079 11725847 11929831 12154935 12405383 12603399 12832951 13072423 (24) GetlocL: int3 00 02 39 02 00 00 08 00 @43388 Pause: int3 22 @23357 int2 02 @2006829 Single speed near the end, mode 00, from sector 118100: ReadN int3 02 @35108 INT1 at: (0) GetlocL: int5 43 80 @36519 Pause: int5 43 ..(2) @237708 none Double speed near the end, mode 80, from sector 118100: ReadN int3 42 @43123 INT1 at: (0) GetlocL: int5 43 80 @36662 Pause: int5 43 ..(2) @25329 none Mode 80 put back to 20: int3 42 @64584 Done. ``` 03DSK.txt: ``` ===== 03 DSK CD SEEK TIMES | BIOS 19951204 System ROM Version 3.0 11/18/96 A BadVaddr as the group starts: 00000480 SeekL times: from one sector to another, single and double speed. Switches (Test 21h, bit1 door open, bit0 head at POS0): int3 00 @32017. Getstat: int3 42 @40290. Mode 20. HINTMSK was 1F. Single speed, from the start outward: 16 to 14839: int3 02 @29101 int2 02 @10467549 GetlocP int3 01 01 03 17 64 03 19 64 @61263 16 to 29662: int3 02 @23149 int2 02 @18615293 GetlocP int3 01 01 06 35 38 06 37 38 @68091 16 to 44485: int3 02 @28189 int2 02 @17937213 GetlocP int3 01 01 09 53 09 09 55 09 @41867 16 to 59308: int3 02 @29337 int2 02 @22669049 GetlocP int3 01 01 13 10 58 13 12 58 @41868 16 to 74131: int3 02 @25833 none GetlocP int3 01 01 06 49 36 06 51 36 @32504 16 to 88954: int3 02 @24922 none GetlocP int3 01 01 08 40 00 08 42 00 @34812 16 to 103777: int3 02 @26361 none GetlocP int3 01 01 08 04 31 08 06 31 @62268 16 to 118600: int3 02 @29149 none GetlocP int3 01 01 07 47 19 07 49 19 @36681 Single speed, short seeks near the start: 1000 to 1001: int3 02 @30685 int2 02 @1568045 GetlocP int3 01 01 00 13 26 00 15 26 @41909 1000 to 1004: int3 02 @31688 int2 02 @2909352 GetlocP int3 01 01 00 13 29 00 15 29 @56411 1000 to 1016: int3 02 @36488 int2 02 @11944584 GetlocP int3 01 01 00 13 41 00 15 41 @41862 1000 to 1064: int3 02 @23530 int2 02 @11057994 GetlocP int3 01 01 00 14 14 00 16 14 @54010 1000 to 1256: int3 02 @41725 int2 02 @4789501 GetlocP int3 01 01 00 16 57 00 18 57 @63179 1000 to 2024: int3 02 @45559 int2 02 @6703239 GetlocP int3 01 01 00 26 74 00 28 74 @41870 Single speed, from the end inward: 118600 to 88954: int3 42 @35197 int2 02 @11911165 GetlocP int3 01 01 19 46 04 19 48 04 @41867 118600 to 59308: int3 02 @31501 int2 02 @16305869 GetlocP int3 01 01 13 10 58 13 12 58 @61259 118600 to 29662: int3 02 @39321 int2 02 @28089337 GetlocP int3 01 01 06 35 37 06 37 37 @53484 118600 to 16: int3 02 @25837 int2 02 @25610925 GetlocP int3 01 01 00 00 18 00 02 18 @41871 Double speed, from the start outward: 16 to 14839: int3 02 @25165 int2 02 @10470189 GetlocP int3 01 01 03 17 64 03 19 64 @41963 16 to 29662: int3 02 @24727 int2 02 @67163719 GetlocP int3 01 01 06 35 37 06 37 37 @60827 16 to 44485: int3 02 @32269 int2 02 @34496557 GetlocP int3 01 01 09 53 10 09 55 10 @68330 16 to 59308: int3 02 @30541 int2 02 @20911357 GetlocP int3 01 01 13 10 58 13 12 58 @61392 16 to 74131: int3 02 @25261 int2 02 @52867901 GetlocP int3 01 01 16 28 31 16 30 31 @61355 16 to 88954: int3 02 @30631 int2 02 @39016279 GetlocP int3 01 01 19 46 06 19 48 06 @64230 16 to 103777: int3 02 @38653 none GetlocP int3 01 01 23 05 07 23 07 07 @134251 16 to 118600: int3 02 @26509 int2 02 @19638893 GetlocP int3 01 01 26 21 25 26 23 25 @64906 Double speed, short seeks near the start: 1000 to 1001: int3 02 @27609 int2 02 @1338361 GetlocP int3 01 01 00 13 26 00 15 26 @51615 1000 to 1004: int3 02 @22186 int2 02 @2015754 GetlocP int3 01 01 00 13 29 00 15 29 @60827 1000 to 1016: int3 02 @29965 int2 02 @2247613 GetlocP int3 01 01 00 13 42 00 15 42 @41966 1000 to 1064: int3 02 @23289 int2 02 @6524505 GetlocP int3 01 01 00 14 14 00 16 14 @41962 1000 to 1256: int3 02 @23293 int2 02 @6794317 GetlocP int3 01 01 00 16 56 00 18 56 @61344 1000 to 2024: int3 02 @23341 int2 02 @3663037 GetlocP int3 01 01 00 26 74 00 28 74 @61358 Double speed, from the end inward: 118600 to 88954: int3 02 @55981 int2 02 @13896989 GetlocP int3 01 01 19 46 04 19 48 04 @41957 118600 to 59308: int3 02 @67469 int2 02 @12791133 GetlocP int3 01 01 13 10 59 13 12 59 @42000 118600 to 29662: int3 02 @63757 int2 02 @13460125 GetlocP int3 01 01 06 35 39 06 37 39 @41963 118600 to 16: int3 02 @59629 int2 02 @20483469 GetlocP int3 01 01 00 00 16 00 02 16 @61359 Mode 80 put back to 20: int3 02 @57960 Done. ``` 04DSP.txt: ``` ===== 04 DSP CD SPEED AND SPIN | BIOS 19951204 System ROM Version 3.0 11/18/96 A BadVaddr as the group starts: 00000480 Speed change, Stop then MotorOn, and Init, each timed. Switches (Test 21h, bit1 door open, bit0 head at POS0): int3 00 @39745. Getstat: int3 02 @29871. Mode 20. HINTMSK was 1F. Single to double speed, then ReadN at once: INT3 int3 02 @32714, first INT1 int1 22 @5850138 Double to single speed, then ReadN at once: INT3 int3 02 @23019, first INT1 int1 22 @28432907 Stop: int3 02 @54438 int2 00 @12902006 MotorOn after it: int3 00 @51818 int2 02 @63162554 Init: int3 02 @83721 int2 02 @4459785 Done. ``` ## References [^run]: Hardware test run 20260930T0000Z-5501a-card-i on the SCPH-5501: [cddisc output](/tests/raw/20260930T0000Z-5501a-card-i/cddisc/01DID.txt) and the other files listed under that run.