Опять же, так случилось что наша знакомая DOS-старушка дотянула до Windows 7. Та самая которая любит печатать на матричный принтер напрямую. Более того обнаружилось что старушка любит во время запуска прочитать состояние принтера по LPT1. Ну чего вы удивляетесь, в те времена это было правилом хорошего тона проверить подключен ли принтер, и главное, включен ли он.)
Используем всю ту же DOSBox SVN_MB6. Хорошо, с настройкой печати на LPT1 просто. Пишем:
[parallel]
parallel1=dev:lpt1
и наша старушка удовлетворена. Но успокаиваться рано. Проверяем саму печать. Ку-ку «Принтер не готов». Как оказалось эмуляцию LPT1-порта для старушки удалось создать, а саму передачу байтов на принтер нет.
Дальнейшие поиски привели к следующему. Можно указать печать на виртуальный принтер
[parallel]
parallel1=printer
а в самой секции принтера указать настоящий принтер. При этом будет выдан диалог выбора принтера при печати.
[printer]
printoutput=printer
Как вы понимаете, сам принтер в Windows 7 должен присутствовать.
Но можно пойти и другим путем. Чтобы печать велась напрямую на LPT1 надо указать так:
[parallel]
parallel1=file dev:lpt1
Но здесь нас ждет сюрприз от Windows 7 – даже в этом случае необходимы драйвера для нашего матричного принтера. Иначе «Принтер не готов». Вот так вот.
Возникла необходимость задействовать виртуальный принтер, попробую поделиться опытом.
В основном, пытаются на реальных USB-девайсах из DosBox печатать, а мне нужен был именно виртуальный, т.к. много всякого непотребства на него выводить планировалось, в том числе командные коды и дёргать реальный принтер не хотелось.
Как вы знаете, стандартный DosBox принтер вообще не поддерживает - позиционируется как игровая машинка, нужна версия SVN-Daum. Заходим к нему в настройки, наивно ставим в секции [printer] параметр printer=true, пишем в консоли echo Yahoo! > PRN и понимаем, что нифига не печатает.
И правильно делает, никто ведь не знает, на каком порту принтер висит. Заходим в секцию [parallel]. Печатать будем на LPT1. В числе доступных значений у параметра parallel1 есть file. Казалось бы, это именно то, что нам нужно.
Код:
[printer]
printer=true
dpi=360
width=85
height=110
printoutput=png
multipage=false
docpath=.
timeout=0
[parallel]
parallel1=file
Пишем в консоли echo Yahoo! > PRN
Где наш файл?
Не поверите, он в каталоге CAPTURE - там же, где и все скриншоты с видеороликами. Расширение у файла PRT, все команды и данные сохраняются в сыром виде. Простейший DIR > PRN создаст текстовый файл со списком файлов.
Во-первых, если вам этого достаточно, секция [printer] не понадобится - параметра parallel1=file из [parallel] для такого функционала достаточно. Таким образом:
[parallel]
parallel1=file
И каждая сессия печати будет сохраняться в CAPTURE в виде файла с расширением PRT.
Мне этого мало - желательно, чтобы работало графическое представление, стили шрифтов, плотность печати. Пробуем настроить.
Код:
[parallel]
parallel1=printer # виртуальный матричный принтер
Теперь печать должна идти через виртуалку, параметры которой настраиваются в секции [printer]. Оставляем стандартные параметры:
Код:
[printer]
printer=true
dpi=360
width=85
height=110
printoutput=png
multipage=false
docpath=.
timeout=0
Пишем в консоли echo Yahoo! > PRN
Где наш файл?
Уже не в CAPTURE. Теперь, чтобы выставить путь для сохранения документа, нужно изменить параметр docpath. Какой подвох ожидает трудолюбивого настройщика? Точка, указанная в качестве значения по умолчанию - это не текущий каталог, из которого производилась печать, там вы свой файл не найдёте. Это рабочий каталог самой программы DosBox. Другими словами, к виртуальном диску, на котором расположено ваше приложение, он никак не относится. Этот путь указывает на каталог реального винчестера. Например, C:\ или D:\PrintOutput (завершающую обратную косую можно не ставить - программа добавляет её в любом случае). Между прочим, имя файла указывать нельзя, это именно каталог, а имя формируется автоматически.
Как же будет называться файл?
Если printoutput = ps (PostScript), в зависимости от параметра multipage DosBox создаёт pageN.ps (multipage = false) или docN.ps (multipage = true), где N - первое возможное число от 1. Это значит, что счётчик не просто накапливается - проверяется первый доступный вариант. Скажем, если у вас на винте находятся page1.ps, page2.ps и page3.ps, а вы удалили page2.ps, при следующей печати будет повторно задействован индекс 2.
Если printoutput = png или bmp, вариант с именем doc вам не встретится, только page.
Не забывайте, что печатаете в картинку, а картинка - это целая страница. Как DosBox узнает, что можно сохранять страницу, если вы напечатали маленький текст, занимающий лишь её половину? Он ждёт какое-то время и если данных больше нет, сбрасывает буфер в картинку (завершает печать страницы).
"Какое-то время" задаётся параметром timeout. Если поставить слишком маленькое значение timeout и программа не успеет распечатать страницу за этот промежуток (скажем, изображение медленно уходит на печать), большая страница разделится на несколько маленьких.
Если он равен нулю, ситуация налаживается - DosBox ждёт вечно. Так ли это хорошо? Пока вы не допечатаете до конца страницы, он не сохранит изображение. Программа может отправить команду "конец страницы", но при простейшем type filename > PRN этого не происходит. Сделаем это сами - напишем простенькую утилитку FF (form feed), которая отправит на принтер 0Ch - конец страницы.
Код:
type %1 > prn
ff
Как только FF завершит работу, DosBox создаст новое изображение с текущей страницей, даже если она не заполнена до конца.
Итак, принтер печатает в PNG и всё почти замечательно. Одна проблема - вместо кириллицы идут кракозябры. Я совершенно не помню, как это делалось в DOS - на тот момент (конец 90-х) у меня не было принтера, так что если я где и читал, как это решалось, уже забыл. К счастью, исходники принтера в DosBox неплохо читаются и служебные команды понять можно. Кодовая таблица 866 в наличии есть, но она не выбрана - по умолчанию во все 4 слота для кодировки ставится таблица 437.
Знакомая ситуация, не правда ли?)
Берём контрольную последовательность 01Bh, 028h, 074h и ставим для принтера в слот первой кодировки таблицу 866, которая идёт у них 14-й по счёту.
Код:
case 0: // Italics, use cp437
Как правило, достаточно сделать это один раз при старте DosBox.
Если файл не создаётся, значит страница заполнена не до конца. Печатайте через батник:
Код:
type %1 > prn
ff
Если я где-то ошибся, поправьте, не сочтите за труд.