INT 25h Absolute disc read

Action: Provides a direct link into the XIOS to allow data to be read from a specified memory location to disc, starting at a specified logical disc sector into a specified memory location.
On entry: AL = Drive number (0 = A:, 1 = B: etc)
CX = number of sectors to read
DX = start sector relative (logical) number
DS:BX = Segment offset of DTA
Returns: Carry clear if successful
Carry set if failed, AX = Error code, as follows
00 - write protect
01 -unknown unit
02 - drive not ready
03 - unknowncommand
04 - data error (CRC failed)
05 - Bad request structure length
06 - seek error
07 - unknown media type
08 - sector not found
09 - printer out (of paper)
0Ah - write fault
0Bh - read fault
0Ch - general failure

AH =
80h - attachment failed to respond
40h - seek operation failed
20h - controller failed
10h - data error (CRC failed)
08 - DMAfailure
04 - requested sector not found
03 - write protect fault
02 - bad address mark
01 - bad command
Notes: All register contents except those of the segment registers may be destroyed.

When this call returns, the CPU flags, originally pushed onto the stack, are still on the stack. The calling program should issue a POPF instruction or ADD SP,2 to prevent uncontrolled stack growth and to make earlier data pushed on the stack accessible correctly.

Logical disc sectors begin at one (unlike BBC media), so the total number of sectors per disc is also the number of the last sector. Sectors are read logically by this call so, although it performs as a hardware command, formatting skew factors are catered for.