Арифметическое переполнение для чисел с разными знаками, сборка 6502

Номера сборок 6502 могут быть подписаны или не подписаны, в зависимости от того, установлен ли седьмой бит. Если оно со знаком, оно находится в диапазоне от -128 до 127, а если нет, то в диапазоне от 0 до 255. Мой вопрос: что произойдет, если я добавлю число со знаком и число без знака вместе? Как я могу объяснить переполнение? Буду ли я по умолчанию переполнять результат для подписанного варианта или нет? Я пытаюсь реализовать инструкцию adc для эмулятора, и это был нюанс, о котором я думал.


person Caspian Ahlberg    schedule 10.02.2021    source источник
comment
Скорее всего, вы не получите правильного поведения эмулируемого АЦП, не изучив подробно поведение 6502 и не скопировав его. Так что сделайте это или скопируйте код из эмулятора, который использует код, проверенный на основе данных, собранных с 6502. Я бы предложил VICE. Если вы хотите узнать больше о флаге V, см. это, особенно раздел 5: 6502.org/ учебники/vflag.html   -  person Nick Westgate    schedule 11.02.2021


Ответы (1)


Независимо от того, подписано число или нет, это полностью проблема программиста; 6502 не различает поведение в зависимости от намерений программиста.

В этом случае переполнение всегда рассчитывается исходя из предположения, что оба числа подписаны.

Конкретный тест для ADC: если два входных числа имеют одинаковый знак, а результат имеет другой знак, установить переполнение. В противном случае очистите его.

Это то же самое, что спросить: неверен ли знак результата? Добавление чисел с разными знаками никогда не может привести к переполнению из-за задействованных диапазонов, а добавление чисел с одним и тем же знаком никогда не должно давать числа с другим знаком.

Итак, типичная реализация C-esque может выглядеть так:

overflow = ~(a^operand) & (a^result) & 0x80;

Кстати, именно так вычисляется переполнение даже в десятичном режиме, хотя используется промежуточная версия результата. Это не попытка предоставить полезную информацию, это просто побочный эффект — переполнение ничего не значит в десятичной арифметике.

person Tommy    schedule 11.02.2021