Pull to refresh

Comments 15

А что не так с восьмибитностью и 16/32-разрядными переменными? Переноса на процессоре нет?
(Если я не разговариваю с переводом)
UFO just landed and posted this here
В приложении хабра в самой статье не видно что это. Но в принципе заметно. Потом вышел в список статей — там плашка есть.
Все там хорошо с восьмибитностью. Но куда проще и (в разы) быстрее сделать инкремент в десятичной форме, чем конвертировать из двоичной.
Можно хранить в виде binary-coded decimal и использовать в 2 раза меньше памяти (если, конечно, из процессора не выкинули команду DAA, которая есть в 8080 и Z80).
>> 2 раза меньше памяти
DAA там есть. Но вам что, жалко 2(!) байта стало?
Вы потратите куда больше чтобы достать старший ниббл.
В GBCPU нет команды RLD, поэтому так:

rrca
rrca
rrca
rrca
and #0f

6 байт

К тому же он хранит не число 0-9, а номер тайла, поэтому ещё 2 байта =)

add a, start_tile_id
Вопрос же не только в удобстве вывода, но и в удобстве инкремента. Хотя, у меня в итоге получилось только 4 байта сэкономить (11 байт для BCD-кода, позволяющего добавлять 1-99 очков, и 15 байт для «обычного» кода, добавляющего 1-10 очков), так что возможно в данном случае такая оптимизация действительно не имеет смысла.
15 это с установкой адреса?
Попробовал ради интереса, получилось 14 без установки адреса (+3 байта)

;hl address
;a value 0-10

    ld b,5
l1: add a,(hl)
    cp start_tile_id+10
    jr c, l2
    sub 10
l2: ld (hl+),a ;постинкремент
    sbc a,a ; эти две команды получают 
    inc a   ; a = carry ? 0 : 1
    djnz l1

>> возможно в данном случае такая оптимизация действительно не имеет смысла.
Это всего несколько десятков тактов и пара байт. Не стоит даже размышления над этим вопросом.
Очки кратные 10 делаются просто — приписывается нолик справа (oldskool trick)
10 очков явно лучше чем одно :-P
У меня на байт больше, так как вместо
sbc a,a
inc a
используется
ld a,0
adc a,a
(в A вроде бы должен быть флаг переноса, а не его инверсия). Для сравнения, код через DAA выглядит так:
    ld   b,3
    or   a
L1: adc  a,(hl)
    daa
    ld   (hl),a
    ld   a,0
    inc  hl ; или dec hl - смотря в каком порядке хранить
    djnz L1

Может можно как-то еще соптимизировать, но я в последний раз что-то осмысленное под Spectrum писал в 1999 году и уже мало что помню, к сожалению. Можно ускорить код, если выходить из цикла по jr nc, но это на 2 байта больше.
>> (в A вроде бы должен быть флаг переноса, а не его инверсия)
Перенос после проверки диапазона инвертирован (jr c, L2). А sub 10 оставляет после себя C=0.
Поэтому перенос нужно инвертировать ещё раз перед использованием.
15$ — это ппц просто! Оно того не стоит
Порекламируйте на новую зеландию, овечки и Velcro это символичные тут :) и достаточно много нинтендобоев.
10 минут смотрел на картинку с дебаггером, аж ностальгия накатилась. Как же он похож на ассемблер Z80.
А это и есть обрезанный Z80, без альтернативных наборов и IX/IY. Зато есть автоинкремент, например.

Фраза «сочетание процессоров Zilog Z80 и Intel 8080» является бредом, т.к. Z80 обратно совместим с 8080.
Sign up to leave a comment.

Articles