Главная » Ассемблер, Железо » Внутренние регистры адаптера

0

Регистр команд (Command register, сокращенно CR), доступный с любой страницы, размещается по базовому адресу (без смещения). Он предназначен для выбора страницы, запуска процесса передачи пакета, а также блокировки и разблокировки внешних DMA-one- раций.

Рис. 9.1. Структура регистра команд CR

Структура регистра команд показана на рис. 9.1. Разряды регистра

имеют следующее назначение:

•     бит О (STP) предназначен для программного сброса адаптера: после установки в 1 данного разряда работа адаптера приостанавливается (если в момент установки разряда выполняется операция приема или передачи пакета, останов производится после полного завершения этой операции; выход из состояния останова осуществляется путем сброса данного разряда);

•     бит 1 (STA) предназначен для активизации адаптера (установка данного бита в 1 позволяет активизировать работу адаптера после включения питания, программного сброса или обнаружения сбоя);

•     бит 2 (ТХР) обеспечивает запуск операции передачи пакета (установка данного бита в 1 инициирует операцию передачи пакета; после завершения операции передачи бит ТХР сбрасывается в 0);

•     биты 3-5 (RDO, RD1, RD2) содержат код внешней DMA-операции (см. табл. 9.4);

•     биты 6-7 (PSO, PS1) служат для выбора регистровой страницы адаптера (см. табл. 9.5).

Таблица 9.4. Значение битов RD0-RD2 регистра команд

Код команды

Выполняемая операция

RD2 RD1 RDO

ООО

Запрещенная комбинация

0 0 1

Передача данных от адаптера в память компьютера

 

(Remote Read)

Таблица 9.4 (продолжение)

Код команды

Выполняемая операция

RD2 RD1 RDO

0 1 0

Запись данных из памяти компьютера в память адаптера (Remote Write)

0 1 1

Передача пакета

1 X X

Аварийное прекращение внешней DMA-операции

Таблица 9.5. Значение битов PS0 и PS1 регистра команд

Код страницы

Номер страницы

PS1 PSO

0 0

Регистровая страница 0

0 1

Регистровая страница 1

1 0

Регистровая страница 2

1 1

Резервная или тестовая страница (пользователям недоступна)

Регистр статуса прерывания (Interrupt Status Register, сокращенно ISR) позволяет центральному процессору компьютера определить причину прерывания.

Рис. 9.2. Структура регистра статуса прерывания ISR

Структура регистра ISR показана на рис. 9.2. Разряды регистра имеют следующее назначение:

•    бит 0 (PRX ) — признак поступления пакета данных (устанавливается в 1 после завершения приема пакета, если пакет принят без ошибок);

•    бит 1 (РТХ) — признак завершения передачи пакета данных (устанавливается в 1 после завершения передачи пакета, если пакет передан без ошибок);

•    бит 2 (RXE) — признак того, что пакет принят с одной или несколькими ошибками (устанавливается в 1 при обнаружении ошибки по CRC, ошибки выравнивания кадра, при переполнении FIFO или потере пакета);

•     бит 3 (ТХЕ) — признак того, что при передаче пакета произошла ошибка (устанавливается в 1, если количество коллизий превысило допустимое значение или буфер FIFO не был полностью загружен);

•     бит 4 (0VW) — признак переполнения кольцевого буфера приемника (устанавливается в 1, если при выполнении внутренней DMA-операции был перейден ограничитель, указывающий на начало первого занятого блока буфера — Boundary Pointer);

•     бит 5 (CNT) — признак переполнения счетчика ошибок (устанавливается в 1 при переполнении любого из трех счетчиков ошибок — счетчика ошибок выравнивання, счетчика ошибок CRC или счетчика потерянных пакетов);

•     бит 6 (RDC) — признак завершения внешней DMA-операции (устанавливается в 1, когда операция завершена);

•     бит 7 (RST) — признак сброса адаптера (данный бит не генерирует прерывание и служит только индикатором состояния адаптера; бит RST устанавливается в 1 после сброса адаптера и сбрасывается в 0 после подачи команды запуска, то есть после установки бита STA в регистре команд).

ВНИМАНИЕ

