Скачал, запускаю. Но гарантировать, что в течение 11 часов смогу регулярно контролировать его состояние, боюсь :) . Вот если можно было бы просто на ночь оставить...Цитата:
Сообщение от Vladimir Kladov
Вид для печати
Скачал, запускаю. Но гарантировать, что в течение 11 часов смогу регулярно контролировать его состояние, боюсь :) . Вот если можно было бы просто на ночь оставить...Цитата:
Сообщение от Vladimir Kladov
смысл в том, чтобы составить корреляцию с тем прогоном, что сделал автор. Оно можно сделать отдельный тест и для bit n,(hl), не проблема, я для того и адаптировал к своему ассемблеру, чтобы иметь возможность пропускать только нужные тесты. Но, по моему мнению, тут глубже собака зарыта. Надо хотя бы по разу на _нескольких_ реалах прогнать, чтобы разницу обнаружить, если она (не дай бо) есть.
При так называемом 'пробое паяльником' в 99.99% помрет либо весь кристалл, либо какие-либо из вентилей ввода-вывода...Цитата:
Сообщение от Vladimir Kladov
А что касается разных производителей, то естественно, что они не раводили кристалл самостоятельно, а брали уже готовый шаблон, либо просто корпусировали кристалл полученный от Zilog. Вряд ли кому-то пришла бы в голову гениальная идея проэктировать кристалл ЗАНОВО :D Да если и пришла бы, то в нем 'поплыли' бы не только недокументированные флаги bit x,(hl) ;)
кой-кому пришла такая идея -- см t80, r800, советский аналог... а у тебя какие гипотезы насчет несовпадения эмуляции bit (hl) для 2х испытанных процов?Цитата:
Сообщение от Titus
Как-то мне приходилось тестировать недокументированные флаги T80 - оказалось один к одному. Думаю внутри стоял кристалл от Zilog. Хотя некоторые склоняются к мнению, что он был просто сточен, переснят и воспроизведен заново ;)Цитата:
Сообщение от boo_boo
Кстати говоря, возможно в Turbo процах, выпускаемых Zilog позднее что-то и отличалось, если они трогали топологию кристалла.
Да, а что касается недокументированных флагов, то еще 10 лет назад я думал, что знаю их все ;)
Отлично, 100%. Черт с ним с DAA, он все равно от XF, YF не зависит, да и не мог он не совпасть, если все прочее совпало до цифирки. А ведь тот человек (который адаптировал тест для спектрума) наверное гонял на фирменном спектруме, а не на пентагоне, так я понял?
Самое замечательное, что тест этот пройден и дал абсолютно тот же результат на том же компе, на котором проделан не менее замечательный тест от боо-боо. Т.е. можно гарантированно насчет команды bit n,(hl) сказать, что тест этой команды в этом большом тесте сходится совсем не потому, что на ее флажки не влияет искомый memptr (потому что он не может не влиять, и это доказывает малый тест от боо боо). Вывод: либо CRC в большом тесте строится по дурацкому алгоритму, и разные результаты могут спокойно давать один и тот же CRC с большой вероятностью, либо в большом тесте каким-то макаром все время оказывалось в memptr такое значение, что XF и YF все время занулялись.
Насчет первого (дурацкий CRC) - это надо проверить (сейчас буду смотреть, есть тест bit n,(ix+1), так вот он и вызывает у меня подозрение. Если ix бывает в этом тесте очень разный, тогда непонятно, почему элементарное зануление флажков XF, YF приводит к той же CRC. Если IX одинаковый, то автор теста (или тот кто его адпатировал) и вправду идиот (или просто не знал ничего про memptr).
А вот насчет зануления (п.2 моего рассуждения абзацем выше) флажков перед выполнением bit n,(hl). Я выяснил, что ближайшая команда, которая могла (и должна была в любом случае) повлиять на изменение memptr перед вызовом теста, это call nz,9BEFh по адресу 99FEh. Если верить источнику *, то в memptr попадает 9Bh&28h = 08h, т.е. как минимум XF=1, YF=0. Все, что по дороге, вроде бы memptr трогать не должно, согласно *.
А теперь очень интересная картина вырисовывается. Из всех эмуляторов выигрывает (тьфу, проходит) тест bit n,(hl) только спектакулятор, который начхал на мемптр по крайней мере для bit n,(hl) и всегда пишет в флажки YF и XF нули. И как же тогда быть прикажете?
Боо-боо, я хочу услышать: ты придумал, как правильно bit n,(hl) эмулировать?
(btw, boo_boo читается бу-бу ;) ) думаю, но данных не хватает :(Цитата:
Сообщение от Vladimir Kladov
особенно мутно с прерываниями и ld(nnnn),a у которого результаты разошлись на разных компах. сейчас дописываю тест поподробней/пообъемней, по результатам бут видно :o
думай. Но учти, что в большом тесте, кторый у Wlodek'а тот же результат показал, последняя команда перед bit n,(hl) это call nz, про который я сказал. Можешь посмотреть, дальше есть еще ld (xxxx),sp, ld sp,(xxxx), pish, pop, di. Если только ld sp,(xxxx) и ld (xxxx),sp вопреки * влияют на memptr, тогда понятно где собака зарыта. И тогда большой тест просто ничего не может сказатью И тогда понятно что бсолютно точно проходит тест эмулятор который просто зануляет XF и YF в bit n,(hl). (Spectaculator).
Так что я бы еще раз проверил что ld sp() и ld ()sp влияют или не влияют, да и push/pop тоже попроверял бы. (А DI не может случайно сбросить memptr, вот смеху-то было бы).
Вот точно какие команды выполняются в биг-тесте:
ORG 99FEh
CALL NZ, 9BEFh
ORG 9BEFH
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IY
DI
LD (9C56H),SP
LD SP,8005H
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
LD SP,(8011H)
;а вот здесь выполняется bit n,(hl), после чего: nop nop и далее
ORG 9C0DH
LD (9C54H),SP
LD SP,9C54H
PUSH AF
дальше флажки уже сохранены какие есть т.е. после bit n(hl) они уже не менялись и даже этот кусок не нужен. Соответственно под подозрение попадают все PUSH/POP и LD (),SP с LD SP,().
ясный пень, LD SP,(8011H) нулями все забил. по моему тесту (последнему), LD SP,(nnnn) на memptr влияет -- сует в него адрес. так что на "большой тест" предлагаю забить, все с ним ясно...Цитата:
Сообщение от Vladimir Kladov
сделаю, как написано в доке плюс ld sp,() / ld (),sp - чем sp хуже bc/de/hl? тогда большой тест пройдёт ;-)
хе-хе :) а как насчет чтобы этот (последний в треде) тест совпал с реалом? ;)Цитата:
Сообщение от SMT
у меня уже прошел, осталось мелочи: объясни, boo-boo (коль те так больше нравится): что в btest2 такое тесты cpd/cpdr/cpi/cpdr и как для них правильно загружать адрес в memptr (или не адрес, а значение? из A? или из (HL)?). И пожалуйста, чуть подробнее насчет EI HALT в IM2 - откуда в регистр попадать должно? (Хоть бы исходники положил что ли, по дизассемблерному коду лазить не смешно).
благодаря Wlodek'у и CHRV мы теперь имеем над чем подумать ;)
в тестировании принимали участие:
Z0840008,Т34ВМ1,КР1858ВМ3,Z084C0010,КР185 8ВМ1 от CHRV,
пентагон Wlodek'a с неизвестным кристаллом (однако, не являющимся одним из вышеперечисленных)
у родных Z084C00010, Z0840008 все одинаково.
остальные кристаллы отличаются или по memptr, или по другим флагам.
итак, memptr, внутренний регистр z80, из старшего байта которого берутся 3 и 5 биты F при выполнении опкода bit n,(hl). судя по результатам теста вырисовывается такая картина (тут плюсиками помечены пункты, совпадающие с nocash-докой, минусом -- несовпадающие или отсутствующие, загогулиной -- ни то, ни се.):
+ LD A,(addr)
memptr=addr+1
~ LD (addr),A
для Z0840008, Z084C00010, КР1858ВМ3: memptr=A*0x100
на пентагоне Wlodek'a, Т34ВМ1, КР1858ВМ1: memptr=0
~ LD (addr), rp; LD rp,(addr)
memptr=addr+1
+ EX (SP),rp
memptr=rp
+ ADD/ADC/SBC rp,rp2
memptr=rp+1
+ RLD/RRD
memptr=HL+1
+ JP/JR/CALL/DJNZ/RET/RETI/?RST? addr (при переходе)
memptr=addr
+ JP/CALL при отрицательном условии
memptr=addr
+ IN A,(port)
memptr=полный_адрес_порта(A*0x100+ port) + 1
- OUT (port),A
для Z0840008, Z084C00010, КР1858ВМ3: memptr=полный_адрес_порта(A*0x100+ port)
для пентагона Wlodek'a, Т34ВМ1, КР1858ВМ1: memptr=0
+ IN A(C)
memptr=BC+1
+ OUT (C),A
memptr=BC+1
- CPI/CPD/CPIR/CPDR
самое непонятное... иногда меняет memptr, неясно, по какому принципу.
[в этом тесте все cpi обнуляют memptr, cpd оставляют как есть, все cpir изменяют непонятно как (первые два обнуляют, остальные, которые при BC=5 выставляют 3й бит), первые два cpdr оставляют как есть, последующие три (BC=5) выставляют 3й бит]
- INI/INIR/OTI/OTIR/IND/INDR/OUTD/OTDR
или просто memptr=0, или что-то похитрее, ведется следствие...
- прерывания:
как при обычном переходе. то есть memptr=адрес обработчика прерывания
+ любая инструкция с (IX/IY+d)
memptr=IX/IY+d
за остальными инструкциями ничего подозрительного не замечено.
пристегиваю архив с результатами теста и самим тестом (сорс для sjasmplus, сляпано быстро и на коленке, звиняюсь ,)
По-моему, на нём написано "Z80A GoldStar". Уточнить вряд ли удастся, потому что на него давно наклеен радиатор.Цитата:
Сообщение от boo_boo
"Исходников" Z80 быть не может. Кстати, обсуждалось недавно (месяца два назад) в comp.arch.fpga , "ссылку" я давал уже здесь.Цитата:
Сообщение от boo_boo
Если дашь тест в формате TAP или TZX то протестю на оригинальном ZX Spectrum+. Если надо, могу посмотреть чем камень в нём стоит.Цитата:
Сообщение от boo_boo
или в CPI/CPD попадает не тот регистр. Варианты: A, DE+1 (а вдруг), BC-1 (тогда откель 1 взялась), (HL) - смотрел?, A-(HL). Для CPIR/CPDR (а может и CPI/CPD - почему бы и) может еще PC (адрес самой команды CPIR/CPDR), причем еще смотреть надо какой байт, старший или младший. Думаю, стоит именно вот эти варианты рассматривать, для них тщательный тест делать, остальные версии вряд ли иммет смысл сейчас муссировать.
(Хм, а что если MemPtr - не один, и в нескольких таких регистрах за 1 такт выполняется несколько инкрементов нескольких регистров, а попасть в xy в команде bit может из какого-нибудь, и не всегда одного и того же)
С CPI/CPD/CPIR/CDPR ясно:
первые 2 не влияют, вторые влияют, если команда выполняется более чем 1 раз, действие такое же как для JP на начало команды после каждого исполнения.
Boo-boo, подтверждай. Я пока 3-й тест гляну.
(Хотя конечно, почему же в LD<i,d>[r] по-другому. Хотя, с логикой тут вообще связки может и не быть. Как пришлось, так и сделали).
насчет "как jp" похоже,Цитата:
Сообщение от Vladimir Kladov
однако, в предыдущей редакции теста аналогичный результат давала CPI (не помню, при каких условиях, исходника нет, надо дизасмить)...
уточняю гипотезу -- CPI и CPIR обнуляют memptr при BC=1, и инициализируют его своим адресом (?или адресом +1?) в остальных случаях. CPD и CPDR не трогают memptr при BC=1 и инициализируют его адресом в остальных случаях.
завтра выкачу очередной вариант теста -- проверим CP*, заодно прочие блочные команды при аналогичных условиях (а вдруг?), ну и еще кой-чего до кучи.
о, здорово, сделаю завтра, вместе с новым вариантом теста :)Цитата:
Сообщение от icebear
Если смотреть на тест 3, то ничего CPI/CPD не обнуляют. Если конечно правильно понял, что во втором проходе @set@ означает что до теста memptr установлен, и проверка идет в том числе на то, что команда вообще его "сбрасывает".
Я кстати замучился смотреть на тест 3. Сравнивать неудобно. Ты бы память инициализировал как-ниудь перед тестом, что ли. А то повторно тест запускать становится неинтересно, + и - вообще перестают совпадать. Различаются по + и - даже железные тесты. Сравнивалка тектовых файлов просто все считает насовпавшим (когдя я свои резултаты хочу сравнить), и приходится долго смотреть глазьями. Жуть!
смотрю на результат последнего теста, вон на 1м проходе, при сброшенном memptr, все cpi дают 00, все cpd тоже 00, на втором, при установленном memptr, cpi опять 00 дают, а cpd 11. те cpi обнуляют, а cpd все пофиг.Цитата:
Сообщение от Vladimir Kladov
память инициализировать? O__o.... ок, сделаю :rolleyes:
советую утилитку CompareIt! показывает именно несоотвествия построчно, выделяя их цветом. удобнее.Цитата:
Сообщение от Vladimir Kladov
#ifdef OFFTOPIC
diff поможет отцам русской демократии?
или если под вындофсь, то тотал командер тож неплохо сравнивает
#endif // OFFTOPIC
Под вынь мелкомягкие злобные оффтопики еще имеют WinDiff - красиво всё раскрашивает, показывая что куда перенесено и т.д.Цитата:
Сообщение от Sinus
утилит много (я предпочитаю WinMerge), но фишка в том, что они все натыкаются на строки с разными +/-, хоть бы там и были одинаковые 0/1 в флажках. Неудобно. Так что проинициализируй. Плиз.
(оно конечно утилитку написать - 10 минут максимум, чтобы во всех файлах заменила все + на - в первой колонке, но ведь интересно и на эти флаги глянуть). А, кстати, в комментах по CPI / CDP мало информации (опять в дебугер лезть). Ну, я размечтался. Значит CPI говоришь, обнуляет. Просто обнуляет, или все-таки из откуда-то еще берет? В следующем тесте будет разборка?
Кстати, мне кажется, уже можно оставить те команды, которые уже прояснились, и заняться только CPxx, INxx, OTxx (или хотя бы в начало их поставить, чтобы легче отладчиком смотреть) Или что-то еще не стыкуется?
не нужно инициализировать :) незачем вообще выводить биты кроме 5 и 3 -- это же флаги после bit (hl), с которыми ясно все, а от предыдущей команды только C остается. если тебя С интересует, могу оставить плюсики, а перед bit (hl) выставлять hl, а то этот hl скачет где ни попадя, неудивительно, что флаги всегда разные :rolleyes:Цитата:
Сообщение от Vladimir Kladov
...добавил подробные тесты для блочных команд.... выложу очередной тест в железячную тему через пару минут
вот :)Цитата:
Сообщение от icebear
Чуствую скоро мы получим тест CPUid ;).Цитата:
Сообщение от boo_boo
о, как раз недавно думал об этом -- добавить для верности к к/сумме состояние флагов _перед_ bit (hl), еще тест DAA, и в результате недурственный CPUid получится :rolleyes:Цитата:
Сообщение от CHRV
это все (причем, больше и подробнее) есть и у янга. с 3 и 5 битами F давно все понятно для всех инструкций... кроме bit n,(hl) :rolleyes:Цитата:
Сообщение от goodboy
ОК, сделаю. Этот тест сохраняет какие-либо результаты? Мне придётся их как-то обратно в TAP загонять, а как это сделать, я ещё не знаю. Посему сразу результата не будет, но я постараюсь как можно быстрее, мне самому интересно :)Цитата:
Сообщение от boo_boo
ага, записывает в конце лог, обычным save -- адрес/длина блока указаны в васике.Цитата:
Сообщение от icebear
Ребят, вам не нужен Z80H для теста? Дома лежит, сейчас маркировку посмотреть не могу. Правда реала у меня не осталось.
неплохо б! :) ...народ, у кого реал есть? может дык?Цитата:
Сообщение от RamTop
Цитата:
Сообщение от boo_boo
Кстати, могу на Спринтере проверить, который Sp97. Но всё упирается во время :(
z84 там? интересно... так на спринтере вроде trd читаются/пишутся, от силы пару минут все займет?Цитата:
Сообщение от icebear
Z84C15. Спринтер рабочий, протестировать быстро получиться. Кстати, на турбе или нет? Возьму последнюю версию теста (5), из которой я уже сделал WAV, что бы загрузить в ZX Spectrum+ :) Вчера не получилось :(Цитата:
Сообщение от boo_boo
по идее, без разницы. прогони так и так, глянь сумму -- одинаковая?Цитата:
Сообщение от icebear