╔══════════════════════════════════════════════════════════════╗
║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ MPU Z380 ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
╚══════════════════════════════════════════════════════════════╝
[ Продолжение. Предыдущие публикации - в номерах 9,8,7,6. ]
(C) WLODEK BLACK
...Вот мы и добрались до системы команд! Начнем с самого просто-
го, как обычно, - пересылок.
Группа команд 8-разрядной загрузки.
В ней добавились к имеющимся в Z80 инструкциям только
операции с половинками индексных регистров:
Команда Действие
LD XYU,n XYU <- n
LD XYL,n XYL <- n
, где "XY" - IX или IY, а "n" - 8-разрядная константа.
Также объявлены команды пересылок между половинками индексных
регистров и регистрами общего назначения:
LD XYU,s
LD XYL,s
LD s,XYU
LD s,XYL
, где "s" - регистр общего назначения.
На самом деле эти операции выполнялись и на Z80, только они бы-
ли не объявлены в официальном списке команд. Теперь же у них по-
явилась стандартная мнемоника, а вместе с нею и полноправное
вхождение в перечень инструкций.
Инструкции вида
LD r,(XY+d) LD (XY+d),r
LD (XY+d),n
LD A,(nn) LD (nn),A
могут быть префиксованы DDIR IB или DDIR IW для расширения раз-
рядности операнда.
В остальном состав группы 8-разрядных пересылок точно такой же,
как и у прототипа.
Группа команд 16- и 32-разрядной загрузки.
Новые команды:
LD[W] (pp),nn (pp+1) <- nh загрузка 16-битной константы nn
(pp) <- nl по адресу, указываемому парой
pp, например, LD (BC),nn;
LD pp,(uu) pph <- (uu+1) косвенная загрузка регистровой
ppl <- (uu) пары pp с адреса, указываемого
парой uu, например LD IX,(BC);
LD (pp),uu (pp+1) <- uuh помещение значения пары uu по
(pp) <- uul адресу, указываемому парой pp:
LD (DE),IX;
LD pp,UU pp <- UU пересылка значения одной пары
в другую: LD BC,HL;
LD XY,pp XY <- pp LD IX,BC; LD IY,DE;
LD pp,XY pp <- XY LD BC,IX; LD DE,IY;
LD IX,IY пересылка значения одного
LD IY,IX индексного регистра в другой;
LD (pp),XY (pp+1) <- XYU сохранение индексного регистра
(pp) <- XYL по адресу,указываемому парой pp;
LD (BC),IX;
LD XY,(pp) XYU <- (pp+1) загрузка индексного регистра с
XYL <- (pp) адреса, указываемого парой pp;
LD IY,(DE);
LD pp,(XY+d) pph <- (XY+d)h загрузка пары pp с адреса, инде-
ppl <- (XY+d)l ксируемого по IX или IY со сме-
щением d: LD HL,(IX+d);
LD IX,(IY+d) загрузка одного индексного реги-
LD IY,(IX+d) стра с адреса, индексируемого
другим индексным регистром со
смещением d;
LD pp,(SP+d) pph <- (SP+d)h загрузка пары с адреса, индекси-
ppl <- (SP+d)l руемого указателем стека SP со
смещением d; LD DE,(SP+d);
LD XY,(SP+d) -"- индексного регистра;
LD (XY+d),pp загрузки в противоположном на-
LD (IX+d),IY правлении - помещение пары pp
LD (IY+d),IX или индексного регистра в память
LD (SP+d),pp по адресу, индексируемому XY или
LD (SP+d),XY SP;
LD[W] I,HL I <- HL загрузка регистра вектора преры-
ваний значением пары HL;
LD I,HL; LDW I,HL ("W" - необя-
зательный элемент);
LD[W] HL,I HL <- I чтение регистра вектора прерыва-
ний в пару HL;
LD HL,I; LDW HL,I.
Символ "W" можно употреблять для удобства чтения программы, что-
бы визуально подчеркнуть, что речь идет об операнде формата
"слово".
Все команды 16-разрядной загрузки, в том числе и "старые", в ре-
жиме "длинное слово" (LW; Long Word mode), установленном в реги-
стре SR, будут работать с 32-разрядными операндами.
Однобайтовое смещение в индексных операциях и 16-разрядный адрес
в операциях с прямой адресацией можно расширить до соответствен-
но 16 или 24-х или до 24-х или 32-х бит с помощью префиксов
DDIR IB, DDIR IW, если формат данных установлен в одинарное сло-
во. В режиме "длинное слово" операнды суть "16-разрядный адрес"
и так превращаются в 32-разрядные и требуют соответствующего ко-
личества байт, но индексное смещение остается в прежнем формате
и требует, при необходимости, префиксования DDIR (! Возможно, в
этом нюансе я чего-то и напутал (все-таки с английского оригина-
ла читаю)).
Группа PUSH / POP.
Добавились:
PUSH nn (SP-2) <- nnl занесение в стек константы;
(SP-1) <- nnh (константу можно расширить
SP <- SP-2 через DDIR);
PUSH SR (SP-2) <- SR(7-0)
(SP-1) <- SR(15-8)
SP <- SP-2
POP SR SR(6-0) <- (SP) <-- бит SR(7) не пере-
SR(15-8) <- (SP+1) устанавливается через
SR(23-16) <- (SP+1) POP; это бит расширен-
SR(31-24) <- (SP+1) ного режима процессора;
SP <- SP+2 его можно сбросить толь-
ко RESET-ом;
При установленном формате "обычное слово" POP SR, как видно, ве-
дет себя довольно оригинально - 8...15-й биты SR копируются в 2
старших байта регистра. При режиме "длинное слово" в стек зано-
сится все 32-битное значение и так же все снимается при POP(это
справедливо для всех регистровых пар); старшая половина 32-бит-
ного значения заносится в стек первой (по отношению к "основной"
части значения).
"PUSH nn" можно расширить с помощью DDIR. Нерасширенный"PUSH nn"
в режиме "длинное слово" заносит дополнительно #0000 в стек (та-
кже это относится к PUSH AF).
"POP nn", разумеется, не существует (смысл очевиден).
При работе процессора в режиме "Z80" указатель стека закольцован
на младших 64К памяти; старшие разряды сброшены в 0.
[ Продолжение следует ].