--- Begin Message ---
diff -ruNp old/kernel/dsk.c new/kernel/dsk.c
--- old/kernel/dsk.c 2004-06-11 04:29:24.000000000 +0000
+++ new/kernel/dsk.c 2004-06-11 04:47:40.000000000 +0000
@@ -39,24 +39,27 @@ static BYTE *dskRcsId =
#define DebugPrintf(x)
#endif
-BOOL ASMPASCAL fl_reset(WORD);
-COUNT ASMPASCAL fl_diskchanged(WORD);
-
-COUNT ASMPASCAL fl_format(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_read(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_write(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_verify(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_setdisktype(WORD, WORD);
-COUNT ASMPASCAL fl_setmediatype(WORD, WORD, WORD);
-VOID ASMPASCAL fl_readkey(VOID);
-extern COUNT ASMPASCAL fl_lba_ReadWrite(BYTE drive, WORD mode,
- struct _bios_LBA_address_packet FAR
- * dap_p);
+void ASMPASCAL fl_readkey(void);
+int ASMPASCAL fl_reset(UBYTE drive);
+int ASMPASCAL fl_diskchanged(UBYTE drive);
+int ASMPASCAL fl_setdisktype(UBYTE drive, WORD type);
+int ASMPASCAL fl_setmediatype(UBYTE drive, WORD tracks, WORD sectors);
+int ASMPASCAL fl_read (UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_write (UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_verify(UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_format(UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_lba_ReadWrite(UBYTE drive, WORD mode,
+ struct _bios_LBA_address_packet FAR *);
#ifdef __WATCOMC__
+#pragma aux (pascal) fl_readkey modify exact [ax]
#pragma aux (pascal) fl_reset modify exact [ax dx]
#pragma aux (pascal) fl_diskchanged modify exact [ax dx]
-#pragma aux (pascal) fl_setdisktype modify exact [ax bx dx]
-#pragma aux (pascal) fl_readkey modify exact [ax]
+#pragma aux (pascal) fl_setdisktype modify exact [ax dx bx]
+#pragma aux (pascal) fl_setmediatype modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_read modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_write modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_format modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_verify modify exact [ax cx dx bx es]
#pragma aux (pascal) fl_lba_ReadWrite modify exact [ax dx]
#endif
@@ -261,13 +264,10 @@ STATIC WORD mediachk(rqptr rp, ddt * pdd
/*
* Read Write Sector Zero or Hard Drive Dos Bpb
*/
-STATIC WORD RWzero(ddt * pddt, UWORD mode)
+STATIC int RWzero(ddt * pddt, UWORD mode)
{
UWORD done;
-
- return LBA_Transfer(pddt, mode,
- (UBYTE FAR *) & DiskTransferBuffer,
- pddt->ddt_offset, 1, &done);
+ return LBA_Transfer(pddt, mode, DiskTransferBuffer, 0, 1, &done);
}
/*
@@ -350,7 +350,7 @@ STATIC WORD getbpb(ddt * pddt)
{
int ret = RWzero(pddt, LBA_READ);
if (ret)
- return dskerr(ret);
+ return ret;
}
if (getword(DiskTransferBuffer + 0x1fe) != 0xaa55 ||
@@ -467,13 +467,13 @@ STATIC WORD IoctlQueblk(rqptr rp, ddt *
STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track,
WORD sector, WORD count, VOID FAR * buffer)
{
- UWORD transferred;
+ UWORD done;
- /* apparently sector is ZERO, not ONE based !!! */
+ /* apparently here sector is ZERO, not ONE based !!! */
return LBA_Transfer(pddt, mode, buffer,
- ((ULONG) track * pddt->ddt_bpb.bpb_nheads + head) *
- (ULONG) pddt->ddt_bpb.bpb_nsecs +
- pddt->ddt_offset + sector, count, &transferred);
+ ((ULONG) track * pddt->ddt_bpb.bpb_nheads
+ + head) * pddt->ddt_bpb.bpb_nsecs + sector,
+ count, &done);
}
STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
@@ -521,7 +521,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
int ret = Genblockio(pddt, LBA_WRITE, rw->gbrw_head, rw->gbrw_cyl,
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
if (ret)
- return dskerr(ret);
+ return ret;
break;
}
case 0x42: /* format/verify track */
@@ -644,7 +644,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
--avb
*/
if (ret)
- return dskerr(ret);
+ return ret;
fv->gbfv_spcfunbit = 0; /* success */
break;
}
@@ -660,7 +660,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
pddt->ddt_serialno = fs->serialno = rp->r_gioc->ioc_serialno;
ret = RWzero(pddt, LBA_WRITE);
if (ret)
- return dskerr(ret);
+ return ret;
break;
}
case 0x47: /* set access flag */
@@ -694,7 +694,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
int ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl,
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
if (ret)
- return dskerr(ret);
+ return ret;
break;
}
case 0x66: /* get volume serial number */
@@ -754,10 +754,10 @@ STATIC WORD blockio(rqptr rp, ddt * pddt
{
UWORD done;
int ret = LBA_Transfer(pddt, action, rp->r_trans,
- start + pddt->ddt_offset, rp->r_count, &done);
+ start, rp->r_count, &done);
rp->r_count = done;
if (ret)
- return dskerr(ret);
+ return ret;
}
return S_DONE;
}
@@ -855,42 +855,22 @@ STATIC unsigned DMA_max_transfer(void FA
UWORD *transferred sectors actually transferred
Read/Write/Write+verify some sectors, using LBA addressing.
-
-
+
This function handles all the minor details, including:
-
retry in case of errors
-
crossing the 64K DMA boundary
-
translation to CHS addressing if necessary
-
- crossing track boundaries (necessary for some BIOS's
-
+ crossing track boundaries (necessary for some BIOS's)
High memory doesn't work very well, use internal buffer
-
write with verify details for LBA
-
*/
STATIC int LBA_Transfer(ddt * pddt, UWORD mode, VOID FAR * buffer,
ULONG LBA_address, unsigned totaltodo,
UWORD * transferred)
{
- static struct _bios_LBA_address_packet dap = {
- 16, 0, 0, 0, 0, 0, 0
- };
-
- unsigned count;
- unsigned error_code = 0;
- struct CHS chs;
- void FAR *transfer_address;
- unsigned char driveno = pddt->ddt_driveno;
-
- int num_retries;
-
*transferred = 0;
-
+
/* only low-level format floppies for now ! */
if (mode == LBA_FORMAT && hd(pddt->ddt_descflags))
return 0;
@@ -900,129 +880,106 @@ STATIC int LBA_Transfer(ddt * pddt, UWOR
if (!hd(pddt->ddt_descflags))
{
- UBYTE FAR *int1e_ptr = (UBYTE FAR *)getvec(0x1e);
- unsigned char nsecs = (unsigned char)(pddt->ddt_bpb.bpb_nsecs);
-
+ UBYTE FAR *int1e_ptr = (UBYTE FAR *)getvec(0x1e);
+ UBYTE nsecs = (UBYTE)pddt->ddt_bpb.bpb_nsecs;
if (int1e_ptr[4] != nsecs)
{
int1e_ptr[4] = nsecs;
- fl_reset(driveno);
+ fl_reset(pddt->ddt_driveno);
}
}
-
-/*
+
+ LBA_address += pddt->ddt_offset;
+/*
if (LBA_address+totaltodo > pddt->total_sectors)
{
printf("LBA-Transfer error : address overflow = %lu > %lu
max\n",LBA_address+totaltodo,driveParam->total_sectors);
- return 1;
+ return failure(E_CMD); // dskerr(1)
}
*/
buffer = adjust_far(buffer);
- for (; totaltodo != 0;)
+ while (totaltodo)
{
- /* avoid overflowing 64K DMA boundary */
- count = DMA_max_transfer(buffer, totaltodo);
+ int num_retries;
+ /* avoid overflowing 64K DMA boundary */
+ void FAR *transfer_address = buffer;
+ unsigned count = DMA_max_transfer(buffer, totaltodo);
if (FP_SEG(buffer) >= 0xa000 || count == 0)
{
transfer_address = DiskTransferBuffer;
count = 1;
-
if ((mode & 0xff00) == (LBA_WRITE & 0xff00))
- {
fmemcpy(DiskTransferBuffer, buffer, 512);
- }
- }
- else
- {
- transfer_address = buffer;
}
- for (num_retries = 0; num_retries < N_RETRY; num_retries++)
+ for (num_retries = N_RETRY;;)
{
- if ((pddt->ddt_descflags & DF_LBA) && mode != LBA_FORMAT)
+ unsigned error_code;
+ if (mode != LBA_FORMAT && (pddt->ddt_descflags & DF_LBA))
{
+ UWORD m;
+ static struct _bios_LBA_address_packet dap = {
+ 16, 0, 0, 0, 0, 0, 0
+ };
dap.number_of_blocks = count;
-
dap.buffer_address = transfer_address;
-
+ dap.block_address = LBA_address;
dap.block_address_high = 0; /* clear high part */
- dap.block_address = LBA_address; /* clear high part */
- /* Load the registers and call the interrupt. */
-
- if ((pddt->ddt_descflags & DF_WRTVERIFY) || mode != LBA_WRITE_VERIFY)
- {
- error_code = fl_lba_ReadWrite(driveno, mode, &dap);
- }
- else
+ m = mode;
+ if (mode == LBA_WRITE_VERIFY && !(pddt->ddt_descflags & DF_WRTVERIFY))
{
/* verify requested, but not supported */
- error_code =
- fl_lba_ReadWrite(driveno, LBA_WRITE, &dap);
-
+ error_code = fl_lba_ReadWrite(pddt->ddt_driveno, LBA_WRITE, &dap);
if (error_code == 0)
{
- error_code =
- fl_lba_ReadWrite(driveno, LBA_VERIFY, &dap);
+ m = LBA_VERIFY;
+ error_code = fl_lba_ReadWrite(pddt->ddt_driveno, m, &dap);
}
}
+ else
+ error_code = fl_lba_ReadWrite(pddt->ddt_driveno, m, &dap);
}
else
{ /* transfer data, using old bios functions */
-
+ struct CHS chs;
if (LBA_to_CHS(LBA_address, &chs, pddt))
- return 1;
+ return failure(E_CMD); /*dskerr(1)*/
/* avoid overflow at end of track */
-
- if (chs.Sector + count > (unsigned)pddt->ddt_bpb.bpb_nsecs + 1)
- {
- count = pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector;
- }
+ if (count > pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector)
+ count = pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector;
error_code = (mode == LBA_READ ? fl_read :
mode == LBA_VERIFY ? fl_verify :
- mode ==
- LBA_FORMAT ? fl_format : fl_write) (driveno,
- chs.Head,
- chs.Cylinder,
- chs.Sector,
- count,
- transfer_address);
-
+ mode == LBA_FORMAT ? fl_format : fl_write)
+ (pddt->ddt_driveno, chs.Head, chs.Cylinder,
+ chs.Sector, count, transfer_address);
if (error_code == 0 && mode == LBA_WRITE_VERIFY)
- {
- error_code = fl_verify(driveno, chs.Head, chs.Cylinder,
+ error_code = fl_verify(pddt->ddt_driveno, chs.Head, chs.Cylinder,
chs.Sector, count, transfer_address);
- }
}
if (error_code == 0)
break;
- fl_reset(driveno);
-
- } /* end of retries */
-
- if (error_code)
- {
- return error_code;
- }
+ fl_reset(pddt->ddt_driveno);
+ if (--num_retries == 0)
+ return dskerr(error_code);
+ } /* end of retries */
/* copy to user buffer if nesessary */
if (transfer_address == DiskTransferBuffer &&
(mode & 0xff00) == (LBA_READ & 0xff00))
- {
fmemcpy(buffer, DiskTransferBuffer, 512);
- }
*transferred += count;
LBA_address += count;
totaltodo -= count;
- buffer = adjust_far((char FAR *)buffer + count * 512);
+ buffer = adjust_far((char FAR *)buffer + count * 512u);
}
- return (error_code);
+ return 0;
}
--- End Message ---