Intel 8080 - Intel 8080

Intel 8080
KL Intel i8080 Black Background.jpg
Вариант процессора Intel C8080A с белой керамикой, золотым теплораспределителем и золотыми контактами.
Общая информация
Запущен Апрель 1974 г . ; 47 лет назад ( 1974-04 )
Снято с производства 1990 ; 31 год назад ( 1990 )
Продается Intel
Разработано Intel
Общий производитель (и)
Представление
Максимум. Тактовая частота процессора От 2 МГц до 3,125 МГц
Ширина данных 8 бит
Ширина адреса 16 бит
Архитектура и классификация
Мин. размер элемента 6 мкм
Набор инструкций 8080
Физические характеристики
Транзисторы
Ядра
Пакет (ы)
Розетки)
История
Предшественник Intel 8008
Преемник Intel 8085

Intel 8080 ( «восемьдесят восемьдесят» ) является вторым 8-битовым микропроцессором , разработанный и изготовленным Intel . Впервые он появился в апреле 1974 года и представляет собой расширенный и улучшенный вариант более ранней конструкции 8008 , хотя и без бинарной совместимости . Первоначальная указанная тактовая частота или предел частоты составляли 2  МГц , и с обычными инструкциями, использующими 4, 5, 7, 10 или 11 циклов, это означало, что он работал с типичной скоростью в несколько сотен тысяч инструкций в секунду . Более быстрый вариант 8080A-1 (иногда называемый 8080B) стал доступен позже с ограничением тактовой частоты до 3,125 МГц.

8080 требуется два вспомогательных чипа для работы в большинстве приложений, тактовый генератор / драйвер i8224 и контроллер шины i8228, и он реализован в металл-оксидно-полупроводниковой логике (NMOS) N-типа с использованием ненасыщенных транзисторов режима улучшения в качестве нагрузки. Таким образом, требуется напряжение +12  В и −5 В в дополнение к основной транзисторно-транзисторной логике (TTL), совместимой с +5 В.

Хотя ранее микропроцессоры использовались для калькуляторов , кассовых аппаратов , компьютерных терминалов , промышленных роботов и других приложений, 8080 стал одним из первых широко распространенных микропроцессоров. Несколько факторов способствовали его популярности: его 40-контактный корпус упростил интерфейс, чем 18-контактный 8008, а также сделал его шину данных более эффективной; его реализация NMOS дала ему более быстрые транзисторы, чем транзисторы типа P-типа металл-оксид-полупроводник (PMOS) 8008, а также упростил интерфейс, сделав его TTL-совместимым ; был доступен более широкий выбор микросхем поддержки; его набор команд был улучшен по сравнению с 8008; а его полная 16-битная адресная шина (по сравнению с 14-битной у 8008) позволяла получить доступ к 64 КБ памяти, что в четыре раза больше, чем диапазон 8008 в 16 КБ. Он стал двигателем Altair 8800 и последующих персональных компьютеров с шиной S-100 , пока не был заменен Z80 в этой роли, и был исходным целевым процессором для операционных систем CP / M, разработанным Гэри Килдаллом .

8080 был достаточно успешным, чтобы совместимость перевода на уровне языка ассемблера стала требованием к дизайну Intel 8086, когда его разработка началась в 1976 году, и привела к тому, что 8080 напрямую повлиял на все более поздние варианты вездесущих 32-битных и 64-битных архитектур x86. .

Описание

Модель программирования

i8080 микроархитектура
Регистры Intel 8080
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (битовая позиция)
Основные регистры
А Флаги Р rogram S ОСТОЯНИЕ Вт Ord
B C B
D E D
ЧАС L H (косвенный адрес)
Индексные регистры
SP S липкости Р ointer
Счетчик команд
ПК Р rogram С ounter
Регистр статуса
  S Z - AC - п - C Флаги

