Первый который ST похоже мертвый - комп не стартует рисует всякие квадратики на экране. На остальных картинка в тесте как во втором видео, без артефактов.
Вид для печати
Так, так... кажется, мы нашли еще одну модель процессора, у которой та же... "проблема", что и у PSC. Твой GoldStar Z8400APS ведет себя как NEC NMOS, а у моего друга Рикардо - как Zilog:
https://github.com/redcode/Z80/wiki/...e-3b-recreated
Пожалуйста, сделай как creator и приложи фотографию процессоров, которые ты тестируешь. Так будет проще все задокументировать.
Ну пока никто не объявился - значит снова я.
Второй проц практически совсем исправился, даже на тесте Патрика почти не мигал.
Нуштош, поставил снова первый(ставить правда проблематично, панелька цанговая советская, с шагом 2,5мм, а процы импортныена, с шагом 2,54, ну и цанга - это не для экспериментов:(
Сперва оба проца во всей красе
Скрытый текст
Нижний, типа Зайлог - да фигушки, скорее всего перемарк NEC, нифига он не CMOS
https://www.cpu-world.com/CPUs/Z80/Z...4C0020PEC.html
Поставил первый, тот , что сверху
Скрытый текст
Sí, es correcto, estos son los resultados obtenidos en el ST Z8400AB1.
Hola!
https://drive.google.com/file/d/1TOu...ew?usp=sharing
Что это за тесты? Ошибки регенерации верхнего банка ($8000-$FFFF) процессором?
Да, они самые)))
- - - Добавлено - - -
Интересно, что в тестах от creator'а тоже был такой же процессор, и давал в целом похожую картинку, но с другим порогом.
- - - Добавлено - - -
На текущий момент, мы имеем тесты для следующих NMOS с пограничным порогом:
ST Z8400AB1 - Z80ACPU 29038 (zebest)
ST Z8400AB1 - Z80ACPU 28831 (creator) - распределение на обоих процессорах похожее
Zilog Z0840004PSC - Z80 CPU 9040 LJ (П321) - распределение такое же, как и у ST Z8400AB1
GoldStar Z8400A PS - 9305 KOREA (SoftLight) - распределение другое, чем на ST, видимо, и другая разводка кристалла.
Kvazar TSL 80H-CPU - 1194 (creator) - эффект едва-едва виден в левом поле. Про распределение сказать невозможно.
Angstrem Т34ВМ1 - 9206 ОП (SoftLight) - распределение такое же, как и у GoldStar Z8400A PS.
Стабильные стандартные NMOS:
Zilog Z0840004PSC - Z80 CPU 9112 CT (SoftLight)
Zilog Z0840006PSC - Z80 CPU 9402 1S (creator)
Angstrem КР1858ВМ1 - 9503 (creator)
И стабильные стандартные CMOS:
Zilog Z84C0020PEC - Z80 CPU 9420 IP (creator)
Zilog Z84C0020PEC - Z80 CPU 9511 CU (SoftLight)
Zilog Z84C0020PEC - Z80 CPU 9515 J9 (SoftLight)
Zilog Z84C0010PEC - Z80 CPU 9511 1N (SoftLight)
Zilog Z84C0006PEC - Z80 CPU 0550 E9 (SoftLight)
Zilog Z84C0006PEC - Z80 CPU 9908 J6 (SoftLight)
Стабильный нестандартный CMOS, у которого поле F5=0,A5=1 - равно нулю, вместо 1.
Toshiba TMPZ84C00AP-6 - JAPAN9908EFI (SoftLight)
Вот мои результаты теста.
Процессор вот такой
https://pic.maxiol.com/thumbs2/17278...563691.cpu.jpg
Тест выглядит так
https://pic.maxiol.com/thumbs2/17278...63691.test.jpg
Видео не снимал потому как ничего нового там нет.
Titus, не мог бы ты добавить в свой тест поддержку обнаружения бага Zilog NMOS, который приводит к сбросу флага P/V при приеме маскируемого прерывания во время выполнения команд ld a,{i|r}?
У процессоров ST CMOS, например, есть такой баг.
Эти тесты обнаруживают данный баг. Исходный код последнего из них доступен:
https://github.com/redcode/Z80/wiki/IFF2-Bug
https://github.com/redcode/Z80/wiki/IFF2-Bug-128K
https://github.com/redcode/Z80/wiki/Z80-INT-Skip
а меня интересует недокументированная команда #ED71 OUT (C),0
и вроде так она выполняется на NMOS, на CMOS в порт засылается #FF
Да, надо с ней разобраться.
Но думаю, что там все просто. Ни один регистр не выдается на шину, и она остается заряженной до логической 1. А так как линия инверсная, вот и получается в итоге 0.
Но проверю.
- - - Добавлено - - -
Где подробно описан этот баг?
иследуй что то полезное:
LDI CPI INI OUTI
LDD CPD IND OUTD
LDIR CPIR INIR OTIR
LDDR CPDR INDR OTDR
Милорд, народ требует зрелищ! Где схемота, где картинки чипов? То что вы делаете последние несколько страниц - это вообще Clean Room эксперименты, которые вполне можно считать за оффтоп и удостоить отдельного топика. ХВМ прав тем что вы отходите от темы и потом тут найти что-то полезное будет сложно.
Ты можешь протестировать его с помощью Visual Z80 Remix: https://floooh.github.io/visualz80remix/
http://z80.info/zip/ZilogProductSpec...ook129-143.pdf (Стр. 130)
Zilog (1989-01). "Z80 Family Data Book", Стр. 412-413Цитата:
Q: I don't seem to get the correct state of the interrupts when using the LD A,l and LD A,R instructions to read the state of IFF2. Why is this? How can I get around this?
A: On CMOS Z80 CPU, we've fixed this problem. On NMOS Z80 CPU, in certain narrowly defined circumstances, the Z80 CPU interrupt enable latch, IFF2, does not necessarily reflect the true interrupt status. The two instructions LD A,R and LD A,l copy the state of interrupt enable latch (IFF2) into the parity flag and modifies the accumulator contents (See table 7.0.1 in the Z80 CPU technical manual for details). Thus, it is possible to determine whether interrupts are enabled or disabled at the time that the instruction is executed. This facility is necessary to save the complete state of the machine. However, if an interrupt is accepted by the CPU during the execution of the instruction -- implying that the interrupts must be enabled -- the P/V flag is cleared. This incorrectly asserts that interrupts were disabled at the time the instruction was executed.
https://zxe.io/depot/documents/techn...29%28en%29.pdf
Цитата:
Q: I don't seem to get the correct state of the interrupts when using the LO A,I arid LO A,R instructions to read the state of IFF2. Why is this? How can I get around this?
A: On CMOS Z80 CPU, we've fixed this problem. On NMOS Z80 CPU, in certain narrowly defined circumstances, the Z80 CPU interrupt enable latch, IFF2, does not necessarily reflect the true interrupt status. The two instructions LO A,R and LO A,I copy the state of interrupt enable latch (IFF2) into the parity flag and modifies the accumulator contents (See table 7.0.1 in the Z80 CPU technical manual for details). Thus, it is possible to determine whether interrupts are enabled or disabled atthetime that the instruction is executed. This facility is necessary to save the complete state of the machine. However, if an interrupt is accepted by the CPU during the execution of the instruction -- implying that the interrupts must be enabled -- the PN flag is cleared. This incorrectly asserts that interrupts were disabled at the time the instruction was executed.
This paradox can be traced to the internal timing of the CPU. The problem is that the interrupt flip-flop (IFF2) is cleared before it is actually transferred to the PN flag. The state of the interrupt enable latch is not copied into the parity flag until after the interrupt time, occurring during the execution of the instruction, has been accepted. Since the acceptance of the interrupt automatically clears the interrupt enable latch, the parity flag is also cleared, despite the fact that interrupts were enabled when the instruction started executing.
A neat solution to this anomaly relies on the fact that at least one item--the old PC value -- is saved on the stack when an interrupt is accepted. The "next entry" position on the stack (the word below the address currently held in the stack pointer) may be cleared before execution of LO A, I (or LD A,R). If that zero value has changed by the time that the next instruction in the routine is executed, then an interrupt must have been accepted. This implies that interrupts were enabled,. even if the state of the parity flag suggests that they were not. Of course, if the parity flag is found to be set after LO A,R (LO A,I) has been executed, there is no need to check the stack top. Interrupts are definitely enabled if the parity flag is in this state.
Two routines are listed here. Both return carry clear if interrupts are enabled, set otherwise. Both corrupt the A register; it does not contain the value in the I (or R) register on exit The status of all flags except the carry flag are undefined on exit.
The first routine may be loaded anywhere in memory except "page zero" -- 0000h to 00FFh. This small restriction comes about because the routine checks only the most significant byte of the "next" stack entry. This byte will be non-zero afteran interrupt has occurred if and only if the routine itself is not on page zero. The second routine tests both bytes of the "nexf' entry and, therefore, overcomes this restriction.
Caution, these routines presume that the service routine for any acceptable interrupt will re-enable interrupts before it terminates. This is almost always the case. They may not return the correct result if an interrupt service routine, which does not re-enable interrupts, is entered after the execution of LD A,I (or LD A,R).
Код:Listing 1 : This routine may not be loaded in page zero
(OOOOh to OOFFh).
GETIFF:
XOR A ;C flag, acc. := O
PUSH AF ;stack bottom := OOxxh
POP AF ;Restore SP
LD A,I ;P flag := IFF2
RET PE ;Exit if enabled
DEC SP ;May be disabled.
DEC SP ;Has stack bottom been
POP AF ;overwritten ?
AND A ;If not OOxxh, INTs were
RET NZ ;actually enabled.
SCF ;Otherwise, they really are
RET ;disabled.
END
Listing 2: This routine may be loaded anywhere in memory.
GETIFF:
PUSH HL ;Save HL contents
XOR A ;C flag, acc. := 0
LD H,A ;HL :=0000h
LD L,A
PUSH HL ;Stack bottom := OOOOh
POP HL ;Restore SP
LD A,I ;P flag := IFF2
JP PE,
POPHL ;Exit if isn't enabled
DEC SP ;May be disabled.
DEC SP ;Let's see if stack bottom
POP HL ;is still OOOOh.
LD A,H ;Are any bits set in H
OR L ;or in L?
POP HL ;Restore old contents.
RET NZ ;HL <> O : isn't enabled.
SCF ;Otherwise, they really are
RET ;disabled.
POPHL:
POP HL ;Exit when P flag is
RET ;set by LD A,I
END
И действительно, даже нашёл что я тут уже и раньше писал. Пожелание собрать все полученные результаты (транзисторные и логические схемы, находки) и скомпилировать их как документ или оформить как вики. Читать форум вперемешку с сообщениями не удобно.
Также хотелось бы понять -- тут реверсится только конкретная модель Z80 (та на которой базируется VisualZ80) или уже началось всё подряд (кмос-шмос)?
Я думаю, что он использует тот же нетлист, но является более продвинутым и исправляет некоторые ошибки. Это независимая разработка, эволюция Visual Z80 (http://www.visual6502.org/JSSim/expert-z80.html). Visual Z80 Remix - лучший симулятор, и если вы обнаружите ошибку, ее автор быстро ее исправит, если вы ему сообщите.
С помощью этого симулятора мы открыли новые вещи. Например, что процессор не принимает второй NMI, пока отвечает на NMI, или что MEMPTR модифицируется во время дополнительного цикла, который декрементирует PC в инструкциях блока ввода-вывода, или что RETI и RETN не принимают маскируемое прерывание, если IFF1 и IFF2 не имеют одинакового состояния перед выполнением этих команд.
Он основан на одной модели, на нетлисте Zilog Z80 NMOS, векторизованном много лет назад людьми из Visual 6502, кажется, я помню.
- - - Updated - - -
Titus, я обновил комментарий на предыдущей странице о ld a,{i|r}, я включил официальное объяснение Zilog.
Пока идет процесс причесывания реверса, познавания тайн процессора, схемы модифицируются, переподписываются и перегруппируются. Поэтому финального варианта с точкой еще нет.
- - - Добавлено - - -
Этот эмулятор воспроизводит шум команд SCF/CCF в 5 и 3 флагах?
Нет. Он дает детерминированный и стабильный результат. YF и XF берутся из значения битов 5 и 3 результата (Q ^ F) | A.
https://i.postimg.cc/MKmcVbwg/ccf.png
Titus
Есть идеи по реализации плавающих битов SCF/CCF в HDL?
Легко. Генератор случайных чисел с регулируемой интенсивностью в зависимости от бит окружения, наиболее влияющих на результат. Очень хорошо по моему тесту видно, как надо сделать. И он же может проверить.
- - - Добавлено - - -
Зачем делается Q ^ F?
Именно формула, открытая Патриком, используется для вычисления этих флагов. Коэффициент Q - это абстракция, представляющая собой защелки внутри АЛУ, в которых процессор вычисляет новые обновленные значения флагов, которые будут переданы в регистр F во время T3 следующего цикла M1. Инструкции, которые не изменяют флаги, устанавливают Q в 0, а те, которые изменяют флаги, копируют F в Q. Ты также можешь использовать QFF, который будет представлять собой фиктивный флип-флоп, указывающий, модифицировала ли предыдущая инструкция флаги или нет. Это зависит от тебя и от того, как ты хочешь это реализовать.
Объяснение:
https://github.com/redcode/Z80_XCF_Flavor
https://worldofspectrum.org/forums/discussion/41704
Это способ обозначить, модифицировала ли предыдущая инструкция флаги. Если она их изменила, то новые значения будут взяты только из A. В противном случае они будут взяты из F | A. Когда F копируется в Q, результат Q ^ F равен 0, поэтому значение будет взято только из A, так как 0 | A - это A.
Не знаю, что именно имел в виду Патрик под буферным регистром флагов, но мне кажется, что не то, что есть в реальности.
На самом деле реальный буферный регистр флагов работает несколько иначе.
Его отдельные биты в зависимости от ситуации могут либо копировать текущее содержимое флага, либо принудительно сбрасывать какой-то флаг, либо принудительно устанавливать, либо устанавливать в зависимости от результата работы АЛУ, либо устанавливать в зависимости от каких-то еще состояний (тригера IFF2 и т.д).
А вот уже этот буферный регистр потом переписывается в основной регистр флагов. Причем, 5 и 3 биты в буферном регистре отсутствуют.