При использовании z80 asm есть ли разница между (HL) и (BC / DE)?

Пытаясь написать сборку для своего TI-84 PlusCE, я обнаружил странную ошибку. Рассмотрим следующий код:

#include "includes\ti84pce.inc"

s_mem_start = saveSScreen

 .assume ADL=1
 .org userMem-2
 .db tExtTok,tAsm84CeCmp

 ;relevant portion
 ld HL, s_mem_start
 ld DE, 2
 ADD HL, DE
 ld D, H
 ld E, L

 ld A, (HL)
 call _PutC
 ld A, (DE)
 call _PutC
 ;/relevant portion

 ret

saveSScreen - это часть свободного барана. _PutC - это вызов ROM, который выводит значение A на экран. См. Эту диаграмму: http://tibasicdev.wikidot.com/83lgfont. Я подтвердил, что _PutC не влияет ни на какие регистры. Вывод этого кода на экран - v[CursorInsertSecond]. (CursorInsertSecond - это символ на калькуляторе). Они эквивалентны шестнадцатеричному символу 03 или 73 и E5. Я не могу сказать, является ли v обычным v или курсивом v.

Очевидно, что (HL) и (DE) обращаются к разным частям памяти. То же самое и при использовании BC. Странно то, что я нигде не могу найти записанную информацию. Казалось бы, большой ущерб иметь только одну регистровую пару для доступа к памяти. Действительно, из-за этого мой собственный код стал очень раздутым.

И последнее, что я заметил, это то, что это применимо только при добавлении к HL. Рассмотрим этот код: (без заголовка).

 ld HL, s_mem_start + 2
 ld DE, s_mem_start + 2

 ld A, (HL)
 call _PutC
 ld A, (DE)
 call _PutC

Это приводит к выводу vv. Что здесь может происходить? Почему (HL) и (DE) дают разные результаты, но только иногда?


person user197974    schedule 08.08.2020    source источник
comment
Я предполагаю, что _PutC портит ваши данные на s_mem_start+2. Может быть, это все-таки не свободный барабан :) Что произойдет, если вы загрузите (DE) перед первым _PutC и нажмете значение, а затем вставите его для второго вызова? Что произойдет, если вы сначала напечатаете (DE) и (HL) вторую?   -  person Jester    schedule 09.08.2020
comment
@Jester: все результаты одинаковы, независимо от того, какую комбинацию вещей я делаю. ОЗУ используется для хранения резервной копии экрана, поэтому я считаю маловероятным, что он перезаписывается. Это также не объясняет, почему второй фрагмент кода работает иначе.   -  person user197974    schedule 09.08.2020
comment
Во втором показанном коде используется s_mem_start, а не s_mem_start+2. Может тогда попробовать?   -  person Jester    schedule 09.08.2020
comment
@ Шут, нет игральных костей. Но два vs вместо ns. Я отредактирую вопрос, чтобы исправить это.   -  person user197974    schedule 09.08.2020


Ответы (1)


Оказывается, на самом деле ti84plusce запускает сборку ez80. В сборке ez80 HL, BC и DE - это три байта, а не два. Мой код скопировал только два байта, поэтому адреса перепутались.

person user197974    schedule 09.08.2020
comment
да, мы обсуждали это не так давно в эта тема - person tum_; 26.09.2020