Intel 8080 является преемником 8008 . Он использует тот же базовый набор команд и модель регистров, что и 8008 (разработанный Computer Terminal Corporation ), хотя он не совместим с исходным кодом или двоичным кодом с его предшественником. Каждая инструкция в 8008 имеет эквивалентную инструкцию в 8080 (даже несмотря на то, что коды операций у двух ЦП различаются). 8080 также добавляет несколько 16-битных операций в свой набор команд. В то время как 8008 требовал использования пары регистров HL для косвенного доступа к его 14-битному пространству памяти, 8080 добавил режимы адресации, чтобы обеспечить прямой доступ к его полному 16-битному пространству памяти. Кроме того, внутренний 7-уровневый стек вызовов с расширением вниз в 8008 был заменен специальным 16-разрядным регистром указателя стека (SP). Большой 40-контактный DIP - корпус 8080 позволяет использовать 16-битную адресную шину и 8-битную шину данных , обеспечивая легкий доступ к 64  КБ (64 × 2 10 ) памяти.

Регистры

Процессор имеет семь 8-битных регистров (A, B, C, D, E, H и L), где A - первичный 8-битный аккумулятор, а остальные шесть регистров могут использоваться как отдельные 8-битные регистры. или как три пары 16-битных регистров (BC, DE и HL, обозначаемые в документах Intel как B, D и H) в зависимости от конкретной инструкции. Некоторые инструкции также позволяют использовать регистровую пару HL в качестве (ограниченного) 16-битного аккумулятора, а псевдорегистр M можно использовать почти везде, где можно использовать любой другой регистр, ссылаясь на адрес памяти, на который указывает HL. пара. Он также имеет 16-битный указатель стека на память (заменяющий внутренний стек 8008 ) и 16-битный счетчик программ .

Флаги

Процессор поддерживает внутренние биты флагов ( регистр состояния ), которые указывают результаты арифметических и логических инструкций. Только определенные инструкции влияют на флаги. Флаги:

  • Знак (S), устанавливается, если результат отрицательный.
  • Ноль (Z), устанавливается, если результат равен нулю.
  • Четность (P), устанавливается, если количество 1 бит в результате четное.
  • Перенести (C), устанавливается, если последняя операция сложения привела к переносу или если последняя операция вычитания потребовала заимствования
  • Вспомогательный перенос (AC или H), используемый для двоично-десятичной арифметики (BCD).

Бит переноса может быть установлен или дополнен специальными инструкциями. Команды условного перехода проверяют различные биты состояния флагов. Флаги можно скопировать группой в аккумулятор. Аккумулятор A и флаги вместе называются регистром PSW или словом состояния программы.

Команды, инструкции

Как и во многих других 8-битных процессорах, для простоты все инструкции кодируются в одном байте (включая номера регистров, но исключая непосредственные данные). За некоторыми из них следует один или два байта данных, которые могут быть непосредственным операндом, адресом памяти или номером порта. Как и более крупные процессоры, он имеет автоматические инструкции CALL и RET для многоуровневого вызова и возврата процедур (которые даже могут выполняться условно, например переходы) и инструкции для сохранения и восстановления любой 16-битной пары регистров в машинном стеке. Также имеется восемь однобайтовых инструкций вызова ( RST) для подпрограмм, расположенных по фиксированным адресам 00h, 08h, 10h, ..., 38h. Они предназначены для обеспечения внешнего оборудования для вызова соответствующей процедуры обслуживания прерывания , но также часто используются как быстрые системные вызовы . Самая изощренная команда - это команда XTHL, которая используется для замены пары регистров HL значением, хранящимся по адресу, указанному указателем стека.

8-битные инструкции

Большинство 8-битных операций могут выполняться только с 8-битным аккумулятором (регистром A). Для 8-битных операций с двумя операндами другой операнд может быть либо непосредственным значением, другим 8-битным регистром, либо байтом памяти, адресованным 16-битной парой регистров HL. Прямое копирование поддерживается между любыми двумя 8-битными регистрами и между любым 8-битным регистром и байтом памяти с адресом HL. Из-за регулярного кодирования MOVинструкции (с использованием четверти доступного пространства кода операции) существуют избыточные коды для копирования регистра в себя ( MOV B,Bнапример), которые мало полезны, за исключением задержек. Однако то, что было бы копией из ячейки с HL-адресом в себя (т. Е. MOV M,M), Вместо этого используется для кодирования HLTинструкции halt ( ), останавливая выполнение до тех пор, пока не произойдет внешний сброс или прерывание.

16-битные операции

