bash.im ithappens.me zadolba.li
10795

Do you speak CP 866?

4 апреля 2013, 07:15

Кто тут хотел баек от сорокалетних спецов с двадцатилетним стажем? Их есть у меня.

Дело было лет двадцать назад, когда писишка была редкостью, стоила дорого и не всегда комплектовалась мышкой, а про локальные сети мало кто слышал. Действующие лица: студенты специальностей 220100, 220400 и 220500 в количестве пяти человек. Инвентарь: БК-0010 с дисководом и принтером СМ6337.

Один из студентов приносит дискету (5,25 дюйма на 800 КБ, «бэкашка» другие не понимала) с книжкой по IBM PC в виде голого текста. В книжке, по его рассказу, много интересного. Возникает идея распечатать, тем более что книжка специально порезана на кусочки по 8–10 килобайт, что позволяет напечатать её на БК (там всего чуть меньше 16 КБ для программ и данных выделено).

Мгновенно ваяется программочка, перекидывающая байтики в порт принтера, начиная с определённого адреса памяти. А чего? Несколько команд на ассемблере. В нужную область памяти грузится первый файл, программа запускается, принтер печатает несколько знаков… и затыкается. Программа завершает работу.

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

Печать пошла. Только вместо текста полезли кракозябры. «Опа! — говорит один из студентов. — На писишке кодировка 866-я, а тут КОИ-8». Возникает логичный вопрос: что делать? Таблиц с кодировками под рукой нет, посмотреть их негде (про интернет тогда никто и не слышал), а распечатку получить хочется.

В попытках перекодировать вручную доходят до частотного анализа, благо перекодировка идёт простой заменой символов. Проходит часа полтора-два, но пока безрезультатно. Вдруг один из студентов тычет пальцем в мануал на принтер и заявляет: «Мы идиоты». Принтер отлично знает о существовании разных кодовых страниц. Мало того, он умеет на них печатать, только перед подачей самого текста надо переключиться на соответствующую кодовую страницу специальной эскейп-командой.

Распечатка у меня до сих пор где-то валяется. Только я не пошёл по программистской части, и многие интересные сведения из неё мне оказались без надобности.