; ; 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 getsec getsec: 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 done error: cmp al,00H ;detect unspecified error code 00H jne done ;...change to 0FFh if found to mov al,0FFH ;...differentiate it from success code done: xor ah,ah ;return AL only popf ;remove flags int 0x25 left on stack pop bp ;restore original frame pointer ret ;all done code ends end