Хотя 8080 обычно является 8-битным процессором, он также имеет ограниченные возможности для выполнения 16-битных операций: любая из трех пар 16-битных регистров (BC, DE или HL, обозначаемая в Intel как B, D, H). документы) или SP могут быть загружены с немедленным 16-битным значением (с помощью LXI), увеличены или уменьшены (с помощью INXи DCX) или добавлены в HL (с помощью DAD). В XCHGинструкции обмены значения пар регистров HL и DE. Добавляя HL к самому себе, можно достичь того же результата, что и 16-битный арифметический сдвиг влево с помощью одной инструкции. Единственные 16-битные инструкции, которые влияют на любой флаг, - это те DAD H/D/B, которые устанавливают флаг CY (перенос), чтобы разрешить запрограммированную 24-битную или 32-битную арифметику (или больше), необходимую, например, для реализации арифметики с плавающей запятой .

Схема ввода / вывода

Пространство входного выходного порта

8080 поддерживает до 256 ввода / вывода (I / O) порты, доступ по выделенным инструкции ввода / вывода адреса портов , принимающих в качестве операндов. Эта схема отображения ввода / вывода рассматривается как преимущество, поскольку она освобождает ограниченное адресное пространство процессора. Вместо этого во многих архитектурах ЦП используется так называемый ввод-вывод с отображением памяти (MMIO), в котором общее адресное пространство используется как для ОЗУ, так и для периферийных микросхем. Это устраняет необходимость в выделенных инструкциях ввода-вывода, хотя недостатком таких схем может быть то, что для вставки состояний ожидания необходимо использовать специальное оборудование, поскольку периферийные устройства часто работают медленнее, чем память. Однако в некоторых простых компьютерах 8080 адресация ввода-вывода действительно осуществляется так, как если бы они были ячейками памяти, «отображенными в память», оставляя команды ввода-вывода неиспользуемыми. Адресация ввода-вывода может также иногда использовать тот факт, что процессор выводит один и тот же 8-битный адрес порта как в IN 05hмладший, так и в старший байт адреса (т. Е. Помещает адрес 0505h на 16-битную адресную шину). Подобные схемы портов ввода-вывода используются в обратно совместимых Zilog Z80 и Intel 8085, а также в близких семействах микропроцессоров x86.

Отдельное пространство стека

Один из битов в слове состояния процессора (см. Ниже) указывает, что процессор обращается к данным из стека. Используя этот сигнал, можно реализовать отдельное пространство памяти стека. Однако эта функция используется редко.

Слово внутреннего состояния

В более продвинутых системах во время одной фазы рабочего цикла процессор устанавливает свой «байт внутреннего состояния» на шине данных. Этот байт содержит флаги, которые определяют, осуществляется ли доступ к памяти или порту ввода-вывода и нужно ли обрабатывать прерывание.

Состояние системы прерываний (включено или отключено) также выводится на отдельный вывод. Для простых систем, где прерывания не используются, можно найти случаи, когда этот вывод используется как дополнительный однобитовый выходной порт (например, популярный компьютер Радио-86РК, сделанный в Советском Союзе ).

Пример кода

Следующий исходный код ассемблера 8080/8085 предназначен для названной подпрограммы, memcpyкоторая копирует блок байтов данных заданного размера из одного места в другое. Блок данных копируется по одному байту за раз, а логика перемещения данных и цикла использует 16-битные операции.

 
 
 
 
 
 
 
 
 
 
 
1000
1000
1000  78
1001  B1
1002  C8
1003  1A
1004  77
1005  13
1006  23
1007  0B
1008  78
1009  B1
100A  C2 03 10
100D  C9
; memcpy --
; Copy a block of memory from one location to another.
;
; Entry registers
;       BC - Number of bytes to copy
;       DE - Address of source data block
;       HL - Address of target data block
;
; Return registers
;       BC - Zero

            org     1000h       ;Origin at 1000h
memcpy      public
            mov     a,b         ;Copy register B to register A
            ora     c           ;Bitwise OR of A and C into register A
            rz                  ;Return if the zero-flag is set high.
loop:       ldax    d           ;Load A from the address pointed by DE
            mov     m,a         ;Store A into the address pointed by HL
            inx     d           ;Increment DE
            inx     h           ;Increment HL
            dcx     b           ;Decrement BC   (does not affect Flags)
            mov     a,b         ;Copy B to A    (so as to compare BC with zero)
            ora     c           ;A = A | C      (are both B and C zero?)
            jnz     loop        ;Jump to 'loop:' if the zero-flag is not set.   
            ret                 ;Return

