I'm sorry to shout in from the sideline, but you made one assumption Sdw, and you guys didn't correct him, that on occasions may not be true. Namely that segments F8 to FB are always existing. There are, AFAIK, internal memory expansions that move the RAM area to completely different segments. Therefore it may occur that even if the machine has enough memory your program will crash. Although it is tedious as hell and a pain in the bottom, you should use EXOS at least until you map the actual memory configuration.
But please scream at me if I said something completely dumb.
I think, you're right. What is fixed is the VRAM itself only, at the four last segments of the 4Mbyte addressing space of the machine. First of all, Ep64 does not have memory expansion at all in addition of that by default. I guess, it's even possible to have an EP64 expanded in a way that it has got 128K RAM at the end, but using different segments. Thus that machine is more or less an Ep128 after that (note: Ep64s has older EXOS versions as well, if I remember correctly) but not at the "usual" segments. Also, it's possible you have not-working segments (bad RAM etc) and should not be used, EXOS on "boot" may marks segments as "non-working" based on memory tests. And anyway, with RAM expansion solutions there are may of them, you can't be sure about the actual segment numbers, indeed! In theory some can even replace the internal memory expansion board of Ep128 to another solution giving more RAM but using different segment numbers, etc etc.
I agree, EXOS should be used to allocate memory! Even if the program does not use EXOS than anymore at all, at least at start-up it should. One solution can be some EXOS segment allocation calls (program should check if it fails for not enough segments etc, also the fact that segment number allocated is >= 0xFC if it's important to know VRAM/non-VRAM nature of the result, etc) at the beginning of the program and storing the segment numbers EXOS returned. Thus then you can use these segment numbers for ports 0xB0-0xB3 later and you may not need to "talk" with EXOS anymore, especially if program is not "EXOS friendly" (ie it won't exit "cleanly" but "cold" reset) then it's just needed to have your segments for RAM for the given machine which will run the software.
Some may argue with me, that Ep128 is more common, and segments F8-FB will exist on 99% of these machines, but somehow, I feel, it's not a too much extra to use EXOS at least _ONCE_ at the startup of your program, even if not any more later