delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1995/08/06/23:16:48

Xref: news-dnh.mv.net comp.os.msdos.djgpp:1377
Path: news-dnh.mv.net!mv!news.sprintlink.net!newsfeed.internetmci.com!EU.net!i2unix!news
From: mc5686 AT mclink DOT it (Mauro Condarelli)
Newsgroups: comp.os.msdos.djgpp
Subject: int 25/26
Date: Sat, 05 Aug 1995 11:37:18 GMT
Lines: 85
Nntp-Posting-Host: 192.106.166.228
To: djgpp AT sun DOT soe DOT clarkson DOT edu
Dj-Gateway: from newsgroup comp.os.msdos.djgpp

Hi,
i' trying to port to djgpp some code which uses dos int 25h/26h (absolute
disk read/write).
Here follows a code fragment:

/*----- Absolute disk Read-------------------------------------------*/
typedef struct {
        quad    sector  __attribute__ ((packed));
        word    nsects  __attribute__ ((packed));
        word    buff_o  __attribute__ ((packed));
        word    buff_s  __attribute__ ((packed));
} DiskReadPacket;

int
ReadSectors(void *buf, quad sect, int n) {
        DiskReadPacket drp;
        __dpmi_regs r;

        drp.sector = sect;
        drp.nsects = n;
        drp.buff_o = (__tb & 15) +sizeof(drp);
        drp.buff_s = __tb / 16;
        dosmemput(&drp, sizeof(drp), __tb);

        r.h.al = DriveNumber;
        r.x.cx = 0xffff;
        r.x.bx = __tb & 15;
        r.x.ds = __tb / 16;

        __dpmi_int(0x25, &r);
        if (r.x.flags & 1) {
                /* error! */
                return 0;
        }
        dosmemget(__tb+sizeof(drp), n * BootSector.eBPB.SectSiz, buf);
        return n;
}

/*----- FAT Handling ------------------------------------------------*/

This fails with ax=701fh and flags=3003h while the original Borland C++

/*----- Absolute disk Read-------------------------------------------*/
typedef struct {
        quad    sector;
        word    nsects;
        byte far *buff;
} DiskReadPacket;

int
ReadSectors(void *buf, quad sect, int n) {
        DiskReadPacket drp;
        union REGS r;
        struct SREGS s;

        drp.sector = sect;
        drp.nsects = n;
        drp.buff   = buf;

        r.h.al = DriveNumber;
        r.x.cx = 0xffff;
        r.x.bx = FP_OFF(&drp);
        s.ds   = FP_SEG(&drp);

        int86x(0x25, &r, &r, &s);
        if (r.x.flags & 1) {
                // error!
                return 0;
        }
        return n;
}

/*----- FAT Handling ------------------------------------------------*/

works flawlessly.
I know int 25 leaves a word on the stack, which skould be pop-ed by the user,
can it be that this confuses __dpmi_int() ???

or is there some evident error i just can't see (shame on me)?

Any reply MOST welcome :) :)

Best Regards
Mauro Condarelli (mc5686 AT mclink DOT it)

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019