Использование пин-кода

Адресная шина имеет свои собственные 16 контактов, а шина данных имеет 8 контактов, которые можно использовать без какого-либо мультиплексирования. Используя два дополнительных контакта (сигналы чтения и записи), можно очень легко собрать простые микропроцессорные устройства. Только отдельное пространство ввода-вывода, прерывания и DMA требуют дополнительных микросхем для декодирования сигналов выводов процессора. Однако нагрузочная способность процессора ограничена, и даже простые компьютеры часто содержат шинные усилители.

Для процессора требуются три источника питания (−5, +5 и +12 В) и два неперекрывающихся синхронизирующих сигнала большой амплитуды. Однако, по крайней мере, позднесоветская версия КР580ВМ80А могла работать с одним источником питания +5 В, при этом вывод +12 В был подключен к +5 В, а вывод −5 В - к земле. Процессор потребляет около 1,3  Вт мощности.

Таблица выводов из сопроводительной документации на микросхему описывает выводы следующим образом:

Пин код Сигнал Тип Комментарий
1 A10 Выход Адрес автобус 10
2 GND - Земля
3 D4 Двунаправленный Двунаправленная шина данных. Процессор также временно устанавливает здесь «состояние процессора», предоставляя информацию о том, что процессор в настоящее время делает:
  • D0 команда прерывания чтения. В ответ на сигнал прерывания процессор считывает и выполняет одну произвольную команду с поднятым этим флагом. Обычно поддерживающие микросхемы обеспечивают команду вызова подпрограммы (CALL или RST), передавая управление коду обработки прерывания.
  • Чтение D1 (низкий уровень означает запись)
  • D2 обращается к стеку (вероятно, изначально планировалось отдельное пространство памяти стека)
  • D3 ничего не делает, остановлен инструкцией HLT
  • D4 записывает данные в выходной порт
  • D5 чтение первого байта исполняемой инструкции
  • D6 чтение данных из входного порта
  • D7 чтение данных из памяти
4 D5
5 D6
6 D7
7 D3
8 D2
9 D1
10 D0
11 −5 В - Источник питания −5 В. Это должен быть первый источник питания, подключенный и последний отключенный, иначе процессор будет поврежден.
12 СБРОС НАСТРОЕК Вход Сброс настроек. Сигнал заставляет выполнение команд, расположенных по адресу 0000. Содержимое других регистров процессора не изменяется. Это инвертирующий вход (активный уровень - логический 0)
13 ДЕРЖАТЬ Вход Запрос прямого доступа к памяти. От процессора требуется переключить шину данных и адреса в высокоимпедансное («отключенное») состояние.
14 INT Вход Запрос на прерывание
15 φ2 Вход Вторая фаза сигнала тактового генератора
16 INTE Выход У процессора есть две команды для установки уровня 0 или 1 на этом выводе. Вывод обычно предполагается использовать для управления прерываниями. Однако на простых компьютерах он иногда использовался как однобитовый выходной порт для различных целей.
17 DBIN Выход Чтение (процессор читает из памяти или порта ввода)
18 WR Выход Запись (процессор записывает в память или в выходной порт). Это инвертированный выход, активный уровень - логический ноль.
19 СИНХРОНИЗАЦИЯ Выход Активный уровень указывает, что процессор поместил «слово состояния» на шину данных. Различные биты этого слова состояния предоставляют дополнительную информацию для поддержки отдельных адресных пространств и пространств памяти, прерываний и прямого доступа к памяти. Этот сигнал требуется для прохождения дополнительной логики, прежде чем его можно будет использовать для записи слова состояния процессора из шины данных в какой-либо внешний регистр, например, 8238- Системный контроллер и драйвер шины.
20 +5 В - Источник питания + 5 В
21 год HLDA Выход Подтверждение прямого доступа к памяти. Процессор переключает контакты данных и адреса в состояние высокого импеданса, позволяя другому устройству управлять шиной.
22 φ1 Вход Первая фаза сигнала тактового генератора
23 ГОТОВ Вход Ждать. Этим сигналом можно приостановить работу процессора. Он также используется для поддержки аппаратного пошагового режима отладки.
24 ЖДАТЬ Выход Подождите (указывает, что процессор находится в состоянии ожидания)
25 A0 Выход Адресная шина
26 A1
27 A2
28 год 12 В - Источник питания +12 В. Это должен быть последний подключенный и первый отключенный источник питания.
29 A3 Выход Адресная шина; может переключаться в состояние с высоким импедансом по запросу
30 A4
31 год A5
32 A6
33 A7
34 A8
35 год A9
36 A15
37 A12
38 A13
39 A14
40 A11

