Разработка оболочки-проводника для DOS в 2017 году

Как показывает практика, комфорт существования динозавра человека при работе/игре под DOS складывается из всевозможных драйверов и утилит. Но даже когда мы подгрузим лишь такие необходимые драйвера как драйвер мышки, драйвер CDROM, драйвера звука/midi для звуковухи, русификатор, зайдем в старый добрый Norton Commander, доберемся до EXE/COM/BAT-файла любимой игры и запустим ее, то вместо игры можем увидеть, например, вот такую картину:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Я часто сталкивался с подобным. Из доступных 640 килобайт драйверами может быть забито 100 или даже 150-200 килобайт. Оболочка (norton, volkov и т.д.) после запуска игры тоже остается висеть в памяти и занимать драгоценное место. Да и игра может требовать не 530 килобайт, как King's Bounty выше, а 550 или даже все 600 килобайт.


"Надо что-то делать!" - подумал я. Понятное дело, надо чистить autoexec.bat и config.sys! Но и после чистки и ужимания объема запускаемых драйверов и резидентных прог, бывает, что всё равно не хватает каких-то там 10 килобайт для запуска игры.


Тогда надо выкинуть оболочку из памяти. Тот же Norton Commander занимаете около 10 килобайт лишней оперативы. Но без оболочки неудобно запускать игры. Ведь придется комбинацией команд cd и dir переходить по папкам и смотреть имя нужного EXE/COM/BAT-файла, которое потом вводить в консоль чтобы запустить игру.


И тогда пришла мысль: "Надо сделать такую оболочку, которая не будет занимать память вообще". Но такого не может быть. Разве что если завершить работу оболочки перед запуском игры. Но, к сожалению, функция DOS "запуск проги из другой проги" не дает возможности закрыть оболочку, а потом запустить EXE/COM/BAT-файл игры. Отсюда вытекает:


Необходимая фича оболочки №1

Запуск программы "из чистого DOS" без нахождения оболочки в памяти


Тогда остается один вариант запуска проги "из чистого DOS":

- выбрать папку с EXE/COM/BAT-файлом игры текущей папкой,

- завершить оболочку, написав напоследок на экране "введи имяфайла.exe для запуска этой игры".


Пользователю останется только ввести с экрана это имя и нажать Enter - и получится, что он достаточно легко запустил прогу из чистого DOS.


Необходимая фича оболочки №2

Легкораспространяемый единственный EXE-файл малого размера и с коротким именем.


В идеале это должна быть прога в виде единственного EXE-шника без сопутствующих файлов. Ее путь пользователь добавляет в PATH в autoexec.bat. И затем, если вдруг надо быстро запустить любимые проги, то одним вводом короткого имени EXE-файла оболочки запускает ее и дергает из под нее нужную прогу.


Название было выбрано "BlackStrip Shell" (т.е. "Оболочка BlackStrip"), а имя EXE-файла "bss.exe". В любое время вводим в досе "bss" - и мы тут же внутри оболочки.


Вперед!


Языком программирования был выбран знакомый с детства (и заброшенный там же в детстве) Visual Basic 1.0 for DOS - у него оконная среда программирования в текстовом режиме, есть поддержка работы с прерываниями через библиотеку vbdos.qlb, т.е. можно организовать работу с мышиным драйвером по int 33h, работу со стандартными DOS-функциями из int 21h и прочими прерываниями.


Т.к. делаем оболочку для небыстрых старых компов, а заодно хотим охватить большую аудиторию, то не будем использовать SVGA-видеорежимы, а возьмем 640х480х16 цветов. А это режим экрана "SCREEN 12".

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Хотелось сделать прогу с русским и английским интерфейсами, при это не зависеть от загруженного/незагруженного русификатора. Поэтому добавляем графический растровый шрифт, предварительно слитый с DOS системы (самый мелкий, моноширинный 8х8 пикселей). А т.к. кроме EXE никаких файлов быть у оболочки не должно, то суем шрифт прямо внутрь проги с помощью команд DATA (конечно не вручную, а с помощью отдельной написанной приблуды, перекодирующей побайтово любой файл в набор DATA команд). И будем грузить шрифт оттуда с помощью RESTORE.

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Программировать на VBDOS можно как на компе, так и на телефоне из под DOSBOX. Поэтому бОльшая часть кода (99%) была написана на телефоне.


