Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   ZX.SPECTRUM (http://zx-pk.ru/forumdisplay.php?f=30)
-   -   memptr (http://zx-pk.ru/showthread.php?t=2814)

Wladimir Bulchukey (2:5020/2065.462) 29th March 2006 13:35

memptr
 
FromNet: NET_Moscow_Russia_(245_02/09/2005) (commserv.rpb.ru)

Здравствуй(-те), All...!

=== Cut ===
http://zx.pk.ru/showthread.php?p=43688#post43688

boo_boo

итак, поэма о memptr -- читаем!
на этой бодрой ноте дело о BIT n,(HL) предлагаю считать закрытым
спасибо огромное всем участникам исследований

ЗЫ. надо бы еще на английский перевести -- поделиться с буржуями может, возьмется кто-нибудь? могу и я, но позориться неохота -- выйдет в стилистике "ай хаве зе вери гуд фемили"...


MEMPTR, эзотерический регистр ZiLOG Z80.

Как известно, после выполнения инструкции BIT n,(HL) в 3 и 5 битах флагового регистра оказывается некое нечто, о котором в фирменных руководствах не сказано ни слова. Hа самом деле это -- 11й и 13й биты внутренней регистровой пары Z80, которая используется для операций с 16и-битными значениями, чаще всего -- адресами (обычная практика для процессоров с 8и-битной шиной данных, оперирующих 16и-битными данными). Как и зачем два бита этого регистра оказались во флагах, неясно, однако же, оказались. Упоминания об этом явлении можно встретить в "z80 undocumented documented" Шона Янга (http://www.myquest.nl/z80undocumented/), и, в несколько большем объеме, в описании Z80 из проекта "nocash" (http://www.work.de/nocash/zxdocs.htm), где эта регистровая пара и названа MEMPTR. К сожалению, до недавнего времени, попытки по состоянию двух бит разобраться, какие конкретные значения выставляются в MEMPTR некоторыми инструкциями процессора, были не слишком успешны.
Hо свершилось чудо. В результате множества экспериментов (основанных на предпосылке, что инструкции с индексной адресацией инициализируют MEMPTR соотвутствующим адресом), а также глубоких медитаций над результатами, нам удалось выяснить, что инструкция CPI увеличивает текущее значение MEMPTR на 1, а CPD текущее значение на 1 уменьшает. Таким образом, циклически декрементируя MEMPTR, и отслеживая заём из старших разрядов по двум известным битам, можно однозначно определить 14 младших бит MEMPTR, а имея их на руках -- сказать наверняка, по какому принципу выставляются значения. Далее -- список операций, влияющих на MEMPTR, с формулами для его содержимого. Здесь rp обозначает регистровую пару (16 бит), а INDEX - регистровые пары IX или IY. Операции, в этом списке отсутствующие, на MEMPTR, насколько известно, не влияют. Все процессора, на которых проводились испытания, дали одинаковые разультаты, за исключением КР1858ВМ1 и Т34ВМ1, которые будем обозначать "*BM1".

================================================== ============================= =====

MEMPTR = addr + 1

MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = 0

MEMPTR = rp + 1

MEMPTR_low = (rp + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (rp + 1) & #FF, MEMPTR_hi = 0

MEMPTR = addr + 1

MEMPTR = значение rp после операции

ADD/ADC/SBC rp1,rp2
MEMPTR = rp1_до_операции + 1

RLD/RRD
MEMPTR = HL + 1

JR/DJNZ/RET/RETI/RST (при переходе по addr)
MEMPTR = addr

JP(кроме JP rp)/CALL addr (в случае условного перехода -- независимо от удовлетворения условию)
MEMPTR = addr

MEMPTR = (A_до_операции '' 8) + port + 1

MEMPTR = BC + 1

MEMPTR_low = (port + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (port + 1) & #FF, MEMPTR_hi = 0

MEMPTR = BC + 1

LDIR/LDDR
при BC '' 1: MEMPTR = адрес_инструкции + 1
при BC = 1 не влияет

CPI
MEMPTR = MEMPTR + 1

CPD
MEMPTR = MEMPTR - 1

CPIR
при BC=1 или A=(HL): как CPI
в остальных случаях на каждом шаге MEMPTR = адрес_инструкции + 1
* поскольку на последнем шаге BC=1 или A=(HL), в итоге MEMPTR = адрес_инструкции + 1 + 1
(если перед этим не было прерывания)

CPDR
при BC=1 или A=(HL): как CPD
в остальных случаях на каждом шаге MEMPTR = адрес_инструкции + 1
* поскольку на последнем шаге BC=1 или A=(HL), в итоге MEMPTR = адрес_инструкции + 1 - 1
(если перед этим не было прерывания)

INI
MEMPTR = BC_до_декремента_B + 1

IND
MEMPTR = BC_до_декремента_B - 1

INIR
как INI на каждом шаге. то есть, в итоге MEMPTR = ((1 '' 8) + C) + 1

INDR
как IND на каждом шаге. то есть, в итоге MEMPTR = ((1 '' 8) + C) - 1

OUTI
MEMPTR = BC_после_декремента_B + 1

OUTD
MEMPTR = BC_после_декремента_B - 1

OTIR
как OUTI на каждом шаге. то есть, в итоге MEMPTR = C + 1

OTDR
как OUTD на каждом шаге. то есть, в итоге MEMPTR = C - 1

любая инструкция с (INDEX+d):
MEMPTR = INDEX+d

переход по прерыванию на addr:
как при обычном CALL. то есть, MEMPTR = addr

================================================== ============================= =====

Какая же польза нам от этого Тайного Знания? Hу, во-первых, теперь возможно написание эмуляторов Z80, поддерживающих _все_ недокументированные особенности cpu. Во-вторых, то, что на некоторых клонах Z80 MEMPTR ведет себя слегка иначе, добавляет еще один метод в копилку способов автоопределения модели процессора. По-моему, уже немало! :)

(c)2006, zx.pk.ru
теоретическая часть: boo_boo, Vladimir Kladov
натурные испытания: Wlodek, CHRV, icebear, molodcov_alex, goodboy

=== Cut ===

С наилучшими - Wlodek # wlblack()newmail.ru # http://wlodeks.narod.ru
[ZX] [500:95/462@ZXNet] [2:5016 Forever] [Golyanovo] [Старые русские]

Vadik Akimoff (2:5020/835.1) 30th March 2006 04:15

memptr
 
FromNet: NET_Moscow_Russia_(245_02/09/2005) (commserv.rpb.ru)

Hi!

In a message of 29 Mar 06 Wladimir Bulchukey wrote to All:

Quote:

Какая же польза нам от этого Тайного Знания?
И действительно?


Quote:

Hу, во-первых, теперь возможно написание эмуляторов Z80,
поддерживающих _все_ недокументированные особенности cpu.
Все ли? А как же останется обойдена вниманием особенность цпу, когда на
него, скажем, подают 10В вместо 5В питания?


Quote:

Во-вторых, то, что на некоторых клонах Z80 MEMPTR ведет себя слегка
иначе, добавляет еще один метод в копилку способов автоопределения
модели процессора.
Hасколько я знаю, ещё ни один клон з80 не отличался по растактовкам.
Максимум - это out (c),0 vs out (c),#ff - совершенно бесполезные. Все
документированные, а также недокументированные команды работы с половинками
и sli - работают везде одинаково. Стало быть, смысла определять 'модель' Z80
нет никакого.


Quote:

По-моему, уже немало! :)
Чтоб пяткой себя в грудь стучать - действительно, немало...



Bye...

Konstantin Denisov (2:5095/1.104) 31st March 2006 22:30

memptr
 
FromNet: Podolsk_Russia (Podolsk_Net)

Hello, Wladimir!

March, 29, 2006 03:40 Wladimir Bulchukey Wrote to All :


Quote:

дали одинаковые разультаты, за исключением КР1858ВМ1 и Т34ВМ1,
которые
будем обозначать "*BM1".

================================================== ====================
========= =====

LD A,(addr)
MEMPTR = addr + 1
А что там на *ВМ1 и ГДРовским MME Z80A ?



... Я ОБЩЕСТВЕHHЫЙ УHИТАЗ!Я ОБЩЕСТВЕHHЫЙ ПОЛОВИК!Я ОБЩЕСТВЕHHЫЙ АВТОМАТ!Я ОБЩ
---

Dima Bystrov (2:5029/77.48) 1st April 2006 07:05

Re: memptr
 
FromNet: Ryazan (Ryazan_Net)

Hello Wladimir!

29 Mar 06 02:40, Wladimir Bulchukey wrote to All:

Quote:

LD (addr),A
MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = 0
После таких расхождений уже вряд ли можно утверждать, что *ВМ1 содран путём
фотографирования топологии оригинального кристалла! Из несовместимостей ещё
можно вспомнить флаги после OUTI (интра START Рощина).

- A.Coder [Wolf2004 HexFill Pang16C TimeGal InfoGuide8 ACEdit99 PT3697 Chip13]
[ANS4 ZXR27UnR59 Jpg42 8col12 DBS7 CacVox1 Gluk61 PC21 Alasm504 STS72 HDDoct10]

... ZX Spectrum today

Wladimir Bulchukey (2:5020/2065.462) 3rd April 2006 17:35

memptr
 
FromNet: NET_Moscow_Russia_(245_02/09/2005) (commserv.rpb.ru)

Здравствуй(-те), All...!

=== Cut ===
boo_boo

письмо пришло от Мартина Корта, автора nocash-евской доки и
эмуляторов, кроме спасибов и прочего, с указаниями на пару
неточностей/неясностей в тексте. посему -- пофикшенная версия.
=== Cut ===


=== Cut ===
MEMPTR, эзотерический регистр ZiLOG Z80.

Как известно, после выполнения инструкции BIT n,(HL) в 3 и 5 битах флагового регистра оказывается некое нечто, о котором в фирменных руководствах не сказано ни слова. Hа самом деле это -- 11й и 13й биты внутренней регистровой пары Z80, которая используется для операций с 16и-битными значениями, чаще всего -- адресами (обычная практика для процессоров с 8и-битной шиной данных, оперирующих 16и-битными данными). Как и зачем два бита этого регистра оказались во флагах, неясно, однако же, оказались. Упоминания об этом явлении можно встретить в "z80 undocumented documented" Шона Янга (http://www.myquest.nl/z80undocumented/), и, в несколько большем объеме, в описании Z80 из проекта "nocash" (http://www.work.de/nocash/zxdocs.htm), где эта регистровая пара и названа MEMPTR. К сожалению, до недавнего времени, попытки по состоянию двух бит разобраться, какие конкретные значения выставляются в MEMPTR некоторыми инструкциями процессора, были не слишком успешны.
Hо свершилось чудо. В результате множества экспериментов (основанных на предпосылке, что инструкции с индексной адресацией инициализируют MEMPTR соотвутствующим адресом), а также глубоких медитаций над результатами, нам удалось выяснить, что инструкция CPI увеличивает текущее значение MEMPTR на 1, а CPD текущее значение на 1 уменьшает. Таким образом, циклически декрементируя MEMPTR, и отслеживая заём из старших разрядов по двум известным битам, можно однозначно определить 14 младших бит MEMPTR, а имея их на руках -- сказать наверняка, по какому принципу выставляются значения. Далее -- список операций, влияющих на MEMPTR, с формулами для его содержимого. Здесь rp обозначает регистровую пару (16 бит), а INDEX - регистровые пары IX или IY. Операции, в этом списке отсутствующие, на MEMPTR, насколько известно, не влияют. Все процессора, на которых проводились испытания, дали одинаковые разультаты, за исключением КР1858ВМ1 и Т34ВМ1, которые будем обозначать "*BM1".

================================================== =============================
MEMPTR = addr + 1

MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (addr + 1) & #FF, MEMPTR_hi = 0

MEMPTR = rp + 1

MEMPTR_low = (rp + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (rp + 1) & #FF, MEMPTR_hi = 0

MEMPTR = addr + 1

MEMPTR = значение rp после операции

ADD/ADC/SBC rp1,rp2
MEMPTR = rp1_до_операции + 1

RLD/RRD
MEMPTR = HL + 1

JR/DJNZ/RET/RETI/RETN/RST (только при переходе по addr. то есть, в случае условных JR/RET при невыполненном условии, или DJNZ когда B_после_декремента == 0, MEMPTR не меняется)
MEMPTR = addr

JP(кроме JP rp)/CALL addr (в случае условного перехода -- независимо от удовлетворения условию)
MEMPTR = addr

MEMPTR = (A_до_операции '' 8) + port + 1

MEMPTR = BC + 1

MEMPTR_low = (port + 1) & #FF, MEMPTR_hi = A
для *BM1: MEMPTR_low = (port + 1) & #FF, MEMPTR_hi = 0

MEMPTR = BC + 1

LDIR/LDDR
при BC '' 1: MEMPTR = адрес_инструкции + 1
при BC = 1 не влияет

CPI
MEMPTR = MEMPTR + 1

CPD
MEMPTR = MEMPTR - 1

CPIR
при BC=1 или A=(HL): как CPI
в остальных случаях на каждом шаге MEMPTR = адрес_инструкции + 1
* поскольку на последнем шаге BC=1 или A=(HL), в итоге MEMPTR = адрес_инструкции + 1 + 1
(если перед этим не было прерывания)

CPDR
при BC=1 или A=(HL): как CPD
в остальных случаях на каждом шаге MEMPTR = адрес_инструкции + 1
* поскольку на последнем шаге BC=1 или A=(HL), в итоге MEMPTR = адрес_инструкции + 1 - 1
(если перед этим не было прерывания)

INI
MEMPTR = BC_до_декремента_B + 1

IND
MEMPTR = BC_до_декремента_B - 1

INIR
как INI на каждом шаге. то есть, в итоге MEMPTR = ((1 '' 8) + C) + 1

INDR
как IND на каждом шаге. то есть, в итоге MEMPTR = ((1 '' 8) + C) - 1

OUTI
MEMPTR = BC_после_декремента_B + 1

OUTD
MEMPTR = BC_после_декремента_B - 1

OTIR
как OUTI на каждом шаге. то есть, в итоге MEMPTR = C + 1

OTDR
как OUTD на каждом шаге. то есть, в итоге MEMPTR = C - 1

любая инструкция с (INDEX+d):
MEMPTR = INDEX+d

переход по прерыванию на addr:
как при обычном CALL. то есть, MEMPTR = addr

================================================== =============================
Какая же польза нам от этого Тайного Знания? Hу, во-первых, теперь возможно написание эмуляторов Z80, поддерживающих _все_ недокументированные особенности cpu. Во-вторых, то, что на некоторых клонах Z80 MEMPTR ведет себя слегка иначе, добавляет еще один метод в копилку способов автоопределения модели процессора. По-моему, уже немало! :)

(c)2006, zx.pk.ru
теоретическая часть: boo_boo, Vladimir Kladov
натурные испытания: Wlodek, CHRV, icebear, molodcov_alex, goodboy

=== Cut ===

С наилучшими - Wlodek # wlblack()newmail.ru # http://wlodeks.narod.ru
[ZX] [500:95/462@ZXNet] [2:5016 Forever] [Golyanovo] [Старые русские]


All times are GMT +4. The time now is 20:53.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.