Speccy - наш выбор!  
ZXPRESS
ZXTUNES
Virtual TR-DOS
World of Spectrum
ZX Spectrum Old Demos •

Go Back   Speccy - наш выбор! > FTN-сети > ZX.SPECTRUM

Reply
 
Thread Tools Display Modes
Old 29th March 2006, 13:35   #1
Гость
 
Posts: n/a
Default 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] [Старые русские]
  Reply With Quote
Old 30th March 2006, 04:15   #2
Гость
 
Posts: n/a
Default 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...
  Reply With Quote
Old 31st March 2006, 22:30   #3
Гость
 
Posts: n/a
Default 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ЫЙ АВТОМАТ!Я ОБЩ
---
  Reply With Quote
Old 1st April 2006, 07:05   #4
Гость
 
Posts: n/a
Default 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
  Reply With Quote
Old 3rd April 2006, 17:35   #5
Гость
 
Posts: n/a
Default 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] [Старые русские]
  Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off

Forum Jump


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


Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Map Яндекс.Метрика