ВЕТКА ОБНОВЛЕНА! (дополнения после видео)
ПРЕДИСЛОВИЕ
Речь ниже, пойдет не о редактировании шрифтов EEPROM, с целью изменения
штатных шрифтов машины.
Уж простите, но я преследовал другие цели.
ПРОЛОГ
Известно, что самый продуктивный движитель прогресса - лень.
Она же и послужила стартом этому проекту, когда я решил,
что такое положение дел больше меня не устраивает:
Разве это можно читать, не плача кровью из глаз?
Нет, я не про код, а про то, как выглядят шрифты.
И я решился написать драйвер, который бы исправлял этот хронический недостаток.
Было скучно, из угрюмого неба шел снег, а я сидел и размышлял:
"Как же можно исправлять сей недостаток, если для правки шрифтов, тупо нужен
специализированный редактор?"
И я решил написать:
ПРОСТОЙ РЕДАКТОР ШРИФТОВ
Основная идея заключалась в формировании шрифта, одновременно из двух:
так как VDP9938/9958, имеет интерлейсный режим отображения, то нужно в каждой строке экрана,
производить переключение на соответствующую ей строку шрифта.
А это значит, что шрифт, вместо 8 строк на символ, должен иметь 16.
Соответственно и редактор должен уметь таким образом выводить символы шрифта,
позволять редактировать и сохранять для последующего использования, чтобы это не вызывало
трудностей и накладных расходов, нашего трудяги z80.
Сказано - сделано! И через пол часа, я уже написал простенький редактор, который
отображает таблицу шрифта, и который, выбирая редактируемый символ, помещает его в "линзу",
где искусно владея клавишами перемещения курсора и пробелом, можно изменять "некую" битовую
карту символа, разделенную построчно в два банка видеопамяти, общим размером 8x16 точек на символ.
По-елозил курсором, натыкал группу заглавных латинских символов, но хочется же посмотреть,
как же это все будет выглядеть?!
Написал простенький драйвер на прерываниях луча развертки, и запустил:
Да, шрифт кривоват, но эти точечки, они же божественны! :)
И ТУТ ОСТАПА ПОНЕСЛО... (с) Ильф и Петров.
Первым делом, я интегрировал драйвер отображения в сам редактор.
После чего, я то и дело менял функционал, добавлял красивостей,
сделал буфер обмена (на одну карту символа), экранные и вызываемые подсказки, сохранение и загрузку.
Но я не учел главного - при редактировании шрифта, можно так его изуродовать, что отображение интерфейса
станет неузнаваемым.
Поэтому я тут же интегрировал теневой шрифт 8x16, а так же сделал переключаемым штатный системный шрифт,
в который переключается редактор во время сохранения и загрузки.
А параллельно, в редакторе появилась возможность переключения вида отображения "линзы",
в которой блоки можно переключить из плоского вида, в псевдо 3D:
После этого я еще пуще разошелся, и сделал еще кучу удобств и годноты
(оптимизации вывода "линзы", режим перемещения по таблице шрифта, режим прокрутки битовой карты символа и др.)
Остановился я лишь когда понял, что за пару часов, успел создать около шести! шрифтов,
и при этом не сильно отвлекаясь на процесс редактирования.
Среди этих шрифтов, было решено создать несколько для просмотра текстов в разных кодировках не родных для MSX:
Кодировка cp866.
Да, представленные шрифты имеют изъяны, да, они не доделаны местами, и да, я делал их для себя.
При этом, я не сомневаюсь ни на секунду, что каждый заинтересовавшийся переделает их под свои нужды, с легкостью.
Кроме того, в репозитории имеются примеры кода драйвера и загрузчика шрифта, под несколько видео режимов.
Итак, представляю Вашему вниманию, не побоюсь назвать ее - одной из лучших моих программ на MSX-Basic для MSX2:
MSX2 FONT EDITOR v2.5 (Final) (c) by Dolphin_Soft Vladivostok 2019
Программа предназначена для редактирования экранных шрифтов,
разрешением 8х16 пикселей. Эти шрифты могут использоваться
во всех текстовых режимах или тайловых режимах:
Программа при старте включает режим через строчной развертки, иКод:- Screen 0, 40 символов шириной (аппаратное разрешение символа 6х16) - Screen 0, 80 символов шириной (аппаратное разрешение символа 6х16) - Screen 1 и выше: 32 символа шириной (аппаратное разрешение символа 8х16)
инициализирует прерывание луча развертки, в котором производится
считывание четности выводимого кадра, и в соответствии ей переключается
адрес знакогенератора.
Тем самым достигается возможность реалтаймового отображения
редактируемого шрифта, и его изменение "на лету".
При редактировании, возможно искажение символов до такой степени,
что интерфейс программы становится не читаемым. Для того чтобы
этого избежать, была создана возможность использования "Системного шрифта",
который загружается на этапе запуска, и реализована возможность
переключения между редактируемым шрифтом и системным.
Так как при операциях дискового ввода/вывода, невозможна работа прерываний,
программа при старте копирует штатный шрифт (8х8) в теневую страницу,
и при выполнении дискового ввода/вывода, переключается кратковременно на него.
Эта возможность не была предусмотрена на этапе разработки программы, поэтому
изначально, адреса банков для редактирования были выбраны штатные для режима
SCREEN0, 80 символов в строке (адрес знакогенератора 0x1000).
Таким образом, проблема была устранена.
Сразу после завершения операции чтения/записи шрифта, программа
вновь инициализирует прерывание отображения, и включает режим
отображения шрифтов 6х16.
Работа с программой:
При старте программы, выполняются инициализации, загрузка системного шрифта,
перемещение таблицы цветов (области блинка), и выполняется вывод интерфейса.
Редактируемый шрифт при этом, берется штатный (8х8), и выполняется его копия
в Банк 1 из Банк 0, тем самым достигается конвертирование стандартного шрифта
8х8, в удвоенный - 8х16.
Все дальнейшие операции с программой эти действия не выполняют.
Используемая видеопамять распределена следующим образом:
При сохранении редактируемого шрифта, создается бинарный файл 'font.fnt',Код:1. 0x0000-0x07FF: Экранная область 2. 0x0800-0x0FFF: Теневая страница (при старте в ней создается справка по клавишам) 3. 0x1000-0x17FF: Банк №0 редактируемого шрифта (четные строки) 4. 0x1800-0x1FFF: Банк №1 редактируемого шрифта (нечетные строки) 5. 0x2000-0x27FF: Банк №0 системного шрифта (четные строки) 6. 0x2800-0x2FFF: Банк №1 системного шрифта (нечетные строки) 7. 0x3000-0x37FF: Банк стандартного шрифта (8х8) для операций ввода/вывода 8. 0x3800-0xBFFF: Неиспользуемая область видеопамяти 9. 0xC000-0xC0FF: Таблица цветов (знакоместа областей блинка) 10. 0xC100-0xC112: Служебная область флагов и буфер копирования символа.
в который копируется область видео-буфера, лежащая по адресам:
0x1000 - 0x1FFF, размером 4 КБ.
Полученный файл представляет собой два банка шрифта, в первой половине
файла находятся четные строки, во второй соответственно нечетные.
Файл можно преобразовать для использования на других платформах.
Перед сохранением редактируемого шрифта, в нем автоматически стирается
карта символа с кодом 0, так как этот служебный символ используются
программой в качестве курсора линзы символа.
Второй служебный символ с кодом 255, может быть изменен, и все изменения
будут сохранены. Это свойство использует шрифт cp1251, в котором символ
с кодом 255, содержит русскую букву 'я'.
ВНИМАНИЕ: Если включено отображение редактируемого шрифта, то при
переключении вида курсора, этот символ будет уничтожен, битовой
картой курсора, выбранной для соответствующего режима его отображения!
Так же, при загрузке шрифта, автоматически выбирается для отображения,
вновь загруженный шрифт. Это сделано для удобства и устранения путаницы.
В интерфейсе программы, это отображается строкой: System Font, за которой
следует адрес в видеопамяти (назначение адресов указано выше в таблице).
Интерфейс программы очень прост и информативен.
В верхней части находится тайтл, в котором содержится названия, номер версии,
и правообладатель (я - Dolphin_Soft) :)
В центре экрана находится табличка адресов редактируемого фонта,
текущий адрес отображаемого шрифта (системный), под которым находится информация
о текущем символе редактирования (его код в hex и dec виде, а так же сам символ)
Под таблицей адресов, располагается карта шрифта, с выделенным в ней символом,
который выбран в качестве редактируемого.
В правой части находится "Линза символа" - область для редактирования, в которой
можно выполнять перемещения курсора, клавишами управления.
Строки линзы тонированы разным цветом, показывая, в каком банке шрифта, находится
редактируемая строка.
При нажатии клавиши [Пробел], происходит инверсия текущего блока (точки символа).
"Курсор линзы", автоматически инвертируется в зависимости от блока под ним.
Это сделано ввиду ограничений текстового видео режима. Для облегчения поиска
местоположения курсора в линзе, нажатие клавиши [Shift], заставляет его мигать.
Используя клавиши управления курсором, при зажатой клавише [Shift],
можно выбирать редактируемый символ в карте шрифта. Так же можно перемещаться
между редактируемыми символами, используя клавиши [<] и [>] (больше/меньше).
Возможно "безотрывное" редактирование, то есть не отпуская клавишу [Пробел],
перемещая курсор клавишами управления, блоки автоматически инвертируются по
траектории его движения.
Внизу экрана находится панграма, отображающая все буквы шрифта, в кодировке MSX.
Под ней располагаются "Ключи" - клавиши управления,
более развернутую справку по которым, можно получить, удерживая клавишу - [H]:
При нажатии клавиши [3], происходит переключение вида блоков линзы, из "плоского",Код:[S] - Save 'Font.fnt' - Сохранение редактируемого шрифта [L] - Load 'Font.fnt' - Загрузка редактируемого шрифта [B] - System Font Adr. - Переключает вид между шрифтами "редактируемый"<-> "системный" [C] - Copy Bank 0 -> 1 - Выполняет копирование банка 0 в банк 1 [R] - Load BIOS char - Перечитывает карту символа из ПЗУ, с копированием в банк 1 [F] - Fill ( white ) - Заполняет все блоки линзы [<] - To previous char - Переход к предыдущему коду символа [>] - To next char - Переход к следующему коду символа [3] - View in 2D or 3D - Переключает форму курсора "плоский" <-> "псевдо 3D" [DEL] - Clear blocks - Очищает все блоки линзы [SPACE] - Invert block - Инвертирует текущий блок линзы [SHIFT] - Seek mode - При нажатии, курсор линзы становится мигающим, и в этом режиме, можно производить произвольное перемещение по таблице символов фонта, используя клавиши управления курсором. [CTRL] - Roll mode - Удерживая клавишу [CTRL], можно производить прокрутку редактируемого символа, для центровки в поле битовой карты. [ESC] - Exit Program - Выход из программы [CTRL] +[Ins] - Copy - Копировать карту символа в буфер обмена [SHIFT]+[Ins] - Paste - копировать карту символа из буфера обмена в линзу
в "псевдо 3D" и обратно.
Текущий редактируемый символ, можно вернуть в состояние стандартного вида, путем
загрузки его из системного ППЗУ. При этом происходит его копирование в оба банка (0 и 1).
Вызов этой функции возможен через нажатие клавиши [R]
Клавишами [F] и [DEL], можно соответственно заполнить все блоки линзы, или очистить.
Комбинациями клавиш [CTRL]+[INS], [SHIFT]+[INS], можно копировать и вставлять
карту редактируемого символа в буфер обмена и обратно.
Удерживая клавишу [CTRL], и используя клавиши управления курсором, можно "прокручивать"
редактируемый символ в редактируемом поле, для корректировки его положения.
Клавишей [B], переключается отображение шрифта на экране, между "Системным" и
"Редактируемым".
Клавишами [S] и [L], производятся сохранение и загрузка редактируемого шрифта,
соответственно. Загрузка и сохранение не подразумевают задания имени шрифта.
Используется имя файла - 'font.fnt'.
На этом можно расходиться.
Тем кому интересен этот проект, может получить все необходимое в:
репозитории на GitHub.
А заключительное видео, продемонстрирует функционал редактора:
Обновление релиза
По личной просьбе Алексея (Wierzbowsky), в репу добавлена версия 2.6,
с возможностью редактирования и сохранения шрифтов 8х8:
Добавлен новый режим редактирования 8х8:
От меня:Код:- Переключение режима происходит по клавише [8], в результате чего, программа переключается между режимами редактирования (8х8 <-> 8х16) - Выбранный режим редактирования подсвечивается в строке ключей, выделяя синим фоном разрешение шрифта по вертикали, для текущего режима. - В режиме редактирования 8х8, линза перекрашивается в 2 зоны по 8х8 блоков, в первой находится символ выбранный в карте шрифта, во второй - следующий за ним. - Можно одновременно редактировать оба символа. - Все функции (прокрутки, очистки, копирования, заполнения, сброса и т.д.) применяются только к символу верхней половины линзы. - При сохранении происходит запись только одного банка (0х1000-0х17FF) - Все отображения продолжают работать как для режима 8х16 - Повторное нажатие клавиши [8], производит переключение в режим редактирования 8x16
Код:- Добавлена возможность копирования в буфер обмена, с очисткой текущего символа, используя клавиши [SHIFT]+[DEL] - Добавлена возможность сброса всего шрифта, с загрузкой из ППЗУ [SHIFT]+[R] - Исправлены незначительные ошибки отображения - Пофиксил некоторые ошибочки и неточности при вычислении адресов - Пофиксил некоторые переходы, чуть улучшена производительность - Удалены комментарии - Сократил исходник










Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
