/* 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; }
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; }