Игры с индексными регистрами
Bogie из E-3
Примечание: для понимания этой статьи требуются базовые знания машинного кода!
В этой статье я расскажу вам об IX и IY то, чего вы наверняка никогда не знали. Во всех руководствах и книгах по машинному коду, что мне попадались, утверждается, будто IX и IY нельзя разделить на части — то есть команда вроде:
LD X,50
якобы невозможна. Но на самом деле сделать это МОЖНО!
Я начал исследовать этот вопрос после того, как ICABOD рассказал мне, что узнал (через Интернет) о существовании подобных способов. Тогда я решил подробнее разобраться в механике работы IX и IY. На самом деле всё, что делает процессор при работе с IX и IY, — это берёт опкод инструкции для пары HL и предваряет его префиксом #DD (для IX) или #FD (для IY).
Для удобства я буду называть старший байт регистра IX «hX», а младший — «X». Сегодня я ограничусь регистром IX, но если вам понадобится проделать то же самое с IY, просто замените #DD на #FD!
Вот небольшой пример. Наберите его в своём ассемблере и вызовите через PRINT USR с адреса компиляции:
LD IX,0
LD HL,65535
DEFB #DD
LD L,50
PUSH IX
POP BC
RET
Поскольку внешне кажется, что регистр IX здесь никак не меняется, можно было бы ожидать возврата 0. Но на экран выведется 50! Это происходит благодаря «префиксированию» команды LD L,50 байтом #DD, что превращает её в LD X,50. А ведь это якобы невозможно!
Точно так же можно загружать hX и X значениями из других регистров:
LD IX,0
LD DE,12345
DEFB #DD
LD H,D
DEFB #DD
LD L,E
PUSH IX
POP BC
RET
Если выполнить вызов через PRINT USR, вернётся не 0, а как раз 12345 (в младших разрядах)! По сути, произошло следующее:
LD IX,0
LD DE,12345
LD hX,D
LD X,E
PUSH IX
POP BC
RET
Ваш ассемблер просто не распознает такой синтаксис напрямую, так как, согласно документации Sinclair Research, это «невозможно». Есть несколько вариантов LD X,r, способ реализации которых я пока ещё не выяснил:
LD X,Y
LD hX,Y
LD X,hY
LD hX,hY
LD X,H
LD X,L
LD hX,H
LD hX,L
Возможно, они существуют, но реализуются не столь очевидным образом. Если ICABOD сможет снова найти эти материалы в Интернете, надеемся, он расскажет подробности в следующем номере Subliminal Extacy.
Кроме того, регистры hX и X можно использовать в логических операциях, например:
LD IX,0
DEFB #DD
LD L,69
LD L,0
LD A,69
DEFB #DD
AND L
DEFB #DD
LD L,A
PUSH IX
POP BC
RET
Этот фрагмент выполняет следующие действия:
Загрузка X,69
Загрузка A,69
Логическое И (AND) с X
Так как 69 AND 69 = 69, команда PRINT USR вернёт 69.
Надеюсь, суть статьи понятна. На всякий случай приведу краткую сводную таблицу:
DEFB #DD : LD H,n = LD hX,n
DEFB #DD : LD H,r = LD hX,r
DEFB #DD : LD L,n = LD X,n
DEFB #DD : LD L,r = LD X,r
DEFB #DD : AND H = AND hX
DEFB #DD : AND L = AND X
DEFB #DD : OR H = OR hX
DEFB #DD : OR L = OR X
DEFB #DD : XOR H = XOR hX
DEFB #DD : XOR L = XOR X
DEFB #DD : INC H = INC hX
DEFB #DD : INC L = INC X
DEFB #DD : DEC H = DEC hX
DEFB #DD : DEC L = DEC X
На этом пока всё, удачного кодинга!
Bogie из E-3
Поделитесь вашим мнением о статье