Вход

Просмотр полной версии : Надёжное и элегантное автоматическое опознание модели спектрума



introspec
31.08.2013, 22:22
всем пока

Alex Rider
31.08.2013, 22:26
Возможно, курение исходников эмуляторов - неплохой путь для нахождения новых детектов. ZXMAK2 в этом смысле хорош.

introspec
31.08.2013, 22:29
Возможно, курение исходников эмуляторов - неплохой путь для нахождения новых детектов. ZXMAK2 в этом смысле хорош.
Я понимаю, как разбираться в железе, но прошу поделиться конкретным опытом, так же, как я поделился своим опытом чуть выше. Изобрести тест ничего не стоит, а вот учесть, что новоизобретённый тест сделает на какой-нибудь неучтённой конфигурации - далеко не тривиальная задача.

Lion17
01.09.2013, 11:32
4. #FF по адресу #0013 (48k ПЗУ)
Верно для всех британских спектрумов, т.е. 48/48+/128/+2(серый)
Удобно, чтобы отсечь испанские спектрумы, т.е. +2a/+2b/+3.

На самом деле испанский спектрум это ZX Spectrum 128.
Модель +2 идентична модели 128, но в другом корпусе с магнитофоном и переразведенной платой.
+2a/+2b/+3 разработка Amstrad, британской фирмы.

introspec
01.09.2013, 12:16
На самом деле испанский спектрум это ZX Spectrum 128.
Модель +2 идентична модели 128, но в другом корпусе с магнитофоном и переразведенной платой.
+2a/+2b/+3 разработка Amstrad, британской фирмы.
Да, спасибо за поправку, не знаю, где я подцепил эту идею. Сейчас переделаю пост.

drbars
01.09.2013, 13:30
introspec, я так понял ты собираешься сделать универсальную тестирующую процедуру, которая однозначно на выходе выдает модель?

Думаю тут комплексно всё тестить нужно, и память, и такты и прошивки.

introspec
01.09.2013, 13:36
Думаю тут комплексно всё тестить нужно, и память, и такты и прошивки.
Ну я примерно так и делаю сейчас. Любую классику я сейчас ловлю по числу тактов и/или поведению диспетчера памяти #1FFD; плюс, есть ещё описанное выше свойство ПЗУ, которым я больше не пользуюсь, хотя работало оно, кажется, неплохо.

Проблемы у меня начинаются с отечественными клонами, т.к. многие из них имеют довольно похожие времянки. Плюс, их реально слишком много, а хочется, ок, если не поддерживать ВСЁ, то хотя бы более-вменяемо отрабатывать на неподдержанном "в лоб" железе.

goodboy
01.09.2013, 15:35
хорошее определение классики (для правильного построения бордюрного скролла) есть в игре Sentinel, там после задержки проверяется системная переменная (frames)

Vadim
01.09.2013, 15:53
Компы Амстрада можно определить по 1FFD, отключением ПЗУ, потом смотрим регистры FDC если они есть, то вполне вероятно, что у нас +3. У +2(серый) и +2A/B+3 разные страницы медленные (на форуме velesoft расписывал уже 2 или 3 раза). Читать содержимое ПЗУ не очень надёжный способ, т.к. юзер ПЗУ может и заменить. Если на профи нажата кнопка отключения всего, что выше Sp-128, то DFFD не опознается никак. Времянки смотреть + читать пустую шину данных, на 48, 128 и +2(серый) будут читаться атрибут если мы читаем в момент его отображения на экране, на компах от Амстрада этого вроде нет (я не помню точно).

introspec
01.09.2013, 16:09
хорошее определение классики (для правильного построения бордюрного скролла) есть в игре Sentinel, там после задержки проверяется системная переменная (frames)
Спасибо! у меня с классикой пока нет проблем, но глянуть полезно будет.

---------- Post added at 13:09 ---------- Previous post was at 13:01 ----------


Компы Амстрада можно определить по 1FFD, отключением ПЗУ, потом смотрим регистры FDC если они есть, то вполне вероятно, что у нас +3. У +2(серый) и +2A/B+3 разные страницы медленные (на форуме velesoft расписывал уже 2 или 3 раза). Читать содержимое ПЗУ не очень надёжный способ, т.к. юзер ПЗУ может и заменить. Если на профи нажата кнопка отключения всего, что выше Sp-128, то DFFD не опознается никак. Времянки смотреть + читать пустую шину данных, на 48, 128 и +2(серый) будут читаться атрибут если мы читаем в момент его отображения на экране, на компах от Амстрада этого вроде нет (я не помню точно).
Да, про дополнительные ПЗУ, изменённые медленные страницы и отсутствие порта #FF у Amstrad я знаю. Про порты диска я не подумал, спасибо, хотя пока мне не нужно было отличать +2а от +3.

Про тумблер у профи не знал - получается, надёжнее всего сделать тест задержек памяти и ловить отечественные клоны на их отсутствии. Спасибо, это очень полезная информация.

Дмитрий
19.09.2013, 12:18
Тесты через TR-DOS не годятся, т.к. вылетают там, где её нет.
Проверить наличие TR-DOS можно проанализировав область системных переменных и уже оттуда плясать дальше.

SoftLight
19.09.2013, 12:52
Проверить наличие TR-DOS можно проанализировав область системных переменных и уже оттуда плясать дальше.

Если тест загружается с магнитофона то область переменных TR-Dos может быть еще не инициализирована.

А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты

Только вот какой смысл? Такой полноценный тест как раз и займет большую часть ОЗУ в 16k модели. Лучше заранее затачивать свои разработки на кол-во строк в экране Pentagon/Original - все остальное лесом.

Дмитрий
19.09.2013, 13:16
Если тест загружается с магнитофона то область переменных TR-Dos может быть еще не инициализирована.
тут уже чисто логика здравого разума. Если загрузили с магнитофона при наличии TR-DOS - ну не лох ли я? Во всяком случае катастрофы не будет, как при попытке обращения к TR-DOS при ее отсутствии.

---------- Post added at 12:16 ---------- Previous post was at 12:14 ----------


1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
не очень удачная идея... для фирменных машин - все ок, а вот для остальных... Сколько версий 48го бейсика существует? Сотни, если не больше.

drbars
19.09.2013, 13:18
Сотни, если не больше.
Какие сотни? rom'ы в студию.

Дмитрий
19.09.2013, 14:10
drbars, увы итальянский сайт с ромами сломался... но сам можешь примерно прикинуть - чуть ли не каждая фирма, выпускающая клон спектрума считала своим долгом сделать свою версию бейсика, внедряла в нее русский шрифт, копирайты, турбо-загрузчики и прочие плюшки. Один Робик только имеет 3 версии ПЗУ Basic48, из-за чего поплатился с совместимостью, как и многие другие русские клоны. А всякие Didactic Scalika, Delta, Орель БК??? Или они все будут иметь одну CRC?

---------- Post added at 12:30 ---------- Previous post was at 12:28 ----------

Я не говорю уже о том, что некоторые версии TR-DOS с возможностью чтения с винта, часть функций содержали процедуры работы с винтом в области 48го бейсика.

---------- Post added at 12:31 ---------- Previous post was at 12:30 ----------

ПЗУ Basic48 Кворумов так же содержало модифицированный шрифт.

---------- Post added at 12:32 ---------- Previous post was at 12:31 ----------

OpenBasic или как его там... так же очередная версия!

---------- Post added at 12:53 ---------- Previous post was at 12:32 ----------


rom'ы в студию.
нашел полсотни ромов... подскажите чем проверить уникальность файлов?

UPD: нашел, среди 50 ромов только 2 одинаковых пары! Все еще думаете сотню не наберем? ;)
http://s019.radikal.ru/i612/1309/11/bd51e8efacb0t.jpg (http://radikal.ru/fp/ea025c20ce9c4e31a2b6b86a69ca25f5)[COLOR="Silver"]

---------- Post added at 13:10 ---------- Previous post was at 12:53 ----------

Все ромы тут - http://rghost.ru/48835637

BYTEMAN
19.09.2013, 14:14
UPD: нашел, среди 50 ромов только 2 одинаковых пары! Все еще думаете сотню не наберем?
разве сотня это много?

Дмитрий
19.09.2013, 14:21
BYTEMAN, ну не то что бы мало... но оно указывает уже на то, что таким способом определять модель нет смысла, только для "фирмы"...

SoftLight
19.09.2013, 14:59
Почему нет смысла проверять CRC ПЗУ? Зато так вы, скажем, сможете точно определить какая из трех моделей Робика перед нами. Самая точная привязка по железу. Ну а если кто ПЗУ своего клона перепрошил - тут как бы сам виноват. Вся табличко займет 100 байт.

Дмитрий
19.09.2013, 15:02
Зато так вы, скажем, сможете точно определить какая из трех моделей Робика перед нами.
Это мало расскажет даже о самом Робике... у меня через полгода мучений с игрушками на Робике сменилась прошивка Basic48 от фирменного спека... И что даст вам CRC в таком случае? Имхо это тупиковая ветвь... Этот способ надежным, как писал ТС, не назовешь.

Soplik
19.09.2013, 15:15
В принципе, АТМ можно попытаться определить, написав на экране большими буквами что-то обидное для АТМ-щиков.
Если человек со злости ударит по клавиатуре -- значит, АТМ.
Этот же способ годится для определения некоторых других моделей.

SoftLight
19.09.2013, 15:37
В принципе, АТМ можно попытаться определить, написав на экране большими буквами что-то обидное для АТМ-щиков.
Если человек со злости ударит по клавиатуре -- значит, АТМ.
Этот же способ годится для определения некоторых других моделей.

Да и опросить сколько кнопок одновременно было нажато. Это ближе к методу который Вы в соседней теме предложили с нажатием цифры изображенной на экране.

Soplik
19.09.2013, 15:38
А если серьезно -- а может, пускай юзер сам в сетупе выбирает модель из полусотни вариантов, а тест только на тонкие различия смотрит?

psb
19.09.2013, 16:22
надо уходить от четкой логики к нечеткой:) там можно и пзу применить, и все что хочешь. и даже отмазаться, что вот 99%, что у вас скорпион, а не 100%:)

alvis
19.09.2013, 17:51
А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты

И крайне желательно предусмотреть ручной выбор, на случай если неправильно определит автоматом или попадется неизвестный зверь. Тем более что:
1) уже писали (хотя можно попытаться определять не CRC или не только его, а отдельные куски кода или например надписи)
2) длительность инта на многих клонах пытались (доработками или настройками)
3) Многи порты (особенно память) на разных клонах могут пересекаться или дублироваться

---------- Post added at 16:45 ---------- Previous post was at 16:30 ----------


Ну а если кто ПЗУ своего клона перепрошил - тут как бы сам виноват. Вся табличко займет 100 байт

Если не бОльшая часть, то очень многие такие ПЗУ давно заменены на стандартные

---------- Post added at 16:51 ---------- Previous post was at 16:45 ----------

А вообще, imho, задача сильно упрощается если определиться для чего это определение нужно. Для многих задач достаточно не достоверно определить модель, а определить определенные параметры модели или их совокупность.

introspec
19.09.2013, 18:35
И крайне желательно предусмотреть ручной выбор, на случай если неправильно определит автоматом или попадется неизвестный зверь. Тем более что:
1) уже писали (хотя можно попытаться определять не CRC или не только его, а отдельные куски кода или например надписи)
2) длительность инта на многих клонах пытались (доработками или настройками)
3) Многи порты (особенно память) на разных клонах могут пересекаться или дублироваться
А вообще, imho, задача сильно упрощается если определиться для чего это определение нужно. Для многих задач достаточно не достоверно определить модель, а определить определенные параметры модели или их совокупность.
Лично меня в первую очередь интересуют точные временные параметры кадра (бордер и/или мультиколор). К сожалению, варианты с ручным выбором далеко не всегда реалистичны, просто в силу усложнения итогового кода и ограниченных возможностей спектрума как машины. Более реалистично, с моей т.зр. оказывается поддержать фиксированный набор хорошо изученных и распространённых моделей.

1. Тесты ПЗУ я не считаю элегантными и, по возможности, стараюсь их избегать, т.к. они, в каком-то смысле, косвенные. Т.е. если мы видим ПЗУ как у оригинального Спектрума, это не означает, что это Спектрум оригинальный. Если мы видим ПЗУ отличное от оригинального Спектрума, это не значит, что интересующие меня времянки не совпадут с оригиналом. Не очень ясно в таком случае, как относиться к любым итоговым результатам таких тестов - в любом случае, решение придётся принять на основании чего-то ещё, так зачем плодить сущности? Примерно по тому же принципу, определение TR-DOS по системным переменным - возможно, но не очень-то и надёжно.

2. Длительность инта. Кстати, неудачное название теста, т.к. под этим некоторые люди понимают число тактов между кадровыми прерываниями, а некоторые - собственно, саму продолжительность сигнала кадрового прерывания поступающего на процессор. В моём понимании, это отличный тест, т.к. его легко сделать компактным по памяти, и т.к. этот тест позволяет чётко отличить некоторые модели спектрумов, в частности пентагон и зелёный скорпион, а также спектрумы от Amstrad.

3. Именно из-за того, что порты пересекаются, дублируются и, зачастую, из-за неполной дешифрации, ещё и откликаются на чужие имена, я и просил людей поделиться своми наработками в этом плане.

4. У себя в программе я остановился на 2 основных тестах: кол-во тактов на фрейм + вариант кол-ва тактов на фрейм завязанный на медленной памяти, так что можно отличать компьютеры с вейтами от компьютеров без вейтов, а ещё и сортировать по видам вейтов. Кроме этого, я написал дополнительный определитель по портам, но им я совершенно недоволен, т.к. он далеко не всегда отлавливает то, что мне хотелось бы отловить.

Soplik
19.09.2013, 18:38
Если временные параметры, то что мешает запилить сетуп, в котором юзер курсорными клавишами подгоняет простенький бордюрный эффект под метку на экране?

introspec
19.09.2013, 18:44
А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты

Только вот какой смысл? Такой полноценный тест как раз и займет большую часть ОЗУ в 16k модели. Лучше заранее затачивать свои разработки на кол-во строк в экране Pentagon/Original - все остальное лесом.
Согласен, кроме ПЗУ, по причинам изложенным выше. Проверять ПЗУ по-настоящему есть смысл только в том случае, если планируется именно что использование ПЗУ. По-настоящему, я надеялся услышать какие-то идеи относительно 3, т.е. о проверенных в деле последовательностях для тестирования моделей по портам.

---------- Post added at 15:44 ---------- Previous post was at 15:40 ----------


Если временные параметры, то что мешает запилить сетуп, в котором юзер курсорными клавишами подгоняет простенький бордюрный эффект под метку на экране?
Мешает то, что есть очень много различных подводных камней, которые можно обойти в случае знания конкретной модели спектрума, и которые нельзя обойти "простеньким бордюрным эффектом". Разные виды задержек памяти и процессора. Разное положение int относительно экрана.

Soplik
19.09.2013, 18:46
Разное положение int относительно экрана.
А что тут сложного? Пауза больше -- пауза меньше.

Разные виды задержек памяти и процессора
Мда, согласен.

introspec
19.09.2013, 18:50
А что тут сложного? Пауза больше -- пауза меньше.
Ммм... давай сделаем так, запрограммируюй что-нибудь в этом роде, работающее одновременно хотя бы на 48к оригинале, 128к+3 от Amstrad, Пентагоне и, для пущего веселья, на Ленинграде-1, и приходи сюда снова, обсудим.

Soplik
19.09.2013, 18:55
Ммм... давай сделаем так, запрограммируюй что-нибудь
Ко мне больше подходит вот это. Я не кодер.

introspec
19.09.2013, 18:58
Я не кодер.
Ну и зачем тогда засорять темы рассуждениями по типу:

А что тут сложного? Пауза больше -- пауза меньше.

Soplik
19.09.2013, 19:03
А если поиграть со стеком на грани вылета из прерывания и посмотреть, в какой памяти на каких значениях процедура вылетает?
Ты извини, если я случайно глупости пишу.

---------- Post added at 17:03 ---------- Previous post was at 17:01 ----------

Есть такой прием -- "свежая голова", человек со стороны. Иногда он неожиданно находит правильное решение.
Вот я и хочу тебе помочь.

alvis
19.09.2013, 19:07
К сожалению, варианты с ручным выбором далеко не всегда реалистичны, просто в силу усложнения итогового кода и ограниченных возможностей спектрума как машины. Более реалистично, с моей т.зр. оказывается поддержать фиксированный набор хорошо изученных и распространённых моделей.

Я имел ввиду ручной выбор из тех моделей, которые должны определяться автоматом. Просто на случай неправильного определения.

introspec
19.09.2013, 19:13
Я имел ввиду ручной выбор из тех моделей, которые должны определяться автоматом. Просто на случай неправильного определения.
Ну я всё же спрашивал о "надёжном" определении! :)))))))

Максагор
19.09.2013, 22:34
7. Я не знаю ни одного элегантного и надёжного теста АТМ1 и АТМ2. Тесты через TR-DOS не годятся, т.к. вылетают там, где её нет. Может быть кто-то знает хороший простой тест наличия TR-DOS? Из документации, у меня сложилось впечатление, что можно бы было ловить ATM по поведению битов 5 и 7 порта #FE (при чтении). К сожалению, я не уверен, есть ли хоть один эмулятор который бы воспроизводил корректное поведение этих битов. Не подскажете?

Именно так, по отслеживанию сигнала Z (который по схеме, прошитой в ПЛМ1556ХЛ8, "мигает" - иногда в "1", иногда в "0") при чтении порта #FE. В АТМ-1 он висит на бите D7, а в АТМ-2(+) - на бите D5.

Как там в эмулях, не знаю...

introspec
19.09.2013, 23:51
Именно так, по отслеживанию сигнала Z (который по схеме, прошитой в ПЛМ1556ХЛ8, "мигает" - иногда в "1!, иногда в "0") при чтении порта #FE. В АТМ-1 он висит на бите D7, а в АТМ-2(+) - на бите D5.

Как там в эмулях, не знаю...
Тогда поэкспериментирую по крайней мере. А как часто мигает? несколько раз за прерывание или реже? Или это до сих пор военная тайна? :)

Максагор
20.09.2013, 02:22
Тогда поэкспериментирую по крайней мере. А как часто мигает? несколько раз за прерывание или реже? Или это до сих пор военная тайна? :)

Определенное количество раз за прерывание и в определенном порядке ноликов и единичек по определенному алгоритму. На этом сигнале в свое время строилась система защиты плат от пиратского копирования. "Родная" ПЗУ от МикроАРТ была заксорена (так, что даже не просмотришь HEX-эдитором), а в определенной последовательности ноликов и единичек сигнала Z был зашифрован ключ от расксорки. Если ключ не подходил (или контрольная сумма ПЗУ в результате правки не совпадала), комп ругался, что он взломан злобными хакерами и отказывался работать (выхавал надпись "I cracked! I halted! Press RESET to continue!"). Сама ПЛМ 1556ХЛ8 была защищена от считывания, чтобы нельзя было посмотреть, как сформировать такой же сигнал. Само собой, что сигнал Z был разным у разных версий ATM - на ATM-1 - одна последовательность, на ATM-2 версии фирмы ATM - другой, ну уже на ATM-2 и 2+ от МикроАРТ - третий. В современном ПЗУ xBIOS, само собой, эта защита уже не используется...

Но это так - сообщаю для академического саморазвития. Нам все эти последовательности не нужны. Нам нужно просто дать HALT, после чего в течении одного прерывания читать нужный бит. Если он хотя бы ОДИН раз изменит свое значение, значит это та самая модель, которую мы определяем. Вот и все.