Первые пробы написания шрифтом разного размера и жирности на синем "рабочем столе" оболочки:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Затем надо было придумать оконный менеджер. Не мудрствуя лукаво была сделана система, подозрительно похожая на Windows 95 по объемности компонентов. Вот окошко:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Потом кнопки и текст а ля "label". В углу планировалось рисовать большой значок открытого окна. Но потом от этого пришлось отказаться, не выпендриваться и рисовать его рядом с текстом заголовка окна.

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Кстати, размеры значков были выбраны 8х8 точек. В совокупности с мелким шрифтом 8х8 пикселей это давало иллюзию "большого экрана" при разрешении 640х480 точек.


Потом был добавлен компонент "поле ввода":

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Для иллюзии большого экрана надо было уменьшить все. Поэтому наряду со шрифтом и значками нужно было уменьшить мышиный курсор. Дефолтный курсор от драйвера был спрятан и заменен на значок 8х8 пикселей с "горячей точкой". В систему были добавлены 5 курсоров на все случаи жизни (курсор-крест так и не был нигде использован пока что).

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Окна, висящие в пустоте, смущали. Поэтому надо было добавить панель задач. Раз уж "blackstrip" это "черная полоса мужского пола", то оболочка-чернополос должна была иметь черную полосу. И панель задач была окрашена в черный. А в углу были добавлены электрические часы из пяти 7-сегментных индикаторов, средний из который никогда не использовался (сначала предполагалось выводить там что нибудь еще, но потом там стало выводиться только время).

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Сама система изнутри была похожа на Windows-систему. Бесконечный цикл, в ходе которого опрашивается клавиатура и мышь, а на происходящие события установлены обработчики. Поэтому при запуске в эту систему надо было напихать окошек с дочерними компонентами, а в бесконечном цикле вставить обработчик "если (фокус на кнопке А и был нажат пробел) или (мышка кликнула по кнопке А) - то делай то-то". И надо было это все расписать для всех окон и всех компонентов на них. Вот старый скрин из исходников, где уже можно было напихать при старте два окошка, на каждом из которых лежит по одной кнопке.

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

И на экране все это отображалось при работе оболочки так:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Оконная система работала и надо было писать внутренности самой оболочки. Т.к. главной задачей стояла задача "запустить прогу, вырубив оболочку", то надо было сваять файловый менеджер, позволяющий лазить по папкам и файлам и имеющий кнопки "запустить выделенный EXE из оболочки" и "запустить выделенный EXE из под DOS".


Прототип файлового менеджера:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Ну а потом все завертелось, и были написаны:

- сам файловый менеджер "Файлы",

- окошко "Память" отображения количества DOS-памяти в самой BSS (чтобы можно было понять - рыпаться ли запускать игру из BSS, либо ей точно не хватит памяти и игру запускать только из под DOS),

- окошко "Клавиатура" показа кода клавиши (для отладки BSS, а заодно и для заезжих DOS-программистов, которые, сидя в досе, м.б. захотят узнать какая клавиша на клаве какой имеет код, простой 1-байтовый или расширенный 2-байтовый),

- и окошко "Экран" настройки экрана, позволяющее выбрать соотношение сторон экрана 4:3 или 16:9 (при этом в 16:9 весь экран отображался также на 640х480, но BSS "думала" что экран 853x480, это позволяет на широкоэкранных ноутах видеть оболочку не с растянутыми по горизонтали компонентами, а с нормальными), выбрать тему (выпуклая типа win95 или плоская типа win10), язык интерфейса, а также ускорение отрисовки окон при их перемещении (при включенном ускорении задняя часть экрана за окном не перерисовается при перемещении окна мышью).

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

На панели задач были добавлены кнопки "Выключение оболочки", "Сеанс DOS", окно "Файлы", окно "Клавиатура", окно "Память", окно "Экран", разделитель, кнопки "Свернуть все окна", "Развернуть окно на весь экран", "Свернуть полноэкранное окно обратно".


