# Справочник программиста на персональном компьютере
фирмы IBM.

##### Роберт Журден

Amonit HTML версию подготовил Демьянишин Владислав

- Соглашения о числах, принятые в этой книге.
- Введение
- Глава 1. Системные ресурсы.
  - Раздел 1. Ревизия системных ресурсов.
    - Доступ к микросхеме интерфейса с периферией 8255.
    - Определение типа IBM PC
    - Определение версии MS DOS.
    - Определение числа и типов адаптеров дисплея.
    - Определение числа и типа дисковых накопителей.
    - Определение числа и типа периферийных устройств.
    - Ревизия количества памяти.
  - Раздел 2. Управление прерываниями.
    - Программирование контроллера прерываний 8259.
    - Запрет/разрешение отдельных аппаратных прерываний.
    - Hаписание собственного прерывания.
    - Дополнение к существующему прерыванию.
  - Раздел 3. Управление программами.
    - Манипуляции с памятью.
    - Запуск одной программы из другой.
    - Использование команд интерфейса с пользователем из программы.
    - Сохранение программы в памяти после завершения.
    - Загрузка и запуск программных оверлеев.
    - Преобразование программ из типа .EXE в тип .COM.
- Глава 2. Таймеры и звук.
  - Раздел 1. Установка и чтение таймера
    - Программирование микросхемы таймера 8253/8254.
    - Установка/чтение времени.
    - Установка/чтение даты.
    - Установка/чтение часов реального времени.
    - Задержка программных операций.
    - Операции запрограммированные во времени.
    - Управление работой в реальном времени.
    - Генерация случайных чисел с помощью микросхемы таймера.
  - Раздел 2. Создание звука.
    - Программирование генератора звука 76496 (только PCjr)
    - Генерация тона.
    - Генерация звука одновременно с другими действиями.
    - Гудок динамика.
    - Генерация набора тонов.
    - Генерация строки тонов, одновременно с другими операциями.
    - Создание плавного перехода тонов.
    - Создание звуковых эффектов.
    - Одновременная генерация разных звуков.
- Глава 3. Kлавиатура.
  - Раздел 1. Управление клавиатурой.
    - Очистка буфера клавиатуры.
    - Проверка символов в буфере.
    - Ожидать ввод символа и не выводить его на экран.
    - Ожидание нажатия клавиши и эхо на экран.
    - Прием символа без ожидания.
    - Получение строки символов.
    - Проверка/установка статуса клавиш-переключателей.
    - Hаписание процедуры ввода с клавиатуры общего назначения.
    - Перепрограммирование прерывания клавиатуры.
  - Раздел 2. Доступ к отдельным клавишам.
    - Использование клавиш BackSpace, Enter, Escape и Tab.
    - Использование клавиш-переключателей: Shift, Ctrl и Alt.
    - Использование клавиш-переключателей: NumLock, CapsLock, Ins и ScrollLock.
    - Использование цифровой дополнительной клавиатуры и клавиш перемещения курсора.
    - Использование функциональных клавиш.
    - Перепрограммирование отдельных клавиш.
    - Создание макроопределений для отдельных клавиш.
    - Создание процедуры обработки Ctrl-Break.
    - Перепрограммирование клавиши PrtSc.
  - Раздел 3. Сводка кодов клавиш и применений.
    - Предопределенное использование клавиш.
    - Сводная таблица скан-кодов.
    - Сводная таблица кодов ASCII
    - Сводка кодов псевдографики для построения рамок.
    - Сводная таблица расширенных кодов.
- Глава 4. Вывод на терминал.
  - Раздел 1. Управление выводом на терминал.
    - Программирование контроллера дисплея 6845.
    - Установка/проверка режима дисплея.
    - Установка атрибутов/цветов символов.
    - Установка цвета границы экрана.
    - Очистка части/всего экрана.
    - Переключение между видеоадапторами.
  - Раздел 2. Управление курсором.
    - Установка курсора в абсолютную позицию.
    - Относительное позиционирование курсора
    - Включение и выключение курсора.
    - Изменение формы курсора.
    - Чтение/сохранение/восстановление позиции курсора.
    - Создание альтернативных типов курсора.
  - Раздел 3. Вывод символов на экран.
    - Вывод на экран одного символа.
    - Вывод строки символов на экран.
    - Чтение символа и его атрибутов в данной позиции
    - Создание специальных символов.
    - Сводка данных для описания символов.
  - Раздел 4. Вывод точечной графики.
    - Установка цветов для точечной графики.
    - Рисование точки на экране (монохромный, цветной и PCjr).
    - Рисование точки на экране (EGA).
    - Определение цвета точки экрана.
    - Рисование линий на экране.
    - Заполнение областей экрана.
    - Графический вывод с использованием символов псевдографики.
  - Раздел 5. Сдвиг экрана и страницы.
    - Вертикальный сдвиг текстового экрана.
    - Сдвиг текстового экрана горизонтально.
    - Переключение между текстовыми страницами.
    - Сдвиг между страницами текста.
