PDA

Просмотр полной версии : Путаница с условиями P/M и флагом S во всех русскоязычных статьях о z80



Oleg Origin
04.09.2011, 16:33
Эта табличка знакома всем

+----------+-----------+----------+
|Результат | Состояние | Мнемоника|
|сравнения | флагов | условия |
+----------+-----------+----------+
| A=X | Z=1 | Z |
+----------+-----------+----------+
| A<>X | Z=0 | NZ |
+----------+-----------+----------+
| Беззнаковое сравнение (0...255) |
+----------+-----------+----------+
| A<X | CY=1 | C |
+----------+-----------+----------+
| A>=X | CY=0 | NC |
+----------+-----------+----------+
| С учетом знака (-128...+127) |
+----------+-----------+----------+
| A<X | S=1 | P (?)
+----------+-----------+----------+
| A>=X | S=0 | M (?)
+----------+-----------+----------+
Впервые встретитвшись в книге "ZX Spectrum для пользователей и программистов", она перекочевала с дополнительной ошибкой в "Как написать игру для ZX Spectrum на ассемблере", а затем во все русскоязычные статьи, посвященные этой теме.
А теперь вопрос: почему при S=1 (Sign=отрицательное число) указано условие P (Plus), а при S=0 (Sign=положительное число) указано условие M (Minus).
Ведь должно быть с точностью до наоборот. Во всяком случае так говорят все тексты, посвященные этому вопросу на других языках (отличных от русского, то есть), а также банальная практика. Да и в самой книге "Как написать игру для ZX Spectrum на ассемблере" встречаются опровержения этой таблице: например, в одной из программ при задании условия выхода за левую границу экрана указано "JR C,aaa ;(или JP M,aaa)". То есть в диапазоне положительных чисел условие A<X (т.е. "С") эквивалентно "M", а не "Р", как показывает таблица.
Я часто использую это сравнение при определении попадания спрайта на экран: сравниваю А с -2, например, и использую значения P/M, прямо противоположные таблице.
Наконец, следует также сказать, что это условие будет выполняться, только если числа в формате Two's Complement (проще, байт со знаком), будут друг от друга отличаться не более чем на 128. То есть -4<5 = -4-5 =-9 даст S=1 (условие M), а вот -128<5 = -128-5 = -133 (-->123) даст S=0 (условие P).
Так в чем же подозрительная притягательность этой таблицы, позволяющая ей без особых подозрений перепечатываться из издания в издание?
Ну, или, может, кто-то сможет объяснить ее логику? =)

Shadow Maker
04.09.2011, 18:14
Ты короче тут много умных слов написал, я ничего не понял :)
Но в таблице явно опечатка, потому что JP P = true, если флаг S=0, и JP M = true, если S=1.

PS - Я эту табличку вообще первый раз в жизни вижу :) Так что ты это прям смело заявил, что знакома всем.

Oleg Origin
04.09.2011, 18:29
Вот и я вижу, что опечатка, но нигде - ни в печатных изданиях, ни в интернете - не найти правильной версии этой таблички. Встречается только такая версия. И кочует из книги в книгу. А в некоторых статьях авторы еще и добавляют, что "перестали путаться в условиях, когда повесили перед собой эту табличку". Вот на этих словах я остался в окончательном недоумении: как это 20 лет (1991 год издания книги "ZX Spectrum для пользователей и программистов") некоторые люди умудряются писать программы, "пользуясь" неправильной таблицей =)

А источники, откуда она взялась - я написал. Могу еще несколько статей назвать, но смысл один. Табличка очень известная, и везде неправильная, получается...

Shadow Maker
04.09.2011, 18:34
Ну я предполагаю, что реально мало людей пользуется знаковым сравнением.

А ты чтоли решил игру написать? Или 20 лет несправедливости исправить решил? :)

Oleg Origin
04.09.2011, 18:50
...или многие замечали ошибку, но молчали =)
игры-то я писал и пишу (хотя это к теме и не совсем относится), а вопрос просто чтобы удостовериться, что я все правильно понял насчет повсеместной опечатки.
ибо если везде видишь один и тот же вариант, начинаешь сомневаться...

Shadow Maker
04.09.2011, 19:02
Может и так, но лично вот я ни разу не пользовался сравнением со знаком. А так можно же экспериментально проверить, если сомневаешься :)

NovaStorm
04.09.2011, 20:09
>>Впервые встретитвшись в книге "ZX Spectrum для пользователей и программистов"
Я пользуюсь Зилоговским мануалом, который в своё время перевели как "Микропроцессорный комплект Z80".

Grand
06.09.2011, 08:11
...или многие замечали ошибку, но молчали =)
Так оно и есть. Много лет назад я исправил себе эту таблицу прямо в упомянутой книге. Две последние строчки таблицы теперь у меня имеют вид:
| A<X | S=1 | M |
+----------+-----------+----------+
| A>=X | S=0 | P |
+----------+-----------+----------+