Доступ к памяти данных
Доступ к памяти данных осуществляется через регистры указателя данных DP[0] и DP[1] или указатель кадра ВР[Offs]. Как только данные в одном из этих регистров устанавливаются, указанные данные могут быть считаны или записаны в качестве источников или получателей при помощи мнемоник @DP[0], @DP[1] или @BP [OFFS].
move DP[0], #0000h ; установка указателя на позицию 0000h
move A[0], @DP[0] ; считывание из памяти данных
move @DP[0], #55h ; запись в память данных
|
Оба указателя данных после считывания или перед записью могут быть увеличены или уменьшены при помощи следующего синтаксиса.
move A[0], @DP[0]++ ; увеличение DP[0] после считывания
move @++DP[0], A[1] ; увеличение DP[0] перед записью
move A[5], @DP[1]-- ; уменьшение DP[1] после считывания
move @--DP[1], #00h ; уменьшение DP[1] перед записью
|
Указатель кадра (ВР[OFFS]) фактически составлен из основного указателя (ВР) и смещения основного указателя (OFFS). Для указателя кадра регистр смещения (OFFS) используется в режиме автоматического увеличения или уменьшения. Основной указатель (ВР) не изменяется при увеличении или уменьшении указателя кадра. Подобно указателям DP[n], регистр OFFS после чтения или перед записью может быть увеличен или уменьшен.
move A[0], @BP[OFFS--] ; уменьшение OFFS после считывания
move @BP[++OFFS], A[1] ; увеличение OFFS перед записью
|
Все три указателя данных поддерживают побайтный и пословный режимы доступа к памяти. Для выбора режима доступа каждый указатель данных имеет свой собственный бит управления (WBSn). Эти три бита регистра (WBS2, который управляет режимом выбора регистра смещения [Offs]; WBS1, который управляет режимом выбора регистра DP[1]; и WBS0, который управляет режимом выбора регистра DP[0]), постоянно находится регистре управления указателем данных (Data Pointer Control - DPC). Когда служебный бит WBSn установлен в единицу, то соответствующий указатель работается в режиме пословного доступа. Когда бит WBSn сброшен в ноль, то указатель работается в режиме побайтного доступа. Пословный режим доступа позволяет обращаться к 64К слов памяти данных, а побайтный режим доступа позволяет обращаться к 64КБ памяти данных.
Каждый указатель данных (DP[n]) и основной регистр указателя кадра (ВР) фактически реализован в виде 17- битного регистра. Регистр смещения указателя кадра (OFFS) реализован в вид 9- битного регистра. Бит WBSn для соответствующего указателя определяет, используются ли старшие 16 бит (16:1) указателя, как это имеет место в пословном режиме (WBSn = 1), или младшие 16 бит (15:0), как это имеет место в побайтовом режиме (WBSn = 0). Бит WBS2 определяет, используются ли старшие 8 бит (8:1), как это имеет место при WBS2 = 1, или младшие 8 бит (7:0), как это имеет место при WBS2 = 0. Все регистры указателя данных считываются, записываются и автоматически увеличиваются/уменьшаются с учетом установленного соответствующего бита WBSn. Увеличение/уменьшение затрагивают только те биты, которые используются в конкретном режиме. Изменение режима доступа не изменяет содержимое указателя данных. Поэтому, важно поддержать последовательность значения адреса указателя данных в пределах данного режима доступа.
move DPC, #0 ; DP[0] в режиме побайтового доступа
move DP[0], #2345h ; DP[0]=2345h (побайтовый режим)
; загружаются биты 15:0
move DPC, #4 ; DP[0] в режиме пословного доступа
move DP[0], #2345h ; DP[0]=2345h (пословный доступ)
; загружаются биты 16:1
move DPC, #0 ; DP[0] в режиме побайтового доступа
move GR, DP[0] ; GR = 468Bh (рассматриваются биты 15:0)
|
Эти три указателя для чтения и записи используют один и тот же порт памяти данных и таким образом, пользователь должен перед использованием сознательно активировать необходимый указатель. Это может быть сделано явно путем выбора битов указателя данных (SDPS1:0; DPC.1:0) или неявно, записывая DP[n], ВР или OFFS регистры, как это показано ниже. Любая косвенная операция записи памяти, используя указатель данных установит биты SDPS, активируя таким образом указатель записи как указатель активного источника.
move DPC, #2 ; (явно) выбор FP в качестве указателя
move DP[1], DP[1] ; (явно) выбор DP[1]; установка SDPS1:0=01b
move OFFS, src ; (явно) выбор FP; установка SDPS1=1
move @DP[0], src ; (явно) выбор DP[0]; установка SDPS1:0=00b
|
После того, как был осуществлен выбор указателя, он останется в силе до тех пор, пока:
- биты выбора указателя данных источника не будут изменены явно или неявно, как это было описано выше
- память, к которой обращается указатель данных, не будет сделана доступной для использования в качестве памяти программы
- не будет произведена операция записи, использующая другой указатель данных.
move DP[1], DP[1] ; выбор DP[1] в качестве активного указателя
move dst, @DP[1] ; считывание данных указателя
move @DP[1], src ; запись, использующая указатель данных
; DP[0] затребован
move DP[0], DP[0] ; выбор DP[0] в качестве активного указателя
|
Для упрощения операций увеличения/уменьшения указателя данных без использования регистра данных, был введен виртуальный получатель NUL, которому присвоен адрес в системном модуле, равный 6, и индекс, равный 7. Ниже приведены команды, позволяющие автоматически увеличить/уменьшить указатель данных без изменения содержимого любого другого регистра:
move NUL, @DP[0]++ ; увеличение DP[0]
move NUL, @DP[0]-- ; уменьшение DP[0]
|
С указателем данных недопустимы приведенные ниже операции:
move @++DP[1], @DP[1]++
move @BP[++Offs], @BP[Offs++]
move @--DP[0], @DP[0]--
move @--DP[1], @DP[1]--
move @BP[--Offs], @BP[Offs--]
move @++DP[0], @DP[0]--
move @++DP[1], @DP[1]--
move @BP[++Offs], @BP[Offs--]
move @BP[++Offs], @BP[Offs--]
move @--DP[0], @DP[0]++
move @--DP[1], @DP[1]++
move @BP[--Offs], @BP[Offs++]
move @DP[0], @DP[0]++
move @DP[1], @DP[1]++
move @BP[Offs], @BP[Offs++]
move @DP[0], @DP[0]--
move @DP[1], @DP[1]--
move @BP[Offs], @BP[Offs--]
move DP[0], @DP[0]++
move DP[0], @DP[0]--
move DP[1], @DP[1]++
move DP[1], @DP[1]--
move Offs, @BP[Offs--]
move Offs, @BP[Offs++]
|