Мне часто требуется создавать маленькие TSR (от 4 до 1000 байт) Они нужны как заплаты в контроллерах (иногда даже с прцессором 80186). Расмотрим алгоритм минимизации размещения в памяти TSR. 1. Освободим область памяти переменных среды функцией INT 21H AH=49h в ES установим сегмент, находящийся в PSP с смещением 2CH. 2. Установим оптимальную стратегию выделения памяти фунцией INT 21H AH=58h. 3. (заметим, что мы пока не освобождаем память для основной программы, которая занимает все). Пробуем выделить память для нашей TSR функцией INT 21H AH=48h BX=длинна TSR. В случае удачи продолжаем с пункта 9. 4. А теперь освободим память занимаемую самой программой, INT 21H AH=49h ES=сегмент PSP. 5. Проверим доступную память функцией INT 21H AH=48h BX=0FFFFH (в BX вернется максимальное допустимое значение). Выделим это значение функцией INT 21H AH=48h. Эта опереция объеденит все блоки свободной памяти, которые смыкаются друг с другом. Т.е. если блок переменных среды смыкается с PSP (обычно это так и есть), то выделенный сегмент памяти будет установлен на блок переменных среды. Вожможно даже еще лутьше, с блоком переменных среды смыкается свободный блок памяти (меньшим по адресу). Тогда выделенный сегмент памяти будет установлен на этот блок. (Заметьте, что объединение свободных блоков делает за нас сама DOS.) 6. Создаем новый PSP за пределами программы (не наткнитесь на стек) функцией INT 21H AH=55h DX=сегмент за пределами программы, SI=смещение 02h старого PSP. 7. Присвоим новому PSP (по смещению 16H) сегмент родителя старого PSP (по смещению 16H). 8. Установим наш новый PSP текущим функцией INT 21H AH=50h DX=сегмент нового PSP. 9 Копируем наш TSR из программы в сегмент выделеный в пункте 5(3) TSR программа должна быть настроена на работу со смещением 0000H 10. Освобождаем память, оставляя длинну нашей TSR фунцией INT 21H AH=4Ah ES=сегмент выделеный в пункте 5(3) BX=длинна TSR. 11. Установливаем собственника блока MCB (по сегменту начала TSR-1), сегмент начала TSR. 12. Закрываем программу (желательно функцией INT 21H AH=4Сh). Примечание: Настройка TSR программы можно выполнить до пункта 1, и до закрытия программы после пункта 11 (когда она уже находится сегменте начала TSR). Я попробовал в пункте 6 заменить функцию INT 21H AH=55h, на NT 21H AH=26h DX=сегмент за пределами программы, и не обнаружил ничего глючного.