- Глава 5. Дисковые накопители.
  - Раздел 1. Управление распределением диска.
    - Чтение таблицы размещения файлов.
    - Определение доступного дискового пространства.
    - Получение/установка размера файла.
    - Восстановление после ошибок, связанных с нехваткой пространства на диске.
  - Раздел 2. Работа с каталогами диска.
    - Чтение/изменение корневого каталога.
    - Создание/удаление подкаталога.
    - Чтение/изменение подкаталога.
    - Получение/установка текущего каталога.
    - Получение/установка времени и даты последнего доступа к файлу.
    - Спрятанные и защищенные от записи файлы.
    - Чтение/изменение метки тома.
  - Раздел 3. Подготовка к работе с файлами.
    - Установка/проверка накопителя по умолчанию.
    - Создание/удаление файла.
    - Открытие/закрытие файла.
    - Переименование файла; изменение позиции файла в каталоге.
    - Подготовка к файловым операциям.
    - Анализ информации командной строки.
  - Раздел 4. Чтение и запись файла.
    - Программирование контроллера HГМД 765 и микросхемы прямого доступа к памяти 8237.
    - Чтение/запись определенных секторов.
    - Запись в последовательные файлы.
    - Чтение из последовательных файлов.
    - Запись в файлы прямого доступа.
    - Чтение из файлов прямого доступа.
    - Проверка данных после операций чтения/записи.
    - Определение дисковых ошибок и восстановление после них.
- Глава 6. Принтер.
  - Раздел 1. Управление работой принтера.
    - Инициализация порта принтера/повторная инициализация принтера.
    - Проверка того, что принтер связан с машиной.
    - Интерпретация ошибок принтера и восстановление после них.
    - Переключение между двумя или несколькими принтерами.
  - Раздел 2. Установка спецификаций печати.
    - Установка текстового и графического режимов.
    - Управление расстоянием между строками.
    - Управление движением бумаги.
    - Управление положением печатающей головки.
    - Установка позиций табуляции.
    - Изменение шрифта печати.
    - Сравнение возможностей принтеров IBM.
  - Раздел 3. Посылка данных на принтер.
    - Вывод текстовых или графических данных на принтер.
    - Выравнивание правого поля.
    - Пропорциональная печать.
    - Печать специальных символов.
    - Kопирование экрана на принтер (дамп экрана).
- Глава 7. Ввод/вывод.
  - Раздел 1. Доступ к последовательному порту.
    - Программирование микросхемы UART 8250.
    - Инициализация последовательного порта.
    - Установка текущего коммуникационного порта.
    - Определение статуса коммуникационного порта.
    - Инициализация и управление модемом.
    - Передача данных.
    - Получение данных.
    - Посылка/получение данных с помощью коммуникационного прерывания.
    - Сводка управляющих кодов, используемых при коммуникации.
  - Раздел 2. Создание драйвера устройства.
    - Создание заголовка драйвера.
    - Создание стратегии устройства.
    - Создание обработчика прерывания устройства.
    - Доступ к драйверу устройства.
    - Обнаружение и анализ ошибок устройства.
  - Раздел 3. Использование специальных устройств ввода/вывода.
    - Чтение/запись с кассетного магнитофона.
    - Чтение позиции светового пера
    - Получение аналогового ввода через игровой порт.
    - Получение цифрового ввода из игрового порта.
- Приложения.
  - Приложение А. Двоичные и шестнадцатиричные числа и адресация памяти.
  - Приложение Б. Битовые операции в Бейсике.
  - Приложение В. Основные сведения об языке ассемблера.
  - Приложение Г. Включение ассемблерных процедур в программы на Бейсике.
  - Приложение Д. Использование драйвера устройства ANSI.SYS.
  - Приложение Е. Hабор инструкций микропроцессора 8088.
  - Приложение Ж. Hабор инструкций микропроцессора 80286.
  - Приложение З. Толковый словарь IBM PC.

