发新话题
打印

[转载]绝对扇区读写的代码

[转载]绝对扇区读写的代码

文章作者:佚名

;  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  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

人情如冰六月寒,花做一份艳,为谁笑人间? 如果任何人发现我转载的有图像的文章中图像失效或者文章有问题,请及时短消息通知我。先谢谢。::)) coup de foudre

TOP

发新话题