Hi! Optimization for getbpb():
- small source cleanup (expressions simplified, extraneous casts removed). - many variables (like `ret') moved deeply (by adding curly braces) - for BC this noticeably decreases stack usage. - getbpb(): removed extraneous stack variable; instead (x+y-1)/y for roundup used (x-1)/y+1 expression; printf sequences joined into one printf.
--- Begin Message ---diff -ruNp old/kernel/dsk.c new/kernel/dsk.c --- old/kernel/dsk.c 2004-06-11 03:25:56.000000000 +0000 +++ new/kernel/dsk.c 2004-06-11 03:38:38.000000000 +0000 @@ -340,42 +340,37 @@ STATIC WORD blk_Media(rqptr rp, ddt * pd STATIC WORD getbpb(ddt * pddt) { - ULONG count; - bpb *pbpbarray = &pddt->ddt_bpb; - unsigned secs_per_cyl; - WORD ret; - - /* pddt->ddt_descflags |= DF_NOACCESS; + /* pddt->ddt_descflags |= DF_NOACCESS; * disabled for now - problems with FORMAT ?? */ /* set drive to not accessible and changed */ if (diskchange(pddt) != M_NOT_CHANGED) pddt->ddt_descflags |= DF_DISKCHANGE; - ret = RWzero(pddt, LBA_READ); - if (ret != 0) - return (dskerr(ret)); - - pbpbarray->bpb_nbyte = getword(&DiskTransferBuffer[BT_BPB]); + { + int ret = RWzero(pddt, LBA_READ); + if (ret) + return dskerr(ret); + } - if (DiskTransferBuffer[0x1fe] != 0x55 - || DiskTransferBuffer[0x1ff] != 0xaa || pbpbarray->bpb_nbyte != 512) + if (getword(DiskTransferBuffer + 0x1fe) != 0xaa55 || + getword(DiskTransferBuffer + BT_BPB) != 512) /* bpb_nbyte */ { /* copy default bpb to be sure that there is no bogus data */ - memcpy(pbpbarray, &pddt->ddt_defbpb, sizeof(bpb)); + memcpy(&pddt->ddt_bpb, &pddt->ddt_defbpb, sizeof pddt->ddt_bpb); return S_DONE; } - pddt->ddt_descflags &= ~DF_NOACCESS; /* set drive to accessible */ + pddt->ddt_descflags &= ~DF_NOACCESS; /* set drive to accessible */ /*TE ~ 200 bytes*/ - memcpy(pbpbarray, &DiskTransferBuffer[BT_BPB], sizeof(bpb)); + memcpy(&pddt->ddt_bpb, DiskTransferBuffer + BT_BPB, sizeof pddt->ddt_bpb); /*?? */ /* 2b is fat16 volume label. if memcmp, then offset 0x36. - if (fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT16",5) == 0 || - fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT12",5) == 0) { + if (memcmp(DiskTransferBuffer + 0x36, "FAT16", 5) == 0 || + memcmp(DiskTransferBuffer + 0x36, "FAT12", 5) == 0) TE: I'm not sure, what the _real_ decision point is, however MSDN 'A_BF_BPB_SectorsPerFAT The number of sectors per FAT. @@ -385,7 +380,7 @@ STATIC WORD getbpb(ddt * pddt) { struct FS_info *fs = (struct FS_info *)&DiskTransferBuffer[0x27]; #ifdef WITHFAT32 - if (pbpbarray->bpb_nfsect == 0) + if (pddt->ddt_bpb.bpb_nfsect == 0) { /* FAT32 boot sector */ fs = (struct FS_info *)&DiskTransferBuffer[0x43]; @@ -397,37 +392,49 @@ STATIC WORD getbpb(ddt * pddt) } #ifdef DSK_DEBUG - printf("BPB_NBYTE = %04x\n", pbpbarray->bpb_nbyte); - printf("BPB_NSECTOR = %02x\n", pbpbarray->bpb_nsector); - printf("BPB_NRESERVED = %04x\n", pbpbarray->bpb_nreserved); - printf("BPB_NFAT = %02x\n", pbpbarray->bpb_nfat); - printf("BPB_NDIRENT = %04x\n", pbpbarray->bpb_ndirent); - printf("BPB_NSIZE = %04x\n", pbpbarray->bpb_nsize); - printf("BPB_MDESC = %02x\n", pbpbarray->bpb_mdesc); - printf("BPB_NFSECT = %04x\n", pbpbarray->bpb_nfsect); + printf("BPB_NBYTE = %04x\n" + "BPB_NSECTOR = %02x\n" + "BPB_NRESERVED = %04x\n" + "BPB_NFAT = %02x\n" + "BPB_NDIRENT = %04x\n" + "BPB_NSIZE = %04x\n" + "BPB_MDESC = %02x\n" + "BPB_NFSECT = %04x\n", + pddt->ddt_bpb.bpb_nbyte, + pddt->ddt_bpb.bpb_nsector, + pddt->ddt_bpb.bpb_nreserved, + pddt->ddt_bpb.bpb_nfat, + pddt->ddt_bpb.bpb_ndirent, + pddt->ddt_bpb.bpb_nsize, + pddt->ddt_bpb.bpb_mdesc, + pddt->ddt_bpb.bpb_nfsect); #endif - count = - pbpbarray->bpb_nsize == 0 ? - pbpbarray->bpb_huge : pbpbarray->bpb_nsize; - secs_per_cyl = pbpbarray->bpb_nheads * pbpbarray->bpb_nsecs; + tmark(pddt); - if (secs_per_cyl == 0) { - tmark(pddt); - return failure(E_FAILURE); - } - /* this field is problematic for partitions > 65535 cylinders, - in general > 512 GiB. However: we are not using it ourselves. */ - pddt->ddt_ncyl = (UWORD)((count + (secs_per_cyl - 1)) / secs_per_cyl); + unsigned secs_per_cyl = pddt->ddt_bpb.bpb_nheads * pddt->ddt_bpb.bpb_nsecs; + if (secs_per_cyl == 0) + return failure(E_FAILURE); - tmark(pddt); + /* this field is problematic for partitions > 65535 cylinders, + in general > 512 GiB. However: we are not using it ourselves. */ + { + unsigned nsize = pddt->ddt_bpb.bpb_nsize; + pddt->ddt_ncyl = (UWORD)(((nsize ? nsize : pddt->ddt_bpb.bpb_huge) - 1) + / secs_per_cyl) + 1; + } + } #ifdef DSK_DEBUG - printf("BPB_NSECS = %04x\n", pbpbarray->bpb_nsecs); - printf("BPB_NHEADS = %04x\n", pbpbarray->bpb_nheads); - printf("BPB_HIDDEN = %08lx\n", pbpbarray->bpb_hidden); - printf("BPB_HUGE = %08lx\n", pbpbarray->bpb_huge); + printf("BPB_NSECS = %04x\n" + "BPB_NHEADS = %04x\n" + "BPB_HIDDEN = %08lx\n" + "BPB_HUGE = %08lx\n", + pddt->ddt_bpb.bpb_nsecs, + pddt->ddt_bpb.bpb_nheads, + pddt->ddt_bpb.bpb_hidden, + pddt->ddt_bpb.bpb_huge); #endif return 0;
--- End Message ---