Сигнал прерывания определенного типа сбрасывается путем записи единицы в соответствующий разряд регистра ISR. После включения питания нужно сбросить регистр ISR, записав в него код FFh (то есть единицы во все разряды).

Регистр маскирования прерываний (Interrupt Mask Register, сокращенно IMR) позволяет избирательно блокировать (запрещать) некоторые типы запросов прерывания от сетевого адаптера.

Рис. 9.3. Структура регистра маскирования прерываний IMR

Структура регистра I MR показана на рис. 9.3. Разряды регистра имеют следующее назначение:

•     бит 0 (PRXE) — управление сигналом завершения приема пакета (0 — прерывание запрещено, 1 — прерывание разрешено);

•     бит 1 (РТХЕ) — управление сигналом завершения передачи пакета (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 2 (RXEE) — управление сигналом об обнаружении ошибок при приеме пакета (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 3 (ТХЕЕ) — управление сигналом об обнаружении ошибок при передаче пакета (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 4 (OVWE) — управление сигналом переполнения кольцевого буфера (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 5 (CNTE) — управление сигналом переполнения счетчика ошибок (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 6 (RDCE) — управление сигналом завершения внешней DMA-операции (0 — прерывание запрещено, 1 — прерывание разрешено);

•    бит 7 — зарезервирован.

Таким образом, каждый разряд регистра IMR (за исключением седьмого — прерывание по сбросу адаптера не вырабатывается и, соответственно, не может быть замаскировано) соответствует разряду регистра ISR с тем же порядковым номером.

Сигнал прерывания вырабатывается адаптером, если в регистре ISR установлен хотя бы один не замаскированный регистром IMR бит, и остается активным до тех пор, пока незамаскированные разряды регистра ISR не будут сброшены (путем записи в них единиц). После включения питания компьютера разряды регистра IMR устанавливаются в 0: все сигналы, кроме сигнала сброса, замаскированы.

Регистр управления форматом данных (Data Configuration Register, сокращенно DCR), предназначен для выбора разрядности интерфейса памяти (8- или 16-разрядный), порядка размещения байтов в 16-разрядных словах и установки порога FIFO.

Рис. 9.4. Структура регистра управления форматом данных DCR

Структура регистра DCR показана на рис. 9.4. Разряды регистра имеют следующее назначение:

• бит О (WTS) — выбор ширины шины данных для внешних и внутренних DMA-операций (0 — 8 разрядов, 1 — 16 разрядов);

•    бит 1 (80S) — выбор порядка байтов в словах (0 — порядок «младший байт — первый», принятый для процессоров 80×86 фирмы Intel; 1 — порядок «старший байт — первый», принятый для процессоров фирмы Motorola);

•    бит 2 (LAS) — выбор режима адресации памяти компьютера (0 — используется спаренный 16-разрядный канал DMA, 1 — используется 32-разрядный канал DMA);

•    бит 3 (LS) — выбор режима работы адаптера (0 — режим диагностики, 1 — рабочий режим);

•    бит 4 (ARM) — управление режимом автоинициалнзации (0 — команда передачи пакета не выполняется, все пакеты удаляются из кольцевого буфера под управлением центрального процессора компьютера; 1 — допускается выполнение команды передачи пакета, производится автоинициализация внешней DMA-операции для удаления пакетов из кольцевого буфера);

•    биты 5-6 (FT0 и FT1) определяют «предел» FIFO, то есть число байтов или слов FIFO, реально используемых при приеме и передаче данных (табл. 9.6);

•    бит 7 зарезервирован.

Таблица 9.6. Зависимость значения предела FIFO от заданной

ширины шины данных DMA и значения битов FT0 и FT1 регистра DCR

Код предела FIFO

Ширина шины данных DMA

FT1 FTO

16 разрядов

8 разрядов

0 0

1 слово

2 байта

0 1

2 слова

4 байта

1 0

4 слова

8 байт

1 1

6 слов

12 байт

В современных ЫЕ2000-совместимых сетевых адаптерах значение некоторых разрядов регистра DCR жестко (на аппаратном уровне) зафиксировано:

•    бит B0S всегда содержит значение 0 (используется порядок байтов процессоров серии 80×86);

•    бит LAS всегда содержит значение 0 (используется 16-разрядный режим DMA);

•    бит ARM всегда содержит значение 0 (автоинициализация кольцевого буфера и использование команды передачи пакета запрещены);

• бит FT1 всегда содержит значение 1, а бит FT0 — значение 0 (что

соответствует пределу FIFO в 4 слова). Регистр управления передатчиком (Transmit Configuration Register, сокращенно TCR) задает параметры работы передающего блока сетевого адаптера.

Рис. 9.5. Структура регистра управления передатчиком TCR

Структура регистра TCR показана на рис. 9.5. Разряды регистра имеют следующее назначение:

•    бит О (CRC) служит для управления схемой генерации контрольного кода (0 — обычный режим работы, код CRC добавляется в конец пакета при передаче; 1 — самотестирование адаптера, код CRC не формируется);

•    биты 1-2 (LB0 и LB1) содержат код режима работы передатчика (см. табл. 9.7);

•    бит 3 (ATD) служит для управления опцией внешней блокировки передатчика (0 — обычный режим работы, внешняя блокировка передатчика запрещена; 1 — разрешена внешняя блокировка передатчика);

•    бит 4 (0FST) служит для выбора алгоритма обработки коллизий (О — стандартный алгоритм, 1 — модифицированный алгоритм);

•    биты 5-7 не используются (зарезервированы).I

Рассмотрим более подробно разряды ATD и 0FST. Установка в 1 разряда ATD позволяет другим станциям сети блокировать и разблокировать работу передатчика путем передачи пакета с определенным групповым адресом (поступление пакета с групповым адресом, хеширующим бит 62, вызывает отключение передатчика; пакет с групповым адресом, хеширующим бит 63, позволяет включить передатчик).

Установка в 1 разряда 0FST приводит к тому, что адаптер начинает использовать модифицированный («смещенный») алгоритм обработки коллизий: после первой коллизии переходит в режим с самым низким приоритетом (с максимальной задержкой передачи), остается в нем после двух следующих коллизий, а затем переходит к обычному алгоритму обработки коллизий.

Таблица 9.6. Значение кода режима работы передатчика

Код режима

Состояние

Номер

Режим работы

 

сигнала LPBK

режима

 

LB1 LBO

0 0

0

0

Обычный

0 1

0

1

Внутренняя диагностика

1 0

1

2

Внешняя диагностика

1 1

0

3

Внешняя диагностика

Регистр состояния передатчика (Transmit Status Register, сокращенно TSR) отражает текущее состояние передатчика.

Рис. 9.6. Структура регистра состояния передатчика TSR .

Структура регистра TSR показана на рис. 9.6. Разряды регистра имеют следующее назначение:

•    бит О (РТХ) — признак успешной передачи пакета (устанавливается в 1, если пакет передан без ошибок);

•    бит 1 — зарезервирован;

•    бит 2 (CDL) — признак наличия коллизий (устанавливается в 1, если в процессе передачи пакета имела место хотя бы одна коллизия);

•    бит 3 (АВТ) — признак аварийного завершения передачи пакета (устанавливается в 1, если передача пакета прервана аварийно после 16 коллизий на линии связи);

•    бит 4 (CRS) — признак потери несущей частоты (устанавливается в 1, если при передаче произошла потеря несущей частоты; передача пакета, однако, в этом случае не прекращается);

•    бит 5 (FU) — признак переполнения FIFO (устанавливается в 1, если в процессе передачи пакета произошло переполнение буфера FIFO; передача пакета в этом случае немедленно прекращается);

•    бит 6 (CDH) — признак сбоя передатчика при формировании сигнала коллизии (устанавливается в 1, если в течение заданного стандартом Ethernet интервала времени сигнал коллизии на линии не сформирован);

• бит 7 (OWC) — признак запаздывания сигнала коллизии (устанав-‘ ливается в 1, если сигнал коллизии на линии сформирован с опозданием, превышающим стандартную величину, равную, 51,2 мкс; в этом случае, как и при обнаружении обычной колли-, зии, производится повторная передача пакета). Регистр управления приемником (Receive Configuration Register, сокращенно RCR) задает параметры работы блока приемника сетевого адаптера.

Рис. 9.7. Структура регистра управления приемником RCR

Структура регистра RCR показана на рис. 9.7. Разряды регистра имеют следующее назначение:

•    бит О (SEP) управляет режимом обработки пакетов, принятых с ошибками (0 — пакеты с ошибками не сохраняются; 1 — сохраняются пакеты с ошибками CRC и выравнивания кадров);

•    бит 1 (AR) служит для управления обработкой «коротких» пакетов с длиной менее 64 бит (0 — короткие пакеты отбрасываются, 1 — адаптер обрабатывает короткие пакеты);

•    бит 2 (АВ) управляет обработкой пакетов с широковещательными адресами (0 — пакеты с широковещательным адресом отбрасываются, 1 — адаптер обрабатывает пакеты с широковещательным адресом);

•    бит 3 (AM) управляет обработкой пакетов с групповыми адресами (О — пакеты с групповым адресом не проверяются, 1 — адаптер проверяет пакеты с широковещательным адресом при помощи массива хеширования);

•    бит 4 (PRO) управляет обработкой пакетов с физическими адресами (0 — принимаются только пакеты с физическим адресом, совпадающим с записанным в регистрах PAR0-PAR5 сетевого адаптера; 1 — принимаются пакеты с любыми физическими адресами);

•    бит 5 (M0N) позволяет переключить контроллер в режим «наблюдения» (0 — обычный режим, в котором принятые пакеты сохраняются в буферной иамяти; 1 — режим наблюдения, в котором пакеты проверяются на наличие ошибок адресации, CRC и вц- равнивания кадров, но в памяти не сохраняются);

•    биты 6 и 7 не используются (зарезервированы).

ПРИМЕЧАНИЕ

Биты АВ и AM должны устанавливаться и сбрасываться совместно друг с другом. Установка в 1 всех трех битов управления контролем адресов (АВ, AM и PRO) и всех разрядов в регистрах многоцелевого адреса (MAR0- MAR7) приводит к переключению адаптера в режим «подслушивания сети», когда принимаются любые обнаруженные в линии связи пакеты — вне зависимости оттого, какой станции сети они адресованы.

Регистр состояния приемника (Receive Status Register, сокращенно RSR) отражает текущее состояние приемника.

Рис. 9.8. Структура регистра состояния приемника RSR

Структура регистра RSR показана на рис. 9.8. Разряды регистра имеют следующее назначение:

•     бит О (PRX) — признак успешного завершения приема пакета (устанавливается в 1, если пакет принят без ошибок);

•     бит 1 (CRC) — признак ошибки CRC (устанавливается в 1, если при приеме пакета обнаружено несовпадение контрольного кода или ошибка выравнивания кадра; установка этого бита приводит к увеличению на 1 значения счетчика ошибок CNTR1);

•     бит 2 (FAE) — признак ошибки выравнивания кадра (устанавливается в 1, если длина принятого пакета не выровнена на целое число байтов; установка этого бита приводит к увеличению на 1 значения счетчика ошибок CNTR0);

•     бит 3 (F0) — признак переполнения FIFO (устанавливается в 1, если при приеме пакета произошло переполнение буфера FIFO; операция приема пакета в этом случае завершается аварийно);

•     бит 4 (МРА) — признак потери пакета (устанавливается в 1 в том случае, если адаптер находится в режиме наблюдения и не сохраняет в памяти поступивший пакет, либо в том случае, когда пакет не был принят в результате переполнения буферной памяти; значение счетчика ошибок CNTR2 при этом увеличивается на 1);

•     бит 5 (PHY) — индикатор типа адреса принятого пакета (0 — физический адрес, 1 — групповой или широковещательный адрес);

•     бит 6 (DIS) — признак блокировки приемника (устанавливается в 1, когда работа приемника приостанавливается в результате переключения адаптера в режим наблюдения);

• бит 7 (DFR) — признак удлиненного пакета (устанавливается в 1, если длина пакета превышает 1518 байт).

Биты признака ошибки CRC и FAE используются совместно. Расшифровка значения кода, записываемого в эти биты, приведена в табл. 9.7.

Таблица 9.7. Значение кода ошибки, записываемого в биты CRC и FAE регистра состояния приемника RSR

Код ошибки

Тип ошибки

FAE CRC

0 0

Нет ошибок

0 1

Ошибка CRC

1 0

Запрещенная комбинация (не используется)

1 1

Ошибка CRC и ошибка выравнивания кадра

Передача данных внутри N Е2000- со в м ее т и м о го адаптера осуществляется при помощи встроенного адаптера прямого доступа к памяти, который имеет собственный набор управляющих регистров (регистров DMA). Группу регистров DMA принято разделять на три подгруппы: подгруппу регистров передатчика (Transmit DMA Registers), подгруппу регистров приемника (Receive DMA Registers) и подгруппу регистров внешних операций (Remote DMA Registers).

Регистры DMA являются 16-разрядными, а для доступа к ним используется 8-разрядный режим, поэтому каждый регистр разделен на две половины: старший и младший байты. В подгруппу регистров передатчика входят Регистр начальной страницы области передачи и Регистр счетчика передаваемых байтов.

Регистр начальной страницы области передачи (Transmit Page Start Register, сокращенно TPSR) содержит старшие 8 разрядов начального адреса области передачи (биты А8-А15). Встроенная оперативная память адаптера разделена на страницы по 256 байт, а начало пакета всегда выравнивается на начало страницы, поэтому младшие 8 разрядов начального адреса области передачи (биты А0-А7) сброшены в 0. Регистр счетчика передаваемых байтов (Transmit Byte Count Register) разделен на младший (TBCR0) и старший (TBCR1) байты. В этот счетчик загружается размер передаваемого пакета в байтах (включая поле адреса источника, поле адреса получателя, поле длины пакета данных и поле данных). Загруженное в счетчик значение не должно превышать 1500 байт.

В подгруппу регистров приемника входят Регистр начальной страницы области приема, Регистр конечной страницы области приема, Регистр контроля границы, Регистр текущей страницы и Регистр текущего локального адреса DMA.

Регистр начальной страницы области приема (Page Start Register, сокращенно PSTART) содержит старшие 8 разрядов начального адреса кольцевого буфера приемника (биты А8-А15). Начало пакета всегда выравнивается на начало страницы, поэтому младшие 8 разрядов начального адреса кольцевого буфера (биты А0-А7) сброшены в 0.

Регистр конечной страницы области приема (Page Stop Register, сокращенно PSTOP), как явствует из его названия, содержит номер конечной страницы кольцевого буфера приемника. Регистр контроля границы (Boundary Register, сокращенно BNRY) содержит номер первой занятой страницы кольцевого буфера и служит для контроля переполнения кольцевого буфера памяти приемника (если при приеме пакета данных происходит пересечение границы, операция приема завершается аварийно).

Регистр текущей страницы (Current Page Register, сокращенно CURR) содержит номер первой свободной страницы кольцевого буфера, которая может быть использована для приема данных. Во время выполнения инициализации адаптера в регистр CURR должно быть записано то же самое значение, что и в регистр PSTART, то есть регистр текущей страницы должен указывать на начало кольцевого буфера. После завершения процесса инициализации содержимое регистра CURR используется логическими схемами управления кольцевым буфером и может быть изменено только самим адаптером: перезаписывать этот регистр нельзя до следующего сброса адаптера.

Регистр текущего локального адреса DMA (Current Local DMA Register) разделен на младший (CLDA0) и старший (CLDA1) байты. Этот регистр позволяет проконтролировать текущий адрес DMA (адрес ячейки памяти, к которой в данный момент осуществляется обращение).

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

Регистр начального адреса для операций внешнего доступа (Remote Start Address Register) разделен на младший (RSAR0) и старший (RSAR1) байты. Этот регистр задает начальный адрес для передачи блока данных.

Регистр счетчика байтов для операций внешнего доступа (Remote Byte Count Register) разделен на младший (RBCR0) и старший (RBCR1) байты. Этот регистр задает размер передаваемого блока данных в байтах.

Регистр текущего адреса DMA для операций внешнего доступа (Current Remote DMA Address) также разделен на младший (CRDA0) и старший (CRDA1) байты. Он доступен только для считывания и предназначен для контроля процесса передачи данных. В группу регистров физического адреса адаптера (Physical Address Registers) входят шесть 8-разрядных регистров PAR0-PAR5. В эти регистры должен быть записан физический 48-разрядный адрес адаптера в сети Ethernet (регистр PAR0 при этом соответствует младшему байту адреса, регистр PAR5 — старшему байту адреса). Указанный адрес используется адаптером при принятии решения о приеме или игнорировании пакета.

В группу регистров группового адреса адаптера (Multicast Address Registers) входят восемь 8-разрядных регистров MAR0-MAR7. Регистры группового адреса предназначены для фильтрации адресов по контрольной сумме — в момент приема последнего бита адреса получателя пакета. Текущее значение счетчика контрольной суммы фиксируется в регистре-защелке, и старшие 6 разрядов полученного кода используются в качестве индекса элемента 64-разрядной битовой маски, записанной в регистрах MARO-M AR7. Если использование групповых адресов разрешено и соответствующий значению индекса бит маски установлен в 1, пакет принимается, иначе — игнорируется.

В подгруппу счетчиков ошибок входят Счетчик ошибок выравнивания, Счетчик ошибок CRC и Счетчик потерянных пакетов. Восьмиразрядные регистры-счетчики имеют следующие общие свойства:

•    максимальное значение количества ошибок каждого типа составляет 192;

•    после считывания содержимого регистр-счетчик автоматически обнуляется.

Счетчик ошибок выравнивания (Frame Alignment Error Tally, сокращенно CNTRO) подсчитывает ошибки выравнивания кадра: значение счетчика увеличивается на единицу каждый раз, когда при приеме пакета возникает ошибка выравнивания.

Счетчик ошибок CRC (CRC Error Tally, сокращенно CNTR1) подсчитывает ошибки по контрольной сумме: значение счетчика увеличивается на единицу каждый раз, когда при приеме пакета обнаруживается несовпадение контрольной суммы. Счетчик потерянных пакетов (Frame Lost Tally Register, сокращенно CNTR2) подсчитывает ошибки переполнения буфера памяти: значение счетчика увеличивается на единицу каждый раз, когда по причине отсутствия места в кольцевом буфере происходит потеря принимаемого пакета. Если адаптер работает в режиме монитора (отслеживает работу сети), регистр CNTR2 подсчитывает количество распознанных пакетов.

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

ПРИМЕЧАНИЕ

Наличие регистра FIFO не является обязательным: у некоторых моделей

NE2000-coBMecTHMbix адаптеров регистр FIFO отсутствует.

Счетчик коллизий (Number of Collisions, сокращенно NCR) используется для подсчета количества коллизий, имевших место в процессе передачи пакета: значение счетчика увеличивается на единицу при обнаружении очередной коллизии. Структура регистра счетчика коллизий показана на рис. 9.9: используются только 4 младших разряда, поэтому значение счетчика не может превышать 15.

Рис. 9.9. Структура регистра счетчика коллизий NCR

Регистр ввода-вывода данных (10 Register) используется центральным процессором компьютера для доступа к оперативной памяти и ПЗУ адаптера. Регистр имеет смещение 10h от начала пространства ввода-вывода. Разрядность регистра составляет 8 или 16 бит — в зависимости от ширины шины данных, заданной в регистр DCR. Чтобы получить доступ к определенному участку памяти адаптера, нужно загрузить начальный адрес этого участка в Регистр начального адреса для операций внешнего доступа RS AR, а количество передаваемых байтов — в Регистр счетчика байтов для операций внешнего доступа RBCR. После каждой операции ввода-вывода текущий адрес будет увеличиваться на 1 (если заданная ширина шины данных составляет 8 разрядов) или на 2 (если ширина шины — 16 разрядов). Значение счетчика байтов будет уменьшаться соответственно на 1 или на 2 (при использовании 16-разрядной шины всегда должно передаваться четное число байтов).

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии