Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

в 15:51, , рубрики: GUI, turbo pascal, велосипедостроение, дела давно минувших дней, интерфейсы, ненормальное программирование, Программирование, метки: , , ,

Относительно недавно, прочитав местную статью "Демо, которых никто никогда не видел", решил, что тоже стоит пролить свет на некоторые плоды своей программистской молодости.

Начиналось с этого:
image


В бытность мою в начале 1996 года студентом первого курса и обладателем компьютера "Поиск",
досталась мне от сокурсника чудесная книга Фаронова «Turbo Vision», которая заинтересовала меня в объектно-ориентированном программировании, и в Turbo Vision, в частности (там всё было так «вкусно» описано)).

Здесь стоит упомянуть, что тот мой комп (обладая 640 Кб ОЗУ, приводом для 5.25" 720Кб дискет и телевизором вместо монитора) «не тянул» Turbo Pascal 6.0, в составе с которым шла библиотека Turbo Vision, да и эмуляция текстового CGA-режима на «Поиске» была ужасна — символы могли быть, если память не изменяет, белыми/голубыми/розовыми на чёрном фоне, либо черными на голубом/розовом/белом фоне.

Короче, свой графический аналог Turbo Vision под CGA-графику (320x240, 4 цвета) писал я на Turbo Pascal 5.5 с кусками кода на Turbo Assembler 2.5 (урезанный комплект этого хозяйства как раз умещался на 720Кб-дискету).

Нюансы CGA-реализации:

  • Библиотеки для работы с графикой не используются
  • Вся отрисовка ведётся через промежуточный буфер, в котором каждому пикселу соответствует 1 байт (для устранения мерцания и увеличения скорости отрисовки).
  • Отрисовка частично перекрытых элементов осуществляется с использованием массива-маски (т.е. из буфера на экран выводятся только немаскированные части изображения).
    Для экономии памяти каждому элементу маски соответствовал квадрат 4x4 экранных пиксела, соответственно, позиция и размеры элементов были кратны 4-м.
  • Самодельный пропорциональный растровый шрифт (стандартные в разрешении 320x240 выглядели гигантскими).
  • Эмуляция мыши через клавиши управления курсором цифрового блока (на «Поиске» мыши не водились)).

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

Осенью 1996 года отец купил (ценой больших усилий: накопления и взятия взаймы долларов, спасибо ему) мне полноценный компьютер (AMD 5x86-133, 4Mb RAM, видео S3 Trio64 1Mb, 850Mb HDD, 14" монитор ARX).
Появилась возможность использовать Borland Pascal 7.0, мышь и 256-цветные SVGA-режимы.

Следующая реализация:

  • использовала 256-цветные VESA-режимы, для чего ставился UniVBE — эмулятор VESA-видео-BIOS (редкие видеокарты на тот момент имели соответствующую встроенную поддержку);
  • отрисовка крупных элементов, не помещающихся целиком в буфер, велась горизонтальными полосами;
  • рисовала полноцветный курсор мыши, который мерцал только если накладывался на обновляемую область (т.е. мерцал гораздо меньше, чем в большинстве тогдашних графических программ);
  • заимела поддержку отрисовки 256-цветных картинок формата BMP;
  • включала в себя некоторые «портированные»/«допиленные» для поддержки графики исходники Turbo Vision.

В последующий период (по 1999 год) указанные наработки были использованы при написании некоторых программок.

Недоделанная обучающая игра для кабинета информатики в школе:
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Курсовая работа — игра про фабрики/сырьё/продукцию и прочее «экономическое моделирование»:
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Был реализован простейший недоредактор растровых пропорциональных шрифтов (до этого был лишь один мелкий пропорциональный шрифт от CGA-версии, в качестве крупного шрифта приходилось использовать сконвертированный шрифт с фиксированной шириной символов):
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Лабораторные работы по статистическому моделированию:
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Лаба по логическому программированию:
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Часть лаб по компьютерной графике:
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

В итоге, к 1999 году накопилось следующее:

  • реализованы растровые регионы для отсечения невидимых областей при отрисовке, вследствие чего ограничения на размер/положение элементов были устранены (также хотелось сделать на основе регионов видимые элементы произвольной формы, но не сделалось);
  • реализация алгоритма Флойда-Стенберга для адаптации загружаемых картинок к используемой фиксированной палитре (8-битный цвет имел формат RRRGGGBB, т.е. под интенсивность красной и зеленой составляющей выделялось по 3 бита, синей — 2 бита);
  • были «портированы» некоторые стандартные элементы управления (список, выпадающий список, диалоговые окна выбора файлов и пр.);
  • возможность отображать/править таблички (реализация TGrid)
  • в связи с увеличением доступного объема памяти и «победным шествием» Windows 9x постепенно был утрачен интерес к DOS-программам.


В рамках подготовки статьи захотелось увидеть, как будет смотреться мой DOS-овский графический WVision в FullHD-разрешении, но, к сожалению, не нашёл VESA-кода для режима 1920x1080x8. Лишь 1280x1024 удалось задать, сделал снимок экрана (вот только habrastorage его ужал до 800x640, увеличив при этом размер файла почти в 6 раз)):
Графический «велосипед» по мотивам Turbo Vision (дела давно минувших дней)

Исходники и рабочие exe-файлы доступны в архиве WORKS.7z
(вот только исходные тексты CGA-реализации потерялись где-то на пятидюймовых дискетах, остался лишь исполняемый файл windy0.exe).
Минимальные требования для запуска: 386-совместимый процессор, 640Кб ОЗУ, 512Кб видеопамяти, поддержка VESA со стороны видео-BIOS (windy0.exe пойдёт и на 8086 с CGA-графикой).

Автор: WVitek


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js