MyTetra Share
Делитесь знаниями!
Различия между процессорами i8080 (он же КР580ВМ80А) и Z80
Время создания: 18.11.2021 08:58
Раздел: Компьютер - Микроша
Запись: xintrea/mytetra_syncro/master/base/1637215098ththn23m2l/text.html на raw.github.com

Различия были следующие.



Адреса портов


У 8080 всего 256 адресов для портов, поскольку байт адреса дублируется на А0...А7 и А8...А15. У Z80 этих адресов - 65536.



Команды сложения и флаги


Есть разница в работе команды DAA, у i8080 там есть "не глюк, а фишка". У Z80 оно было исправлено, но некоторые бейсики для i8080 потом не могли нормально работать на Z80, пока не пропатчишь эту команду.


Пояснение 1: по даташиту на i8080 DAA работала правильно только после сложения (флаг полупереноса корректно заработал только на Z80 который позволил ей работать и после вычитания) и никак иначе. Другими словами, флаг правильно работает только при сложении, то есть не работает как флаг полузаема. И его состояние кажется вообще определено только после команды ADD, хотя инкремент-декремент тоже его состояние меняют.


Возможное решение проблемы (быстрое и не совсем правильное): добавить команду ORA перед DAA.


Пояснение 2: там дело не в DAA, а в флаге четности (в двух местах), который в z80 еще и флаг переполнения.


Пояснение 3: Что касается DAA. Открываем фирменный мануал "8080/8085 assembly language programming manual (c) 1977, 1978, 1979, 1981 Intel corporation" и читаем там дословно на странице 3-18 : DAA used when adding decimal numbers. Надо после вычитания использовать - добавьте ноль и потом используйте. Или дополните до двойки и складывайте. И основные грабли там закопаны в том что флаг полупереноса не работает как флаг полузаема (а в Z80 работает). Только справа налево. Кстати INR не модифицирует CF, поэтому при инкременте можно тоже багов выгребсти при десятичной коррекции чисел шире двух знаков. Только сложение и только хардкор. Так что все вопросы задавайте товарищам которые используют DAA после инкремента-декремента-вычитания и "у них все работает". По поводу флага AC - единственная команда на которую он влияет DAA, а единственная команда после которой он (и перенос) правильно стоит - сложение, и напрямую флаг AC нигде не доступен, хотя и участвует в арифметических операциях.


Раскопки 580ВМ80А показали что флаг AC устанавливается по правилу:



psw_ac <= (c[3] & ~id_xra & ~id_ora & ~id_rxc) | (id_ana & (x[3] | r[3]));



То есть (когда он вообще устанавливается):


  • при XOR, OR и сдвигах обнуляется
  • при AND вычисляется как ИЛИ третьих разрядов аргументов
  • при всех остальных операциях как перенос из третьего разряда суммы (вычитание выполняется как сумма с инвертированных аргументом и еще единичка)



Прочие различия


У i8080 нет префиксов (CB, ED, DD, FD), один набор регистров и один тип прерываний. У i8080 не было контакта /iorq и формирование этого сигнала обеспечивала внешняя схема. По этой причине на большинстве машин построенных на базе i8080 ввод-вывод был memory-mapped (для этого в комплекте даже была специальная микросхема которая анализировала код операции на шине).



Так же в этом разделе:
 
MyTetra Share v.0.58
Яндекс индекс цитирования