Просмотр полной версии : 16 bit signed arithmetic on Z80
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
Занятная статейка и о сравнении тоже
В демах имеет смысл, но в играх я бы не стал большинство методик оттуда применять - очень запутанный код и транжир памяти был бы.
я вот тоже так думаю, что sbc но как то у меня не проходят тесты сравнении (=<) когда одно число отрицательное, а другое положительное, странно, может у меня эмуль z80 кривой конечно
Надо выкладывать конкретный пример, где и как не сравнивает, и какие получаются флаги.
iceoflame
26.01.2012, 15:02
Andrew771, Тут смотря, что важно: память или скорость. От этого и зависит оптимизация.
http://www.andreadrian.de/oldcpu/Z80_number_cruncher.html#mozTocId370017
вот никак не могу понять
пытаюсь сравнить два 16 битных числа 1000 и 2000 и надо переход по 1000 < 2000
делаю
никакого перехода, хрен а не переход и флаг оверфлоу в нуле
взял эмуль unreal и глянул как этот флаг выставляется
Должен устанавливаться. Значит в эмуле ошибка.
как видим флаг по маске #8000 будет именно 0, что и прописано во все просмотренных мною эмуляциях Z80 и JP PE работать разумеется не будет
и вот непонятно, у кого ошибочка вышла, надо на реале наверное смотреть
На сколько видно из алгоритма, флаг будет установлен если:
a и b разных знаков, и a и результат тоже разных знаков.
Следовательно, так как знаков может быть всего два, получаем установку флага при b и результате одного знака, а a - другого. Отсюда как минимум одна нестыковка - a и b - неравноценны! А как такое может быть?)
посмотрел еще эмулятор i8080 написанный на Java каким то иностранцем, там так же оверфлоу в sbc hl формируется
Как так? Пример строчки.
ошибочка вышла, вверху я приводил код не из unreal а из явовского эмуля z80
а в unreal код такой
А приведи кусочек из Unreal'а, где вычисляется простое add a, что нибудь.
Чего-то я проглючил.
В unreal'е все верно.
Этот флаг нам говорит о том, что произошел выход за рамки представления чисел со знаком.
---------- Post added at 23:23 ---------- Previous post was at 23:15 ----------
Если хочется сравнивать числа со знаком, то надо проверять два флага сразу.
Например:
Меньше, чем - это S != V
Больше или равно - это S == V
вот и я думаю что два флага
Просто на других процессорах есть условия сравнения типа LE, GE и т.д., где учитываются сразу несколько флагов, до 3-х. А на Z80 нет.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot