сделаю, как написано в доке плюс ld sp,() / ld (),sp - чем sp хуже bc/de/hl? тогда большой тест пройдёт ;-)
сделаю, как написано в доке плюс 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, сляпано быстро и на коленке, звиняюсь ,)
Последний раз редактировалось boo_boo; 27.02.2006 в 00:26.
По-моему, на нём написано "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*, заодно прочие блочные команды при аналогичных условиях (а вдруг?), ну и еще кой-чего до кучи.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)