Вход

Просмотр полной версии : 16 bit signed arithmetic on Z80



Raydac
26.01.2012, 10:21
not a short message

Andrew771
26.01.2012, 10:49
вычитанием, ИМХО, sbc hl,bc

iceoflame
26.01.2012, 13:15
я вот тоже так думаю, что sbc но как то у меня не проходят тесты сравнении (=<) когда одно число отрицательное, а другое положительное, странно, может у меня эмуль z80 кривой конечно

http://ivr.webzone.ru/articles/dop_ar/

Занятная статейка и о сравнении тоже

Andrew771
26.01.2012, 14:15
Занятная статейка и о сравнении тоже
В демах имеет смысл, но в играх я бы не стал большинство методик оттуда применять - очень запутанный код и транжир памяти был бы.

Titus
26.01.2012, 14:46
я вот тоже так думаю, что sbc но как то у меня не проходят тесты сравнении (=<) когда одно число отрицательное, а другое положительное, странно, может у меня эмуль z80 кривой конечно
Надо выкладывать конкретный пример, где и как не сравнивает, и какие получаются флаги.

iceoflame
26.01.2012, 15:02
Andrew771, Тут смотря, что важно: память или скорость. От этого и зависит оптимизация.

Protom
26.01.2012, 22:52
http://www.andreadrian.de/oldcpu/Z80_number_cruncher.html#mozTocId370017

Titus
27.01.2012, 01:34
вот никак не могу понять
пытаюсь сравнить два 16 битных числа 1000 и 2000 и надо переход по 1000 < 2000
делаю

никакого перехода, хрен а не переход и флаг оверфлоу в нуле
взял эмуль unreal и глянул как этот флаг выставляется

Должен устанавливаться. Значит в эмуле ошибка.

Titus
27.01.2012, 02:28
как видим флаг по маске #8000 будет именно 0, что и прописано во все просмотренных мною эмуляциях Z80 и JP PE работать разумеется не будет
и вот непонятно, у кого ошибочка вышла, надо на реале наверное смотреть

На сколько видно из алгоритма, флаг будет установлен если:
a и b разных знаков, и a и результат тоже разных знаков.
Следовательно, так как знаков может быть всего два, получаем установку флага при b и результате одного знака, а a - другого. Отсюда как минимум одна нестыковка - a и b - неравноценны! А как такое может быть?)

Titus
27.01.2012, 23:43
посмотрел еще эмулятор i8080 написанный на Java каким то иностранцем, там так же оверфлоу в sbc hl формируется
Как так? Пример строчки.

Titus
28.01.2012, 00:05
ошибочка вышла, вверху я приводил код не из unreal а из явовского эмуля z80
а в unreal код такой
А приведи кусочек из Unreal'а, где вычисляется простое add a, что нибудь.

Titus
28.01.2012, 00:23
Чего-то я проглючил.
В unreal'е все верно.
Этот флаг нам говорит о том, что произошел выход за рамки представления чисел со знаком.

---------- Post added at 23:23 ---------- Previous post was at 23:15 ----------

Если хочется сравнивать числа со знаком, то надо проверять два флага сразу.
Например:
Меньше, чем - это S != V
Больше или равно - это S == V

Titus
28.01.2012, 00:27
вот и я думаю что два флага

Просто на других процессорах есть условия сравнения типа LE, GE и т.д., где учитываются сразу несколько флагов, до 3-х. А на Z80 нет.