Основная часть оболочки - файловый менеджер "Файлы", эдакий common dialog, имела следующие органы управления:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

- наверху подобие командной строки и кнопку перехода (для тех, кто не любит жать Enter). В нее можно ввести как путь (по которому оболочка переходит), так и еще и имя файла в конце пути (на которое перескочит курсор в списке файлов),

- поле с отображением реальной текущей папке (если ввели наверху бред, то текущая папка не изменится),

- список файлов со значками и именами,

- маска-фильтр списка файлов, например, "*.exe" покажет только exe файлы в текущей папке, а также кнопка сброса фильтра в "*.*",

- кнопка "Обновить" позволяет обновить список файлов (если есть подозрения, что какой нибудь резидентный софт что нибудь меняет),

- кнопка "Папка выше" (как и кнопка Влево на клаве) позволяет выйти из текущей папки на один уровень вверх,

- кнопки "Запуск из BSS" (с возвратом обратно в BSS по окончании запущенной проги) и "Запуск из DOS" (та самая фича закрытия оболочки и оставления пользователя в чистом досе с подсказкой "что ввести чтобы запустить"),

- поле ввода аргументов командной строки "Аргументы КС", которые будут переданы программе при запуске из BSS/из DOS, а также кнопка очистки этого поля,

- опции сортировки и отображения списка файлов. Сортировка по имени, дате, размеру, типу файла, группировка файлов отдельно и папок отдельно, инверсия списка и отображения информации в соответствии с типом сортировки (т.е. отображение даты, размера, типа файла),

- показ количества файлов/папок в списке.


Потом была добавлена возможность смены диска (кнопка правее командной строки или на клавиатуре кнопка "Влево" из корневого каталога диска).

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

И вот оболочка уже могла запускать игры хоть из самой себя (занимая при этом место в оперативе), хоть из чистого доса. Но этого было мало.


Меню запуска: ярлыки на DOS программы


Чтобы каждый раз не лезть к EXE хорошо бы было создать на него некоторое подобие ярлыка. Выбирать этот ярлык в меню и запускать по нему прогу (из оболочки или из доса). Так в оболочке родилось "меню запуска".


Для начала лезем в файловом менеджере к нужному EXE/COM/BAT-файлу, ставим на него курсор в списке файлов и жмем волшебную кнопку с ракетой, которая расположилась справа от командной строки в файловом менеджере рядом с кнопками перехода и смены диска.

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

После этого открывается окно меню запуска, где уже будут введены:

- название проги (по имени исполняемого файла),

- путь и имя исполняемого файла,

- номер значка для ярлыка,

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Можно поменять имя на любое (включая русскоязычное), добавить аргументы для командной строки, изменить значок на любой значок оболочки, а потом либо добавить ярлык в список, либо заменить выбранный в списке ярлык на ярлык с введенными параметрами.


По списку можно лазить кнопками "Вверх"-"Вниз" на клавиатуре или в окне справа. При нажатии на пункт списка он загружается в верхние поля. Таким образом, можно нажать на пункт списка, загрузить его параметры в верхние поля, исправить их, нажать кнопку "Заменить" и сохранить измененный ярлык поверх первоначального загруженного.


Также можно:

- удалить выделенный ярлык кнопкой "Удалить",

- сортировать ярлыки по имени в алфавитном порядке,

- сдвинуть текущий ярлык в списке вверх или вниз на одну позицию,

- запустить программу/игру по ярлыку из BSS или из DOS.


Но и этого было мало. Иногда хочется посмотреть на файлы, окружающие программу или игру. Почитать "ридми" там или посмотреть текстовые ресурсы проги.


Hex-редактор


Было добавлено еще одно окошко, позволяющее побайтово просматривать и редактировать файлы. Ставим в файловом менеджере курсор на файл и жмем справа от командной строки волшебную кнопку с колбой или просто пытаемся открыть по Enter неисполняемый файл. Открывается окно редактора:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

В этом окне можно:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

- изменить имя файла и загрузить его (например, если имя файла известно и без файлового менеджера или имена нескольких файлов отличаются номером типа file1.txt, file2.txt),

