Last time I explained how your standard file rename function as seen in MS-DOS worked. You’d set up two CPU registers with pointers to the old and new names, set AH
to 0x56
, and called Int 0x21
. Easy, right? And then I went into detail on how malformed inputs were handled. They weren’t handled too well, and DOSBox does it differently from MS-DOS on top of that.
But what if we had a file system and rename function that did support spaces? Maybe more than eight characters, even? In mixed case?
That is of course VFAT, an extension to regular FAT16 available in Windows 95, NT 3.5, and later. With a VFAT driver, most of the old file operations available from Int 0x21
had counterparts installed that generally took the same arguments and had the same numbers, but accepted long filenames.
So to rename a file with long filename support, you’d do exactly what you’d do before but instead of setting AH
to 0x56
you’d set AX
to 0x7156
. Assuming Windows is running and we use the same inputs as last time, your file will now be named hello world.txt
. And that’s all that takes, even if it’s a pure DOS program doing it.
Which raises a question. How do you make a pure DOS program that handles files that may have long names, may be run from Windows, and should not drop any of those long names if it is in fact running in Windows? Well, it turns out all those LFN functions — the ones starting with 0x71
, all reset AX
to 0x7100
if they’re not installed. A trick of the system, I suppose. So what you could do for your LFN-enabled rename function is try to use 0x7156
, see if AX
has reset to 0x7100
, and if it has, you try again with AH
set to 0x56
. In other words, it’s time to bring back the rename function from SCI11… or rather a branch of SCI11+ that I’ve been working on.
rename proc oldName:ptr byte, newName:ptr byte mov dx, oldName ; ds:dx = old name push ds pop es mov di, newName ; es:di = new name mov ax, 7156h ; LFN Rename int 21h .if ax == 7100h ; LFN failed, try DOS 2.0 version mov ah, 56h int 21h .endif .if carry? xor ax, ax .endif ret rename endp
It’s that easy. Of course, this is old-school MASM code which has some nice things like .if
but that’s just sugar to avoid having to write compares and branches — the concept should be clear enough. An attempt to rename a file to Introduction.txt
will result in exactly that on Windows, or transparently collapse to introduc.txt
on plain DOS.
Note that in the actual SCI11+ code, if you’re crazy enough to look it up, there’s an extra function I made that’s called right before the DOS 2.0 rename call that replaces all spaces with underscores, which renders them about 100% not as confusing and untouchable as the one shown last time. I left that part out for brevity.