diff --git a/kernel/blockio.c b/kernel/blockio.c index e3e0020..a66ce74 100644 --- a/kernel/blockio.c +++ b/kernel/blockio.c @@ -37,9 +37,16 @@ static BYTE *blockioRcsId = "$Id$"; /* * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.2 2000/05/08 04:29:59 jimtabor * Update CVS to 2020 * + * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.15 2000/04/29 05:13:16 jtabor * Added new functions and clean up code * @@ -547,7 +554,7 @@ BOOL dskxfer(COUNT dsk, ULONG blkno, VOID FAR * buf, UWORD numblocks, COUNT mode { /* REG struct dpb *dpbp = &blk_devices[dsk]; */ - REG struct dpb *dpbp = CDSp->cds_table[dsk].cdsDpb; + REG struct dpb *dpbp = (struct dpb *)CDSp->cds_table[dsk].cdsDpb; for (;;) { diff --git a/kernel/dsk.c b/kernel/dsk.c index 2d70d89..120526f 100644 --- a/kernel/dsk.c +++ b/kernel/dsk.c @@ -33,9 +33,16 @@ static BYTE *dskRcsId = "$Id$"; /* * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.2 2000/05/08 04:29:59 jimtabor * Update CVS to 2020 * + * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.6 2000/04/29 05:13:16 jtabor * Added new functions and clean up code * @@ -118,7 +125,9 @@ BOOL fl_format(); #define NDEV 8 /* only one for demo */ #define SEC_SIZE 512 /* size of sector in bytes */ #define N_RETRY 5 /* number of retries permitted */ -#define NENTRY 25 /* total size of dispatch table */ +#define NENTRY 26 /* total size of dispatch table */ + +extern BYTE FAR nblk_rel; union { @@ -138,7 +147,15 @@ static struct media_info COUNT mi_partidx; /* Index to partition array */ }; -static struct media_info miarray[NDEV]; /* Internal media info structs */ +static struct FS_info +{ + ULONG fs_serialno; + BYTE fs_volume[11]; + BYTE fs_fstype[8]; +}; + +static struct media_info miarray[NDEV]; /* Internal media info structs */ +static struct FS_info fsarray[NDEV]; static bpb bpbarray[NDEV]; /* BIOS parameter blocks */ static bpb *bpbptrs[NDEV]; /* pointers to bpbs */ @@ -177,6 +194,7 @@ WORD init(rqptr), mediachk(rqptr), bldbpb(rqptr), blockio(rqptr), + IoctlQueblk(rqptr), Genblkdev(rqptr), blk_error(rqptr); COUNT ltop(WORD *, WORD *, WORD *, COUNT, COUNT, LONG, byteptr); @@ -221,12 +239,13 @@ static WORD(*dispatch[NENTRY]) () = blk_error, /* Output till busy */ blk_error, /* undefined */ blk_error, /* undefined */ - Genblkdev, /* Generic Ioctl */ + Genblkdev, /* Generic Ioctl Call */ blk_error, /* undefined */ blk_error, /* undefined */ blk_error, /* undefined */ blk_error, /* Get Logical Device */ - blk_error /* Set Logical Device */ + blk_error, /* Set Logical Device */ + IoctlQueblk /* Ioctl Query */ }; #define SIZEOF_PARTENT 16 @@ -391,6 +410,9 @@ static WORD init(rqptr rp) miarray[Unit].mi_offset = 0l; miarray[Unit].mi_drive = Unit; + fsarray[Unit].fs_serialno = 0x12345678; + + bpbarray[Unit].bpb_nbyte = SEC_SIZE; bpbarray[Unit].bpb_nsector = 2; bpbarray[Unit].bpb_nreserved = 1; @@ -415,6 +437,7 @@ static WORD init(rqptr rp) rp->r_nunits = nUnits; rp->r_bpbptr = bpbptrs; rp->r_endaddr = device_end(); + nblk_rel = nUnits; /* make device header reflect units */ return S_DONE; } @@ -490,6 +513,10 @@ static WORD bldbpb(rqptr rp) getword(&((((BYTE *) & buffer.bytes[BT_BPB]))[BPB_NHEADS]), &bpbarray[rp->r_unit].bpb_nheads); getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HIDDEN])), &bpbarray[rp->r_unit].bpb_hidden); getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HUGE])), &bpbarray[rp->r_unit].bpb_huge); + + + getlong(&((((BYTE *) & buffer.bytes[0x27])[0])), &fsarray[rp->r_unit].fs_serialno); + #ifdef DSK_DEBUG printf("BPB_NBYTE = %04x\n", bpbarray[rp->r_unit].bpb_nbyte); printf("BPB_NSECTOR = %02x\n", bpbarray[rp->r_unit].bpb_nsector); @@ -511,6 +538,7 @@ static WORD bldbpb(rqptr rp) if (miarray[rp->r_unit].mi_size == 0) getlong(&((((BYTE *) & buffer.bytes[BT_BPB])[BPB_HUGE])), &miarray[rp->r_unit].mi_size); sector = miarray[rp->r_unit].mi_sectors; + if (head == 0 || sector == 0) { tmark(); @@ -518,6 +546,7 @@ static WORD bldbpb(rqptr rp) } miarray[rp->r_unit].mi_cyls = count / (head * sector); tmark(); + #ifdef DSK_DEBUG printf("BPB_NSECS = %04x\n", sector); printf("BPB_NHEADS = %04x\n", head); @@ -538,35 +567,87 @@ static COUNT write_and_verify(WORD drive, WORD head, WORD track, WORD sector, return fl_verify(drive, head, track, sector, count, buffer); } +static WORD IoctlQueblk(rqptr rp) +{ + switch(rp->r_count){ + case 0x0860: + case 0x0866: + break; + default: + return S_ERROR; + } + return S_DONE; + +} + static WORD Genblkdev(rqptr rp) { - UWORD cmd = rp->r_count; - - - switch(cmd){ - case 0x0860: + switch(rp->r_count){ + case 0x0860: /* get device parameters */ { - struct gblkio FAR * gblp = rp->r_trans; + struct gblkio FAR * gblp = (struct gblkio FAR *) rp->r_trans; + REG COUNT x = 5,y = 1,z = 0; - gblp->gbio_devtype = 0x05; - gblp->gbio_devattrib = 0x01; + if (!hd(miarray[rp->r_unit].mi_drive)){ + y = 2; + switch(miarray[rp->r_unit].mi_size) + { + case 640l: + case 720l: /* 320-360 */ + x = 0; + z = 1; + break; + case 1440l: /* 720 */ + x = 2; + break; + case 2400l: /* 1.2 */ + x = 1; + break; + case 2880l: /* 1.44 */ + x = 7; + break; + case 5760l: /* 2.88 almost forgot this one*/ + x = 9; + break; + default: + x = 8; /* any odd ball drives return this */ + } + } + gblp->gbio_devtype = (UBYTE) x; + gblp->gbio_devattrib = (UWORD) y; + gblp->gbio_media = (UBYTE) z; gblp->gbio_ncyl = miarray[rp->r_unit].mi_cyls; - gblp->gbio_media = 0; gblp->gbio_bpb = bpbarray[rp->r_unit]; gblp->gbio_nsecs = bpbarray[rp->r_unit].bpb_nsector; - - printf("GenBlkIO = %08lx\n", rp->r_trans); - printf("GenBlkIO = %08lx\n", gblp); break; } - case 0x0866: + case 0x0866: /* get volume serial number */ + { + REG COUNT i; + struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans; + struct FS_info FAR * fs = &fsarray[rp->r_unit]; + gioc->ioc_serialno = fs->fs_serialno; + for(i = 0; i < 12 ;i++ ) + gioc->ioc_volume[i] = fs->fs_volume[i]; + for(i = 0; i < 9; i++ ) + gioc->ioc_fstype[i] = fs->fs_fstype[i]; + + printf("DSK_IOCTL SN %lx \n" , &fs->fs_serialno); + printf("DSK_IOCTL SN %lx \n" , &fs->fs_volume); + printf("DSK_IOCTL SN %lx \n" , &gioc->ioc_serialno); + printf("DSK_IOCTL SN %lx \n" , &gioc->ioc_volume); + + } break; + default: + return S_ERROR; } - return S_DONE; } + + static WORD blockio(rqptr rp) { REG retry = N_RETRY, diff --git a/kernel/fatfs.c b/kernel/fatfs.c index 3f8eb52..f4ff6a8 100644 --- a/kernel/fatfs.c +++ b/kernel/fatfs.c @@ -36,9 +36,16 @@ BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.2 2000/05/08 04:30:00 jimtabor * Update CVS to 2020 * + * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.23 2000/04/29 05:13:16 jtabor * Added new functions and clean up code * @@ -2140,7 +2147,7 @@ struct dhdr FAR *select_unit(COUNT drive) /* Just get the header from the dhdr array */ /* return blk_devices[drive].dpb_device; */ - return CDSp->cds_table[drive].cdsDpb; + return (struct dhdr FAR *)CDSp->cds_table[drive].cdsDpb; } diff --git a/kernel/inthndlr.c b/kernel/inthndlr.c index 6797c61..3b37339 100644 --- a/kernel/inthndlr.c +++ b/kernel/inthndlr.c @@ -36,21 +36,22 @@ BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.4 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.3 2000/05/09 00:30:11 jimtabor * Clean up and Release * * Revision 1.2 2000/05/08 04:30:00 jimtabor * Update CVS to 2020 * - * Revision 1.25 2000/04/29 05:31:47 jtabor - * fix history + * $Log$ + * Revision 1.4 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C * * Revision 1.24 2000/04/29 05:13:16 jtabor * Added new functions and clean up code * - * Revision 1.23 2000/03/31 05:40:09 jtabor - * Added Eric W. Biederman Patches - * * Revision 1.22 2000/03/17 22:59:04 kernel * Steffen Kaiser's NLS changes * @@ -1021,11 +1022,9 @@ dispatch: } else { - - if(r->AL == 0x02) + if((r->AL == 0x02) || (r->AL == 0x03) || (r->AL == 0x04) || (r->AL == 0x05)) r->AX = r->CX; - - r->FLAGS &= ~FLG_CARRY; + r->FLAGS &= ~FLG_CARRY; } } break; @@ -1133,8 +1132,8 @@ dispatch: || ((psp FAR *) (MK_FP(cu_psp, 0)))->ps_parent == cu_psp) break; tsr = FALSE; - int2f_Remote_call(REM_PROCESS_END, 0, 0, 0, 0, 0, 0); - int2f_Remote_call(REM_CLOSEALL, 0, 0, 0, 0, 0, 0); + int2f_Remote_call(REM_PROCESS_END, 0, 0, 0, 0, 0, 0); + int2f_Remote_call(REM_CLOSEALL, 0, 0, 0, 0, 0, 0); if (ErrorMode) { ErrorMode = FALSE; @@ -1556,25 +1555,34 @@ dispatch: /* Get/Set Serial Number */ case 0x69: - r->BL = ( r->BL == 0 ? default_drive : r->BL - 1); - if (r->BL <= lastdrive) + rc = ( r->BL == 0 ? default_drive : r->BL - 1); + if (rc <= lastdrive) { - if (CDSp->cds_table[r->BL].cdsFlags & CDSNETWDRV) { - r->AX = 0x01; - goto error_out; + if (CDSp->cds_table[rc].cdsFlags & CDSNETWDRV) { + goto error_invalid; } switch(r->AL){ case 0x00: + r->AL = 0x0d; r->CX = 0x0866; rc = DosDevIOctl(r, (COUNT FAR *) & rc1); break; case 0x01: + r->AL = 0x0d; r->CX = 0x0846; rc = DosDevIOctl(r, (COUNT FAR *) & rc1); break; } - r->FLAGS &= ~FLG_CARRY; + if (rc1 != SUCCESS) + { + r->FLAGS |= FLG_CARRY; + r->AX = -rc1; + } + else + { + r->FLAGS &= ~FLG_CARRY; + } break; } else @@ -1582,11 +1590,37 @@ dispatch: break; #if 0 - /* Extended Open-Creat, not fully functional.*/ case 0x6c: switch(r->DL) { - case 0x01: + case 0x12: + { + COUNT x = 0; + if ((rc = DosOpen(MK_FP(r->DS, r->SI), 0)) >= 0) + { + DosClose(rc); + x = 1; + } + if ((rc = DosCreat(MK_FP(r->DS, r->SI), r->CX )) < 0 ) + goto error_exit; + else + { + x += 2; + r->CX = x; + r->AX = rc; + r->FLAGS &= ~FLG_CARRY; + } + } + break; + case 0x10: + if ((rc = DosOpen(MK_FP(r->DS, r->SI), 0)) >= 0) + { + DosClose(rc); + r->AX = 80; + r->FLAGS |= FLG_CARRY; + } + else + { if ((rc = DosCreat(MK_FP(r->DS, r->SI), r->CX )) < 0 ) goto error_exit; else @@ -1595,9 +1629,42 @@ dispatch: r->AX = rc; r->FLAGS &= ~FLG_CARRY; } + } + break; + case 0x02: + if ((rc = DosOpen(MK_FP(r->DS, r->SI), 0)) < 0) + goto error_exit; + DosClose(rc); + if ((rc = DosCreat(MK_FP(r->DS, r->SI), r->CX )) < 0 ) + goto error_exit; + else + { + r->CX = 0x03; + r->AX = rc; + r->FLAGS &= ~FLG_CARRY; + } break; - case 0x10: + case 0x11: + if ((rc = DosOpen(MK_FP(r->DS, r->SI), 0)) >= 0) + { + r->CX = 0x01; + r->AX = rc; + r->FLAGS &= ~FLG_CARRY; + } + else{ + if ((rc = DosCreat(MK_FP(r->DS, r->SI), r->CX )) < 0 ) + goto error_exit; + else + { + r->CX = 0x02; + r->AX = rc; + r->FLAGS &= ~FLG_CARRY; + } + } + break; + + case 0x01: if ((rc = DosOpen(MK_FP(r->DS, r->SI), r->BL )) < 0 ) goto error_exit; else diff --git a/kernel/ioctl.c b/kernel/ioctl.c index afb94b5..3d54177 100644 --- a/kernel/ioctl.c +++ b/kernel/ioctl.c @@ -35,9 +35,16 @@ static BYTE *RcsId = "$Id$"; /* * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.2 2000/05/08 04:30:00 jimtabor * Update CVS to 2020 * + * $Log$ + * Revision 1.3 2000/05/11 04:26:26 jimtabor + * Added code for DOS FN 69 & 6C + * * Revision 1.4 2000/04/29 05:13:16 jtabor * Added new functions and clean up code * @@ -147,17 +154,19 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) /* JT Fixed it */ r->BL = ( r->BL == 0 ? default_drive : r->BL - 1); + + printf("IOCTL bl = %04x\n", r->BL); + if (r->BL > lastdrive) { *err = DE_INVLDDRV; return 0; } else - { + { cdsp = &CDSp->cds_table[r->BL]; dpbp = cdsp->cdsDpb; - } - + } break; case 0x0b: @@ -186,7 +195,7 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) case 0x01: /* sft_flags is a file, return an error because you */ /* can't set the status of a file. */ - if ((s->sft_flags & SFT_FDEVICE)) /* !*/ + if (!(s->sft_flags & SFT_FDEVICE)) { *err = DE_INVLDFUNC; return 0; @@ -209,14 +218,12 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) case 0x03: nMode = C_IOCTLOUT; IoCharCommon: - if ((s->sft_flags & SFT_FDEVICE) - || ((r->AL == 0x10) && (s->sft_dev->dh_attr & ATTR_QRYIOCTL)) - || ((r->AL == 0x0c) && (s->sft_dev->dh_attr & ATTR_GENIOCTL))) - /* ! ! */ + || ((r->AL == 0x02 ) && (s->sft_dev->dh_attr & SFT_FIOCTL)) + || ((r->AL == 0x03 ) && (s->sft_dev->dh_attr & SFT_FIOCTL)) + || ((r->AL == 0x10) && (s->sft_dev->dh_attr & ATTR_QRYIOCTL)) + || ((r->AL == 0x0c) && (s->sft_dev->dh_attr & ATTR_GENIOCTL))) { - if (s->sft_dev->dh_attr & SFT_FIOCTL) - { CharReqHdr.r_unit = 0; CharReqHdr.r_length = sizeof(request); CharReqHdr.r_command = nMode; @@ -234,7 +241,6 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) 00 : 0xff; } break; - } } *err = DE_INVLDFUNC; return 0; @@ -251,10 +257,10 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) case 0x05: nMode = C_IOCTLOUT; IoBlockCommon: - if ((dpbp->dpb_device->dh_attr & ATTR_IOCTL) - || ((r->AL == 0x11) && (dpbp->dpb_device->dh_attr & ATTR_QRYIOCTL)) - || ((r->AL == 0x0d) && (dpbp->dpb_device->dh_attr & ATTR_GENIOCTL))) - /* ! ! */ + if ( ((r->AL == 0x04 ) && !(dpbp->dpb_device->dh_attr & ATTR_IOCTL)) + || ((r->AL == 0x05 ) && !(dpbp->dpb_device->dh_attr & ATTR_IOCTL)) + || ((r->AL == 0x11) && !(dpbp->dpb_device->dh_attr & ATTR_QRYIOCTL)) + || ((r->AL == 0x0d) && !(dpbp->dpb_device->dh_attr & ATTR_GENIOCTL))) { *err = DE_INVLDFUNC; return 0; @@ -315,7 +321,7 @@ COUNT DosDevIOctl(iregs FAR * r, COUNT FAR * err) case 0x09: if(cdsp->cdsFlags & CDSNETWDRV) - r->DX = 0x1000; + r->DX = ATTR_REMOTE; else r->DX = dpbp->dpb_device->dh_attr; break;