Поддержка чипов

Ключевым фактором успеха 8080 был широкий спектр доступных микросхем поддержки, обеспечивающих последовательную связь, счетчик / синхронизацию, ввод / вывод, прямой доступ к памяти и программируемое управление прерываниями среди других функций:

Физическая реализация

В интегральной схеме 8080 используются ненасыщенные вентили nMOS с усиленной нагрузкой , требующие дополнительных напряжений (для смещения нагрузки-затвора). Он был изготовлен методом кремниевого затвора с минимальным размером элемента 6 мкм. Один слой металла используется для соединения примерно 6000 транзисторов в конструкции, но слой поликремния с более высоким сопротивлением , который требовал более высокого напряжения для некоторых межсоединений, реализован с помощью затворов транзисторов. Размер матрицы составляет примерно 20 мм 2 .

Промышленное влияние

Приложения и преемники

8080 используется во многих ранних микрокомпьютерах, таких как MITS Altair 8800 Computer, Processor Technology SOL-20 Terminal Computer и IMSAI 8080 Microcomputer, образуя основу для машин, работающих под управлением операционной системы CP / M (более поздняя, ​​почти полностью совместимая и др. состоянии, Zilog Z80 процессор будет заработать на этом, с Z80 и CP / M становится доминирующим CPU и OS сочетание периода около 1976 до 1983 больше, чем сделал x86 и DOS для ПК десять лет спустя).

Даже в 1979 году, после появления процессоров Z80 и 8085, пять производителей 8080 продавали примерно 500 000 единиц в месяц по цене от 3 до 4 долларов каждый.

Первые одноплатные микрокомпьютеры , такие как MYCRO-1 и dyna-micro / MMD-1 (см .: Одноплатный компьютер ), были основаны на Intel 8080. Одно из первых применений 8080 было сделано в конце 1970-х годов. компанией Cubic-Western Data из Сан-Диего, Калифорния, в ее автоматизированных системах оплаты проезда, специально разработанных для систем общественного транспорта по всему миру. На ранних этапах промышленного использования 8080 использовался в качестве «мозга» линейки продуктов DatagraphiX Auto-COM (Computer Output Microfiche), которая берет большие объемы пользовательских данных с катушки на катушку и отображает их на микрофишах. Инструменты Auto-COM также включают в себя целую автоматизированную подсистему резки, обработки, промывки и сушки пленки - настоящий подвиг, как тогда, так и в 21 веке, и все это может быть успешно выполнено с помощью только 8-битного микропроцессора, работающего на тактовая частота менее 1 МГц при ограничении памяти 64 КБ. Кроме того, на микропроцессоре 8080 было построено несколько ранних аркадных видеоигр , в том числе Space Invaders , одна из самых популярных аркадных игр из когда-либо созданных.

Вскоре после выпуска 8080 был представлен конкурирующий дизайн Motorola 6800 , а после этого - производная от 6800 MOS Technology 6502 .

Zilog представил Z80 , который имеет совместимый набор команд машинного языка и изначально использовал тот же язык ассемблера, что и 8080, но по юридическим причинам Zilog разработал синтаксически другой (но совместимый с кодом) альтернативный язык ассемблера для Z80. В Intel за 8080 последовал совместимый и более элегантный в электрическом отношении 8085 .

Позже Intel выпустил ассемблере совместимы (но не двоично-совместимый) 16-BIT 8086 и затем 8/16-бит 8088 , который был выбран с помощью IBM для своего нового ПК будет запущен в 1981 г. Позже NEC сделал NEC V20 (клон 8088 с совместимостью с набором инструкций Intel 80186 ), который также поддерживает режим эмуляции 8080. Это также поддерживается NEC V30 (аналогично улучшенный клон 8086). Таким образом, 8080 благодаря своей архитектуре набора команд (ISA) оказал долгосрочное влияние на историю компьютеров.

