; Absolute Disk Read: GETSEC ( uses BIOS interrupt 0x25 );; Interfaces to Computer Innovations C-86 "c" compiler V1.32 (& later); See DOS 2.10 Technical Reference page 5-10, and Technical Reference; page A-32. This code was written by Mike Sirmans (05-25-84).; --------------------------------------------------------------------; THIS ROUTINE IS POWERFUL. (AND AS SUCH, IS DANGEROUS IN THE WRONG; HANDS). BE CAREFUL HOW YOU USE IT. I ASSUME NO RESPONSIBILITY.; --------------------------------------------------------------------;; Synopsis: int getsec(drive,numsec,begsec,buffer); unsigned int drive; /* 0=A, 1=B, etc. */; unsigned int numsec; /* Number of sectors to read */; unsigned int begsec; /* Beginning logical sector */; char *buffer; /* Transfer address */;; Function: The number of sectors specified are transferred ; between the given drive and the transfer address. ; LOGICAL SECTOR NUMBERS are obtained by numbering; each sector sequentially starting from track 0, head 0,; sector 1 (logical sector 0) and continuing along the; same head, then to the next head until the last sector; on the last head of the track is counted. Thus, ; logical sector 1 is track 0, head 0, sector 2,; logical sector 2 is track 0, head 0, sector 3, & so on.;; Returns: NULL if the operation is successful.; otherwise, error codes are as follows:;; hex 80 Attachment failed to respond.; hex 40 SEEK operation failed.; hex 20 Controller failure.; hex 10 Bad CRC on diskette read.; hex 08 DMA overrun on operation.; hex 04 Requested sector not found.; hex 03 Write attempt on write-protected diskette.; hex 02 Address mark not found.; hex FF Unspecified (error other than those above).;code segment byte public ;segment registers remain intact assume cs:code ;all other registers will be destroyed public getsecgetsec: push bp ;save old frame pointer mov bp,sp ;get new frame pointer mov ax,4[bp] ;put drive number into AL xor ah,ah mov cx,6[bp] ;number of sectors to fetch mov dx,8[bp] ;logical record number of 1st sector mov bx,10[bp] ;pointer to transfer address int 25h ;BIOS call jc error ;error has occurred if carry flag = 1 mov al,00H ;NULL to indicate sucessful completion jmp doneerror: cmp al,00H ;detect unspecified error code 00H jne done ;...change to 0FFh if found to mov al,0FFH ;...differentiate it from success codedone: xor ah,ah ;return AL only popf ;remove flags int 0x25 left on stack pop bp ;restore original frame pointer ret ;all donecode ends end  
|