Преобразование данных - Упакованное десятичное - зонное десятичное

Теперь для получения очередного приближения к EBCDIC-представлению число необходимо «распаковать». Это значит, что его нужно пополнить зонными кодами и половинки последнего байта поменять местами. Все эти действия выполняются командой UNPK (Unpack — РАСПАКОВАТЬ), работающей совершенно аналогично команде упаковки (PACK).

UNPK D1(L1,B1),D2(L2,B2)

UNPacK

Преобразовать (D2 + (B2))L2 в зонное десятичное и за- писать в (D1+(B1))LI

Содержимое L2-байтового поля, начинающегося по адресу D2+(B2), должно представлять выровненное по правому краю поля упакованное десятичное целое. По окончании выполнения команды в L1 байтах, начинающихся байтом D1+(B1), будет записано требуемое число в зонном формате. Выполнение распаковки проходит в несколько этапов. Сначала половинки последнего байта второго операнда меняются местами и результат помещается в последний байт области первого операнда. Затем, начиная с правой половины предпоследнего байта исходного числа, последовательно просматриваются все его цифры. Происходит преобразование в соответствующие коды путем добавления к каждой цифре зонной части. Каждый получившийся код записывается в очередной байт первого операнда, пока вся L1-байтовая область не будет заполнена. Содержимое второго операнда командой UNPK не меняется.

Предположим, что команда UNPK выполняется настолько медленно, что мы можем уследить за изменениями, происходящими на каждом из шагов. Пусть первоначально содержимое памяти выглядело так:

PD: 50134D

ZD: 7777777777

Рассмотрим процесс выполнения команды

UNPK ZD(5),PD(3)

На первом шаге цифры 4 и D поменяются местами, и результат запишется в ZD:

ZD: 77777777D4

Затем цифра 3 дополнится спереди кодом F, и, таким образом, получится

ZD: 777777F3D4

Следующей рассматриваемой цифрой является 1:

ZD: 777777F1F3D4

затем 0

ZD: 77F0F1F3D4

и, наконец, 5

ZD: F5F0F1F3D4

Мы получили окончательный результат.

N-байтовое упакованное число в зонном виде требует для своего размещения не менее 2N—1 байтов. Если длина первого операнда UNPK больше, чем требуется для записи преобразованного числа, то неиспользованная область будет заполнена кодами F0, что эквивалентно добавлению к числу слева незначащих нулей. Если же длина первого операнда слишком мала, то не уместившиеся в отведенную область коды будут утеряны. Пусть, например,

PD: 0123456С

и выполняется команда

UNPK ZD(10),PD(4)

Ее результатом будет

ZD: F0F0F0F0FIF2F3F4F5C6

В то время как результатом выполнения команды

UNPK ZD(3),PD(4)

было бы

ZD: F4F5C6

Если нашей конечной целью является распечатка некоторой строки, то разумно распакованные числа помещать сразу в соответствующие позиции. Таким образом, в качестве длины первого операнда команды UNPK обычно указывается то количество позиций, которое мы хотим отвести для печати данного числа. Например, если 6-байтовое упакованное десятичное число, хранящееся по адресу PD, мы хотим распечатать в виде 12-разрядного числа, начиная с 15-й позиции строки, записанной в области OUTPUT, следует выполнить команду

UNPK OUTPUT+15(12),PD(6)

При этом учитывается, что первый символ строки является символом управления кареткой.

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

DAT: 1ABCDE53

то выполнение команды

UNPK DIS(7),DAT(4)

даст

DIS: F1FAFBFCFDFE35