Как пары регистров Z80 адресуют оперативную память

ZX Land #04

Учись, учись... ассемблеру

Ты говоришь на ассемблере? (часть вторая)

Снова приветствую тех, кому интересно заглянуть в самую глубину.

Сегодня на лекции я постараюсь рассказать о командах, предназначенных для изменения и чтения содержимого ячеек оперативной памяти.

Как мы помним, в предыдущей статье я писал, что у Z80 есть семь восьмибитных регистров (значения от 0 до 255): A, B, C, D, E, H, L. Однако адресная шина — то, что отвечает за доставку значения в нужную ячейку памяти, одну из 65535, — шестнадцатибитная.

Поэтому, чтобы можно было загружать значения в ячейки памяти с помощью регистров, пришлось объединять регистры в пары. Два регистра вместе образуют «один шестнадцатибитный регистр».

Но всё не совсем так. Например, пару HL можно изменить, поменяв только один регистр — H или L.

К сожалению, нельзя произвольно объединять регистры в пары. Существуют три основные пары, с помощью которых можно адресовать память: BC, DE и HL.

Подробнее мы разберём эту тему в одной из ближайших статей.

Пока нам достаточно понимать, как адресуются ячейки памяти. Допустим, мы хотим, чтобы первый байт атрибутов экрана получил цвет с чёрным фоном и зелёным символом (см. «Путеводитель по ZX SPECTRUM», стр. 74). Этого можно добиться разными способами:

LD (HL),A

или

LD (адрес),A

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

Если в программе что-либо записано в скобках, это означает запись в ячейку по адресу, содержащемуся в паре регистров или заданному числом. То же относится и к чтению из ячейки:

LD A,(HL)

или

LD A,(адрес)

Чтобы нагляднее показать, о чём идёт речь, напишем программу, которая нарисует полоску заданного цвета в памяти атрибутов.

ORG 40000       ; размещение программы начиная с адреса 40000
LD HL,22528     ; начало полоски
LD B,32         ; длина полоски
LD A,79         ; цвет

PETLA LD (HL),A ; рисование полоски
INC HL          ; следующий байт
DJNZ PETLA      ; уменьшить B и, если он не равен 0, перейти к PETLA
RET             ; возврат

Эта программка, возможно, примитивна, но должна объяснить, в чём смысл изученных команд и связанных с ними возможностей.

По мере знакомства с новыми командами примеры, которые будут появляться в рамках этого цикла, станут всё интереснее.

Если мои рассуждения и наблюдения покажутся слишком сложными, прошу связаться со мной.

SCALMAN

Поделитесь вашим мнением о статье