Отыскал на форуме "nedoPC"
отличную статью А. Шевцова про различия i8080 и Z80, фрагмент из которой, посвященный именно программным различиям, с удовольствием приведу здесь:
Code:
1.Несовместимости чисто программные.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
─────────────────────────────────────────────────────────────────────────
1. Немногие знают о наличии у i8080, так называемых, дублирующих кодов. Если посмотреть на полную таблицу команд i8080(например в Радио N5,1987г.), то можно заметить, что в таблице есть пустые места. Т.е. имеются коды на которые процессор i8080, казалось бы, никак не должен реагировать. Однако i8080 все - таки реагирует на эти коды. Это вовсе не новые "секретные" команды неизвестные широкому кругу программистов, а просто данные коды дублируют некоторые стандартные команды. Вот все эти команды:
┌───────────┬────────────────────────┬───────────────────┐
│ Станд.код │ Дублир. код(ы) │ Мнемоника (i8080) │
├───────────┼────────────────────────┼───────────────────┤
│ 00h │10h,20h,30h,08h,18h,28h │ NOP │
│ │ 38h │ │
├───────────┼────────────────────────┼───────────────────┤
│ 0C3h │ 0CBH │ JMP │
├───────────┼────────────────────────┼───────────────────┤
│ 0C9h │ 0D9h │ RET │
├───────────┼────────────────────────┼───────────────────┤
│ 0CDh │ 0DDh,0EDh,0FDh │ CALL │
└───────────┴────────────────────────┴───────────────────┘
Такими кодами очень удобно пользоваться для защиты программ от "взлома", т.к. ни один дизассемблер их не воспринимает. Этим, кстати, очень активно в свое время занималась знаменитая фирма "SP580". Однако здесь есть 2 "огромных" минуса. Первый минус это то, что такие программы практически невозможно адаптировать под другую систему (например под RAMFOS). Второй минус остро ощутят на себе пользователи, которые установят Z80. У Z80 данные коды не являются дублерами, а означают совершенно другие, отсутствующие у i8080, команды. Вот, что означают "дублеры" у Z80:
┌───────┬───────────────┬───────────────────────────────────┐
│ Код │ Мнемоника Z80 │ Комментарий │
├───────┼───────────────┼───────────────────────────────────┤
│ 10h │ DJNZ e │ Относительный переход (+/-128max) │
│ │(2 байта-10h,e)│ B=B-1, при B=0 PC=PC+2 │
│ │ │ при B<>0 PC=PC+e │
├───────┼───────────────┼───────────────────────────────────┤
│ 20h │ JR NZ,e │ -- // -- │
│ │ (-- // --) │ PC=PC+e, если Z=0 │
│ │ │ PC=PC+2, если Z=1 │
├───────┼───────────────┼───────────────────────────────────┤
│ 30h │ JR NC,e │ -- // -- │
│ │ (-- // --) │ PC=PC+e, если C=0 │
│ │ │ PC=PC+2, если C=1 │
├───────┼───────────────┼───────────────────────────────────┤
│ 08h │ EX AF,AF' │ Обмен между дополнительными ре- │
│ │ (1 байт) │ гистрами - AF<- ->AF' │
├───────┼───────────────┼───────────────────────────────────┤
│ 18h │ JR e │ Относительный переход (+/-128max) │
│ │ (2 байта) │ PC=PC+e │
├───────┼───────────────┼───────────────────────────────────┤
│ 28h │ JR Z,e │ -- // -- │
│ │ (-- // --) │ PC=PC+e, если Z=1 │
│ │ │ PC=PC+2, если Z=0 │
├───────┼───────────────┼───────────────────────────────────┤
│ 38h │ JR C,e │ -- // -- │
│ │ (-- // --) │ PC=PC+e, если C=1 │
│ │ │ PC=PC+2, если C=0 │
├───────┼───────────────┼───────────────────────────────────┤
│ 0D9h │ EXX │ Обмен между дополнительными ре- │
│ │ (1 байт) │ гистрами - BC<- ->BC' │
│ │ │ DE<- ->DE' │
│ │ │ HL<- ->HL' │
├───────┼───────────────┼───────────────────────────────────┤
│ 0CBh │ --- │ Открывает дополнительную таблицу │
│ │ │ команд (могут быть команды до 4 │
│ │ │ байт обьемом) │
├───────┼───────────────┼───────────────────────────────────┤
│ 0DDh │ --- │ -- // -- │
├───────┼───────────────┼───────────────────────────────────┤
│ 0EDh │ --- │ -- // -- │
├───────┼───────────────┼───────────────────────────────────┤
│ 0FDh │ --- │ -- // -- │
└───────┴───────────────┴───────────────────────────────────┘
После установки Z80 я проверил все имеющиеся программы на работоспособность. Нашлась всего 1 программа, которая имела защиту от взлома с применением в загрузчике "дублеров". Этой программой оказалась Trs_MX.COM (одна из первых версий (V1.51) программы). Адаптация данной программы к Z80(она по прежнему работоспособна на i8080) не составила труда, т.к. "дублеров" оказалось немного. Последние 2-х файловые версии трассировщика печатных плат "дублеров" не содержат и полностью работоспособны на Z80.
Я не советую увлекаться "туфтой", т.е. применением этих дурацких "дублеров". Те, кто сталкивался в свое время с программами фирмы SP580, наверняка помнят отличные системные программы, например, "The Last Word". Однако, практически все системные программы этой фирмы были "заражены" "дублерами". И из - за этого эти программы просто в буквальном смысле "умерли" даже для пользователей, работающих в RAMFOS с i8080. Хорошо, что SP580 не додумалась защитить "дублерами" свои игровые программы, перенесенные со Spectrum.
──────────────────────────────────────────────────────────────
2. Основная несовместимость i8080 с Z80 возникает из - за бита D2 регистра признаков или флагов. У i8080 данный разряд используется как флаг четности - P. При этом на установку P влияют одинаково все арифметические и логические команды, т.е. P=1 если после выполнения логической или арифметической операции число единиц в регистре четно(например - 11010100B).
У Z80 разряд D2 используется как флаг четности/переполнения - P/V, т.е. в зависимости от типа команд флаг имеет различное назначение:
══1. При арифметических операциях над числами со знаком он действует как флаг переполнения V. T. к. диапазон представления чисел со знаком от -128 до +127, то при операциях над ними возможен выход результата за эти пределы - переполнение. В этом случае флаг устанавливается в 1, сигнализируя об ошибочности результата. Логика установки флага V в 1 такова:
а) если был перенос из 6-го бита в 7-ой, и не было переноса из 7-го бита во флаг C.
б) не было переноса из 6-го бита в 7-ой, но есть перенос из 7-го бита во флаг C.
Примеры:
1.Сложение +76 = 01001100
-114 = 10001110
--------
C=0 11011010 = -38 верно
V=0
2.Сложение -1 = 11111111
-1 = 11111111
--------
C=1 11111110 = -2 верно
V=0
3.Сложение +82 = 01010010
+94 = 01011110
--------
C=0 10110000 = -80 неверно!
V=1
В последнем примере произошла установка флага V. Это означает, что ошибка должна быть программно учтена при анализе результата.
══2. При выполнении логических операций, команд сдвига флаговый бит 2 действует как флаг четности P. Он устанавливается, когда регистр содержит четное количество единиц, и обнуляется при нечетном количестве. Т.е. здесь D2 работает также, как у i8080.
Программы, написанные под i8080, очень редко используют бит D2. В основном это математические программы, например языки программирования(Basic и т.д.). Программы, написанные для CP/M-80, учитывают различия i8080 и Z80 и поэтому одинаково работают на обоих процессорах (исключение составляют программы специально написанные под Z80, т. е. использующие его дополнительные команды, например, TURBO PASCAL).
При проверке работы программ на "Специалисте_MX" с Z80 выявилось несколько неправильно работающих - это Moni_Б2.COM и все версии Basic_MX.EXE. Для адаптации этих программ был применен простой способ, не нарушающий совместимости с i8080. Просто перед каждой командой, проверяющей бит D2, вставлялась логическая команда (конечно учитывалось влияние на другие флаги). Например:
1. DCR A DCR A
JPE 8D33h --- > ORA A
JPE 8D33h
В приведенном примере работа велась над регистром А, поэтому для адаптации достаточно было вставить команду ORA A или ANA A. При такой адаптации необходимо учитывать влияние команды ORA A (ANA A) на флаги C и AC, если они в дальнейшем используются программой.
─────────────────────────────────────────────────────────────────────────
3. Последнее программное отличие i8080 от Z80 - это более широкое применение команды DAA у Z80. У CPU i8080 данная команда выполняет десятичную коррекцию только после выполнения операций сложения, а у Z80 эта команда работает корректно как после операций сложения, так и вычитания.
Естественно данное программное отличие не влияет на работоспособность программ процессора i8080 при исполнении их на Z80.
─────────────────────────────────────────────────────────────────────────
p.s. Там еще интересные прения про авторское право детектед.