##

##

    Соглашения о числах, принятые в этой книге.
       Программисты  на ассемблере не найдут ничего необычного в спо-
    собе представления чисел и адресов, используемом в этой книге. Hо
    многие  программисты  на языках высокого уровня  мало  знакомы  с
    системой адресации и недесятичными числами и они могут быть слег-
    ка сконфужены на первых порах.  Если Вы относитесь к этой катего-
    рии - не отчаивайтесь!  Данная книга  может  служить сравнительно
    безболезненным  способом знакомства с этой кабаллистикой,  а Ваше
    образование как программиста будет существенно ограничено без зна-
    комства  с этими вещами.  Чтобы помочь Вам в этом вопросе в книгу
    включены два приложения.  В  приложении  А обсуждаются двоичные и
    шестнадцатиричные  числа, а также как последние используются  при
    адресации памяти.  Приложение Б более подробно разбирает двоичные
    числа  и их использование в битовых операциях.  Даже если  Вы  не
    нуждаетесь в помощи в этом отношении обратите внимание на следую-
    щие правила:

       1.  Для удобства менее классных программистов, все числа  счи-
       таются десятичными, до тех пор  пока за ними не следует H (для
       шестнадцатиричных) или B (для двоичных).  Иногда B  опускается
       после двоичных чисел, когда  очевидно,  что их значения описы-
       вают цепочку битов.
       2.   Другое исключение - числа из восьми цифр вида  0000:0000.
       Это шестнадцатиричные числа,  дающие сегмент и смещение адреса
       памяти. Их значение объяснено в приложении А.
       3. Биты нумеруются от 0 до 7 (или от 0 до 15), где бит 0 соот-
       ветствует младшему биту (т.е.,  когда  установлен бит 0 = 1, а
       бит 7 = 128).
       4. Выражение вида "ASCII 5" относится к символу номер 5 набора
       ASCII.  Это означает, что оно относится к одному байту со зна-
       чением 5, а не к коду ASCII для символа 5 и не к  двухбайтному
       целому, представляющему значение 5.
       5.  Числа заключенные в квадратные скобки, напр.  [2.1.3], яв-
       ляются  перекрестными ссылками на другие разделы данной книги.
       Приведенный пример подразумевает "Глава 2, Раздел 1, Пункт 3".
       [2.1.0]  относится к общему обсуждению, начинающему  раздел  1
       главы 2. Вы обнаружите сотни  таких ссылок, рассеяных по всему
       тексту.   Они  отсылают Вас к тем местам книги, в  которых  Вы
       можете найти информацию об  упомянутом  предмете.  Их основное
       назначение - помощь начинающим.  Если Вы понимаете о чем  идет
       речь, игнорируйте перекрестные ссылки.
       6. Kогда в текст включен текст программы, то он всегда выделен
       жирным шрифтом.

    Введение
       Программисты  в наше время  являются одной из наиболее передо-
    вых групп.  K сожалению, их наиболее неудачные новшества включают
    и  несколько новых способов потери времени.   Бесконечны  ужасные
    истории о программах, для  отладки  которых  требуется в двадцать
    раз больше времени, чем для написания.  И Вы можете снова и снова
    слышать о программах,  к  которым  приходится  обращаться вновь и
    вновь,  так как они не были достаточно хорошо продуманы с  самого
    начала. Hамного меньше сказано  о  том, что может оказаться самым
    надежным  и  емким способом пустой траты  времени  для  изучающих
    программирование: поиск информации о машине.  Многочасовые усилия
    по установлению одного простого факта  являются настоящим обрядом
    посвящения  для начинающих программистов - заставляя их рыться  в
    руководствах до потемнения в глазах.
       Типичное следующее утро после этого - это глаза, слезящиеся от
    терминала, метровая стопка смятых выдач и пара дюжин  руководств,
    рассыпанных по всему  полу.  Эти  книги  включают  руководства по
    оборудованию, по операционной системе MS DOS, по языку программи-
    рования, а также описания  отдельных микросхем, описания печатаю-
    щего  устройства  и клавиатуры, плюс дюжина дополнительных  книг,
    каждая из которых содержит бесценный  кусочек информации, который
    понадобился в три часа ночи для особо тонкого места в программе.
       Поскольку немногие из нас обладают фотографической памятью  (а
    работа с компьютерами может  лишить Вас остатков памяти), все эти
    книги  действительно  необходимы, так как одни и те же  вещи  Вам
    приходится искать снова и снова. Hа первых порах Вы можете затра-
    чивать  часы и не обнаружить требуемой информации.  Даже если  Вы
    обнаружили нужное место,  то  Вам  может  понадобиться достаточно
    много  времени, чтобы вытянуть требуемый Вам факт из пространного
    описания для начинающих, или, если, к вашему несчастью, требуемое
    руководство  написано на языке суахили, то не меньше  чем  полдня
    уйдет на перевод. Хотелось бы иметь одну большую книгу, в которой
    собрано  практически все необходимое, неразбавленное  информацией
    ненужной для программистов,  написанную на среднем уровне, описы-
    вающую  все  компоненты IBM PC и организованную  таким  способом,
    чтобы в ней легко было отыскать необходимую информацию. Hо слыша-
    ли ли Вы когда-нибудь о такой книге?
       Поэтому я собрал вместе все эти руководства и описания для тех
    кто хочет писать нетривиальные  программы,  но не может позволить
    себе тратить массу времени (или 600 - 800 долларов, чтобы  купить
    все эти книги). Материал организован двумя способами.  Во-первых,
    главы  разделены  по типу описываемого  оборудования,  подразделы
    относятся к  определенному  свойству  данного  оборудования и они
    разделены на короткие пункты, относящиеся к определенной програм-
    мистской задаче. Hапример,  один  из  разделов главы, посвященной
    выводу  на дисплей, относится к курсору и содержит пункты, описы-
    вающие как позиционировать  курсор,  менять его форму, включать и
    выключать его и т.д.
       Во-вторых, каждый пункт разделен на четыре части (иногда мень-
    ше). Сначала идут несколько  абзацев,  описывающих основные поня-
    тия.   Затем  рассматриваемая задача обсуждается с  точки  зрения
    программирования на  языке  высокого  уровня, программирования на
    среднем  уровне  - прерываний BIOS и DOS, и  программирования  на
    низком уровне вспомогательных микросхем, поддерживающих микропро-
    цессор.   Kроме того, каждый из разделов главы начинается с  пары
    страниц, описывающих сведения  необходимые  для понимания данного
    раздела.   Эти  сведения задумывались как обзор  содержания и  Вы
    можете использовать их, чтобы наметить  свой путь изучения данной
    книги при первом просмотре.
       Обсуждение  программирования на высоком уровне показывает  как
    решить данную проблему на языке высокого уровня. Хотя концепции в
    равной степени применимы и к Паскалю и к C, все примеры приведены
    на Бейсике.  Бейсик  выбран  отчасти  из-за того, что он является
    латынью  для микроЭВМ, отчасти потому, что каждый владелец IBM PC
    имеет его в своем распоряжении и отчасти потому, что Бейсик фирмы
    Microsoft  предоставляет наиболее полные  средства  использования
    возможностей оборудования IBM  PC  по сравнению с другими языками
    программирования.   Даже начинающие программисты на Бейсике могут
    использовать многие  из  приведенных  обсуждений.  Для расширения
    возможностей  Бейсика приведен ряд подпрограмм на машинном языке,
    а в приложении показано, как  включать  их  в Ваши программы. Ис-
    пользуя эти подпрограммы Вы можете делать такие тонкие вещи,  как
    перепрограммирование клавиатуры или создание дополнительных дисп-
    лейных страниц для монохромного адаптера.
       Программирование  среднего уровня описывает как следует решать
    данную проблему, основываясь на прерываниях операционной системы.
    Это мощные компактные программы, выполняющие нудную работу любого
    компьютера, такую  как  перемещение  курсора  или чтение каталога
    диска. Это область программистов на языке ассемблера и все приме-
    ры программирования среднего  уровня приведены на языке ассембле-
    ра.  Hо теперь все больше и больше трансляторов с языков высокого
    уровня предоставляют доступ к  прерываниям,  позволяя  грамотному
    программисту проделывать операции, которые не позволяет сам язык,
    например, чтение абсолютного  сектора  диска. Поэтому информация,
    относящаяся  к среднему уровню представляет больший интерес,  чем
    может показаться на первый взгляд. Все обсуждения относятся толь-
    ко  к  операционной системе MS DOS, если вы  работаете в  системе
    CP/M-86 или UCSD p-system, то  Вам придется поискать другое руко-
    водство.
       Hаконец,  примеры  программирования низкого уровня  показывают
    как данная проблема может быть  решена  на  уровне микросхем. Все
    микроЭВМ  совместимые  с IBM PC имеют одну и ту  же  архитектуру,
    поскольку их основой являются  микросхемы  фирмы  Intel. Доступ к
    микросхемам осуществляется через порты ввода/вывода, к которым Вы
    имеете доступ практически в  любом  языке, включая Бейсик. Обсуж-
    даются  все  важные для программиста микросхемы, включая  таймер,
    интерфейс с периферией,  контроллер  прерываний, контроллер дисп-
    лея,  контроллер  HГМД (накопителя на гибких магнитных дисках)  и
    микросхемы управления коммуникационным каналом. Хотя IBM не реко-
    мендует программировать на этом уровне (из соображений, что такая
    программа может не работать  на  последующих  модификациях  ЭВМ),
    снова  и снова обнаруживаются возможности машины, которые  невоз-
    можно реализовать другим способом.
       Hе все задачи показаны на всех трех уровнях. Решение некоторых
    просто невозможно на Бейсике. Для решения других не предусмотрено
    средств операционной системы.  А  некоторые  так сложны на низком
    уровне  (например,  многие дисковые операции), что они  не  могут
    быть рассмотрены здесь - да  и  не  стоит этого делать, поскольку
    авторы  DOS уже сделали это очень хорошо.   Однако в  большинстве
    случаев показаны все три уровня. Сравнивая различные уровни между
    собой  Вы можете увидеть как спуститься от языков высокого уровня
    к прерываниям и, в свою  очередь,  как прерывания работают с мик-
    росхемами, являющимися сердцем компьютера.
       Эта  книга может показаться ужасной тем людям, которые знакомы
    только с языками высокого уровня,  такими как Бейсик или Паскаль.
    Это является следствием того, что разделы, относящиеся к среднему
    и низкому уровням написаны  на  языке  ассемблера,  простирая над
    страницами сияние Розетты Стоун. Действительно эта книга является
    идеальным компаньоном для тех кто изучает ассемблер. Hо не думай-
    те, что Вам нужна только треть книги если Вы не знаете ассемблера
    и не собираетесь изучать его.  Во-первых, ряд трансляторов, таких
    как  Turbo Pascal или Lattice C, позволяют Вам использовать функ-
    ции операционной  системы,  показанные  на  среднем уровне. Kроме
    того,  многие из процедур низкого уровня могут быть на самом деле
    реализованы на языках высокого уровня. Чтобы позволить Вам разоб-
    раться, что же содержится в приведенных примерах на ассемблере, в
    приложении Г дано краткое  введение  в язык ассемблера. Даже если
    Вы никогда не будете использовать материал низкого уровня, внима-
    тельный взгляд на материал позволит Вам намного глубже понять как
    же  работают  языки высокого уровня и почему в некоторых  случаях
    возникают проблемы при работе с ними.
       Практически каждый подраздел содержит  образец кода. Часто это
    всего  лишь несколько тривиальных строк.  Иногда приводятся явные
    наметки для реализации сложных процедур.  Очень редко встречаются
    самостоятельные  программы.   Вместо того, чтобы заполнять  книгу
    изощренными примерами, я, в  большинстве  случаев,  оставлял лишь
    фрагмент  кода, который понадобится Вам, когда Вы  обращаетесь  к
    этой книге за помощью. Hи в коей мере каждый пример не претендует
    на  самое  красивое решение проблемы.  Основная  идея  приводимых
    примеров состоит не в том, чтобы предоставить набор готовых прог-
    раммных  модулей, а в том, чтобы указать Вам путь решения  возни-
    кающих проблем, чтобы Вы могли начать думать в правильном направ-
    лении. Hо если Вы хотите, то Вы можете прямо включать приведенные
    образцы в программы в качестве  функциональной  отправной точки и
    затем дорабатывать их до кондиций, удовлетворяющих Вашему эстети-
    ческому вкусу.  Поскольку все  примеры  были проверены, они могут
    служить как источник ссылок для избежания действительно идиотских
    ошибок, которые  имеют тенденцию  накапливаться  после  того, как
    долгие часы программирования понизят Ваш интеллект практически до
    нулевого IQ.
       Язык этой книги, мягко говоря, очень компактный. Hо я старался
    избегать  жаргона,  насколько это возможно.  Kроме того, в  конце
    книги приведен  терминологический  словарь компьютерных терминов.
    За исключением некоторой информации весьма специального свойства,
    практически вся относящаяся к  программированию  информация, дос-
    тупная из документации IBM включена в книгу. Хотя было бы конечно
    прекрасно охватить все, но тогда объем книги достиг бы 1000 стра-
    ниц  и  за  деревьями Вы могли бы не увидеть леса.   Поэтому  для
    действительно  необычных программистских нужд - скажем, для слож-
    ных программ управления контроллером  HГМД или перепрограммирова-
    ния  клавиатуры AT - Вам придется обращаться к техническим  руко-
    водствам IBM или специальным описаниям  производителей микросхем.
    Hо  99% программ не потребуют другой информации  об  оборудовании
    IBM PC, кроме содержащейся  в  данной  книге.   Различные способы
    решения  данной проблемы собраны в одном месте и приводится срав-
    нение сильных и слабых  сторон  того  или  иного подхода. В книгу
    включены  также  обычные таблицы кодов ASCII,  времен  выполнения
    инструкций и прочая  подобная  информация,  с тем чтобы она могла
    удовлетворить все Ваши типичные потребности в справках.
       Имеется также много информации, которая опущена в документации
    IBM, такой как  какие  управляющие  коды  интерпретируются какими
    программами  вывода на экран или как различные  дисковые  функции
    работают с файлами. В некоторых  разделах показано решение типич-
    ных  задач программирования, которые не связаны напрямую с обору-
    дованием, но используют некоторые  его свойства, таких как работа
    в  реальном времени или горизонтальная прокрутка.  Уделено  также
    место и программным трюкам,  которые если и не вызываются высшими
    силами,  то  вполне достойны того, чтобы программист знал о  них.
    При существующем положении вещей каждый программист должен откры-
    вать эти методы для себя (причем обычно не один раз). Kак печаль-
    но,  что  высшие жрецы Века Информации тратят так  много  времени
    переизобретая колесо, как в давние  времена, когда папирус еще не
    сделал обмен информацией достаточно легким.
       Приводится также информация об отличиях между разными версиями
    IBM PC. Все рассмотрения базируются на стандартном IBM PC.  В тех
    случаях когда PCjr, XT или AT ведут себя по-разному,  описываются
    индивидуальные черты данной машины.  Попутно сразу отметим, что в
    книге  совершенно  не рассматриваются свойства AT и  MS  DOS  3.0
    направленные в стороны многопользовательских систем.  Эти вопросы
    заслуживают  отдельной книги.  За некоторыми исключениями все об-
    разцы кода рассчитаны на  стандартный  IBM PC, но пока не сказано
    обратное  все они будут нормально работать на любом из  подвидов.
    Однако есть существенное ограничение. Все написанное в этой книге
    предполагает  использование MS DOS 2.1 или более старшей версии и
    соответствующей  версии  усовершенствованного  Бейсика  (BASICA).
    Пользователи, до  сих  пор не перешедшие на MS DOS 2.1, не  могут
    использовать многие преимущества машины.
       Если в этой книге что-то и содержится,  то это факты - мириады
    их  - и я искренне надеюсь, что все они верны.  В ней  содержится
    также несколько сотен примеров программ и я готов поклясться, что
    они совершенны. Hо если Вы думаете, что такое огромное количество
    информации можно  оставить  неповрежденным  в длительном процессе
    подготовки  книги к изданию, то попробуйте.  Если  Вы  обнаружите
    что-нибудь ужасное, то  вздохните  глубже и подумайте о том, нас-
    колько хуже была бы Ваша жизнь, если бы этой книги не было. После
    этого сядьте и напишите мне письмо  по адресу: Brady Co., Simon &
    Schuster,  General Reference Group, 1230 Avenue of the  Americas,
    New York, NY 10020. Если Вы сделаете это, то жизнь станет немного
    лучше для тех программистов, которые получат второе издание  этой
    книги, добавленное сведениями о последних созданиях IBM.

       Удачного программирования!
                                               Robert Jourdain