CD/Streaming Library (libcd)
Provides functions for controlling the CD-ROM drive and streaming data.
| Library | libcd.lib |
|---|---|
| Header File | libcd.h |
| SDK | Psy-Q |
Overview
The CD/Streaming Library (libcd) consists of two separate libraries. The CD-ROM library controls the built-in CD-ROM drive and provides CD sound control and other services. The streaming library is a group of functions that continuously read real-time data such as movies, sounds or vertex data from high-capacity media.1
A program that uses libcd links with libcd.lib and includes libcd.h. A program that uses only streaming may include libds.h instead.1
This library is part of the run-time library that Sony distributed with the Psy-Q development tools.2
CD-ROM Sectors
Digital data is recorded on a CD-ROM in a spiral, as on a CD audio disc, and is handled in units called sectors. One second of data is divided into 75 sectors. Each sector is one of the following types:1
| Sector type | Stored data |
|---|---|
| Audio sector | CD-DA audio data |
| ADPCM sector | ADPCM compressed audio data |
| Data sector | User data |
An audio sector holds 44.1 kHz digital stereo audio, which is ordinary CD audio. The CdlPlay command plays it, and it cannot be read as user data. A data sector holds user data, and although its user area varies somewhat with the mode, the standard is 2048 bytes in the mode 1 format. An ADPCM sector, strictly a real-time or mode 2 form 2 sector, holds ADPCM compressed audio that plays in the same way as an audio sector.1
Interleave
ADPCM compresses the audio of an audio sector to 1/4. ADPCM sectors are therefore placed on the disc every four sectors, so that the drive plays ADPCM without seeking for each sector. This arrangement is called interleaving. The remaining sectors can hold other data, which the drive reads while the audio plays. At double speed the ADPCM sectors are placed every 8 sectors.134
Sectors of other ADPCM channels can be interleaved in the same way. For example, with 8 channels (A0 to A7) interleaved, the program switches between 8 channels of audio without seeking. The CdlSetfilter command selects the channel by the file and channel members of a CdlFILTER structure, and it is effective only when CdlModeSF is set in the mode.45
Addressing
For compatibility with CD audio, a position on the disc is given by the track number, the index number and a time in minutes, seconds and sectors. A second has 75 sectors and a minute 60 seconds, and the first sector is at 00 minutes 02 seconds 00 sectors. A track signal is recorded at the start of each track, and the table of track positions is recorded at the start of the disc as the TOC (Table of Contents).3
To make position calculation easy, a data sector may also be addressed by the total number of sectors from 00:02:00, which is called the absolute sector. CdIntToPos() and CdPosToInt() convert between the two forms. Minute, second and sector are BCD values in the CdlLOC structure, in which each decimal digit has a 4-bit field, so decimal 60 is written 0x60.36
File System
On a disc recorded in the ISO-9660 format, the position of a file can also be found through the file system. A CD-ROM is read-only, so the sectors of each file are arranged contiguously and a file is read from its start position alone. The disc therefore needs nothing like a FAT (File Allocation Table), and CdSearchFile() serves as the index of file names.3
CdSearchFile() searches by the absolute path of the file and stores the result in a CdlFILE structure. ISO-9660 positions are more accurate than TOC positions, which have only second resolution, but they cannot address audio sectors. CdGetToc() reads the TOC. The positions of all tracks and files are fixed before the disc is made, so these utilities serve mainly in development and debugging.5
Transfer Rate
The drive rotates the disc at normal speed, the same as an ordinary CD player, or at double speed. The transfer rates are therefore 150 KB/sec and 300 KB/sec, which means 75 sectors per second at normal speed and 150 sectors per second at double speed.3
Sector Buffer
The CD-ROM transfer rate is very slow compared with the 132 MB/sec main bus. The CD-ROM system therefore has a local memory for one sector of data, called the sector buffer. A read command places each sector in the sector buffer, where it stays valid until the next sector overwrites it. CdGetSector() transfers it to main memory at high speed.78
Because the sector buffer is overwritten constantly, each sector must be transferred before the next arrives. Data for the frame buffer or the sound buffer goes through main memory first. The sector size depends on the mode but is usually 2 KB. In that case one CdGetSector() transfers at most 2 KB. CdGetSector() is a blocking function, so the transfer is complete when it returns.9
Sound Control
The CD-ROM subsystem outputs left and right audio for both CD audio and ADPCM. The audio goes to the SPU, where it is mixed with the SPU voices and output as one sound. Four attenuators control the CD-ROM audio output, and CdMix() sets them with a CdlATV structure.7
Primitive Commands
The lowest level of operation is to issue commands directly to the CD-ROM subsystem with CdControl(), which takes the command, a parameter and a result buffer. These low-level commands are called primitives:710
| Symbol | Code | Type | Details |
|---|---|---|---|
| CdlNop | 0x01 | B | No operation |
| CdlSetloc | 0x02 | B | Set seek location |
| CdlPlay | 0x03 | B | CD-DA start play |
| CdlForward | 0x04 | B | Fast forward |
| CdlBackword | 0x05 | B | Rewind |
| CdlReadN | 0x06 | B | Data read start with retry |
| CdlStanby | 0x07 | N | Wait with disc rotating |
| CdlStop | 0x08 | N | Stop disc rotation |
| CdlPause | 0x09 | N | Pause at current location |
| CdlMute | 0x0b | B | CD-DA mute |
| CdlDemute | 0x0c | B | Release mute |
| CdlSetfilter | 0x0d | B | Select ADPCM sector to play |
| CdlSetmode | 0x0e | B | Set basic mode |
| CdlGetparam | 0x0f | B | Get current mode |
| CdlGetlocL | 0x10 | B | Get logical location (data sector) |
| CdlGetlocP | 0x11 | B | Get physical location (audio sector) |
| CdlSeekL | 0x15 | N | Logical seek (data sector) |
| CdlSeekP | 0x16 | N | Physical seek (audio sector) |
| CdlReadS | 0x1b | B | Data read start without retry |
B is blocking and N is non-blocking. CdlSetloc, CdlReadN, CdlReadS and CdlPlay take a CdlLOC start position, CdlSetfilter takes a CdlFILTER, CdlSetmode takes the mode byte and CdlGetTD takes a BCD track number. The other commands take NULL.106
Every command returns 8 bytes, so the result buffer needs 8 bytes even when the result is only the status. A NULL result pointer suppresses the result. The first byte of the result of almost every command is the CD-ROM status:11
| Symbol | Code | Details |
|---|---|---|
| CdlStatPlay | 0x80 | CD-DA playing |
| CdlStatSeek | 0x40 | Seeking |
| CdlStatRead | 0x20 | Reading data sector |
| CdlStatShellOpen | 0x10 | Shell open |
| CdlStatSeekError | 0x04 | Error during seeking or reading |
| CdlStatStandby | 0x02 | Motor rotating |
| CdlStatError | 0x01 | Command issue error |
The CdlNop command clears the shell open flag. To learn whether the cover is open now, the program therefore issues CdlNop at least once before it tests the flag.11
Command Details
CdlSetloc sets the target position without moving the head, and CdlPlay, CdlReadN, CdlReadS, CdlSeekP and CdlSeekL use it when their own argument is NULL. CdlPlay seeks the target and starts CD-DA play. CdlReadN and CdlReadS seek the target and then read data sectors into the local buffer.12
CdlReadS does not retry after an error and is used for real-time reading such as streaming. CdlReadN retries for up to 8 seconds after a read error, and the read may still fail. Because a retry reads the sector again, CdlReadN cannot be used while ADPCM plays or where a fixed transfer rate is needed.128
CdlSeekL and CdlSeekP seek the target and wait in pause status. A CD-ROM has a long seek time, so moving the head in advance speeds up access when the target is known. CdlSeekL is a logical seek, which reads the address in the header of a data sector and is therefore accurate, but it works only on data sectors. CdlSeekP is a physical seek, which uses the subcode and works on every sector type, including audio sectors without a header, but it is imprecise.12
CdlStandby waits with the spindle motor turning. CdlStop stops the motor and returns the head to its home position, and the next seek, read or play starts faster from standby than from stop. CdlPause halts read or play and waits at the position of the head.12
CdlSetmode sets the basic mode of the drive from the logical OR of the following bits, and CdlGetparam returns the current mode:13
| Symbol | Code | Details |
|---|---|---|
| CdlModeStream | 0x100 | Normal streaming |
| CdlModeStream2 | 0x120 | Streaming with SUB HEADER information |
| CdlModeSpeed | 0x80 | 0: normal speed, 1: double speed |
| CdlModeRT | 0x40 | 0: ADPCM off, 1: ADPCM on |
| CdlModeSize1 | 0x20 | Sector size 0: 2048 bytes, 1: 2340 bytes |
| CdlModeSize0 | 0x10 | Sector size 1: 2328 bytes |
| CdlModeSF | 0x08 | Subheader filter |
| CdlModeRept | 0x04 | Report mode |
| CdlModeAP | 0x02 | Autopause |
| CdlModeDA | 0x01 | CD-DA play |
CdlGetlocL returns the minute, second and sector of the data sector being read or the ADPCM being played, with the mode and the file and channel numbers, and it does not work while an audio sector plays. CdlGetlocP returns the track, the index, the time within the track and the absolute time from the subcode, so it works on every sector type. CdlGetTN returns the first and last track numbers, and CdlGetTD returns the TOC minute and second of a track, or the total time for track 0.1314
Command Synchronization
A command that takes time returns before its processing completes and is called a non-blocking command. A blocking command waits for completion. A non-blocking command continues in the background after CdControl() returns, and its result at that point is only temporary. CdSync() or a callback reports the real completion, and CdControlB() blocks for every command.1415
The execution status of a command is CdlNoIntr while it runs, CdlComplete when it has finished and the next command can be received, and CdlDiskError after an error. CdSync(0) waits until the status leaves CdlNoIntr and CdSync(1) returns at once. Commands are not queued, so while the status is CdlNoIntr a new command waits for the previous one to finish.15
CdSyncCallback() registers a function called when the status changes from CdlNoIntr to CdlComplete or CdlDiskError. For example, the callback of a CdlSeekL can issue CdlPlay, so the program is not blocked during the seek. CdControl() also blocks briefly until the subsystem acknowledges the command. CdControlF() returns without this wait, in which case CdSync() and polling must check for errors.16
Sector Ready
CdReady() reports the state of the sector buffer: CdlNoIntr while the sector is prepared, CdlDataReady when it is ready and CdlDiskError after an error. CdReady(0) blocks until the state leaves CdlNoIntr, and after it returns the state goes back to CdlNoIntr. CdReadyCallback() registers a function called when each sector is ready. This callback works at a lower level than CdReadSync() and CdReadCallback(), which report the end of a CdRead().89
In double speed mode 300 sectors arrive each second, which leaves 1/300 second for each sector. A sector can therefore be skipped. A program that reads with the low-level functions therefore sets CdlModeSize1 to read the sector header. It then checks with CdGetSector() that the address in the first 12 bytes follows the address of the previous sector.17
The libcd ready callback takes two parameters, and the intr parameter must be checked, since the callback is also called when a read fails. A callback that is no longer needed is cleared at once, or a later CdlDataReady may call it unexpectedly. A command issued from a CdSyncCallback() function can call the same callback again and loop without end.1718
High-Level Interface
CdRead() combines CdlReadN and CdGetSector() and reads several sectors into main memory. It uses CdReadyCallback() internally, so that callback is not available while CdRead() runs. CdRead() is non-blocking. In non-blocking mode CdReadSync() returns the number of unread sectors, which may not decrease steadily because CdRead() retries internally.9419
From library version 3.5, CdRead() checks the continuity of the sector headers, and a sector with an incorrect header is not read. Many errors in CdRead() therefore point to the recording format of the disc. CdReadFile() reads a file, CdReadExec() loads an executable file and CdPlay() plays CD-DA tracks.1920
Report Mode
With CdlModeRept set during audio play, the status changes to CdlDataReady 10 times each second, and the result holds the following report:21
| Byte | Contents |
|---|---|
| 0 | Status |
| 1 | Track |
| 2 | Index |
| 3 | Amin |
| 4 | Asec |
| 5 | Aframe |
| 6 | LevelH |
| 7 | LevelL |
The report alternates between absolute and relative time. When it is relative, the highest bit of the frame byte is set, which is possible since frames run only from 0 to 74. The level takes 15 bits of two bytes, and the remaining bit gives the L or R channel. Report mode is turned on only while CD-DA plays, since during a data read its interrupts cannot be told from the data interrupts.22
Events and Callbacks
At initialization a default callback is registered for each callback, and these callbacks deliver the following events:21
| Cause descriptor | Details | Event type |
|---|---|---|
| HwCdRom | Processing complete | EvSpCOMP |
| HwCdRom | Data ready | EvSpDR |
| HwCdRom | Data end | EvSpDE |
| HwCdRom | Error occurred | EvSpERROR |
An event handler can therefore detect the end of a command or a read. However, a new callback releases the default callback and the events stop, and restoring the default is left to the application. The synchronization functions and callbacks are the following:21
| Called function | Sync detect | Callback | Details |
|---|---|---|---|
| CdControl | CdSync | CdSyncCallback | Issue command |
| CdReady | CdReadyCallback | Sector read | |
| CdRead | CdReadSync | CdReadCallback | Multiple sector read |
Disc Notes
A disc must meet the CD-ROM XA specifications, so its data tracks come before its optional DA tracks. Autopause may fail with no gap or a very short gap between tracks, so the gaps are at least two seconds. A track jump within three minutes of the outer edge can throw the head off the disc. The outer three minutes are therefore not accessed and are usually filled with NULLs or with one continuous file such as an ending movie.222317
The CD-ROM decoder has 32 KB of local memory, but its control software does not read ahead. A read must therefore start within 6.6 msec at double speed and 13.3 msec at normal speed after the data ready interrupt, or data may be skipped. FF and FR cannot be used while data is read, and opening the cover cancels the operation in progress.23
A watchdog checks the state of the CD-ROM subsystem every few vertical syncs. The watchdog returns the drive to normal operation after any error. During CD-DA or CD-XA play it issues CdlNop and plays the track again when CdlStatPlay is off. During a read it restarts all reads when no CdlDataReady has come for a few seconds.1819
Swapping Discs
Before a disc is swapped, the CD subsystem is set to normal speed and may be stopped with CdlStop. A swap is detected with CdlNop. CdlStatShellOpen is always 1 while the cover is open and 1 only the first time after it closes, so a change from 1 to 0 means the disc may have changed. After the cover closes the subsystem reads the TOC, and only CdlNop and CdlGetTN may be issued until CdlGetTN succeeds.20
A logical read then checks that the disc is a PlayStation disc. On another disc it returns a command error. A command error is a CdlDiskError with bit 0 of result[0] and bit 6 of result[1] set. The only recovery is to open the cover and mount the disc again. The debugging station accepts CD-Rs as PlayStation discs, while the PlayStation accepts only black discs.24
Changing the Motor Speed
A command that moves the head issued right after a change in transfer speed loses control of the head, which can run to the mechanical stopper and make a strange sound. The program therefore waits at least three vertical syncs after a speed change before it issues CdlSeekP, CdlSeekL, CdlReadS, CdlReadN or CdlPlay. CdInit() sets the speed to normal.2425
Debug Messages
CdSetDebug() sets the debug level. Messages of level 0 are always printed, and messages of levels 1 and 2 when the debug level is 1 or 2. They include CD timeout, when no callback came from the subsystem in the expected time. They also include DiskError for a fatal error and CdRead: sector error, when the sector addresses were out of sequence and CdRead() retried from the first sector.252627
Streaming Library
The streaming library reads real-time data from high-capacity media in units called frames. A frame consists of one or more sectors, and each frame the library delivers is complete and contiguous without omissions. The library reads the CD-ROM and places the data in memory in units of time, while the user program displays the data and outputs the sound.28
When sectors are read continuously, each frame must be processed in less time than one frame takes to read. Otherwise the data accumulates and the buffer overflows. The library solves this by discarding read data in whole frames when processing is late, so the data that remains is always complete. When a frame must not be discarded, the head can be moved back instead, but XA audio and streaming then cannot be used together.2829
The library stores the data in a ring buffer whose size is set in sectors by StSetRing(). StGetNext() returns the start of a frame when a whole frame is available, and StFreeRing() releases it so that new data can be read into it. The ring buffer has a header region of 32 bytes per sector and a data region of 2016 bytes per sector.2930
A sequence that fits in the ring buffer can be repeated from memory without the CD-ROM, when end_frame of StSetStream() or StSetEmulate() is 0. StCdInterrupt() handles the CD-ROM interrupts during streaming and makes 2 KB DMA transfers, which hold the bus for a long time. For 24-bit RGB movies it can therefore be called by the program at a suitable time when the StCdIntrFlag flag is set.3031
Structures
In the tables below, Introduced is the run-time library version that added the item.32
libcd has the following structures:32
| Structure | Introduced | Purpose |
|---|---|---|
CdlATV |
2.x | Audio attenuation structure. |
CdlFILE |
2.x | ISO-9660 file system file descriptor. |
CdlFILTER |
3.0 | ADPCM channel. |
CdlLOC |
2.x | Time-code based CD-ROM disc position. |
StHEADER |
2.x | Sector header. |
Functions
libcd has the following functions:33
| Function | Introduced | Purpose |
|---|---|---|
CdComstr |
2.x | Get character string corresponding to command code (for debugging). |
CdControl |
2.x | Issue primitive command to CD-ROM system. |
CdControlB |
2.x | Issue primitive command to CD-ROM system (Blocking-type function). |
CdControlF |
2.x | Issue primitive command to CD-ROM system (high speed). |
CdDataCallback |
3.0 | Define a routine to be executed when data transfer is completed. |
CdDataSync |
3.2 | Wait for or check a data transfer initiated by CdGetSector2(). |
CdDiskReady |
3.5 | Determine CD-ROM status after disc change. |
CdFlush |
3.2 | CD-ROM command flush. |
CdGetDiskType |
3.5 | Get disc format. |
CdGetSector |
2.x | Transfer sector buffer data to main memory. |
CdGetSector2 |
4.0 | Transfer sector buffer data to main memory (Non-blocking type). |
CdGetToc |
2.x | Read CD-ROM table of contents information. |
CdInit |
2.x | Initialize CD-ROM system. |
CdIntstr |
2.x | Get character string corresponding to command status code (for debugging). |
CdIntToPos |
2.x | Translate an absolute sector number to a minute/seconds/sector time code. |
CdLastCom |
3.2 | Get last command issued by CDControl()/CDControlB(). |
CdLastPos |
3.5 | Get CD-ROM location most recently specified. |
CdMix |
2.x | Set attenuation for CD audio. |
CdMode |
3.5 | Get latest CD-ROM mode. |
CdPlay |
3.5 | Play CD-DA tracks. |
CdPosToInt |
2.x | Translate time code to an absolute sector number. |
CdRead |
2.x | Read multiple sectors from the CD-ROM. |
CdRead2 |
2.x | Start reading data from the CD-ROM. |
CdReadBreak |
4.0 | Interrupt CdRead(). |
CdReadCallback |
2.x | Define a callback function to be executed on completion of CdRead(). |
CdReadExec |
3.5 | Load PlayStation-format executable program file from CD-ROM. |
CdReadFile |
3.5 | Read a CD-ROM file. |
CdReadSync |
2.x | Check completion of CdRead() and related functions. |
CdReady |
2.x | Wait for CD-ROM data to be ready. |
CdReadyCallback |
2.x | Define CdReady callback function. |
CdReset |
2.x | Initialize CD-ROM subsystem. |
CdSearchFile |
2.x | Get location and size from CD-ROM file name. |
CdSetDebug |
2.x | Set debug level. |
CdStatus |
3.0 | Get latest CD-ROM status. |
CdSync |
2.x | Wait for or check completion of CD-ROM command. |
CdSyncCallback |
2.x | Define CdSync callback function. |
StCdInterrupt |
2.x | Handler for interrupts from CD-ROM (internal function). |
StClearRing |
2.x | Flush ring buffer. |
StFreeRing |
2.x | Release ring buffer. |
StGetBackloc |
3.5 | Return location and ID of first frame in the ring buffer in order to avoid any frame skip. |
StGetNext |
2.x | Get one frame of ring buffer data. |
StGetNextS |
3.5 | Get one frame of ring buffer data from memory. |
StNextStatus |
3.5 | Return status of the next frame. |
StRingStatus |
3.5 | Return status of ring buffer. |
StSetChannel |
2.x | Set streaming channel. |
StSetEmulate |
2.x | Set parameters for streaming emulation. |
StSetMask |
2.x | Control the playing of streaming. |
StSetRing |
2.x | Set ring buffer. |
StSetStream |
2.x | Set streaming parameters. |
StUnSetRing |
2.x | Release interrupt used by streaming library. |
References
-
^ a b c d e Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-3.
-
^ Sony Computer Entertainment Inc. Programmer Tools CD (DTL-S2002), README.TXT. 11/26/96. Section "CD-ROM Contents - Highlights", directories \PSX and \PSYQ.
-
^ a b c d e Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-4.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-16.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-17.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-7.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-5.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-14.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-15.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-6.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-8.
-
^ a b c d Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-9.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-10.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-11.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-12.
-
^ Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-13.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-21.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-22.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-23.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-24.
-
^ a b c Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-18.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-19.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-20.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-25.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-26.
-
^ Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-27.
-
^ Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-28.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-30.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-31.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-32.
-
^ Sony Computer Entertainment Inc. Run-Time Library Overview. Run-Time Library 4.4. January 1999. Page 11-33.
-
^ a b Sony Computer Entertainment Inc. Run-Time Library Reference. Run-Time Library 4.4. January 1999. Pages 10-3 to 10-7.
-
^ Sony Computer Entertainment Inc. Run-Time Library Reference. Run-Time Library 4.4. January 1999. Pages 10-8 to 10-58.