www.digitalmars.com         C & C++   DMDScript  

c++ - possible bug in biosdisk() library function?

reply Scott <Scott_member pathlink.com> writes:
Am I doing something wrong or have I encountered a bug in the biosdisk() library
function?

While the biosdisk function reads sectors fine, it does not seem to write using
the following short program (it is modelled on the Digital Mars bios.h
information page). Note that it seems that even though biosdisk should return 0
when successful, it is instead returning a value of 768 when successful, and 0
upon failure. I verified this return value error by many correct sector reads
from several sectors with the return value from biosdisk() always coming back
with a return value of 768, not 0. I should note that this program writes to the
disk just fine when compiled on DJGPP (with the proper result "if" lines
exchanged in that expect a 0 return when the function has been successful.

Thanks for any feedback,
Scott

___________________

#include <stdio.h>
#include <stdlib.h>
#include <bios.h>

int main(int argc, char **argv) {

const int amountToReadConstant=1;
int disk, target;
int result = 1;
unsigned char buf[512]; 
FILE *fp;
int i;
unsigned char pattern;

disk = 128;
pattern = 0x5a;
target = 60;

printf("\n\nAttempting direct disk read and write operations.\n\n\n\n");

for(i=0;i<512;i++)
buf[i]=pattern;

result = (int) biosdisk(_DISK_WRITE, disk, 0, 0, target, amountToReadConstant,
buf);
//if (result != 0) {
if (result == 0) {
printf("Disk write operation did not complete correctly.\n");
printf("Result error code was: %d \n\n\n", result);
return 0;
}
else
printf("Wrote a sector.\n\n");

// Read back the sector.
result = (int) biosdisk(_DISK_READ, disk, 0, 0, target, amountToReadConstant,
buf);
//if (result != 0) {
if (result == 0) {
printf("Disk read operation did not complete correctly.\n");
printf("Result error code was: %d \n\n\n", result);
return 0;
}
else
printf("Read a sector.\n\n");

if ( buf[0] != pattern )
printf("Write seems to have failed.\n\n");

fp=fopen("now-is.img","wb");
if(fp==NULL) {
printf("\nCould not open the file for writing.\n\n");
return 0;
}
printf("Writing the sector that was read to a file.\n\n\n");
for(i=0;i<512;i++)
fputc(buf[i],fp);
fclose(fp);

return 1; 
}
Sep 05 2003
parent reply "Walter" <walter digitalmars.com> writes:
Which memory model are you using?

"Scott" <Scott_member pathlink.com> wrote in message
news:bjbfgh$4fk$1 digitaldaemon.com...
 Am I doing something wrong or have I encountered a bug in the biosdisk()
library
 function?

 While the biosdisk function reads sectors fine, it does not seem to write
using
 the following short program (it is modelled on the Digital Mars bios.h
 information page). Note that it seems that even though biosdisk should
return 0
 when successful, it is instead returning a value of 768 when successful,
and 0
 upon failure. I verified this return value error by many correct sector
reads
 from several sectors with the return value from biosdisk() always coming
back
 with a return value of 768, not 0. I should note that this program writes
to the
 disk just fine when compiled on DJGPP (with the proper result "if" lines
 exchanged in that expect a 0 return when the function has been successful.

 Thanks for any feedback,
 Scott

 ___________________

 #include <stdio.h>
 #include <stdlib.h>
 #include <bios.h>

 int main(int argc, char **argv) {

 const int amountToReadConstant=1;
 int disk, target;
 int result = 1;
 unsigned char buf[512];
 FILE *fp;
 int i;
 unsigned char pattern;

 disk = 128;
 pattern = 0x5a;
 target = 60;

 printf("\n\nAttempting direct disk read and write operations.\n\n\n\n");

 for(i=0;i<512;i++)
 buf[i]=pattern;

 result = (int) biosdisk(_DISK_WRITE, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk write operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Wrote a sector.\n\n");

 // Read back the sector.
 result = (int) biosdisk(_DISK_READ, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk read operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Read a sector.\n\n");

 if ( buf[0] != pattern )
 printf("Write seems to have failed.\n\n");

 fp=fopen("now-is.img","wb");
 if(fp==NULL) {
 printf("\nCould not open the file for writing.\n\n");
 return 0;
 }
 printf("Writing the sector that was read to a file.\n\n\n");
 for(i=0;i<512;i++)
 fputc(buf[i],fp);
 fclose(fp);

 return 1;
 }
Sep 05 2003
next sibling parent Scott <Scott_member pathlink.com> writes:
Hello Walter, and thank you for your swift reply, and your compiler.

I tried -ms, -mc, -mm, and -ml. Each compilation would read the sectors
correctly, but none would write.


In article <bjbq94$j97$1 digitaldaemon.com>, Walter says...
Which memory model are you using?

"Scott" <Scott_member pathlink.com> wrote in message
news:bjbfgh$4fk$1 digitaldaemon.com...
 Am I doing something wrong or have I encountered a bug in the biosdisk()
library
 function?

 While the biosdisk function reads sectors fine, it does not seem to write
using
 the following short program (it is modelled on the Digital Mars bios.h
 information page). Note that it seems that even though biosdisk should
return 0
 when successful, it is instead returning a value of 768 when successful,
and 0
 upon failure. I verified this return value error by many correct sector
reads
 from several sectors with the return value from biosdisk() always coming
back
 with a return value of 768, not 0. I should note that this program writes
to the
 disk just fine when compiled on DJGPP (with the proper result "if" lines
 exchanged in that expect a 0 return when the function has been successful.

 Thanks for any feedback,
 Scott

 ___________________

 #include <stdio.h>
 #include <stdlib.h>
 #include <bios.h>

 int main(int argc, char **argv) {

 const int amountToReadConstant=1;
 int disk, target;
 int result = 1;
 unsigned char buf[512];
 FILE *fp;
 int i;
 unsigned char pattern;

 disk = 128;
 pattern = 0x5a;
 target = 60;

 printf("\n\nAttempting direct disk read and write operations.\n\n\n\n");

 for(i=0;i<512;i++)
 buf[i]=pattern;

 result = (int) biosdisk(_DISK_WRITE, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk write operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Wrote a sector.\n\n");

 // Read back the sector.
 result = (int) biosdisk(_DISK_READ, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk read operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Read a sector.\n\n");

 if ( buf[0] != pattern )
 printf("Write seems to have failed.\n\n");

 fp=fopen("now-is.img","wb");
 if(fp==NULL) {
 printf("\nCould not open the file for writing.\n\n");
 return 0;
 }
 printf("Writing the sector that was read to a file.\n\n\n");
 for(i=0;i<512;i++)
 fputc(buf[i],fp);
 fclose(fp);

 return 1;
 }
Sep 06 2003
prev sibling parent reply Scott <Scott_member pathlink.com> writes:
Hello Walter, and thank you for your swift reply, and your compiler.

I tried -ms, -mc, -mm, and -ml. Each compilation would read the sectors
correctly, but none would write.


In article <bjbq94$j97$1 digitaldaemon.com>, Walter says...
Which memory model are you using?

"Scott" <Scott_member pathlink.com> wrote in message
news:bjbfgh$4fk$1 digitaldaemon.com...
 Am I doing something wrong or have I encountered a bug in the biosdisk()
library
 function?

 While the biosdisk function reads sectors fine, it does not seem to write
using
 the following short program (it is modelled on the Digital Mars bios.h
 information page). Note that it seems that even though biosdisk should
return 0
 when successful, it is instead returning a value of 768 when successful,
and 0
 upon failure. I verified this return value error by many correct sector
reads
 from several sectors with the return value from biosdisk() always coming
back
 with a return value of 768, not 0. I should note that this program writes
to the
 disk just fine when compiled on DJGPP (with the proper result "if" lines
 exchanged in that expect a 0 return when the function has been successful.

 Thanks for any feedback,
 Scott

 ___________________

 #include <stdio.h>
 #include <stdlib.h>
 #include <bios.h>

 int main(int argc, char **argv) {

 const int amountToReadConstant=1;
 int disk, target;
 int result = 1;
 unsigned char buf[512];
 FILE *fp;
 int i;
 unsigned char pattern;

 disk = 128;
 pattern = 0x5a;
 target = 60;

 printf("\n\nAttempting direct disk read and write operations.\n\n\n\n");

 for(i=0;i<512;i++)
 buf[i]=pattern;

 result = (int) biosdisk(_DISK_WRITE, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk write operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Wrote a sector.\n\n");

 // Read back the sector.
 result = (int) biosdisk(_DISK_READ, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk read operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Read a sector.\n\n");

 if ( buf[0] != pattern )
 printf("Write seems to have failed.\n\n");

 fp=fopen("now-is.img","wb");
 if(fp==NULL) {
 printf("\nCould not open the file for writing.\n\n");
 return 0;
 }
 printf("Writing the sector that was read to a file.\n\n\n");
 for(i=0;i<512;i++)
 fputc(buf[i],fp);
 fclose(fp);

 return 1;
 }
Sep 06 2003
parent "Walter" <walter digitalmars.com> writes:
Here are the library functions that implement it:

#include <bios.h>
#if __INTSIZE != 4
int biosdisk(int cmd, int drive, int head, int track, int sector,
     int nsects, void *buffer)
{
 struct diskinfo_t dinfo;

 dinfo.drive = drive;
 dinfo.head = head;
 dinfo.track = track;
 dinfo.sector = sector;
 dinfo.nsectors = nsects;
 dinfo.buffer = buffer;

 return(_bios_disk(cmd,&dinfo));
}
#endif

and:

include macros.asm

DISKINFO STRUC
        drive           DW      ?
        head            DW      ?
        track           DW      ?
        sector          DW      ?
        nsectors        DW      ?
        buffer          DD      ?
DISKINFO ENDS

[...]

T2:
    if LPTR
        pop     DS
    endif ;LPTR
        WINLEAVE
        ret
c_endp  _bios_timeofday


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Access BIOS disk (int 0x13)  functions
;       #include <bios.h>
;       int _bios_disk(int service, struct diskinfo_t *diskinfo)
; Usage:
;       service = 0     reset the disk system
;       service = 1     get diskette status
;       service = 2     read diskette sectors
;       service = 3     write diskette sectors
;       service = 4     verify diskette sectors
;       service = 5     format diskette sectors
        c_public _bios_disk
func    _bios_disk
        WINENTER
    if LPTR
        push    DS
        lds     BX,P+2[BP]
    else ;LPTR
        mov     BX,P+2[BP]
    endif ;LPTR
        mov     DL,byte ptr drive[BX]
        mov     DH,byte ptr head[BX]
        mov     CL,byte ptr sector[BX]
        mov     CH,byte ptr track[BX]
        mov     AL,byte ptr nsectors[BX]
        les     BX,buffer[BX]
        mov     AH,P[BP]
        int     13h
        jc      D1              ;error (error code is in AH)
        _if     <byte ptr P[BP]> e 0, D1
        _if     <byte ptr P[BP]> e 1, D2
        _if     <byte ptr P[BP]> ne 5, T2
D1:     clr     AL
        jmp     T2

D2:     xchg    AH,AL           ;put status bits in AH, 0 in AL
        jmp     T2
c_endp  _bios_disk

        endcode bios

        end

"Scott" <Scott_member pathlink.com> wrote in message
news:bjdgbs$3rl$1 digitaldaemon.com...
 Hello Walter, and thank you for your swift reply, and your compiler.

 I tried -ms, -mc, -mm, and -ml. Each compilation would read the sectors
 correctly, but none would write.


 In article <bjbq94$j97$1 digitaldaemon.com>, Walter says...
Which memory model are you using?

"Scott" <Scott_member pathlink.com> wrote in message
news:bjbfgh$4fk$1 digitaldaemon.com...
 Am I doing something wrong or have I encountered a bug in the
biosdisk()
library
 function?

 While the biosdisk function reads sectors fine, it does not seem to
write
using
 the following short program (it is modelled on the Digital Mars bios.h
 information page). Note that it seems that even though biosdisk should
return 0
 when successful, it is instead returning a value of 768 when
successful,
and 0
 upon failure. I verified this return value error by many correct sector
reads
 from several sectors with the return value from biosdisk() always
coming
back
 with a return value of 768, not 0. I should note that this program
writes
to the
 disk just fine when compiled on DJGPP (with the proper result "if"
lines
 exchanged in that expect a 0 return when the function has been
successful.
 Thanks for any feedback,
 Scott

 ___________________

 #include <stdio.h>
 #include <stdlib.h>
 #include <bios.h>

 int main(int argc, char **argv) {

 const int amountToReadConstant=1;
 int disk, target;
 int result = 1;
 unsigned char buf[512];
 FILE *fp;
 int i;
 unsigned char pattern;

 disk = 128;
 pattern = 0x5a;
 target = 60;

 printf("\n\nAttempting direct disk read and write
operations.\n\n\n\n");
 for(i=0;i<512;i++)
 buf[i]=pattern;

 result = (int) biosdisk(_DISK_WRITE, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk write operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Wrote a sector.\n\n");

 // Read back the sector.
 result = (int) biosdisk(_DISK_READ, disk, 0, 0, target,
amountToReadConstant,
 buf);
 //if (result != 0) {
 if (result == 0) {
 printf("Disk read operation did not complete correctly.\n");
 printf("Result error code was: %d \n\n\n", result);
 return 0;
 }
 else
 printf("Read a sector.\n\n");

 if ( buf[0] != pattern )
 printf("Write seems to have failed.\n\n");

 fp=fopen("now-is.img","wb");
 if(fp==NULL) {
 printf("\nCould not open the file for writing.\n\n");
 return 0;
 }
 printf("Writing the sector that was read to a file.\n\n\n");
 for(i=0;i<512;i++)
 fputc(buf[i],fp);
 fclose(fp);

 return 1;
 }
Sep 06 2003