55 lines
2.0 KiB
NASM
55 lines
2.0 KiB
NASM
|
;
|
||
|
; 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
|