One persistent issue in any MS-DOS HDD image I generate is that
I can never get BASIC.COM, BASICA.COM, and GWBASIC.EXE to run.

Even from the command line, it will always print "You cannot SHELL to basic".

It turns out from some investigation that BASIC/GWBASIC uses the byte
value at 0000:050F as a flag whether or not it is currently running.

If the flag value is nonzero, GWBASIC thinks it's already running and
prints the error message.

Problem is that for some reason, there is junk at 0000:0500-0000:05FF
that looks like the remnants of a directory listing, when booting
my disk images.

DOSBox-X does not write those byte values, which is why the same
executable runs just fine under the DOSBox-X DOS kernel.

If GWBASIC refuses to run when clearly it is not already running,
break into the debugger and type:

SM 0:50F 0

and hit enter. Resume emulation and BASIC/GWBASIC should then
run without complaint.

-------------------------------------------------------------------

Update:

The reason that GWBASIC has this problem appears to center around
some boot-time code in MS-DOS. At some point, the first sector of
the root directory is loaded to 0000:0500. MS-DOS leaves it there
after booting, where it is visible to any DOS program after boot.

GWBASIC uses byte value at 0000:050F to determine running.

So how is it able to run? Well, if 0000:0500 is a copy of the root
directory, then 050F is the 15th byte of the first directory entry.

In the original FAT filesystem design, bytes 14 and 15 were not used.
When MS-DOS prior to version 7 creates a directory entry, those
bytes are zero. On a bootable MS-DOS system, 0000:050F points to the
first directory entry byte offset 15 which is normally IO.SYS and
those bytes are zero.

Starting with MS-DOS 7.0 (Windows 95), Microsoft defined bytes 14
and 15 to carry the file creation time stamp. If IO.SYS has those
bytes set, and Windows 95 does not clear that area, then GWBASIC
will fail the same way.

The HDD images generated by my script were made using the Linux
mtools, which support long filenames and will set the file creation
timestamp as well. Therefore, files added by mtools (including the
IO.SYS file) will have nonzero bytes 14 and 15 and GWBASIC will
refuse to run.

The solution is for the script to zero those bytes after using
mtools to add IO.SYS, and GWBASIC will run.

