Zorko писал(а):
Подсистема DosDev не будет работать под любой 64-битной Windows, поскольку DOS-компилятор вызывается прямо из Windows. Может быть под 64-биткой удастся реализовать вызов компилятора через DosBox, надо пробовать. Если вам это удастся, поделитесь, пожалуйста, решением.
Мне удалось запустить turboC -компилятор через Dosbox на 64-разрядной Windows 7. Разумеется это возможно и в 32-разрядной ОС и в Windows XP, так что желающие могут попробовать. Кстати, виртуальная Dos-машина Dosbox может оказаться полезной не только потому, что старые Dos-приложения иначе не запустить.
1) Скачиваем
Dosbox, устанавливаем и при необходимости настраиваем, хотя базовые возможности доступны сразу после установки без особых настроек.
2)Скачиваем и устанавливаем
Turbo C 201. Поскольку инсталятор - это тоже dos-приложение, устанавливать придется через Dosbox. Но у меня этот компилятор был установлен еще в Windows XP, так что я просто скопировал все его файлы в DosDev\Bin\TC201\.
3)А вот теперь нужно переделать батники DosDev\Bin\compile.bat и DosDev\Bin\build.bat. Для обеспечения большей гибкости решил не прописывать в каждом файле путь к dosbox, а создать файл параметров DosDev\Bin\config.cfg. В нём пока единственная строчка, указывающая файл для запуска dosbox (c полным путем):
Код: "BAT"
set dosbox="C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe"
В дальнейшем можно добавить в этот файл дополнительные команды.
Сами батники compile.bat и build.bat изменяем так, чтобы они вначале выполнили команды из config.cfg, потом проверили существование переменной окружения dosbox. Если такая переменная задана, то компилятор и созданные программы запускаем через файл, на который она указывает. Если такой переменной нет, то компилятор и приложения запускаем непосредственно.
Такой подход позволит быстро подключить\отключить dosbox изменением строки всего в одном файле. Для отключения удалите строку set dosbox="C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe" из файла параметров config.cfg или задайте ее как
или закройте комментарием
REM set dosbox="C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe"
Вот так выглядит мой файл DosDev\Bin\compile.bat
Код: "BAT"
@FOR /F "tokens=*" %%f in (..\bin\config.cfg) do %%f
@SET PATH=..\BIN\TC201\BIN
@SET Lib=..\Lib
@SET This=%CD:~-3%
IF /%dosbox%==/ GOTO :nodosbox
%dosbox% -c "mount c .." -c "c:" -c "cd %This%" -c "path %PATH%" -c "tcc -1 -O -d -f87 -Z -I..\BIN\TC201\INCLUDE -IOBJ -L..\BIN\TC201\LIB -I%Lib% -c %1.c" -c "@IF errorlevel 1 PAUSE" -c EXIT
EXIT
:nodosbox
tcc -1 -O -d -f87 -Z -I..\BIN\TC201\INCLUDE -IOBJ -L..\BIN\TC201\LIB -I%Lib% -c %1.c
@IF errorlevel 1 PAUSE
А это файл DosDev\Bin\build.bat
Код: "BAT"
@FOR /F "tokens=*" %%f in (..\bin\config.cfg) do %%f
@SET PATH=..\BIN\TC201\BIN
@SET Lib=..\Lib
@SET This=%CD:~-3%
IF /%dosbox%==/ GOTO :nodosbox
%dosbox% -c "mount c .." -c "c:" -c "cd %This%" -c "path %PATH%" -c "tcc -1 -O -d -f87 -Z -I..\BIN\TC201\INCLUDE -L..\BIN\TC201\LIB -IOBJ -I%Lib% %Lib%\DOSDEV.LIB %1.c" -c "@IF errorlevel 1 PAUSE" -c EXIT
IF EXIST %1.exe MOVE %1.exe ..
@CLS
%dosbox% -c "mount c .." -c "c:" -c "%1.exe" -c PAUSE -c EXIT
EXIT
:nodosbox
tcc -1 -O -d -f87 -Z -I..\BIN\TC201\INCLUDE -L..\BIN\TC201\LIB -IOBJ -I%Lib% %Lib%\DOSDEV.LIB %1.c
@IF errorlevel 1 PAUSE
@IF EXIST %1.exe MOVE %1.exe ..
@CLS
@..\%1.exe
@PAUSE
В этих файлах вначале выполняются команды из config.cfg и задаются необходимые переменные окружения. Затем, в зависимости от наличия dosbox, либо компилятор и созданная программа запускается через Dosbox, либо как раньше - непосредственно.
В начале я долго не мог понять, почему dosbox срабатывает через раз - то не запускается компилятор, то он не может создать exe, то этот экзешник "не найден", хотя вроде бы на месте. Оказалось, что виноват мой антивирус. Хотя я когда-то прописал необходимые разрешения и для dosbox и для blackbox, но антивирусу показалась очень подозрительной такая хитрая механика запуска через батник
Проблема ушла после добавления батников в доверенные.
Оставшиеся проблемы. В момент запуска батников текущей папкой является папка, содержащая с-файлы (DosDev\Obj). Чтобы компилятор смог найти эти си-исходники, а пути ..\BIN\TC201 или ..\Lib обработались правильно, в Dosbox мы должны зайти в ту же самую папку. Но как это сказать Dosbox? Там своя файловая система (так реальный каталог DosDev монтируется в Dosbox-ий виртуальный диск С:). Вначале я просто ставил команду -c "cd OBJ", но это позволяло откомпилировать только файлы из каталога OBJ. Потом придумал использовать @SET This=%CD:~-3%, но это позволит обработать файлы из каталога в имени которого РОВНО 3 СИМВОЛА! Легкого пути как решить эту проблему пока не придумал. Можно конечно средствами батника присвоить @SET This= "часть %CD% от последней \ до конца строки", но готовой функции для этого я не знаю, а исхитряться с батниковскими циклами лень.
Пусть пока будут 3-символьные каталоги, тем более что в DosDev стандартно только такие и есть.