Были изготовлены ряд процессоров , совместимых с Intel 8080A в восточном блоке : кр580вм80а (изначально помечается как KP580ИK80) в Советском Союзе , то MCY7880 сделал Unitra ЦЭМИ в Польше , то MHB8080A сделаны TESLA в Чехословакии , то 8080APC сделал Tungsram / MEV в Венгрии и MMN8080 производства Microelectronica Bucharest в Румынии .

По состоянию на 2017 год 8080 все еще находится в производстве Lansdale Semiconductors.

Изменение отрасли

8080 также изменил способ создания компьютеров. Когда был представлен 8080, компьютерные системы обычно создавались такими производителями компьютеров, как Digital Equipment Corporation , Hewlett Packard или IBM . Производитель будет производить весь компьютер, включая процессор, терминалы и системное программное обеспечение, такое как компиляторы и операционную систему. 8080 был разработан практически для любого приложения, кроме полной компьютерной системы. Компания Hewlett Packard разработала серию интеллектуальных терминалов HP 2640 на основе 8080. HP 2647 - это терминал, который запускает язык программирования BASIC на 8080. Microsoft будет продавать в качестве своего основного продукта первый популярный язык для 8080, а позже приобретет DOS. для IBM PC .

8080 и 8085 породили 8086, который был разработан как совместимое с исходным кодом (хотя и не двоично-совместимое ) расширение 8085. Эта конструкция, в свою очередь, позже породила семейство чипов x86 , основу для многих используемых процессоров. Cегодня. Многие из основных машинных инструкций и концепций 8080 выживают в широко распространенной платформе x86. Примеры включают регистры с именами A , B , C и D, а также многие флаги, используемые для управления условными переходами. Ассемблерный код 8080 по-прежнему можно напрямую транслировать в инструкции x86; все его основные элементы все еще присутствуют.

История

Федерико Фаггин , создатель архитектуры 8080 в начале 1972 года, предложил ее руководству Intel и настаивал на ее реализации. Через полгода он наконец получил разрешение на его разработку. В ноябре 1972 года Фаггин нанял из Японии Масатоши Шима , который выполнил детальное проектирование под своим руководством, используя методологию проектирования для случайной логики с кремниевым вентилем, которую Фаггин разработал для семейства 4000. Стэнли Мазор добавил пару инструкций в набор инструкций.

Компания Shima закончила компоновку в августе 1973 года. После регламента производства NMOS в январе 1974 года был завершен прототип 8080. У него был недостаток, заключающийся в том, что управление стандартными устройствами TTL увеличивало напряжение заземления, поскольку в узкую линию протекал большой ток. . Однако Intel уже произвела 40 000 единиц 8080 по указанию отдела продаж, прежде чем Шима охарактеризовал прототип. Он был выпущен как требующий маломощных устройств Schottky TTL (LS TTL). В 8080A этот недостаток исправлен.

Intel предложила имитатор набора команд для 8080 под названием INTERP / 80. Его написал Гэри Килдалл, когда он работал консультантом в Intel.

Патент

Культурное влияние

  • Астероид 8080 Intel назван в качестве каламбура и похвалы имени Intel 8080.
  • Опубликованный номер телефона Microsoft 425-882-8080 был выбран потому, что очень много ранних работ было сделано над этим чипом.
  • Многие из основных телефонных номеров Intel также имеют похожую форму: xxx-xxx-8080.

Смотрите также

использованная литература

дальнейшее чтение

  • 8080A / 8085 Программирование на языке ассемблера ; 1-е изд; Лэнс Левенталь; Адам Осборн и партнеры; 495 страниц; 1978. (архив)
  • Язык ассемблера 8080 / Z80 - методы улучшенного программирования ; 1-е изд; Алан Миллер; Джон Уайли и сыновья; 332 страницы; 1981; ISBN  978-0471081241 . (архив)
  • Методы взаимодействия с микропроцессором ; 3-е изд; Родней Закс и Остин Лизи; Sybex; 466 страниц; 1979; ISBN  978-0-89588-029-1 . (архив)
  • Программирование на языках ассемблера Z80 и 8080 ; 1-е изд; Кэте Спраклен; Хайден; 180 страниц; 1979; ISBN  978-0810451674 . (архив)

внешние ссылки