- включить "режим правки" (редактирования файла вместо только чтения) и режим "Далее по ENTER" перехода к следующему байту по нажатию Enter в поле кода/символа текущего байта,

- выбрать кодировку файла для просмотра и редактирования (DOS 866 или кириллическую Windows 1251),

- выбрать символ переноса для просмотра файла в текстовом виде (0D(13) или 0A(10)),

- посмотреть на "таблице из трех двойных кнопок" файл побайтово, изменяя текущее смещение на 1 по кнопкам "Вверх" и "Вниз" с клавиатуры или кликом по "таблице из кнопок",

- изменить смещение вручную или обнулить/увеличить/уменьшить текущее смещение на определенное количество байт в области "Переход",

- посмотреть и изменить код текущего байта или символ текущего байта (в соответствии с выбранной кодировкой),

- посмотреть кнопками "Текст" и "Коды" в поле предпросмотра файл с текущего смещения в виде текста или hex-кодов,

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

- посмотреть таблицу символов в соответствии с выбранной кодировкой и ввести символ в "Код:"/"Символ:" по клику на ячейку этой таблицы,

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост
Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

- перейти кнопкой "Ниже" к следующей странице при просмотре файла в виде текста или hex-кодов.

Конец


Получилась вот такая DOS-оболочка:

Разработка оболочки-проводника для DOS в 2017 году DOS, Оболочка, Shell, Visual basic, Qbasic, Длиннопост

Кнопки на панели задач аналогичны клавишам F1-F12. Поэтому, добавив в переменные среды path оболочку bss, и добавив единожды ярлыки на проги/игры в меню запуска, вызов любимой проги/игры из любой папки в DOS-е выглядит так:

1) bss [enter]

2) [F5] (вызов окна "Меню запуска")

3) Выбор проги в "Меню запуска" по [вверх][вниз]

4) [enter] для запуска из BSS либо [shift+enter] для запуска из под DOS (аналогичные сочетания работают и в окне файлового менеджера).


Скачать оболочку можно по адресу: http://blackstrip.ru/bss.exe (118 килобайт).


Запакована UPX-ом, при запуске разворачивается в память и занимает 270 килобайт.


Под досбоксом на андроиде работает хорошо, под досбоксом под виндой работает не очень (по Ctrl+F12 повысьте циклы до 20-30 тысяч), на настоящем досовском ноутбуке "Bliss 3070" 2000 года выпуска работает отлично.


Всем веселых игр под DOS.

IT минувших дней

993 поста7.1K подписчиков

Добавить пост

Правила сообщества

Запрещается добавлять новости о прошлогодних новинках, а также посты, не относящиеся к тематике "ретро в ИТ".

Желательно соблюдать правила приличия.

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

круто


у меня тут вопрос, не по теме - вот есть виртуалка, которую было бы неплохо подключить к интернету. но в ethernet внутренняя система не может, зато может в serial

соотв. вопрос, можно ли на хостовой Linux-системе сделать что-то вроде сервера, что раздавал бы интернет на виртуальный ком-порт, или как-то ещё перенаправить трафик?...

раскрыть ветку (5)
2
Автор поста оценил этот комментарий

"можно ли на хостовой Linux-системе сделать что-то вроде сервера" - можно

Автор поста оценил этот комментарий

"но в ethernet внутренняя система не может" что за внутренняя  система? "зато может в serial" а это что?

раскрыть ветку (3)
Автор поста оценил этот комментарий

UNIX древний. может в SLIP. slipattach команда присутствует. как поднять на линуксе SLIP сервер, пока выяснить не удалось (подходящих пакетов в репозиториях не наблюдается)

раскрыть ветку (2)
Автор поста оценил этот комментарий

Может, на более древний линукс найдётся подходящий пакет? Что, если в несколько этапов сделать? Древний Unix в виртуалке под древним линуск в виртуалке чуть менее древнего... и так далее. Знаете анекдот про даму с кошёлочкой?

раскрыть ветку (1)
Автор поста оценил этот комментарий

анекдот не знаю

на сайте с образом было упоминание про использование Windows NT 4.0 как промежуточного этапа. но как раз хотелось бы избежать :с

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку