MobyGamer wrote on Today, 03:41:
mateusz.viste wrote on 2025-07-16, 20:14:
Sure, I could have added EMS support directly into DOSMid, but that would be so boring.
It also would have been much more performant. See below.
Not necessarily, no. At least not in the way I would have implemented it, using the EMS 4.0 copying API, which is basically doing the same thing as XMS: moving bytes back and forth.
The legacy EMS 3.2 way of doing it would, however, be more performant, that's perfectly right. But it would also require a nasty page frame, while EMS 4.0 doesn't.
MobyGamer wrote on Today, 03:41:
If you don't feel like implementing it, then people can always use Quarterdeck's QRAM, which was designed to do all of the above (in 1990).
I did end up implementing it, as I mentioned yesterday. I did not know about QRAM - very cool stuff. The more the merrier!
MobyGamer wrote on Today, 03:41:
mateusz.viste wrote on Yesterday, 05:41:
That's a good question, and to be honest I was hoping to find out here with people saying "I can run program xyz now on my 8086!". :-P
You won't find any. XMS was not designed to be an 8086 memory standard, because EMS already existed.
I think that reasoning is flawed. Considering a real-mode program, it does not cost much to be "8086-compatible". Authors may be tempted to produce 8086 binaries if it's just a compiler switch away, if only to expand their potential user base by 0.5%. This has usually negligible impact on more recent CPUs anyway. These authors may also use XMS when it's available, but do without if not (just slower), and not be invested into 8086 users enough to go the extra mile and implement an alternative memory management scheme based on EMS. That's pretty much the path I follow myself.
MobyGamer wrote on Today, 03:41:
...Which is why MS MEM won't detect XMS on 8086 systems, because it was never an 8086 standard.
Ignoring XMS on pre-286 CPUS seems like it was just an arbitrary decision, probably a programmer's shortcut to save some time on testing. I wouldn't read too much into that. There are MEM implementations out there that do not make such assumptions and happily report XMS memory on a 8088.
MobyGamer wrote on Today, 03:41:
If you'd like to play WOLF3D with EXMS86, then you need to instruct the game not to reserve all the EMS memory. It's actually easy: just run "WOLF3D NOEMS".
That would be slower than letting it just use EMS.
Of course, but that wasn't really the point - in this specific case it's only about the coolness factor of seeing Wolf3D's startup screen reporting XMS memory on a 8086. :-) I tested the CGA version that was mentioned earlier in this thread - it's surprisingly playable on a 8088 with XMS.
MobyGamer wrote on Today, 03:41:
All that said, I'm happy to see you wrote your TSR in 100% assembler.
No need for emotions. Assembly is just a tool, and it is not inherently better than C. Sometimes it is better suited to the given task, most of the time it is not. Even for a TSR, it often makes sense to do it in C rather than assembly if it is non-trivial. The C code does not have to be bloated, as I demonstrated with EtherDFS. Yes, there are hoops to jump over, but nowadays we also have WMINCRT which makes it easy to generate super compact binaries with C. There are obviously also cases where both assembly and C are a bad choice. I think it all boils down to using the right tool for the job at hand.