コード例 #1
0
ファイル: inthndlr.c プロジェクト: TijmenW/FreeDOS
/* 
    this function is called from an assembler wrapper function 
*/
VOID int2526_handler(WORD mode, struct int25regs FAR * r)
{
  ULONG blkno;
  UWORD nblks;
  BYTE  FAR *buf;
  UBYTE drv;
  
  if (mode == 0x26) mode = DSKWRITEINT26;
  else              mode = DSKREADINT25;
  
  drv = r->ax;

  if (drv >= lastdrive)
  {
    r->ax = 0x201;
    r->flags |= FLG_CARRY;
    return;
  }
  

  nblks = r->cx;
  blkno = r->dx;
    
  buf = MK_FP(r->ds, r->bx);
    
  if (nblks == 0xFFFF)
  {
    /*struct HugeSectorBlock FAR *lb = MK_FP(r->ds, r->bx);*/
    blkno = ((struct HugeSectorBlock FAR *)buf)->blkno;
    nblks = ((struct HugeSectorBlock FAR *)buf)->nblks;
    buf   = ((struct HugeSectorBlock FAR *)buf)->buf;
  }
  

  InDOS++;

  r->ax=dskxfer(drv, blkno, buf, nblks, mode);

  if (mode == DSKWRITE)
    if (r->ax <= 0)
        setinvld(drv);

  if (r->ax > 0)
  {
    r->flags |= FLG_CARRY;
    --InDOS;
    return;
  }


  r->ax = 0;
  r->flags &= ~FLG_CARRY;
  --InDOS;
  
}
コード例 #2
0
ファイル: inthndlr.c プロジェクト: krinkleneck/ForthDOS
VOID int26_handler(struct int25regs FAR * r)
{
  ULONG blkno;
  UWORD nblks;
  BYTE FAR *buf;
  UBYTE drv = r->ax & 0xFF;

  InDOS++;

  if (r->cx == 0xFFFF)
  {
    struct HugeSectorBlock FAR *lb = MK_FP(r->ds, r->bx);
    blkno = lb->blkno;
    nblks = lb->nblks;
    buf = lb->buf;
  }
  else
  {
    nblks = r->cx;
    blkno = r->dx;
    buf = MK_FP(r->ds, r->bx);
  }

  if (drv >= nblkdev)
  {
    r->ax = 0x202;
    r->flags |= FLG_CARRY;
    return;
  }

  if (!dskxfer(drv, blkno, buf, nblks, DSKWRITE))
  {
    /* XXX: should tell the user exactly what the error was */
    r->ax = 0x202;
    r->flags |= FLG_CARRY;
    return;
  }

  setinvld(drv);

  r->ax = 0;
  r->flags &= ~FLG_CARRY;
  --InDOS;
}